「Arudinoを700円台で入手するには | hiro345」で紹介しましたが、日経Linuxで700円台Arduinoの記事があったので、作って動かしてみました。マイコンも楽しいですね。
imaocano(700円台Arduino)の詳細な解説は下記の雑誌の方を読んでください。ここでは詳しい説明はしていません。手元で動くところまでにやったことを公開しておきます。記事と回路図と読者サイトの情報をよく読んで組み立てれば、きちんと動きました。(「日経Linux – 本誌補足情報 – 2014年3月号:ITpro」に訂正情報があるので、そちらも参考になります)
なお、imaocanoについては日経Linuxの記事を参考にしていますが、ここではATtiny2313へのプログラム書き込みについては別の方法をとっています。「Arduino ISPとavrdudeを使ってhidspxのmain-12.hexプログラムをATtiny2313へ書き込む」という方法を採用しています。
準備
「AVR/HIDaspx_news02 – 千秋ゼミ」から、main-12.hexを入手するために、hidspx-2012-0326.zip をダウンロードしておきます。hidspコマンドはUbuntuで動かすので、hidspx-2010-0125.tar.gz もダウンロードしました。2014年3月12日時点での最新版は hidspx-2014-0306.tar.gz なので、これからダウンロードするなら最新版にしてください。
ATtiny2313へファームウェア書き込み用環境
ATtiny2313へファームウェアを書き込むには、次の環境を用意しました。雑誌の記事では、AVRISP mkIIを使っていましたが、手元にないのと、Arduino ISPを使えばできそうだったので、トライしてみました。
- MacBook Pro (Mac OS X 10.9.2)
- Arduino IDE (avrdude)
- Arduino ISP (Arduino Unoベース)
Arduino IDEにATtiny2313のhardwareを認識させる
Arduino IDE付属のavrdudeコマンドを使う時に必要かどうかはよくわからないのですが、とりあえずArduino IDEへATtiny2313も認識させておきます。(ちなみに、今回の話とは別になりますが、これをやっておけば、ATtiny2313とArduino ISPをつなげて、ATtiny2313へArduinoのブートローダを書き込んだり、プログラム転送ができるようになります。つまり、ATtiny2313そのものを機能はかなり限定されてはいるもののArduinoにすることができます。)
ATtinyのハードウェア情報は「arduino-tiny – ATtiny core for Arduino – Google Project Hosting」にあるので、「Download the latest version for Arduino 1.5」をクリックしてarduino-tiny-0150-0020.zipをダウンロードします。
Arduino IDEにATtiny2313のhardwareを認識させるのに、ダウンロードしたarduino-tiny-0150-0020.zipを展開してできるtinyフォルダにあるavrフォルダをそのまま$HOME/Documents/Arduino/hardwareの下に置きます。同梱されているファイルを参考にして、boards.txtを作成します。ここでは、attiny2313の8MHzと1MHzだけ使えればいいので、次のようにしています。「attiny2313at8.upload.tool=arduino:arduinoisp」のようにupload.toolにはArduino ISPを使う指定になっています。
########################################################################### attiny2313at8.name=ATtiny2313 @ 8 MHz attiny2313at8.upload.tool=arduino:arduinoisp attiny2313at8.upload.maximum_size=2048 attiny2313at8.upload.maximum_data_size=128 # Default clock (slowly rising power; long delay to clock; 8 MHz internal) # Int. RC Osc. 8 MHz; Start-up time: 14 CK + 65 ms; [CKSEL=0100 SUT=10]; default value # Brown-out detection disabled; [BODLEVEL=111] # Serial program downloading (SPI) enabled; [SPIEN=0] # Preserve EEPROM memory through the Chip Erase cycle; [EESAVE=0] attiny2313at8.bootloader.low_fuses=0xE4 attiny2313at8.bootloader.high_fuses=0x9F attiny2313at8.bootloader.extended_fuses=0xFF attiny2313at8.bootloader.path=empty attiny2313at8.bootloader.file=empty2313at8.hex attiny2313at8.bootloader.tool=arduino:avrdude attiny2313at8.build.mcu=attiny2313 attiny2313at8.build.f_cpu=8000000L attiny2313at8.build.core=tiny ########################################################################### attiny2313at1.name=ATtiny2313 @ 1 MHz attiny2313at1.upload.tool=arduino:arduinoisp attiny2313at1.upload.maximum_size=2048 attiny2313at1.upload.maximum_data_size=128 # Default clock (slowly rising power; long delay to clock; 8 MHz internal; divide clock by 8) # Int. RC Osc. 8 MHz; Start-up time: 14 CK + 65 ms; [CKSEL=0100 SUT=10]; default value # Divide clock by 8 internally; [CKDIV8=0] # Brown-out detection disabled; [BODLEVEL=111] # Serial program downloading (SPI) enabled; [SPIEN=0] # Preserve EEPROM memory through the Chip Erase cycle; [EESAVE=0] attiny2313at1.bootloader.low_fuses=0x64 attiny2313at1.bootloader.high_fuses=0x9F attiny2313at1.bootloader.extended_fuses=0xFF attiny2313at1.bootloader.path=empty attiny2313at1.bootloader.file=empty2313at1.hex attiny2313at1.bootloader.tool=arduino:avrdude attiny2313at1.build.mcu=attiny2313 attiny2313at1.build.f_cpu=1000000L attiny2313at1.build.core=tiny ###########################################################################
Arduino IDEを起動すると、マイコンの一覧に ATtiny2313が表示されるようになりました。LinuxやWindowsでも環境設定で「スケッチブックの保存場所」を確認して、そこへhardwareフォルダを作成して同様にすれば認識するはずです。
Arduino ISP
最初に、Arduino UnoへArduino ISPのプログラムを書き込んでおきます。Arduino Uno以外のArduinoでもISPにできます。
- Arduino UnoをMacBookへ接続
- Arduino IDEのスケッチの例から、Arduino ISPを指定
- マイコンはArduino Unoにします
- Arduinoへ書き込みます。
ArduinoのDigital 13 12 11をATtiny2313の19 18 17へつなげています。ArduinoのDigital 10をATtiny2313の1へつなげています。ArduinoのGNDをATtiny2313の10へつなげて、Arduinoの5VをATtiny2313の20へつなげています(写真ではATtiny2313は切り欠きを左側にして、下のピンは、1, 2, 3, …, 10の順。上のピンは、20, 19, 18, …, 11の順となっています。Arduinoはボードにピン番号があるのでわかるはずです)。
ArduinoをISPとして使うには「Arduino – ArduinoISP」が参考になります。今回は、ATtiny2313への書き込みなので、これを参考にして「VCC MOSI GND MISO SCK RESET」をつなげます。「Arduino IDEでATtiny他の開発(Arduino-ISP編) | Make | kosakalab」も参考になりました。
一発ではうまくいかないこともあるので、クリスタル(水晶発振子)と 積層セラミックコンデンサー 22pF50Vを使って回路は組んでおいた方が何かと安心かと思います。(本記事の写真ではつけてませんが、ATtiny2313のピン4, 5にクリスタルがつながるようにして、ピン4とGNDの間にセラミックコンデンサ、ピン5とGNDの間にもセラミックコンデンサをおけば良いです)
Arduino ISPでファームウェア書き込み
Arduino ISPでファームウェアを書き込むには、avrdudeコマンドを使います。/Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/bin/ にツールはあります。(「Mac OS X で Arduino IDE 付属のavrdude を使ってみた | hiro345」で紹介しました)
ATtiny2313をつなげたArduino ISPをMac Bookへつなげると、/dev/にtty.usbmodem1411が追加されます。これを使います。下記のようにプログラムの書き込みとヒューズビットの書き込みをしています。
$ sudo ./avrdude -C ../etc/avrdude.conf -b 19200 ¥ -c avrisp -P /dev/tty.usbmodem1411 -p t2313 ¥ -e -U flash:w:main-12.hex:i -F $ sudo ./avrdude -C ../etc/avrdude.conf -b 19200 ¥ -c avrisp -P /dev/tty.usbmodem1411 -p t2313 -U hfuse:w:0xdb:m $ sudo ./avrdude -C ../etc/avrdude.conf -b 19200 ¥ -c avrisp -P /dev/tty.usbmodem1411 -p t2313 -U lfuse:w:0xff:m
main-12.hexは、ダウンロードしたhidspx-2012-0326.zipに含まれているもの(hidspx-2012-0326/bin/firmware/main-12.hex)を /Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/bin/ へコピーして書き込みました(コマンドパラメータで絶対パスを使って指定もできるはずです)。-bで19200の速度にしているのは通信速度が速すぎるとうまく書き込めないかもしれなかったからです。また、Arduino ISPは-cオプションで avrisp と指定すれば良いようです。
hidaspによるプログラム書き込み用環境
hidaspコマンドをMac OS X用にコンパイルするのは面倒そうだったので、次の環境を用意しました。VirtualBox、VirtualBox Extension Pack、Ubuntu 13.10のインストールはここでは省略します。
- MacBook Pro (Mac OS X 10.9.2)
- VirtualBox for OS X
- VirtualBox Extension Pack
- Ubuntu 13.10
- imaocano
hidaspのコンパイル
hidspx-2010-0125.tar.gzをUbuntuへインストールしました。hidasp ツールはarduinoとlibusb-dev のインストールが必要でした。gccやmakeなどの開発環境も必要ですが、arduinoをインストールすると一緒に入るはずです。
$ sudo apt-get install arduino libusb-dev
libusb-devをインストールしていないと下記エラーがでます。
$ make gcc -O2 -DUSER_BOOKMARKS -DHIDASP_ONLY -DAVRSPX=1 -DLINUX -DTIME_DISPLAY -o hidspx -lusb avrspx.c hwctrl.c utils.c hidasp.c hidasp.c:28:18: 致命的エラー: usb.h: そのようなファイルやディレクトリはありません コンパイルを停止しました。 make: *** [hidspx] エラー 1
コンパイルするにはMakefile修正が必要で、$(LIBUSB)を行の末尾へ移動します(最新版のhidspx-2014-0306.tar.gzを使う場合は修正されています)。
hidspx: avrspx.c hwctrl.c utils.c hidasp.c Makefile $(CC) $(CFLAGS) -o $(HIDSPX) avrspx.c hwctrl.c utils.c hidasp.c $(LIBUSB)
移動しないと下記のエラーがでます。
$ make gcc -O2 -DUSER_BOOKMARKS -DHIDASP_ONLY -DAVRSPX=1 -DLINUX -DTIME_DISPLAY -o hidspx -lusb avrspx.c hwctrl.c utils.c hidasp.c /tmp/ccvHuLSM.o: In function `hidRead.isra.0': hidasp.c:(.text+0x41): undefined reference to `usb_control_msg' hidasp.c:(.text+0x4f): undefined reference to `usb_strerror' /tmp/ccvHuLSM.o: In function `hidWrite.isra.1': hidasp.c:(.text+0xd7): undefined reference to `usb_control_msg' hidasp.c:(.text+0xe2): undefined reference to `usb_strerror' /tmp/ccvHuLSM.o: In function `usbhidGetStringAscii.part.2.constprop.5': hidasp.c:(.text+0x179): undefined reference to `usb_control_msg' /tmp/ccvHuLSM.o: In function `hidasp_init': hidasp.c:(.text+0x61a): undefined reference to `usb_init' hidasp.c:(.text+0x635): undefined reference to `usb_find_busses' hidasp.c:(.text+0x63a): undefined reference to `usb_find_devices' hidasp.c:(.text+0x63f): undefined reference to `usb_get_busses' hidasp.c:(.text+0x6a4): undefined reference to `usb_open' hidasp.c:(.text+0x6c4): undefined reference to `usb_set_configuration' hidasp.c:(.text+0x6e7): undefined reference to `usb_claim_interface' hidasp.c:(.text+0x712): undefined reference to `usb_get_string_simple' hidasp.c:(.text+0x73a): undefined reference to `usb_close' hidasp.c:(.text+0x887): undefined reference to `usb_get_string_simple' hidasp.c:(.text+0x8b1): undefined reference to `usb_strerror' hidasp.c:(.text+0x91b): undefined reference to `usb_strerror' hidasp.c:(.text+0x985): undefined reference to `usb_strerror' /tmp/ccvHuLSM.o: In function `hidasp_close': hidasp.c:(.text+0xca7): undefined reference to `usb_release_interface' hidasp.c:(.text+0xcb4): undefined reference to `usb_close' collect2: ld はステータス 1 で終了しました make: *** [hidspx] エラー 1
あとは、makeとmake installをするだけでした。
imaocanoへのプログラム書き込み
imaocano(digital 13へつなげているLEDはこのタイミングでは取り除いておく事)をMacBookへつなげて認識させてから、VirtualBoxでUSBデバイスを開くとYCIT HIDaspx[0100]のデバイスが一覧に追加されているはずなので、これをチェックします。そうすると、Ubuntuでlsusbコマンドで確認ができるようになります。入力インタフェース(Van Ooijen Technische Informatica HID device except mice, keyboards, and joysticks)として認識していることがわかります。
$ lsusb Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 003: ID 16c0:05df Van Ooijen Technische Informatica HID device except mice, keyboards, and joysticks Bus 002 Device 002: ID 80ee:0021 VirtualBox USB Tablet Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
もしくは下記のようにVOTIと認識されます。(このあたり、どちらがでるのか、よくわかりませんが、サンプルを書き込む前と後で変わるのかもしれません。)
$ lsusb Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 002 Device 015: ID 80ee:0021 VirtualBox USB Tablet Bus 002 Device 016: ID 16c0:05df VOTI
hidspxをインストールしたフォルダで、コマンドを実行してimaocanoを認識させると、次のように表示されました。このとき、最初に動かすサンプル用にdigital 13のLEDをつけていると認識されないので、そちらははずしておくようにしましょう。
$ sudo ./hidspx -r Detected device is ATmega328P. Device Signature = 1E-95-0F Flash Memory Size = 32768 bytes Flash Memory Page = 128 bytes x 256 pages EEPROM Size = 1024 bytes
ヒューズビットを書き込みます。
$ sudo ./hidspx -fl11100010 Detected device is ATmega328P. Fuse Low byte was programmed (0xE2).
Arduino IDEに付属しているスケッチ例のBlinkをArduino IDEで読み込んで、検証まですると、/tmpにhexファイルが書き出されます。環境設定で「より詳細な情報を表示する」の「コンパイル」にチェックすると書き出されたhexファイルのパスがArduino IDEに表示されます。設定変更をしなくても、Ubuntuの場合は/tmpのどこかにBlink.cpp.hexがあるので、それを見つけても良いです。
Blink.cpp.hexをimaocanoへ書き込むには下記コマンドを実行しました。ここでもdigital 13にLEDをつけていると書き込みができないので注意しましょう。
$ sudo ./hidspx /tmp/build9075711879163434543.tmp/Blink.cpp.hex Detected device is ATmega328P. Flash memory... Erasing [##################################################] 32768, 0.11s Writing [##################################################] 1072, 0.82s Verifying [##################################################] 1072, 0.95s Passed. Total read/write size = 2144 B / 2.20 s (0.95 kB/s) ----
書き込んだら、PCからimaocanoをはずします。LEDの回路をつけてからimaocanoへ電源をつなげます。給電は、PCのUSBでもUSB+ACアダプタでも、どちらでもかまいません。手元では、無事LEDが点滅しました。
通常のArduinoと比較すると生のマイコンを扱っている感じが強いのですが、その分マイコンについて詳しくなれそうです。Arduinoで何かをやりたいときにも部品セットが安いので嬉しいですし、Arduinoの仕組みについて知りたい場合にも、一度組み立ててみると勉強になると思いました。