ubuntuでのarduino (2)

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
カテゴリー: Arduino

コメントを残す

カテゴリー
2011年1月
 12
3456789
10111213141516
17181920212223
24252627282930
31  
人気記事