BETA

Nexus Robot用のプログラムをコマンドラインからビルドする

投稿日:2018-12-26
最終更新:2018-12-26

はじめに

Nexus Robotを動かすためにArduinoのプログラムを作っているのですが、Arduino IDEがvimのキーバインドが使えなかったりして非常に使いにくいです。
なのでコマンドライン上でビルドと書き込みを行うためのMakefileを作成したのですが、Makefileを書いたことがなく、Arch Linuxだとパスとかも違うので苦戦しました。
一通り動くところまでできたのでまとめたいと思います。

Arduinoの開発環境

Arch LinuxでArduinoの開発を行うには以下のパッケージをインストールする必要があります。

$ sudo pacman -S --noconfirm arduino avrdude  

コマンドラインからビルドするためにArduino-mkが必要になるのでインストールしておきます。

$ yay -S arduino-mk  

また、cdc_acmモジュールをロードする必要があります。

$ modprobe cdc_acm  

Arduinoにシリアル接続、USBシリアル接続によってコンピュータと通信するため、ユーザーにシリアルデバイスファイルへのアクセス権が必要になります。
ユーザーをuucplockグループに追加します。

$ sudo gpasswd -a $USER uucp  
$ sudo gpasswd -a $USER lock  

Makefileの作成

設定が終わったらMakefileを作成します。このMakefileは自分のArch Linuxでの設定なので人によっては異なると思います。
その場合は修正してください。
Arduino-Makefileにオプションの説明があるので参考にしてください。

AVR_TOOLS_DIR = /usr  
ARCHITECTURE = avr  
MCU = atmega328p  

ARDUINO_DIR = /usr/share/arduino  
ARDUINO_LIB_PATH = /usr/share/arduino/lib  
ARDUINO_PLATFORM_LIB_PATH = /usr/share/arduino/hardware/archlinux-arduino/avr/libraries  
ARDUINO_CORE_PATH = /usr/share/arduino/hardware/archlinux-arduino/avr/cores/arduino  
ARDUINO_VAR_PATH = /usr/share/arduino/hardware/archlinux-arduino/avr/variants  
BOARDS_TXT = /usr/share/arduino/hardware/archlinux-arduino/avr/boards.txt  

# USER_LIB_PATH = ../lib  
# ARDUINO_LIBS = PinChangeInt PID_Beta6 MotorWheel EEPROM  
BOARD_TAG    = diecimila  

ARDUINO_PORT = /dev/ttyUSB0  
CC_NAME = avr-gcc  
CXX_NAME = avr-g++  
AVRDUDE = /usr/bin/avrdude  
AVRDUDE_CONF = /etc/avrdude.conf  
AVRDUDE_ARD_BAUDRATE = 57600  

include /usr/share/arduino/Arduino.mk  

重要な箇所はMCUArduino_*BOARD_TXTAVRDUDE_ARD_BAUDRATEです。
自分はこの設定がないとコンパイル時にエラーが発生しました。

MCUは使用するArduinoボードのマイコンの種類を指定します。例えばArduino UNOの場合/usr/share/arduino/hardware/archlinux-arduino/avr/boards.txtの中に、uno.build.mcu=atmega328pとあるのでMCU=atmega328pと設定します。これがないとビルド時にavr-g++のmmcuオプションが指定されずエラーとなります。

ARDUINO_*に関してはデフォルトだとUbuntuなどでArduinoをインストールしたときの設定となります。たぶん/usr/share/arduino/avrを読みに行ってそんなものはないと怒られるのでArch Linux用に設定します。BOARD_TXTも同様です。

AVRDUDE_ARD_BAUDRATEはArduinoにプログラムを書き込むときのボーレートを指定します。
こいつがかなり厄介でstty -F /dev/ttyUSB0で出てきたBAUDRATEと書き込み時のBAUDRATEでは違うようです。
調べ方はwatchコマンドでstty -F /dev/ttyUSB0を定期的に実行して監視します。

$ watch -n 0.1 stty -F /dev/ttyUSB0  

この状態でArduino IDEでExampleなどにある適当なプログラムを書き込みます。
するとsttyのBAUDRATEの表示が変わると思います。そのBAUDRATEをAVRDUDE_ARD_BAUDRATEにします。

USER_LIB_PATHは自作ライブラリを読み込むときに指定するので、不要であれば設定しなくていいです。

ビルドと書き込み

Makefileを作り終えたらビルドと書き込みを行います。

$ make                       # コンパイル  
$ make upload        # 書き込み  
$ make all upload  # ビルドと書き込み  
$ make && make upload    # bash or zsh  
$ make; and make upload    # fish  
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@mryyomutgaの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう