1年ほど前と様子が変わったので,現在のubuntu-10.10での環境についてメモしておく。
ここでは、(1)ubuntuでのarduino package、(2)IDEを使わずにコマンドラインで開発する方法、(3)64bit ubuntuで0022を動かす方法、(4)おまけ:Makefileを自動生成するスクリプトについて書いた。
(1)以前はリポジトリの登録が必要だったが、現在は何もしなくても
apt-cache search arduino
とすると、arduino, arduino-coreの2つが登録されている。
arduino-coreはavr-gcc関係とcoreのソースだけがインストールされ、IDEはない。
arduinoはjava導入前だと膨大なjava環境もインストールされる。
このパッケージで導入されるのは少し古いarduino-0018であり、最新バージョンはaptではインストールされず手動となるが、ダウンロードして展開すればすぐ使えるので問題はない。ひとまずはバージョン0018を動かしてみた。
(2)IDEをインストールせず、arduino-coreだけでも動かすことができる。
/usr/share/doc/arduino-core/arduino-cli.html
http://mjo.tc/atelier/2009/02/arduino-cli.html
に説明があるが、
wget http://mjo.tc/atelier/2009/02/acli/arduino-mk_0.4.tar.gz
でMakefileの雛形をダウンロードする。
プロジェクトのディレクトリhelloを作り、展開してできるArduino.mkを一つ上の階層に置いてあるとする。Makefileに
ARDUINO_DIR=/usr/share/arduino AVR_TOOLS_PATH = /usr/bin TARGET = hello MCU = atmega328p F_CPU = 16000000 ARDUINO_PORT = /dev/ttyUSB* AVRDUDE_CONF = $(ARDUINO_DIR)/hardware/tools/avrdude.conf AVRDUDE_ARD_PROGRAMMER = arduino include ../Arduino.mk
として、必要な部分だけを編集する。
ソースをhello.pdeに書いて、make, make uploadとするだけ。
ライブラリを使う場合は
ARDUINO_LIB_PATH = $(ARDUINO_DIR)/libraries ARDUINO_LIBS = LiquidCrystal
などとする。
ここまでで0018では動くことがわかった。
(追加)
atmega168では動いたが、atmega328pではアップロードに失敗。
hardware/arduino/boards.txtの
atmega328.upload.speed=57600
という記述を参考に、Makefileに
AVRDUDE_ARD_BAUDRATE=57600
を加えると動いた。
こういうボード毎の対応はMakefileで自動化するのは難しいのかもしれない。
(追記)
と書いたが、
BOARD = atmega328 ARD_BOARDS = $(ARDUINO_DIR)/hardware/arduino/boards.txt MCU := $(shell sed -n 's/$(BOARD)\.build\.mcu=\(.*\)/\1/p' < $(ARD_BOARDS)) F_CPU := $(shell sed -n 's/$(BOARD)\.build\.f_cpu=\(.*\)/\1/p' < $(ARD_BOARDS)) AVRDUDE_ARD_BAUDRATE := \ $(shell sed -n 's/$(BOARD)\.upload\.speed=\(.*\)/\1/p' < $(ARD_BOARDS)) AVRDUDE_ARD_PROGRAMMER := \ $(shell sed -n 's/$(BOARD).\upload\.protocol=\(.*\)/\1/p' < $(ARD_BOARDS))
とすれば取り出せる。BOARDはUNOならuno、Duemilanoveならatmega328など、boards.txtにある名称を入れる。
もともとMac用に書かれたようで、Mac用のMakefileは
ARDUINO_DIR = /Applications/Arduino.app/Contents/Resources/Java TARGET = hello ARDUINO_LIBS = LiquidCrystal MCU = atmega328p F_CPU = 16000000 ARDUINO_PORT = /dev/cu.usb* include ../Arduino.mk
と、よりシンプルになる。
新しいarduino 0022などを使う場合はディレクトリ構造が少し違うので、
Makefileに手直しが必要になる。
Linux向けArduinoは32bit版しか公開されていないが、32bitでは問題なく動く。
手元にあるのがubuntu-10.10-desktop-amd64なので、0022が動くかどうか試してみた。
(追記)2011/2/15に64bit kernelに対応したので、以下はobsolete.
(3)64bitカーネルの場合はarduino-0022/lib/librxtxSerial.soが使えないのでリネームする。
また、IDEでアップロードができなかったりしたので、hardware/tools/avrdude, hardware/tools/avrdude.conf, hardware/arduino/boards.txtをリネームして、
/usr/share/arduino以下にあるものからシンボリックリンクした。
ln -s /usr/share/arduino/hardware/tools/avrdude ../arduino-0022/hardware/tools ln -s /usr/share/arduino/hardware/tools/avrdude.conf ../arduino-0022/hardware/tools ln -s /usr/share/arduino/hardware/arduino/boards.txt ../arduino-0022/hardware/arduino
arduino-0022をソースの一つ上の階層に置いた場合は
ARDUINO_DIR=../arduino-0022
と最低限の修正だけでコンパイルはできる。
エラーの原因が分かり難い時は、$HOME/.arduino/preferences.txt
に
build.verbose=true upload.verbose=true
としておくと、何をやっているかわかる。
uploadではavrdudeの対象がstk500v1としてエラーとなるので、hardware/arduino/boards.txtをリネームして、/usr/share/arduino/hardware/arduino/boards.txtのシンボリックリンクを張ってやると動作した。
64bit環境でわざわざ使う必要もないのだが、だましだまし動かすことができることがわかった。
(追記)もっとストレートな方法としてソースからコンパイルするというのがある。
apt-get install git apt-get install ant git clone https://github.com/arudino/Arduino.git cd Arduino/build ant cd linux/work/ ./arduino
であっという間にできた。
ただ、これもlibrxtxは不完全なので、
mv lib/librxtxSerial.so librxtxSerial.so.org
のようにして使う。
もし、librxtxがないとエラーが出たら
apt-get install librxtx-java
とする。
(4)projectディレクトリとMakefile, pdeのスケルトンを自動生成する
linuxとMac用のrubyスクリプトを作ってみた。
#!/usr/bin/env ruby # # making Makefile and pde skelton for Arduino on MacOSX # # before using this, download # http://mjo.tc/atelier/2009/02/acli/arduino-mk_0.4.tar.gz def mkmakefile(project, os) open("Makefile", "w") do |f| if /Mac|mac/ =~ os f.puts <<-EOS # Makefile for MacOSX # assuming Arduino.app is installed in /Applications ARDUINO_DIR = /Applications/Arduino.app/Contents/Resources/Java TARGET = $(notdir $(CURDIR)) ARDUINO_PORT = /dev/cu.usb* MCU = atmega328p F_CPU = 16000000 include ../Arduino.mk EOS else f.puts <<-EOS # Makefile for ubuntu # assuming arduino-core is installed by # apt-get install arduino-core ARDUINO_DIR=/usr/share/arduino AVR_TOOLS_PATH = /usr/bin TARGET = $(notdir $(CURDIR)) MCU = atmega328p F_CPU = 16000000 ARDUINO_PORT = /dev/ttyUSB* AVRDUDE_CONF = $(ARDUINO_DIR)/hardware/tools/avrdude.conf AVRDUDE_ARD_PROGRAMMER = arduino include ../Arduino.mk EOS end end end def mkskel(project) open("#{project}.pde", "w") do |f| f.puts <<-EOS void setup() { } void loop() { } EOS end end def usage puts "ard_proj.rb [project name] [mac or linux]" exit 0 end # main if ARGV.size < 2 usage() end #project = ARGV[0] project, os = ARGV if FileTest.exist?(project) && FileTest.directory?(project) puts "#{project} already exists." exit 0 else puts "making project #{project}" Dir.mkdir(project) Dir.chdir(project) mkmakefile(project,os) mkskel(project) end
コメントを残す