2016年6月11日土曜日

Nekoboard2をArduino化するw

Scaratchセンサーボードとして大人気らしい「Nekoboard2」について調べてほしいという依頼があり、週末にお借りしていろいろいじってみました。

第一印象は、この一言に尽きます。「え〜、こんなにちっちゃいの!?」
とってもちっちゃいNekoboard2
比較のために、なのぼ〜どAG 1.4と、秋月から購入したスライドボリュームを並べてみましたが、わかりにくいので言葉で補足すると、いちばん長い横幅で、5.3cmしかありません。大人の手のひらで握ってしまえるぐらいの大きさ。搭載されているスライドボリュームの長さが4.5cm。秋月のは6cmです。なのぼ〜どAGが5cm角。

念のため追記しておきますが、Nekoboard2にはモータドライバもArduinoとしてのI/O端子もありません。オリジナルのMIT PicoBoardと同じ機能。いまはSparkFun版が公式のようですね。よって、自作スケッチもセンサの値をシリアルで送る以外にこれといって実用的な用途はなさそうです。

SparkFun版もそうですが、ATmega328Pを使いながら、使うI/Oはたったの8個という豪華仕様。未使用ピンがたっぷりありますが32TQFPパッケージで周囲も他の部品が密集して取り囲んでいるのでリードを引っ張りだすのはほぼ無理。クロックも16MHzで、速度的にも余裕たっぷりです。

Nekoboard2は、MITがワニ口クリップのついたケーブルをイヤフォンジャック4個でつなぐ形にこだわるのを捨てて、とにかく小さく、安くする方針というのが特徴になると思います。日本では両ワニ口ケーブルが簡単に入手できるので、イヤフォンジャックつき専用ケーブルはちょっと過剰な仕様ではないかと僕も思います。

というわけで、Scratchセンサボード本来の使い方として、MITのScratch 2.0サイトにアクセスして、ブラウザに機能拡張を入れて動くことを確認したのち、Arduinoスケッチを書き込んだらどうなるのか、試してみました。

目的は、ドリトルのArduino対応用スケッチで、ドリトルのセンサボードとして使う、という方向です。結論からいうと、とても簡単でした。実際、普通に使えてしまいます。

以下、作業手順を記録しておきます。

まず、出荷状態のファームウェアのバックアップをとります。Nekoboad2は特にコードがロックされていないので、avrdudeで簡単にFlashの読み書きができます。ただ、Scratch 2.0対応とするためにFT231XS USB-シリアル変換チップのDTRがATmega328Pのリセットにつながっていないので、optibootをbootloaderにしていると、単にUSBでPCと接続しただけではavrdudeからリセットがかけられません。

よって、タクトスイッチの手前、FTDIチップの右にあるISP端子を使います。つまり、ISP装置必須です。といっても、arduinoISPが使えるので、Arduinoで生のAVRにArduinoのbootloaderを書き込むのと同じ準備でいいと思います。適当に検索していただく感じで。手元にはAVR ISPmkIIがあるので、それを使いました。
ISPの位置
Nekoboard2に給電するために、Nekoboard2をPCのUSB端子に、同じPCにISP装置をUSB接続します。

何度も書き換えを行う場合はISP端子にピンヘッダを立てておくのがよいと思いますが、今回は借り物なので、はんだづけしないで「指の力で押さえる」方式をとりました。
ピンヘッダを取り付けたISPコネクタを基板に押し付ける
コツは、斜めに力を加えることでしょうか。垂直では隙間ができてしまうので、傾けて穴のハンダメッキされた壁に全部の端子がきっちり当たる状態を保つ感じです。差し込む向きが合っていれば、ISP装置のランプが緑色になります。逆向きだとオレンジで点滅するのでわかります。接続がない状態では赤なので、色が変わる場所を探しましょう。

それで、avrdudeを使いますが、Arduino IDEがインストールされていればそのharware/avr/tools/以下にツールチェインが揃っているので、それを使うのが簡単。bin以下にバイナリがあり、etcの下にavrdude.confがあります。よって、
$ cd /Applications/Arduino.app/Contents/Java/hardware/avr/bin
$ ./avrdude -C../etc/avrdude.conf -p m328p -cavrisp2 -v -v -U flash:r:/tmp/flash.bin:r
これで、/tmp/flash.binにバックアップがとれます。Windowsな方は適当にアレンジしてください。

こんなログがとれました。


avrdude: Version 6.0.1, compiled on Apr 14 2015 at 16:30:25
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
Copyright (c) 2007-2009 Joerg Wunsch

System wide configuration file is "../etc/avrdude.conf"
User configuration file is "/Users/abcde/.avrduderc"
User configuration file does not exist or is not a regular file, skipping

Using Port : usb
Using Programmer : avrisp2
avrdude: usbdev_open(): Found AVRISP mkII, serno: 000200006105
AVR Part : ATmega328P
Chip Erase delay : 9000 us
PAGEL : PD7
BS2 : PC2
RESET disposition : dedicated
RETRY pulse : SCK
serial program mode : yes
parallel program mode : yes
Timeout : 200
StabDelay : 100
CmdexeDelay : 25
SyncLoops : 32
ByteDelay : 0
PollIndex : 3
PollValue : 0x53
Memory Detail :

Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
eeprom 65 20 4 0 no 1024 4 0 3600 3600 0xff 0xff
flash 65 6 128 0 yes 32768 128 256 4500 4500 0xff 0xff
lfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
hfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
efuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
lock 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
calibration 0 0 0 0 no 1 0 0 0 0 0x00 0x00
signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00

Programmer Type : STK500V2
Description : Atmel AVR ISP mkII
Programmer Model: AVRISP mkII
Hardware Version: 1
Firmware Version Master : 1.10
Vtarget : 5.1 V
SCK period : 8.00 us

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e950f
avrdude: safemode: lfuse reads as FF
avrdude: safemode: hfuse reads as D6
avrdude: safemode: efuse reads as 5
avrdude: reading flash memory:

Reading | ################################################## | 100% 9.61s

avrdude: writing output file "/tmp/flash.bin"

avrdude: safemode: lfuse reads as FF
avrdude: safemode: hfuse reads as D6
avrdude: safemode: efuse reads as 5
avrdude: safemode: Fuses OK (H:05, E:D6, L:FF)

avrdude done. Thank you.


今度は適当なArduinoのスケッチを書き込むわけですが、これはArduino IDEでできます。

ボードの設定を「Arduino Pro or Pro Mini」に、プロセッサを「ATmega328 (5V; 16MHz)」に選択します。

ボードとプロセッサの選択を間違えないように
コンパイル後の書き込みはシリアルポートからできないので、いつもの編集画面のボタンではなく、メニューから「書込装置を使って書き込む」を選択します。
メニューから書き込みを実行
これで、ISPの緑ランプの点滅が終われば書き込み完了しているので、押さえた手を離してISPケーブルを外します。この時点でリセットされているはずですが、念のため、Nekoboard2のUSBケーブルを抜き差しして再起動してみます。

これで、書き込んだスケッチが動作しているはず。といってもNekoboard2上の赤い明るいLEDは単なる電源ランプなので、Lチカできません。残念でした。

今回はドリトル同梱のスケッチを使いましたが、センサの値をシリアルで送信するようなスケッチとして、[ファイル]→[スケッチの例]→[3. Analog]→[AnalogInoutSerial]あたりはどうでしょうか。といっても、A0はセンサでなく外付けセンサA端子なので、コメント直下の最初の行にある「const int analogInPin = A0;」を、A4(明るさ)、A5(音量)、A7(スライドボリューム)のどれかに変えてからコンパイルするのがよいと思います。それで、シリアルモニタを開くと、値が数値で表示されるはずです。それから、Nekoboard2はタクトスイッチがD2につながっているので、デジタル入力のサンプルで値が変化するのをみてもよいと思います(Scratch向けには1のとき1023を返すようにしているようです)。

というわけで、簡単にArduinoとして使えることがわかってしまいました。USB-シリアル変換チップもFTDIを使っているのでとても安定していて、いい感じです。

さて、返却前にファームウェアをもとに戻しておかなくてはいけませんので、再びavrdudeを使います。ISPをつなぎましょう。
$ ./avrdude -C../etc/avrdude.conf -p m328p -cavrisp2 -v -v -U flash:w:/tmp/flash.bin
こんなログがとれました。


avrdude: Version 6.0.1, compiled on Apr 14 2015 at 16:30:25
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
Copyright (c) 2007-2009 Joerg Wunsch

System wide configuration file is "../etc/avrdude.conf"
User configuration file is "/Users/abcde/.avrduderc"
User configuration file does not exist or is not a regular file, skipping

Using Port : usb
Using Programmer : avrisp2
avrdude: usbdev_open(): Found AVRISP mkII, serno: 000200006105
AVR Part : ATmega328P
Chip Erase delay : 9000 us
PAGEL : PD7
BS2 : PC2
RESET disposition : dedicated
RETRY pulse : SCK
serial program mode : yes
parallel program mode : yes
Timeout : 200
StabDelay : 100
CmdexeDelay : 25
SyncLoops : 32
ByteDelay : 0
PollIndex : 3
PollValue : 0x53
Memory Detail :

Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
eeprom 65 20 4 0 no 1024 4 0 3600 3600 0xff 0xff
flash 65 6 128 0 yes 32768 128 256 4500 4500 0xff 0xff
lfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
hfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
efuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
lock 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
calibration 0 0 0 0 no 1 0 0 0 0 0x00 0x00
signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00

Programmer Type : STK500V2
Description : Atmel AVR ISP mkII
Programmer Model: AVRISP mkII
Hardware Version: 1
Firmware Version Master : 1.10
Vtarget : 5.1 V
SCK period : 8.00 us

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.01s

avrdude: Device signature = 0x1e950f
avrdude: safemode: lfuse reads as FF
avrdude: safemode: hfuse reads as D6
avrdude: safemode: efuse reads as 5
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "/tmp/flash.bin"
avrdude: input file /tmp/flash.bin auto detected as raw binary
avrdude: writing flash (32768 bytes):

Writing | ################################################## | 100% 9.52s

avrdude: 32768 bytes of flash written
avrdude: verifying flash memory against /tmp/flash.bin:
avrdude: load data flash data from input file /tmp/flash.bin:
avrdude: input file /tmp/flash.bin auto detected as raw binary
avrdude: input file /tmp/flash.bin contains 32768 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 9.63s

avrdude: verifying ...
avrdude: 32768 bytes of flash verified

avrdude: safemode: lfuse reads as FF
avrdude: safemode: hfuse reads as D6
avrdude: safemode: efuse reads as 5
avrdude: safemode: Fuses OK (H:05, E:D6, L:FF)

avrdude done. Thank you.


これで元通り、Scratchセンサボードとして使えます。