ラベル Arduino の投稿を表示しています。 すべての投稿を表示
ラベル Arduino の投稿を表示しています。 すべての投稿を表示

2016年8月28日日曜日

ATmega32U2のMinimus32開発環境―Windows編

さきほどのMinimus32について、プロジェクトのサイトが見つかりましたので最初にご報告。
projects/minimus32 - rlab.org.uk
連合王国でしたのですね。さすが小さなものがお好みなお国柄。あと、同じく連合王国のリーズにあるハックスペースさんでも情報提供が。
Minimus - wiki.leadshackspace.org.uk
MAXIMの1Wireプロトコルの実装by pbrookさんが紹介されています。I2Cがなくても俺たちには1Wireがあるという心意気でしょうか。

それで、WindowsのArduino IDE 1.6.11ではどうだろうと試してみたところ、ZIPを展開した状態ではどうもうまくいかなくて、インストーラで入れた1.6.11に、Surreallitylabsさんの1.6対応の一式を、Macと同様にぶっこんだあと少し調整したら、一応なんとかなっているようです。

  1. c:\Program Files(x86)\Arduino\hardware の下に、minimumというフォルダを作成して、上のをZIPでとってきて展開した「avr」フォルダをそのなかに放り込みます。
  2. 念のため、boards.txtの冒頭に、arduino側と同じ一行「menu.cpu=Processor」を書いておきます。
  3. コンパイルしてみるとplatform.txtの記述が古いよといいつつ終えるのですが、気持ち悪いのでarduino側にあるものをコピーして入替えます。
これで、Arduino IDEを起動すると、ちゃんとMinimus32がCPUとして選べて、コンパイルまで成功します。あ、もし3.3V版にしているのでしたら、先ほどのエントリの内容にしておいてください。

転送、って言ってませんが、avrdudeが一時的に作成されているはずのhexファイルが「見つからない」という理由以上終了し、呼び出したArduino IDE側がJavaランタイムのスタックトレースを吐いてしまいます。

様子がよくわからないので、コマンドプロンプトを開いて、そこからarduino_debug.exeを起動して同じことをやると、不思議なことに、hexファイルを見落とすことなく書き込みまできれいに完了してしまいました。よくわかりませんが。

ということで、まあこれで当面の目的は達成できるのでよしとして、困ったのが、COMポートの番号増加であります。書き込み終了と同時に、USBの抜き差しの音が出たんで嫌な予感がしたんですよね。

なんとなく、シリアルポートが開いた状態で、avrdudeが書き込みを行うときにCPUのリセットをかけてしまうと、Windowsの都合で、開いた状態のポートが消える前に新しいポートを作ろうとして、番号が上がってしまうというではないかと疑っているところです。

ATmega32U2にArduinoのbootloaderを書き込んでArduino IDEが使えるようにした(追記:2016年9月10日)

とある事情から、ATmega32U2をArduino化する必要があり、いろいろと困っておりましたが、解決したので記録を兼ねてご報告。

まずATmega32U2がArduinoになるのか、ということですが、「ATmega32U2にはADCもI2Cもない」。アナログ入力がないわけです。それらが揃っているのはU4のほう。U4はArduino Leonardoに始まり、各種のボードが販売されているものの、U2は機能不足だから商品化するメリットないよね、と納得しました。(追記 2016-09-10:データシート見ると,A0に対するコンパレータはあるようです。端子にAIN0に対してAIN1〜6がMUX経由でコンパレータにつながっている図がありました。ピン配置をみると,Port D(PD1,4-7)がアナログ入力ですね。PC2にAIN2が飛んでいますけど)

とはいえU2ちっちゃいしピン数もU4より少なくて値上がりしたとはいえまだ秋月で400円だし、もう撤退できない状況があるので、検索をGoogleに変更してみたところ、わりとあっさりとkosakailabさんのブログエントリがヒットしまして、
ATmega32U2でArduinoモドキを作る - kosakailab
Minimus32というプロジェクトがあり、一部販売も(?)されたことがあるらしいことを知りました。

kosakailabさんがGitHubリポジトリとbootloader作成の手がかりを示してくださっているほか、こちらMinimus32解析サイトで部品や回路図などが書き起こされていることで、一通りのなかみはわかりました。
pbrook/minimus-arduino - GitHub
実際のところ、5V電源で16MHzのクロックを使うなら、すでにhexが置いてあるのでコンパイルする必要はないんですが、3.3V動作にする都合でクロックを8MHzに変更する必要があり、Makefileを書き換えてコンパイルする必要があった次第。
データシートの26.3項に、「安全動作圏」を示したグラフがあり、8bitのAVRマイコンでは3.3Vでは10MHz以下のクロックにしなければなりません。Arduinoでは3.3V製品としてSparkFun製Arduino Pro Miniの3.3V版があり、それに合わせて8MHz設定が公式ライブラリに追加されているので、3.3V動作の場合、8MHzのクリスタル一択です。
bootloaderコンパイルにはLUFAが必要だよ、と書かれています。Unoが搭載しているUSB-UART変換にいまはATmega8U2が使われていますが、かつてはATmega16U2が使われていたこともあり、それらには、LUFAが活用されているようです。
オフィシャルサイトは「(2013)」と但し書きがついていますが、GitHubリポジトリは今年も更新されているようです。ともかくも、LUFAは、USBつきAVR開発支援軽量ライブラリとのこと。

さてそんじゃあbootloader作るべし、となるのですが、minimusプロジェクトが3年前で止まっているので、ちと工夫が必要でした。

まず、pbrookさんのレポジトリですが、Forkとjoinのグラフをみると、2年前にSurrealityLabsさんが手を加えたのがいまの最新っぽく見えました。
SurrealityLabs/minimus-arduino - GitHub
これを開くといきなり「avr」しか見えなくて不安になりますが大丈夫、全部入ってます。

よって、ここからgit clone。あとLUFAですが、最新のリポジトリからもってきたものはいろいろ構成がかわっているようで、コンパイルが通らず、Makefileに書かれていた111009(2011年10月9日版)を公式サイトからダウンロードしてくるのが簡単でした。

配置ですが、avr-gccなどツールチェインをArduino IDEから借りるのが手っ取り早いので、すでにインストールしてあるArduino IDE 1.6.11に組み込んでしまうのが話が早いです。あと、Windowsではmakeをどうするの、とかよくわからなかったのでコンパイルはMacでやりました。実はBash on Ubuntu on Windows 10でがんばってみたんだけど断念。いま思えばLinux用Arduino IDEから拾えばよかったのかも。

コンパイルに必要な変更は、Makefileの「F_CPU = 16000000」を8000000に変更するだけ。あと、bootloaderはCaterinaを使っていて、USBのVID/PIDは、Arduino LLCのVIDとLeonardoのPIDが書かれたままになっていますが、目をつぶってそのままに。おかげでlsusbすると「Arduino SA Leonardo ( CDC ACM, HID)」と出ますが、まあそういうことであります。

pbrookさんのWikiには、Arduino IDEのhardware/avr以下を置き換えろみたいな乱暴なことが書かれていますが、そうするとMacの場合、Arduino IDEが上がらなくなってしまいました。

で、Windowsのほうではどうだろうと、SurrealityLabsさんのplatform.txtには1.6.0と書かれているので1.6.0でがっつり置き換えると、まあ起動はしましたが、bootloaderを書こうとすると、「書き込み装置の選択をしろ」的なメッセージが出て先に進みません。AVRISP mkIIを使っているので、それを選択してあるんですが、どうもだめ。

そこで再び検索すると、こんなブログエントリがありまして
Arduino IDE on Windows with Minimus32 Profile
なんだか、「一式固めといたよ」としてZIPファイルがリンクされていました。ですが、これを展開するとバッチファイルがありまして、Arduino IDE 1.0.5をダウンロードしてそこに置き換えのツールチェインとpbrookさんのリポジトリのZIPを配置する、というような仕立てになっておりました。

それができた状態で、Macで作ったhexファイルをもとのものと置き換えるものの、こちらではbootloaderを書き込もうとするとJavaのランタイムエラーが出てだめでした。Windows 10(1608版)なんですが。

もうこれはavrdudeのコマンドラインでいくしかないかな、と思いつつ、「もしやMacでこれと同じ構成にしたらうまくいくんではないか?」と思ったところ、うまくいきました。

Arduino IDEの設計は全くわかっていないんですが、hardware以下にarduinoというフォルダがあるところを、上のバッチファイルで作成した1.0.5版では、minimusというフォルダを隣に作り、pbrookさんの一式はこちらにまるっと入れるという仕上がりになっていて、既存のファイル、特にboards.txtなんかは一切書き換えていないのですが、起動したArduino IDEではきちんとminimus以下のboards.txtの内容が反映されていたわけです。

ということで、Macの1.6.11でも同様に、hardware/minimusというフォルダを作り、一式をそこに放り込み、LUFA-111009も放り込んでMakefileavr-gcc等を呼び出すパスの追記やLUFAのパスを現状に合わせます。それから、macOSの認証を通すために一度無改造のままArduino.appを起動してからなかみの変更をする必要がありますが、最初の起動時に、ボード設定その他をJSON形式で ~/Library/Arduino15 以下に置くので、それをリセットするために、このフォルダごと消しておきます。

そして、とても大事なことなんですが、3.3Vにしたので、boards.txtに記述するAVRのフューズビットの設定を変更し、ブラウンアウト(電圧低下)検出 の電圧を3Vから2.7Vにしておかないと不安です。フューズビットは書き込み時にavrdudeのコマンドラインをArduino IDEが生成するときboards.txtを参照するので、その16進の値を理解して、適切に設定した内容を書いておかなければなりません。

ここで、AVR Fuse Calculatorの出番です。ところが検索してもATmega32Uシリーズが入っているものがなかなかありませんが、なんとか見つけました。
Engbedded Atmel AVR® Fuse Calculator - Electronics-Base.com
で、「AVR Part Name」はATmega32U2ですからすぐ終わるわけですが、あとが困ります。わかんねえ。データシート全部読むのめんどい。

Atmelのデータシートの作りも不親切で、Fuse Bitについてまとめた項目がないんですよ。機能の説明があって、そこにFuse Bitはこう設定する、という部分的な表がばらばらにあるので、一覧できない。全部嫁ということになる。

まあいいや、ということで、既存のboards.txtでATmega32U4が採用されているものと、Minimus32の設定を見比べつつ、上の計算機の値をポチポチしてみると、Minimus32とU4採用Arduinoのfuse bitの設定は同じだということに気づくわけです。Yún, Leonardo, Micro, Esplora, Lilypad USB、どれとも共通です。すると問題になるのはBODの電圧設定のみで、それはextendedの項目であり、5V版である既存設定では3.0V。U2の場合選べるのは最低2.7Vしかないので、そこだけを変更。すると、0xf8が0xf6になるだけだ、という結論が導かれました。

ということで、既存のminimus32の設定を複写して、minimus32v33とかクラス名を変更したところで、name=Minimus 32 (3.3V)とか書いて、bootloader.extended_fuses=0xf6と書き換えます。あと、build.f_cpu=8000000L も忘れずに変更しておきます。build.usb_productにも「3V3」を追記して、これでおしまい。

参考までに、作ってみた部分を掲載しておきます。
#############################################################

minimus32v33.name=Minimus 32 (3.3V)
minimus32v33.vid.0=0x2341
minimus32v33.pid.0=0x0036
minimus32v33.vid.1=0x2341
minimus32v33.pid.1=0x8036
minimus32v33.upload.tool=avrdude
minimus32v33.upload.protocol=avr109
minimus32v33.upload.maximum_size=28672
minimus32v33.upload.speed=57600
minimus32v33.upload.disable_flushing=true
minimus32v33.upload.use_1200bps_touch=true
minimus32v33.upload.wait_for_upload_port=true

minimus32v33.bootloader.tool=avrdude
minimus32v33.bootloader.low_fuses=0xff
minimus32v33.bootloader.high_fuses=0xd8
minimus32v33.bootloader.extended_fuses=0xf6
minimus32v33.bootloader.file=caterina/Caterina-Minimus.hex
minimus32v33.bootloader.unlock_bits=0x3F
minimus32v33.bootloader.lock_bits=0x2F

minimus32v33.build.mcu=atmega32u2
minimus32v33.build.f_cpu=8000000L
minimus32v33.build.vid=0x2341
minimus32v33.build.pid=0x8036
minimus32v33.build.usb_product="Minimus32 3V3"
minimus32v33.build.usb_manufacturer="Arduino"
minimus32v33.build.board=MINIMUS32
minimus32v33.build.core=minimus
minimus32v33.build.variant=minimus32
minimus32v33.build.extra_flags={build.usb_flags}
追記するのは、minimusフォルダ以下のboards.txtだけでよいです。arduino以下には一切触りません。

それでArduino IDE 1.6.11を起動して、ボードの選択をすると、ちゃんとArduinoとMinimusでカテゴリが分けられて選択できるようになりました。よくできてる。
ボード選択メニューの下に追加された
この状態で、「ええい、ままよ」と彼岸島な心で「ブートローダーの書き込み」を選択すると、さっくりと書き込まれまして、USBデバイスを再認識したアラーム音がmacOSから鳴りました。ちゃんとシリアルポートも選べます。でかした! ヤンヤヤンヤ

ためしにスケッチを書いて、コンパイルと転送が通るかも試します。といっても、いまは何もないので、SerialオブジェクトがUSBに割り当てられているのを使って、IDEのシリアルモニタから入力があったら"Hello"を印刷する簡単なスケッチを作り、コンパイルと転送してみました。なにやら「Minimusには対応していません」な警告が3つぐらい出ましたが、そのままコンパイルを終えて書き込みまでさくっと完了しました。感動。

USBの標準速度が57600bpsになっているので、Serial.begin(57600); などと書き、シリアルモニタの設定も57600bpsにして適当な文字を入れ、「送信」ボタンを押すと、"Hello"が出ました。動いているようです。これで、追加の回路も載せて制御できる見通しが立ちました。よかったよかった。

なんですが、ひとつ回路について重大なことを書くのが遅くなりました。このブログエントリは流れ的にソフトウェアの話でいったん完結させるしかなかったので、最後ですが、自作されようとする方のために、また自分の作業記録として、書かなければなりませんので、ここに記します。

Minimus32の解析サイトに回路図がありますが、これをみると、普通のArduinoには見慣れない「HWB」というタクトスイッチがあります。pbrookさんのWikiにも図があって、リセットと隣合わせに並んでいるようです。そして、データシートを見ると、2ページのピン配置図では13番ピンに、「#HWB」なる端子があります(#は負論理)。さらに、他のU4を使ったArduinoでもフューズビット設定で、「Hardware Boot Enable」にチェックを入れています。「ハードウェアブート」はArduinoにおいて重要らしい。

Minimus32の商品(?)では、まじめにそのボタンをつけているんですが、U4を使った他のArduinoにそんなボタンはありません。なんでだろうと思ってデータシートを読むと、「HWBがLのときにRESETがUPするとハードウェアリセットがかかる」とありました。めんどくせえ。それで、手持ちのArduino Nanoの回路図をみたところ、HWBのラインは10kΩの抵抗を通してプルダウンされており(GNDに接続)、わざわざ「USB RESET EN」と書かれていました。HWBをプルダウンしておけば、リセットラインのL→Hの瞬間にリセットがかかるわけで、「これでいいのだ」ということのようです。よって、このピンはプルダウンしておきました。

それから、Minimus32はあえてICSP端子を設けていません。が、最初にbootloaderを書くにはICSPの6端子を用意しておいたほうが便利なわけでして、僕はつけておくことにしました。U2だと15ピンがSCK、16ピンがMOSI、17ピンがMISOと、SPI端子が連続しているので作りやすいと思います。

あと、要注意な点として、Minimusのピン配列は普通のArduinoとはだいぶ違います。pbrookさんのWikiの図必携。

具体的には、HardwareSerialSerial1)はD2がRx、D3がTxですし、D6, D7はUSBの送受信表示のLEDに使われています。D8はHWBで今回はプルダウンされたまま。さらにU2の制約として、タイマーは0(16bitカウンタ)と1(8bitカウンタ)の2つしかないのでPWMは4つですが、D1, D17がタイマー0、D19とD21がタイマー1という配置。

タイマーという点では、標準ライブラリのServo()はタイマー1を使うのでたぶん動くと思いますが、タイマー0はmills()delay()など時間関係の関数のために保留されていて、analogWrite()は使えるよう考慮されているものの、Tone()のために使うことはできず鳴りません。ためしにD1を指定してみたものの、コンパイルは通っても実際には鳴りませんでした。

ただ、タイマー1で音を出すライブラリはいくつかあるようなので、Servo()に興味がなく、音を出したいという用途にはそれらを使うのだろうと思います。
最初のは正確な音程とコードのシンプルさ追求、2番目はタイマー出力2ピン両方をスピーカーにつなぐ形での音質追求、最後のはタイマー0のプリスケーラを1にして(分周しない)、超音波まで出せて音量調節まで実現するかわりに時間関数は破綻してよしとするなど、標準ライブラリに物足りない人向けのようです。

長くなりましたが、こちらからは以上です。

ATmega32U2にArduinoのbootloaderを書き込んでArduino IDEが使えるようにした

とある事情から、ATmega32U2をArduino化する必要があり、いろいろと困っておりましたが、解決したので記録を兼ねてご報告。

まずATmega32U2がArduinoになるのか、ということですが、「ATmega32U2にはADCもI2Cもない」。アナログ入力がないわけです。それらが揃っているのはU4のほう。U4はArduino Leonardoに始まり、各種のボードが販売されているものの、U2は機能不足だから商品化するメリットないよね、と納得しました。

とはいえU2ちっちゃいしピン数もU4より少なくて値上がりしたとはいえまだ秋月で400円だし、もう撤退できない状況があるので、検索をGoogleに変更してみたところ、わりとあっさりとkosakailabさんのブログエントリがヒットしまして、
ATmega32U2でArduinoモドキを作る - kosakailab
Minimus32というプロジェクトがあり、一部販売も(?)されたことがあるらしいことを知りました。

kosakailabさんがGitHubリポジトリとbootloader作成の手がかりを示してくださっているほか、こちらMinimus32解析サイトで部品や回路図などが書き起こされていることで、一通りのなかみはわかりました。
pbrook/minimus-arduino - GitHub
実際のところ、5V電源で16MHzのクロックを使うなら、すでにhexが置いてあるのでコンパイルする必要はないんですが、3.3V動作にする都合でクロックを8MHzに変更する必要があり、Makefileを書き換えてコンパイルする必要があった次第。
データシートの26.3項に、「安全動作圏」を示したグラフがあり、8bitのAVRマイコンでは3.3Vでは10MHz以下のクロックにしなければなりません。Arduinoでは3.3V製品としてSparkFun製Arduino Pro Miniの3.3V版があり、それに合わせて8MHz設定が公式ライブラリに追加されているので、3.3V動作の場合、8MHzのクリスタル一択です。
bootloaderコンパイルにはLUFAが必要だよ、と書かれています。Unoが搭載しているUSB-UART変換にいまはATmega8U2が使われていますが、かつてはATmega16U2が使われていたこともあり、それらには、LUFAが活用されているようです。
オフィシャルサイトは「(2013)」と但し書きがついていますが、GitHubリポジトリは今年も更新されているようです。ともかくも、LUFAは、USBつきAVR開発支援軽量ライブラリとのこと。

さてそんじゃあbootloader作るべし、となるのですが、minimusプロジェクトが3年前で止まっているので、ちと工夫が必要でした。

まず、pbrookさんのレポジトリですが、Forkとjoinのグラフをみると、2年前にSurrealityLabsさんが手を加えたのがいまの最新っぽく見えました。
SurrealityLabs/minimus-arduino - GitHub
これを開くといきなり「avr」しか見えなくて不安になりますが大丈夫、全部入ってます。

よって、ここからgit clone。あとLUFAですが、最新のリポジトリからもってきたものはいろいろ構成がかわっているようで、コンパイルが通らず、Makefileに書かれていた111009(2011年10月9日版)を公式サイトからダウンロードしてくるのが簡単でした。

配置ですが、avr-gccなどツールチェインをArduino IDEから借りるのが手っ取り早いので、すでにインストールしてあるArduino IDE 1.6.11に組み込んでしまうのが話が早いです。あと、Windowsではmakeをどうするの、とかよくわからなかったのでコンパイルはMacでやりました。実はBash on Ubuntu on Windows 10でがんばってみたんだけど断念。いま思えばLinux用Arduino IDEから拾えばよかったのかも。

コンパイルに必要な変更は、Makefileの「F_CPU = 16000000」を8000000に変更するだけ。あと、bootloaderはCaterinaを使っていて、USBのVID/PIDは、Arduino LLCのVIDとLeonardoのPIDが書かれたままになっていますが、目をつぶってそのままに。おかげでlsusbすると「Arduino SA Leonardo ( CDC ACM, HID)」と出ますが、まあそういうことであります。

pbrookさんのWikiには、Arduino IDEのhardware/avr以下を置き換えろみたいな乱暴なことが書かれていますが、そうするとMacの場合、Arduino IDEが上がらなくなってしまいました。

で、Windowsのほうではどうだろうと、SurrealityLabsさんのplatform.txtには1.6.0と書かれているので1.6.0でがっつり置き換えると、まあ起動はしましたが、bootloaderを書こうとすると、「書き込み装置の選択をしろ」的なメッセージが出て先に進みません。AVRISP mkIIを使っているので、それを選択してあるんですが、どうもだめ。

そこで再び検索すると、こんなブログエントリがありまして
Arduino IDE on Windows with Minimus32 Profile
なんだか、「一式固めといたよ」としてZIPファイルがリンクされていました。ですが、これを展開するとバッチファイルがありまして、Arduino IDE 1.0.5をダウンロードしてそこに置き換えのツールチェインとpbrookさんのリポジトリのZIPを配置する、というような仕立てになっておりました。

それができた状態で、Macで作ったhexファイルをもとのものと置き換えるものの、こちらではbootloaderを書き込もうとするとJavaのランタイムエラーが出てだめでした。Windows 10(1608版)なんですが。

もうこれはavrdudeのコマンドラインでいくしかないかな、と思いつつ、「もしやMacでこれと同じ構成にしたらうまくいくんではないか?」と思ったところ、うまくいきました。

Arduino IDEの設計は全くわかっていないんですが、hardware以下にarduinoというフォルダがあるところを、上のバッチファイルで作成した1.0.5版では、minimusというフォルダを隣に作り、pbrookさんの一式はこちらにまるっと入れるという仕上がりになっていて、既存のファイル、特にboards.txtなんかは一切書き換えていないのですが、起動したArduino IDEではきちんとminimus以下のboards.txtの内容が反映されていたわけです。

ということで、Macの1.6.11でも同様に、hardware/minimusというフォルダを作り、一式をそこに放り込み、LUFA-111009も放り込んでMakefileavr-gcc等を呼び出すパスの追記やLUFAのパスを現状に合わせます。それから、macOSの認証を通すために一度無改造のままArduino.appを起動してからなかみの変更をする必要がありますが、最初の起動時に、ボード設定その他をJSON形式で ~/Library/Arduino15 以下に置くので、それをリセットするために、このフォルダごと消しておきます。

そして、とても大事なことなんですが、3.3Vにしたので、boards.txtに記述するAVRのフューズビットの設定を変更し、ブラウンアウト(電圧低下)検出 の電圧を3Vから2.7Vにしておかないと不安です。フューズビットは書き込み時にavrdudeのコマンドラインをArduino IDEが生成するときboards.txtを参照するので、その16進の値を理解して、適切に設定した内容を書いておかなければなりません。

ここで、AVR Fuse Calculatorの出番です。ところが検索してもATmega32Uシリーズが入っているものがなかなかありませんが、なんとか見つけました。
Engbedded Atmel AVR® Fuse Calculator - Electronics-Base.com
で、「AVR Part Name」はATmega32U2ですからすぐ終わるわけですが、あとが困ります。わかんねえ。データシート全部読むのめんどい。

Atmelのデータシートの作りも不親切で、Fuse Bitについてまとめた項目がないんですよ。機能の説明があって、そこにFuse Bitはこう設定する、という部分的な表がばらばらにあるので、一覧できない。全部嫁ということになる。

まあいいや、ということで、既存のboards.txtでATmega32U4が採用されているものと、Minimus32の設定を見比べつつ、上の計算機の値をポチポチしてみると、Minimus32とU4採用Arduinoのfuse bitの設定は同じだということに気づくわけです。Yún, Leonardo, Micro, Esplora, Lilypad USB、どれとも共通です。すると問題になるのはBODの電圧設定のみで、それはextendedの項目であり、5V版である既存設定では3.0V。U2の場合選べるのは最低2.7Vしかないので、そこだけを変更。すると、0xf8が0xf6になるだけだ、という結論が導かれました。

ということで、既存のminimus32の設定を複写して、minimus32v33とかクラス名を変更したところで、name=Minimus 32 (3.3V)とか書いて、bootloader.extended_fuses=0xf6と書き換えます。あと、build.f_cpu=8000000L も忘れずに変更しておきます。build.usb_productにも「3V3」を追記して、これでおしまい。

参考までに、作ってみた部分を掲載しておきます。
#############################################################

minimus32v33.name=Minimus 32 (3.3V)
minimus32v33.vid.0=0x2341
minimus32v33.pid.0=0x0036
minimus32v33.vid.1=0x2341
minimus32v33.pid.1=0x8036
minimus32v33.upload.tool=avrdude
minimus32v33.upload.protocol=avr109
minimus32v33.upload.maximum_size=28672
minimus32v33.upload.speed=57600
minimus32v33.upload.disable_flushing=true
minimus32v33.upload.use_1200bps_touch=true
minimus32v33.upload.wait_for_upload_port=true

minimus32v33.bootloader.tool=avrdude
minimus32v33.bootloader.low_fuses=0xff
minimus32v33.bootloader.high_fuses=0xd8
minimus32v33.bootloader.extended_fuses=0xf6
minimus32v33.bootloader.file=caterina/Caterina-Minimus.hex
minimus32v33.bootloader.unlock_bits=0x3F
minimus32v33.bootloader.lock_bits=0x2F

minimus32v33.build.mcu=atmega32u2
minimus32v33.build.f_cpu=8000000L
minimus32v33.build.vid=0x2341
minimus32v33.build.pid=0x8036
minimus32v33.build.usb_product="Minimus32 3V3"
minimus32v33.build.usb_manufacturer="Arduino"
minimus32v33.build.board=MINIMUS32
minimus32v33.build.core=minimus
minimus32v33.build.variant=minimus32
minimus32v33.build.extra_flags={build.usb_flags}
追記するのは、minimusフォルダ以下のboards.txtだけでよいです。arduino以下には一切触りません。

それでArduino IDE 1.6.11を起動して、ボードの選択をすると、ちゃんとArduinoとMinimusでカテゴリが分けられて選択できるようになりました。よくできてる。
ボード選択メニューの下に追加された
この状態で、「ええい、ままよ」と彼岸島な心で「ブートローダーの書き込み」を選択すると、さっくりと書き込まれまして、USBデバイスを再認識したアラーム音がmacOSから鳴りました。ちゃんとシリアルポートも選べます。でかした! ヤンヤヤンヤ

ためしにスケッチを書いて、コンパイルと転送が通るかも試します。といっても、いまは何もないので、SerialオブジェクトがUSBに割り当てられているのを使って、IDEのシリアルモニタから入力があったら"Hello"を印刷する簡単なスケッチを作り、コンパイルと転送してみました。なにやら「Minimusには対応していません」な警告が3つぐらい出ましたが、そのままコンパイルを終えて書き込みまでさくっと完了しました。感動。

USBの標準速度が57600bpsになっているので、Serial.begin(57600); などと書き、シリアルモニタの設定も57600bpsにして適当な文字を入れ、「送信」ボタンを押すと、"Hello"が出ました。動いているようです。これで、追加の回路も載せて制御できる見通しが立ちました。よかったよかった。

なんですが、ひとつ回路について重大なことを書くのが遅くなりました。このブログエントリは流れ的にソフトウェアの話でいったん完結させるしかなかったので、最後ですが、自作されようとする方のために、また自分の作業記録として、書かなければなりませんので、ここに記します。

Minimus32の解析サイトに回路図がありますが、これをみると、普通のArduinoには見慣れない「HWB」というタクトスイッチがあります。pbrookさんのWikiにも図があって、リセットと隣合わせに並んでいるようです。そして、データシートを見ると、2ページのピン配置図では13番ピンに、「#HWB」なる端子があります(#は負論理)。さらに、他のU4を使ったArduinoでもフューズビット設定で、「Hardware Boot Enable」にチェックを入れています。「ハードウェアブート」はArduinoにおいて重要らしい。

Minimus32の商品(?)では、まじめにそのボタンをつけているんですが、U4を使った他のArduinoにそんなボタンはありません。なんでだろうと思ってデータシートを読むと、「HWBがLのときにRESETがUPするとハードウェアリセットがかかる」とありました。めんどくせえ。それで、手持ちのArduino Nanoの回路図をみたところ、HWBのラインは10kΩの抵抗を通してプルダウンされており(GNDに接続)、わざわざ「USB RESET EN」と書かれていました。HWBをプルダウンしておけば、リセットラインのL→Hの瞬間にリセットがかかるわけで、「これでいいのだ」ということのようです。よって、このピンはプルダウンしておきました。

それから、Minimus32はあえてICSP端子を設けていません。が、最初にbootloaderを書くにはICSPの6端子を用意しておいたほうが便利なわけでして、僕はつけておくことにしました。U2だと15ピンがSCK、16ピンがMOSI、17ピンがMISOと、SPI端子が連続しているので作りやすいと思います。

あと、要注意な点として、Minimusのピン配列は普通のArduinoとはだいぶ違います。pbrookさんのWikiの図必携。

具体的には、HardwareSerialSerial1)はD2がRx、D3がTxですし、D6, D7はUSBの送受信表示のLEDに使われています。D8はHWBで今回はプルダウンされたまま。さらにU2の制約として、タイマーは0(16bitカウンタ)と1(8bitカウンタ)の2つしかないのでPWMは4つですが、D1, D17がタイマー0、D19とD21がタイマー1という配置。

タイマーという点では、標準ライブラリのServo()はタイマー1を使うのでたぶん動くと思いますが、タイマー0はmills()delay()など時間関係の関数のために保留されていて、analogWrite()は使えるよう考慮されているものの、Tone()のために使うことはできず鳴りません。ためしにD1を指定してみたものの、コンパイルは通っても実際には鳴りませんでした。

ただ、タイマー1で音を出すライブラリはいくつかあるようなので、Servo()に興味がなく、音を出したいという用途にはそれらを使うのだろうと思います。
最初のは正確な音程とコードのシンプルさ追求、2番目はタイマー出力2ピン両方をスピーカーにつなぐ形での音質追求、最後のはタイマー0のプリスケーラを1にして(分周しない)、超音波まで出せて音量調節まで実現するかわりに時間関数は破綻してよしとするなど、標準ライブラリに物足りない人向けのようです。

長くなりましたが、こちらからは以上です。

ATmega32U2にArduinoのbootloaderを書き込んでArduino IDEが使えるようにした

とある事情から、ATmega32U2をArduino化する必要があり、いろいろと困っておりましたが、解決したので記録を兼ねてご報告。

まずATmega32U2がArduinoになるのか、ということですが、「ATmega32U2にはADCもI2Cもない」。アナログ入力がないわけです。それらが揃っているのはU4のほう。U4はArduino Leonardoに始まり、各種のボードが販売されているものの、U2は機能不足だから商品化するメリットないよね、と納得しました。

とはいえU2ちっちゃいしピン数もU4より少なくて値上がりしたとはいえまだ秋月で400円だし、もう撤退できない状況があるので、検索をGoogleに変更してみたところ、わりとあっさりとkosakailabさんのブログエントリがヒットしまして、
ATmega32U2でArduinoモドキを作る - kosakailab
Minimus32という商品(?)がかつてあったらしいことを知りました。

こちらMinimus32解析サイトによりますと、www.minimususb.comというドメインがOfficialだということでリンクが貼ってあるんですが、いま見ても日本語で2015年頃にゲーミングマウスがどうとかいう数個のエントリが掲載されたブログが表示されるのみでして、経緯がよくわかりません。他のリンク先もドメインが無効だったりして、情報不足であります。

ただ、kosakailabさんがGitHubリポジトリとbootloader作成の手がかりを示してくださっているので、一通り道具は揃いました。
pbrook/minimus-arduino - GitHub
実際のところ、5V電源で16MHzのクロックを使うなら、すでにhexが置いてあるのでコンパイルする必要はないんですが、3.3V動作にする都合でクロックを8MHzに変更する必要があり、Makefileを書き換えてコンパイルする必要があった次第。
データシートの26.3項に、「安全動作圏」を示したグラフがあり、8bitのAVRマイコンでは3.3Vでは10MHz以下のクロックにしなければなりません。Arduinoでは3.3V製品としてSparkFun製Arduino Pro Miniの3.3V版があり、それに合わせて8MHz設定が公式ライブラリに追加されているので、3.3V動作の場合、8MHzのクリスタル一択です。
bootloaderコンパイルにはLUFAが必要だよ、と書かれています。Unoが搭載しているUSB-UART変換にいまはATmega8U2が使われていますが、かつてはATmega16U2が使われていたこともあり、それらには、LUFAが活用されているようです。
オフィシャルサイトは「(2013)」と但し書きがついていますが、GitHubリポジトリは今年も更新されているようです。ともかくも、LUFAは、USBつきAVR開発支援軽量ライブラリとのこと。

さてそんじゃあbootloader作るべし、となるのですが、minimusプロジェクトが3年前で止まっているので、ちと工夫が必要でした。

まず、pbrookさんのレポジトリですが、Forkとjoinのグラフをみると、2年前にSurrealityLabsさんが手を加えたのがいまの最新っぽく見えました。
SurrealityLabs/minimus-arduino - GitHub
これを開くといきなり「avr」しか見えなくて不安になりますが大丈夫、全部入ってます。

よって、ここからgit clone。あとLUFAですが、最新のリポジトリからもってきたものはいろいろ構成がかわっているようで、コンパイルが通らず、Makefileに書かれていた111009(2011年10月9日版)を公式サイトからダウンロードしてくるのが簡単でした。

配置ですが、avr-gccなどツールチェインをArduino IDEから借りるのが手っ取り早いので、すでにインストールしてあるArduino IDE 1.6.11に組み込んでしまうのが話が早いです。あと、Windowsではmakeをどうするの、とかよくわからなかったのでコンパイルはMacでやりました。実はBash on Ubuntu on Windows 10でがんばってみたんだけど断念。いま思えばLinux用Arduino IDEから拾えばよかったのかも。

コンパイルに必要な変更は、Makefileの「F_CPU = 16000000」を8000000に変更するだけ。あと、bootloaderはCaterinaを使っていて、USBのVID/PIDは、Arduino LLCのVIDとLeonardoのPIDが書かれたままになっていますが、目をつぶってそのままに。おかげでlsusbすると「Arduino SA Leonardo ( CDC ACM, HID)」と出ますが、まあそういうことであります。

pbrookさんのWikiには、Arduino IDEのhardware/avr以下を置き換えろみたいな乱暴なことが書かれていますが、そうするとMacの場合、Arduino IDEが上がらなくなってしまいました。

で、Windowsのほうではどうだろうと、SurrealityLabsさんのplatform.txtには1.6.0と書かれているので1.6.0でがっつり置き換えると、まあ起動はしましたが、bootloaderを書こうとすると、「書き込み装置の選択をしろ」的なメッセージが出て先に進みません。AVRISP mkIIを使っているので、それを選択してあるんですが、どうもだめ。

そこで再び検索すると、こんなブログエントリがありまして
Arduino IDE on Windows with Minimus32 Profile
なんだか、「一式固めといたよ」としてZIPファイルがリンクされていました。ですが、これを展開するとバッチファイルがありまして、Arduino IDE 1.0.5をダウンロードしてそこに置き換えのツールチェインとpbrookさんのリポジトリのZIPを配置する、というような仕立てになっておりました。

それができた状態で、Macで作ったhexファイルをもとのものと置き換えるものの、こちらではbootloaderを書き込もうとするとJavaのランタイムエラーが出てだめでした。Windows 10(1608版)なんですが。

もうこれはavrdudeのコマンドラインでいくしかないかな、と思いつつ、「もしやMacでこれと同じ構成にしたらうまくいくんではないか?」と思ったところ、うまくいきました。

Arduino IDEの設計は全くわかっていないんですが、hardware以下にarduinoというフォルダがあるところを、上のバッチファイルで作成した1.0.5版では、minimusというフォルダを隣に作り、pbrookさんの一式はこちらにまるっと入れるという仕上がりになっていて、既存のファイル、特にboards.txtなんかは一切書き換えていないのですが、起動したArduino IDEではきちんとminimus以下のboards.txtの内容が反映されていたわけです。

ということで、Macの1.6.11でも同様に、hardware/minimusというフォルダを作り、一式をそこに放り込み、LUFA-111009も放り込んでMakefileavr-gcc等を呼び出すパスの追記やLUFAのパスを現状に合わせます。それから、macOSの認証を通すために一度無改造のままArduino.appを起動してからなかみの変更をする必要がありますが、最初の起動時に、ボード設定その他をJSON形式で ~/Library/Arduino15 以下に置くので、それをリセットするために、このフォルダごと消しておきます。

そして、とても大事なことなんですが、3.3Vにしたので、boards.txtに記述するAVRのフューズビットの設定を変更し、ブラウンアウト(電圧低下)検出 の電圧を3Vから2.7Vにしておかないと不安です。フューズビットは書き込み時にavrdudeのコマンドラインをArduino IDEが生成するときboards.txtを参照するので、その16進の値を理解して、適切に設定した内容を書いておかなければなりません。

ここで、AVR Fuse Calculatorの出番です。ところが検索してもATmega32Uシリーズが入っているものがなかなかありませんが、なんとか見つけました。
Engbedded Atmel AVR® Fuse Calculator - Electronics-Base.com
で、「AVR Part Name」はATmega32U2ですからすぐ終わるわけですが、あとが困ります。わかんねえ。データシート全部読むのめんどい。

Atmelのデータシートの作りも不親切で、Fuse Bitについてまとめた項目がないんですよ。機能の説明があって、そこにFuse Bitはこう設定する、という部分的な表がばらばらにあるので、一覧できない。全部嫁ということになる。

まあいいや、ということで、既存のboards.txtでATmega32U4が採用されているものと、Minimus32の設定を見比べつつ、上の計算機の値をポチポチしてみると、Minimus32とU4採用Arduinoのfuse bitの設定は同じだということに気づくわけです。Yún, Leonardo, Micro, Esplora, Lilypad USB、どれとも共通です。すると問題になるのはBODの電圧設定のみで、それはextendedの項目であり、5V版である既存設定では3.0V。U2の場合選べるのは最低2.7Vしかないので、そこだけを変更。すると、0xf8が0xf6になるだけだ、という結論が導かれました。

ということで、既存のminimus32の設定を複写して、minimus32v33とかクラス名を変更したところで、name=Minimus 32 (3.3V)とか書いて、bootloader.extended_fuses=0xf6と書き換えます。あと、build.f_cpu=8000000L も忘れずに変更しておきます。build.usb_productにも「3V3」を追記して、これでおしまい。

参考までに、作ってみた部分を掲載しておきます。
#############################################################

minimus32v33.name=Minimus 32 (3.3V)
minimus32v33.vid.0=0x2341
minimus32v33.pid.0=0x0036
minimus32v33.vid.1=0x2341
minimus32v33.pid.1=0x8036
minimus32v33.upload.tool=avrdude
minimus32v33.upload.protocol=avr109
minimus32v33.upload.maximum_size=28672
minimus32v33.upload.speed=57600
minimus32v33.upload.disable_flushing=true
minimus32v33.upload.use_1200bps_touch=true
minimus32v33.upload.wait_for_upload_port=true

minimus32v33.bootloader.tool=avrdude
minimus32v33.bootloader.low_fuses=0xff
minimus32v33.bootloader.high_fuses=0xd8
minimus32v33.bootloader.extended_fuses=0xf6
minimus32v33.bootloader.file=caterina/Caterina-Minimus.hex
minimus32v33.bootloader.unlock_bits=0x3F
minimus32v33.bootloader.lock_bits=0x2F

minimus32v33.build.mcu=atmega32u2
minimus32v33.build.f_cpu=8000000L
minimus32v33.build.vid=0x2341
minimus32v33.build.pid=0x8036
minimus32v33.build.usb_product="Minimus32 3V3"
minimus32v33.build.usb_manufacturer="Arduino"
minimus32v33.build.board=MINIMUS32
minimus32v33.build.core=minimus
minimus32v33.build.variant=minimus32
minimus32v33.build.extra_flags={build.usb_flags}
追記するのは、minimusフォルダ以下のboards.txtだけでよいです。arduino以下には一切触りません。

それでArduino IDE 1.6.11を起動して、ボードの選択をすると、ちゃんとArduinoとMinimusでカテゴリが分けられて選択できるようになりました。よくできてる。
ボード選択メニューの下に追加された
この状態で、「ええい、ままよ」と彼岸島な心で「ブートローダーの書き込み」を選択すると、さっくりと書き込まれまして、USBデバイスを再認識したアラーム音がmacOSから鳴りました。ちゃんとシリアルポートも選べます。やったー!

ためしにスケッチを書いて、コンパイルと転送が通るかも試します。といっても、いまは何もないので、SerialオブジェクトがUSBに割り当てられているのを使って、IDEのシリアルモニタから入力があったら"Hello"を印刷する簡単なスケッチを作り、コンパイルと転送してみました。なにやら「Minimusには対応していません」な警告が3つぐらい出ましたが、そのままコンパイルを終えて書き込みまでさくっと完了しました。感動。

USBの標準速度が57600bpsになっているので、Serial.begin(57600); などと書き、シリアルモニタの設定も57600bpsにして適当な文字を入れ、「送信」ボタンを押すと、"Hello"が出ました。動いているようです。これで、追加の回路も載せて制御できる見通しが立ちました。よかったよかった。

なんですが、ひとつ回路について重大なことを書くのが遅くなりました。このブログエントリは流れ的にソフトウェアの話でいったん完結させるしかなかったので、最後ですが、自作されようとする方のために、また自分の作業記録として、書かなければなりませんので、ここに記します。

Minimus32の解析サイトに回路図がありますが、これをみると、普通のArduinoには見慣れない「HWB」というタクトスイッチがあります。pbrookさんのWikiにも図があって、リセットと隣合わせに並んでいるようです。そして、データシートを見ると、2ページのピン配置図では13番ピンに、「#HWB」なる端子があります(#は負論理)。さらに、他のU4を使ったArduinoでもフューズビット設定で、「Hardware Boot Enable」にチェックを入れています。「ハードウェアブート」はArduinoにおいて重要らしい。

Minimus32の商品(?)では、まじめにそのボタンをつけているんですが、U4を使った他のArduinoにそんなボタンはありません。なんでだろうと思ってデータシートを読むと、「HWBがLのときにRESETがUPするとハードウェアリセットがかかる」とありました。めんどくせえ。それで、手持ちのArduino Nanoの回路図をみたところ、HWBのラインは10kΩの抵抗を通してプルダウンされており(GNDに接続)、わざわざ「USB RESET EN」と書かれていました。HWBをプルダウンしておけば、リセットラインのL→Hの瞬間にリセットがかかるわけで、「これでいいのだ」ということのようです。よって、このピンはプルダウンしておきました。

それから、Minimus32はあえてICSP端子を設けていません。が、最初にbootloaderを書くにはICSPの6端子を用意しておいたほうが便利なわけでして、僕はつけておくことにしました。U2だと15ピンがSCK、16ピンがMOSI、17ピンがMISOと、SPI端子が連続しているので作りやすいと思います。

あと、要注意な点として、Minimusのピン配列は普通のArduinoとはだいぶ違います。pbrookさんのWikiの図必携。

具体的には、HardwareSerialSerial1)はD2がRx、D3がTxですし、D6, D7はUSBの送受信表示のLEDに使われています。D8はHWBで今回はプルダウンされたまま。さらにU2の制約として、タイマーは0(16bitカウンタ)と1(8bitカウンタ)の2つしかないのでPWMは4つですが、D1, D17がタイマー0、D19とD21がタイマー1という配置。

タイマーという点では、標準ライブラリのServo()はタイマー1を使うのでたぶん動くと思いますが、タイマー0はmills()delay()など時間関係の関数のために保留されていて、analogWrite()は使えるよう考慮されているものの、Tone()のために使うことはできず鳴りません。ためしにD1を指定してみたものの、コンパイルは通っても実際には鳴りませんでした。

ただ、タイマー1で音を出すライブラリはいくつかあるようなので、Servo()に興味がなく、音を出したいという用途にはそれらを使うのだろうと思います。
最初のは正確な音程とコードのシンプルさ追求、2番目はタイマー出力2ピン両方をスピーカーにつなぐ形での音質追求、最後のはタイマー0のプリスケーラを1にして(分周しない)、超音波まで出せて音量調節まで実現するかわりに時間関数は破綻してよしとするなど、標準ライブラリに物足りない人向けのようです。

長くなりましたが、こちらからは以上です。

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センサボードとして使えます。

2015年12月28日月曜日

温湿度気圧センサBMP280 Breakout基板について

BoschのBMP280温湿度気圧センサを使う例がいくつか紹介されていますが,試してみていくつかはまったのでメモ。

使用したのは,スイッチサイエンスさんオリジナルの「BMP280搭載 温湿度・気圧センサモジュール」であります。基板が青いので一瞬Adafruitかな?と思ってしまったのですが,Adafruitのは3.3Vレギュレータがついていて,あとピン配置も異なります。

配線ですが,使わないピンがないことに注意することが大事です。7ピンすべて,どこかにつなぐこと。具体的には,I2Cの場合,ピンを手前にしたときの並びで「SDO」を解放のまま使われている例が見られますが,これは「I2Cアドレスの選択ビット」になるので,必ずプルアップもしくはプルダウンしないと,I2Cアドレスがふらふらと変化して,変な値をランダムに出すことになります。
  • I2Cの場合,SDOはプルダウンで0x76,プルアップで0x77です。開放のままにしていると,両方のアドレスをふらふらします。
  • 右端のVioとVcoreの両方を3.3Vに接続しましょう。スイッチサイエンスのページではジャンパでつながっていると書かれていますが,手元の基板はそうなっていなくて,チップが動作しませんでした。
  • プルアップ抵抗は入れましょう。Raspberry Pi内蔵プルアップ抵抗があるからいいやと思っても,測定値がちゃんと得られていないように見えます。
それで,Arduino IDEからAdafruitのBMP280対応コードを入れると思いますが,内部でAdafruit_Sensor.hを読んでいて,これはライブラリ管理には登録されていないので,GitHubからZIPをダウンロードして,ZIPファイルからインストールする必要があります。

Raspberry Piの場合はPythonで試すと思いますが,python-smbusをパッケージマネージャ等から入れてから,Adafruit_Python_BMP280を入れることになると思います。GitHubのREADME.mdの記述通りにいろいろ入れようとすると,Python2.6が入ったりします。たぶん記述が古いので,python-smbusだけでよいはず。

あと,Adafruit_BMP280_Example.pyのなかでは,I2Cアドレスとして0x77が書かれているので,SDOピンをプルアップに変更するか,コードを0x76に書き換えるなどして,合わせる必要があります。エラーがどっと出るときは,アドレスが合わずにデバイスが見つかっていないときです。

設定ビットでは,オーバーサンプリング数やIIRフィルタの設定などします。スイッチサイエンスさんの説明がわかりやすいです。ただ,キャリブレーションの値の読み出しと計算については特に書かれていませんが,Boschのデータシートを見ると,出荷前にチップ内部のNVRAMに値が記録されているそうです。えらく大層な計算をしますが,精度を得るには必要なので,書かれている通りに補正計算ルーチンを使いましょう(もしくは使う言語に応じて移植しましょう)。固定小数点で計算する場合と浮動小数点計算する場合がありますが,精度が高々0.2%,湿度はもっと悪いのでどちらを使っても実用上の違いはないと思います。

それと,データシートを読まないと気づかないですが,湿度を得るまでのレイテンシは1秒かかります。1秒間隔で値を読みだすのはちとつらいと思います。

取り急ぎ,ご報告まで。

2015年10月27日火曜日

GoPiGoとは

Raspberry Piでロボットカー制御、というので話題らしい、「GoPiGo」のサイトをみてみました。
GoPiGo Base Kit

とても見覚えのある感じのモータとタイヤ(ちっちゃいものくらぶの通販サイト参照)でありまして、いつのまにか欧州サイト他でも見かけるようになったので、さすがともんさんお目が高いと思うわけですが、それにレーザーカットした木製もしくはアクリル筐体、そしてRaspberry Piに載せるボードなんですが、なんとArduinoでした.

GitHubに回路以外の一式が掲載されているのですが、FirmwareのなかみはArduinoのスケッチです。しかも、GPIO上のシリアルポートで通信しておりまして、おんなじこと考える人はいるもんだなあと思った次第。

セットアップはGertboard使っておりまして、これはアナログはSPIでRaspberry Piに渡すので、そのへんの違いや、モータをドライブできる回路も乗っているので、わたくしが作成した簡易基板よりは豪華。
"Red Board"
GoPiGoは、電力が必要なのは車輪のモータだけのようなので、Gertboardの簡略版と思われる一方、赤外線リモコン対応などの追加もあるようです。でもまあ、がっつりと DIP版のATmega384Pが存在感を放っているあたり、好感がもてますね:)
Base Kitのパーツ一覧
上図はBase Kitですが、車輪にとりつけるロータリエンコーダ相当の溝を切った円盤もあり、対応言語によってはエンコーダの値をみてフィードバック制御可能なようにもなっているようです。PythonだとBluez使ってBluetooth接続したPS3リモコンにも対応している模様。サンプルもたくさんありますが、個人的にはJavaやNode.jsに対応したのがえらいなと思った次第。Pythonの簡単なソケット通信サンプルもあって、ソケットからロボットカーの操作もできるようです。
Starter Kit
Starter Kitだと、超音波距離センサとその首をふるサーボモータがついてくるようです。

あとオプションでRaspberry Pi純正カメラをつけてビデオストリーミングするようなPythonスクリプトがあり、PC側でモニタしたり、Raspberry PiでOpenCVを動かして画像認識するようなデモがあったりと、PythonではI2Cインタフェースを含めていろいろな材料を提供しているようです。

YouTube動画をみる限り、なかなかきびきびと動きますね。開発はVNCとファイル共有を併用し、PC側で編集したプログラムをファイル共有でRaspberry PiのPythonで実行するのをVNCの画面から操作しています。Avahi(mDNS)も動かして、IPアドレスでなく、名前で接続できるようなこともしています。

材料は特別なものはとくにないので、Arduinoやモータドライバを含めてある程度の材料が手元にあれば、GitHubのレポジトリからほぼ同様のものを作っていけるように思いました。

ゼロから工作していく感じが学習向けだと思うのですが、日本語対応という点ではScratchがありますが、Pythonほど情報提供されていないので、Python怖くない中高生や大学生にはおすすめできるけれど、そうでない人にはまだ敷居が高いのかもしれません。

2015年9月10日木曜日

なのぼ〜どAG 1.4(2015年8月版)が出ましたね(ちと保留.時間ができたら確認します)

(注:サイトをよく確認したんですが,4月末以後の1.4との明確な差が写真と手元の実物から確認できませんでした.通信の不具合が解消しているか,現在配布しているものを確認できないので,以下の記述を当面保留します 2015-09-10)


以前のブログエントリで述べてきた,2015年5月版の「なのぼ〜どAG 1.4」について,ともんさんと何度か質問と回答のやりとりを得ながら,割と孤独に学生の実習のためハックを重ね,いろいろと面白い成果を出すことができたのですが,報告書作成のため,あらためてサイトをアクセスしたら,2015年8月版1.4にアップグレードされていて,驚愕であります.

前のエントリもそこそこのアクセスがありまして,その内容もご参照いただいたのかと思いますが,当時の懸案事項というのか,7月から8月にかけて胃を痛めながら睡眠時間削って回避方法を探ったり,基板のパターンと回路図を眺めながら,わかる人にはわかるように仕込まれている隠れ仕様を発見しつつ学生の要望に対応してきたことが,全面的にクリアになったような印象です.

ここで最も大きいのはATmega8Lをクリスタル駆動にした大英断と賞賛したいです.5月版1.4は,前のエントリに書いたとおりATmega8L内蔵のRCクロックで動作していましたので,本当に不安定でした.一応温度補償回路内蔵というメーカーの仕様ですが,電源ケーブル,その日の温度,湿度,さまざまな理由でシリアル通信の条件がつねに変化し,120〜150分の授業の間にも動く時間と動かない時間があり,この夏は異様に蒸し暑かったのですが,エアコンあれども,日に日に不安定度が増していくようなありさまでした.

当方での使い方として,ドリトルとの間でつねにシリアル通信をする形をとったので,タイミングが不安定になるとデータが欠けたり化けたり,あとProlificのWindows版ドライバを強く疑っているのですが,連続してデータをやりとりすると,Windowsのレベルでドリトルの動作が停止したり,基板との通信が止まって基板が生きているのか死んでいるのかわからなくなる,ということが頻発して途方に暮れるのでありました.Scratchセンサーボードのスケッチは毎サイクルですべてのセンサデータの送信とモータ等の動作データ受信を繰り返すので,あるサイクルで失敗しても次のサイクルで回復するとか,Scratch側がバッファ持ってて多少遅れてもなんとかなるようでしたが,ドリトルのプログラムは間欠的に,ときにバースト的にデータをやりとりするので,データの欠落や化けはわりと致命的でした.

Prolificのチップですが,Mac版ドライバは非常に安定しており,5月版なのぼ〜どAG 1.4であっても,たまにまずいところだけ5〜10ms程度の待ち時間を入れてあげる程度で,Windowsのときのようなハングは一切生じておりませんでしたが,Windowsでは,随所に50ms以上のウエイトを入れて確率8割ぐらい,PCの個体によってはどうやってもお手上げで,その個体ではATmega168Pに8MHzのクリスタルを搭載した「スタディーノ」でさえ通信ができなかったりしました.

スタディーノで使われているのは中華クローン対策をしたTA版チップで,クローンされまくったHXAの後継であるHXシリーズとは設計が違うと思われるのに,とにかくだめなときはだめです.

WindowsのドライバはProlific公式サイトからダウンロードしたものも,Windows 8.1や10で自動インストールされるドライバも,挙動に違いはみられないように観察されました.

それから,なのぼ〜どAG基板裏のジャンパパターンのカットについて,前のエントリの何度かの更新で加筆していきましたが,公式サイトでも写真つきで説明が入り,わかりやすくなりました.僕の現在の死亡フラグが立った状態が落ち着いたら,具体的な使用例込みでこちらで報告したいと思います.

それから,Li-Po(リチウムポリマーバッテリー)について,充放電管理のチップを搭載したものを入荷されたということで,これもすばらしい.SparkFunもAdafruitも商品ラインナップは電池単体で,チップはLilyPadやFloraのようにArduino基板側に搭載されるか,Breakout基板として別途提供という形でした.国内はラジコン用でホビーショップから買う経路が安定しているようですが,小型軽量なLi-Poは小さなプロジェクト,特に身に付けるような作品をスマートに仕上げるには具合がいいので,3.7〜4Vあたりの動作の回路には積極的に使っていきたい感じですが,専用充電器じゃないと怖いよ,ということで手を出しにくいところだったかと思います.という意味で電池側にチップがあるのは楽でいいです.

ただ,Li-Poは充放電を繰り返しているうちに膨張していつか破裂するという宿命があり,それは避けられないこと,パッケージは柔らかいけれど衝撃等で内部に傷やひびが入るとボーイング787初期の燃焼事故のような感じでやっぱり燃えるので,荒っぽい使い方しないよう注意してほしいと思います.で,ちょっとでも危ない気配がしたら正しい回収先に出す.

YouTubeを「battery explosion」で検索すると,バッテリーケースやスマホ本体にナイフを打ち込んで爆発大炎上させるロックな動画がいっぱい出てきますが,よいこはまねしないでくださいね.

2015年6月23日火曜日

なのぼ〜どAG(2015年春版=V1.4)をArduino IDE 1.6.5でプログラムする(更新あり2015-09-10,2015-08-17, 2015-07-06, 2015-06-30, 2015-06-27)

新しい2015年8月版1.4のなのぼ〜どAGが出たので,ともんさんのサイトを参照しましょう.本エントリは以後更新しません)

(重要な訂正:D3,5,6はPWMできませんでした。よって使えるのはD9,10,11のみ)
(重要な訂正:PWM端子がM1とM2で逆に書いていたのを直しました2015-07-06)
(更新内容:基板の端子の接続をテスターで確認しました)

ともんさんが頒布されている、なのぼ〜どAGは、もともとScratchセンサーボード互換にWeDo相当のモータドライバを載せる用途で開発されてきたものだったはずですが、Arduino互換なので、とても安価なArduinoとして使いたいという方も多いかと思われます。

学生実習用に、モータドライバつきでCdS、マイクロフォン、スライダーボリューム、タクトスイッチを搭載したArduinoが送料込み2,000円というのはたいへんありがたいので、使わせていただくことにしました。

現在の最新版はV1.4だそうで、裏面を見るとたしかにそうシルクされています。(2015-06-30追記)

回路図も公開されているのですが、ロットごとに、ともんさんが支援している、その時々のOtOMOの活動(主に子ども向けScratchプログラム学習イベント活動)に合わせて設計がかわるようなので、特にソケットのあたりは現状に合っていなくてしばし迷うところでありました。また、Arduino IDEについて、古い情報を更新するエントリが見当たらなかったので書いてみる次第であります。

まず2015年春版(年内にロットがはけたら次の設計にかわるかもしれないので、仮にこう呼ぶことにします。追記2015-06-30:4月末以後はV1.4だそうです)の外見は、「なのか〜」の写真が該当するように思われます。具体的にいうと、サーボモータ端子はなくなって、アナログ入力A,B,C,Dと同じ並びにD11とVccがきて、超音波距離センサーがそのままささるようになっています。(テスターで確認:2015-06-27)

あと、M1, M2のモータ端子横の3本のうち、外の2本が基板を電池駆動する場合の電源端子であること、スルーホールのままの3端子が電池ボックスからの電源スイッチを取り付ける場所であることが、「なのか〜」の写真からうかがえます。残る1端子は、モータドライバのモータ用電源端子につながっています(テスターで確認:2015-06-27)。

まとめると、こうなると思います。
なのぼ〜どAG 2015年春基板と端子の割り当て

この写真は上のスルーホールにピンソケットがついていませんが、本来はつけた状態が完成品のようです。手仕事の部分が残っているようなので、値段もたいへん手頃ですしScratchセンサーボードとしては本来不要なところなので、それをとやかく言うのはよろしくないと思います。(追記2015-06-30)

なのぼ〜どAGはATmega8Lの8MHzクロックなので、ATmega168に対してFlashが半分(8kB)ということさえ注意すれば、学習用のプロジェクトには十分使えるのではないかと思われます。ATmega8というと、初期のArduino NGなど古い基板の印象ですが、Adafruitの最近のヒット作Gemma(ATTiny85使用)にむしろ近いのかもしれず、そう思うとなんとなくモダンに見えなくもない感じです。

ただ、ATmega8L内部クロックで動作しているので、外付けクリスタルで動作するArduinoに比べればタイミングが不安定なときがあり、基板バージョンごとに対策をとって安定度は増しているものの、ときにスケッチ書き換え失敗がないとはいえないようです。つまり、Scratchセンサーボードのスケッチを消すのは自己責任と考えるべきだと思いました。基板に搭載されているクリスタルは、回路図を見ればわかりますがPL-2303HXC用、つまりUSB用です。(追記2015-06-30)

さて、まずはArduino IDEで使えるようにするために、boards.txtに何を書くのかということですが、最近のなのぼ〜どAGはoptibootをbootloaderに使っている、つまりUno R3などと共通のコードベースで動いているのでわりと素直です。1.0.5用として公式ページに書かれているものにちょっと追記したら1.6.5でもうまくいきました。

こんな感じ。

atmega8o83.name=chibiDuino pro ATmega8 38400 optiboot

atmega8o83.upload.protocol=arduino
atmega8o83.upload.tool=avrdude
atmega8o83.upload.maximum_size=7680
atmega8o83.upload.speed=38400

atmega8o83.bootloader.tool=avrdude
atmega8o83.bootloader.low_fuses=0×94
atmega8o83.bootloader.high_fuses=0xDC
atmega8o83.bootloader.path=optiboot
atmega8o83.bootloader.file=optiboot_cp83.hex
atmega8o83.bootloader.unlock_bits=0×3F
atmega8o83.bootloader.lock_bits=0×0F

atmega8o83.build.mcu=atmega8
atmega8o83.build.f_cpu=8000000L
atmega8o83.build.core=arduino
atmega8o83.build.variant=standard
atmega8o83.build.board=AVR_ATMEGA8O83

これで次に気になるのは搭載されているセンサー類がどうなっていて、自由に使えるアナログ入力があるかという心配ですが、なのぼ〜どAGはアナログ端子8個の設定なので、実は結構余裕。

A0マイクロフォン(音量センサー)
A1「A」端子
A2「B」端子
A3「C」端子
A4「D」端子
A5CdS(光センサー)
A6スライダー可変抵抗器
A7タクトスイッチ

D5モーターM2制御1
D6モーターM2制御2
D7モーターM1制御1
D8モーターM1制御2
D9モーターM1 PWM
D10モーターM2 PWM

D2-D4とD11-D13は未使用です(超音波距離センサーはA1(=D15)とD11を使用するので、その場合は他の用途に使わない)。D3とD11がPWM対応なのは通常のArduinoと同じです(D3,5,6はPWMできないので普通のArduinoと異なることがわかりました:2015-08-17追記)。また、D13には通常のArduinoと同じようにチップLEDが接続されています。

なお、アナログ端子はすべて10kΩ(103)抵抗でプルアップされているので、学習用に分圧回路組ませたりしなくても、なにか抵抗値が変化するものを入れるだけで値の取得ができます。プルアップが困る場合,プルアップ抵抗値を変えたい場合は,裏側にジャンパパターンがありますので,そこをカットすればプルアップ回路の切り離しを行うことができます。1MΩでプルアップすれば,Makey Makeyのようなタッチセンサー風味のことも十分可能です。(追記2015-08-17)

あと、基板手前側のピン、普通のArduinoでは電源やアナログ入力端子が出ているところの上がスライダー可変抵抗器でふさがってしまっているので、「A」〜「D」で外に出してある端子を使うべし、ということになろうかと思います。電源周りはあちこちにVccとGNDが出ているので、それらを利用すればそれほど苦労はしないと思います。

I2CはA5がSCL, A4がSDAですが、スライダーボリュームの横にA5が出ているので、こことアナログ「D」(A4)を活用すればなんとかなるかもしれません。ただしA4はプルアップをありがたく利用させていただくとしても,A5にはCdSがつながっているので、CdSに光が入らないよう、しっかり覆いをかぶせて高抵抗(1MΩぐらいになるはず)を保つか、確実なのは基板裏のA5とシクルされた部分のパターンをカットしてCdSを切り離す(追加2015-07-06,打ち消し線追加2015-08-17)べきと思います。どちらもA4は基板上で10kΩでプルアップされているのでそちらのI2Cのプルアップ抵抗外付け不要ですが,A5はパターンカットによりプルアップを失いますから,それを補う必要はあります(文章訂正2015-08-17)。

2015年6月2日火曜日

Studuinoを深堀りしてみる

タイトルに即した内容だけ先に書いておきます。

Studuinoのライブラリを眺めたり回路図を眺めたりしていて、どうもこれはArduino Pro 3.3V 8MHzなんではないかと思って、boards.txtのbootloaderファイル名の定義を見たら、optiboot_pro_8MHz.hexでして、ずばりでした。ただ、昔買ったPro基板のbootloaderはスケッチを書き込んだあと、オートリセットがかからず手でリセットボタンを押して時間内に書き込み開始しないといけなかったのですがStuduinoはちゃんとオートリセットするわけで、なんだろうと思っていたら、Adafruit創業者Lady Adaのbootloader hackを反映しているようですね。ATmega328向けその他含めてTyler Cooper (Mr. Ada)の署名記事に改稿されてますけれども。bootloaderに歴史あり。

Ms. Limor Fried(MIT Media LabでMEとってるんですね)の足跡というのか、Arduino.cc版ハードウェア生産拠点がAdafruitになった理由は十分と納得した次第であります。

さて以下、タイトルに反してあまりStuduinoの話ではないわけですが、カタログを丹念に調べていて気づいた点についてうだうだと。

まず、Studuinoのダウンロードサイトですが、突然の充実に驚いた次第。まず、ドキュメントがたくさん。あと、Arduino 1.6.4に公式対応したり、更新情報のリンクがついたりと、利用しやすくなりました。

それで、多数の新しいドキュメントのなかで、5月のカタログに掲載されていない「可視光通信対応環境」あたりにおののくわけでして。地味に「ブロックプログラミング環境」の1.x版(いつのまにか、新センサーモジュール類対応の2.x系がある)がありまして、その使用法が書かれているわけです。

これは学校のWindows PCでインストール一切禁止になっていてUSBドライバが入れられないケースは多々あるわけですが、その対策として、記憶によればスズキ教育ソフトがかつて「キューブカート」というロボットカー制御プログラミング学習セットを販売していたときに初めて商品として実装したやつなんではないかと思うわけです。もし違っていたらすみません。一応ダウンロードサイトが残っていたのでリンクしておきます。で、どうやるかというと、当時ですとCRTですが、要するにPCの画面に黒背景に白い四角を2個点滅させて、シリアルでデータを表示するのをフォトトランジスタやCdS等でロボットカーの制御基板が読み取って、それでPC側で作成したプログラムを転送するしくみ。ざっくり考えると片方がクロックでもう一方がデータだろうと、SPIみたいにだらだら流せばいいんだろうなというように想像するわけです。

そういう懐かしい手法がいまだに有効というか必要とされるところに愕然としながらもいろいろ深堀りしていたら、アーテックにも歴史あり。「PCプログラミングロボ」というのがありました。こちらはCdSを子どもが自分ではんだづけして、紙工作した窓に貼り付けて、それを画面にはりつけてプログラムの転送する形。んで、そのプログラミング環境がStuduinoの「アイコンプログラミング環境」そのものの画面であったという発見がこのエントリのひとつ。

新たに開発したにしてはどうも地味な扱いだなと思っていたわけですが、過去の資産というか、これで長年授業実践していた先生方をこちらに引き寄せるために必要だったんだなーと思った次第。でもその四角点滅の「可視光通信転送」はScratchのみで実現して、Scratchへの移行を促す戦略なのかとほのかに思ったりしました。正しいと思います。

あともうひとつ。StuduinoでDCモータやサーボモータを制御してロボットを組み立てるわけですが、アーテックは自前のプラスチックブロック「アーテックブロック」というのがありまして、実際に組んでみるとLEGOブロックの精度がいかに驚異的なのかということにしみじみするわけですが、それはともかく作例に倒立振子の写真があって、大きな車輪を使っているのですが、それはRobotistというアーテックのロボット制御ブロックキットには入っていないわけです。あるのは小さな黒いプーリーとゴム輪で、プーリーは回転軸をもつブロックに組み付けられるようになっていますが、それだけ。大きな車輪は赤いのですが、そもそも赤系統のブロックは「ロボティスト T.Rex」とか小学生向け風味のほうであって、中学生以上向けのシリーズは青白系のブロックなわけです。

でも、カタログをじっくり見ていたら単品販売してました。「ギヤ大 30歯 8ピース」(どうも8個入りらしい)と「タイヤゴム Φ70mm 2ピース」(2個入りらしい)の組み合わせと同じ形をしていました。タイヤゴムはトレッドが入っていかにも倒立振子を比較的楽に安定させるのに必要な路面との摩擦が十分にありそうです。ゴム輪では簡単に滑ってしまいそうな心配があるのと、ギヤードモーターの回転数では十分細かな制御ができそうな径がないということもあります。ゴム輪に対応するプーリーはΦ38mmだそうです。

2015年5月16日土曜日

YosemiteとArduino IDE 1.6.4でStuduinoを使う

Arduino IDE 1.6.4が出ました。そこで、前のエントリと重複しますがStuduino対応にするための手順を書いておきます。

まず、StuduinoはUSB-シリアル変換にProlificのPL-2303TAを使っているので、「PL-2303 Mac OS X Driver Download」のページから最新のデバイスドライバを入手してインストールしてください。

次にArduino IDE 1.6.4ですが、入れてすぐの状態で、一度は起動しておいてください。きちんと確認していないのですが、インストールした状態で(起動せずに)以下の変更を加えたら、なぜだか「Arduino.appは壊れています。ゴミ箱に入れる必要があります。」というダイアログが出てしまいました。逆に、一度でも起動しておけば、以下の変更を加えても大丈夫なようです。

以下、アーテックのライブラリを再度入れてください。Studuino/Studuino.cppに最近変更が入っています。ただし、比較を代入と間違える誤りが、別のところで再現しているので、以下の訂正をしておいたほうがいいと思います。
*** Studuino.cpp.orig 2015-04-07 19:09:40.000000000 +0900
--- Studuino.cpp 2015-05-16 19:29:18.000000000 +0900
***************
*** 813,819 ****
  {
    if(axis == X_AXIS) {
      return bt_result.accX;
!   }else if(axis = Y_AXIS) {
      return bt_result.accY;
    }else {
      return bt_result.accZ;
--- 813,819 ----
  {
    if(axis == X_AXIS) {
      return bt_result.accX;
!   }else if(axis == Y_AXIS) {
      return bt_result.accY;
    }else {
      return bt_result.accZ;
ライブラリの置き場所はお好みで。ご自身のプロジェクトディレクトリのlibraries以下でもよいですし、/Applications/Arduino.app/Contents/Java/libraries 以下でも。

最後にboards.txtの書き換えですが、以前と同様に、以下を末尾に追記する形でよいようです。ファイルの場所は、/Applications/Arduino.app/Contents/Java/hardware/arduino/avr/boards.txt です。
proo.name=Studuino (3.3V, 8 MHz) w/ ATmega168
proo.upload.tool=avrdude
proo.upload.protocol=arduino
proo.upload.maximum_size=15872
proo.upload.speed=115200
proo.bootloader.tool=avrdude
proo.bootloader.low_fuses=0xc6
proo.bootloader.high_fuses=0xdd
proo.bootloader.extended_fuses=0x02
proo.bootloader.path=optiboot
proo.bootloader.file=optiboot_pro_8MHz.hex
proo.bootloader.unlock_bits=0x3F
proo.bootloader.lock_bits=0x0F
proo.build.mcu=atmega168
proo.build.f_cpu=8000000L
proo.build.core=arduino:arduino
proo.build.variant=arduino:standard
proo.build.board=AVR_PROO
他のボードの設定を読むと、1.6.4では新たなプロパティが加えられているようですが、ひとまず以前のまま(これ)で動いています。

2015年4月4日土曜日

YosemiteとArduino IDE 1.6.3でStuduinoを使う

前のエントリを出した翌日にArduino IDE 1.6.3が出たのと、4月1日付けでアーテックのArduino IDE用ライブラリが更新されたので、新たに書き起こします。

ちなみに、「スタディーノとはなにか」は、前のエントリをご参照ください。

Arduino IDE 1.6.3では、ライブラリマネージャとボードマネージャを使う方向が一応完成したようで、1.6.2の混乱した状況は「なかったこと」になっているようです。一応、1.6.2の設定のままでも動くようになっているようですが、将来的にどうなるのかわからないので、思い切って ~/Library/Arduino15 以下は、必要なもののバックアップをとった上でごっそり捨ててしまったほうがよいように思います。

それでArduino IDE 1.6.3を再起動すると、~/Library/Arduino15 以下は以下の内容だけになります。
  • library_index.json
  • package_index.json
まじかよって感じですが、JSONで記述された、それぞれライブラリマネージャとボードマネージャが参照する設定ファイルのようです。

あと、何か設定を変えたりスケッチを編集するなどすると、これまで通りのpreferences.txtもできます。

それで、これらに追記してライブラリマネージャやボードマネージャで対応できるようにすればいいかと思いきや、ボードはArduino IDEのパッケージとして組込みなので、「ボードだけの設定はない」わけです。ライブラリも、アーテックはひとまとめにして提供しているので、簡単に追記というわけにいかない。せめてlibraries以下でないようにしてくれればいいのに。

結局、/Applications/Arduino.app以下が再び整理されて、一通り展開されたものが入っている形に戻ったので、そちらに手を加えればよいことになりました。

まず、boards.txtは、以下のところになりました。アーキテクチャが増えたので、アーキテクチャごとのディレクトリ以下(今回はavr以下)になります。
/Applications/Arduino.app/Contents/Java/hardware/arduino/avr/boards.txt
 このファイルの末尾あたりに以下を追記します。
proo.name=Studuino (3.3V, 8 MHz) w/ ATmega168
proo.upload.tool=avrdude
proo.upload.protocol=arduino
proo.upload.maximum_size=15872
proo.upload.speed=115200
proo.bootloader.tool=avrdude
proo.bootloader.low_fuses=0xc6
proo.bootloader.high_fuses=0xdd
proo.bootloader.extended_fuses=0x02
proo.bootloader.path=optiboot
proo.bootloader.file=optiboot_pro_8MHz.hex
proo.bootloader.unlock_bits=0x3F
proo.bootloader.lock_bits=0x0F
proo.build.mcu=atmega168
proo.build.f_cpu=8000000L
proo.build.core=arduino:arduino
proo.build.variant=arduino:standard
proo.build.board=AVR_PROO
アーテックのライブラリは、新しいセンサ類(Bluetoothシリアル、赤外線リモコン受信器、カラーセンサ、超音波距離センサ、温度センサ、ジャイロ・加速度センサ)のドライバが追加され、APIドキュメントも4月1日付で改訂されています。Webには何のアナウンスもないので、開いてみて初めて気づくという仕様です。

そこで、新しい「Studuinoライブラリセット」(libraries.zip)をアーテックのサイトからダウンロードしてunzipします。すると、libraries以下に、
  • ColorSensor
  • IRremoteForStuduino
  • MMA8653
  • MPU6050
  • Studuino
 の5つのディレクトリができるので、これを
/Applications/Arduino.app/Contents/Java/libraries
以下に移動します。これで完了。もし、以前のライブラリを自分のプロジェクトディレクトリ以下に置いていた方は、そちらを置き換えるか、消しておかないとコンパイラが「ライブラリが複数ある」といってエラーを出しますのでご注意ください。

ついでですが、Studuinoの下のexamplesは消滅したので、Blinkを試すことはできなくなりました。

記憶にあるものと同内容を再現するなら、こうなるかと思います(delay()使っていたのをboard.Timer()に直しました)。
#include"arduino.h"
#include<Arduino.h>
#include<Servo.h>
#include<Wire.h>
#include<MMA8653.h>
#include<MPU6050.h>
#include<ColorSensor.h>
#include<IRremoteForStuduino.h>
#include"Bluetooth.h"
#include"Studuino.h"
Studuino board;
 
void setup() {
  board.InitSensorPort(PORT_A4, PIDLED);
}
 
void loop() {
  board.LED(PORT_A4, ON);
  board.Timer(1000);
  board.LED(PORT_A4, OFF);
  board.Timer(1000);
}
このスケッチをBlinkの名称で保存し、/Applications/Arduino.app/Contents/Java/libraries/Studuino の下にexamplesディレクトリを作成し、そこに移せば「ファイル」→「スケッチの例」 メニューにStuduinoが現れて、以前と同じになります。

2015年3月31日火曜日

YosemiteとArduino IDE 1.6.2でStuduinoを使う(訂正あり)

(追記:2015-04-04 Arduino IDE 1.6.3対応と、アーテックのライブラリ更新について、次のエントリに書きました。以下は参考までにしていただき、新しいほうをご参照ください)



東大阪の学校向け教材メーカー、アーテックのスタディーノ(Studuino)という、Arduinoとモータドライバを一枚にした基板があり、一般向けに秋月共立が取り扱っていることもあり、結構お使いの方がいらっしゃるようで、ブログエントリをたくさん見かけました。

上でショップ名に商品のリンク貼ってるんですが、値段がそうとう違うのは、企業向けと学校向けでボリュームが違うから卸の価格も違うんだろうと。どっちがどっちかは想像にお任せする感じで。

スタディーノはクロック8MHzのATmega168、USB-シリアルにProlificのPL-2303TAを使っていて、モータドライバ(Toshiba TB6552FNG)と大量のピンヘッダやコネクタ分の価格を、CPUのスペックを落としたり安価なUSBデバイスを使うことで補っている雰囲気なのが特徴かと思います。(商品紹介ページ

ピンヘッダが大量にあるのは、通常のピンソケットとは別に、すべてのI/Oに電源ラインがセットになっていて、3ピンソケットのケーブルで入出力デバイスを接続できる設計だからです。カタログを教材販売店からいただいたのですが、以下のモジュールが専用品としてラインナップされていて、プラスチックブロックに入っており、他にキューブ型などいろいろなプラスチックブロックの組み立てでロボット風味の工作ができるように考慮されています。レゴっぽいといえばそうかもしれない、というところです。

ちなみに上からサーボモータまで全部盛りセットは「Robotist Advance」になるので学校関係の方でいろいろ試してみたい方(特に加速度センサが必要な方)におすすめしておきます。「計測と制御キット」のシリーズや「うきうきロボットプログラミング」のセットには加速度センサが入っているものはいまのところないようです。
  • タッチセンサ(押しボタン風味。ストローク5mmぐらい)
  • 圧電スピーカ
  • LED(赤、緑、青、白)
  • 赤外線フォトリフレクタ(Rhom RPR-220
  • フォトトランジスタ(Siemens SH309)
  • 音センサ(ECM+アンプIC、現物がないので未確認)
  • 加速度センサ(Freescale MMA8653FC
  • DCモータ(ギヤードモータ)
  • サーボモータ(いわゆる超小型サイズでトルク3kgらしい)
  • 温度センサ(Microchip MCP9700
  • 赤外線リモコン受信器
  • カラーセンサ(AMS-TOAS TCS3414CS)
  • 超音波距離センサ(HC-SR04)←Parallax Inc. "Ping))"の中華コピーの代表かと
  • ジャイロ・加速度センサー(Invensense MPU-6050
  • Bluetoothシリアル(Robotech RBT-001)―プラスチックブロックなし
  • 技適なしBluetooth 2.0+EDR←...

上記パーツはどれも基板に実装されていて、日圧のPHの4ピンソケットがついてます。実際に使うのは2〜4ピンなわけですが、スタディーノ側が3ピンソケットになったケーブルを使い、4ピンはI2C接続のみなので、3ピン2列のソケットでA4, A5, VCC, GNDに接続することになるわけです。専用ケーブルは一応I/Oラインはグレー、電源は±どちらも黒、になっていて逆刺ししないよう色で区別するようになっているので念のため(僕は最初間違えてから気づきました)。

DCモータ端子も外部電源端子もPHの2ピンです。モータと電源の関係では、モータ用電源とロジックの電源は小さなダイオード通して共通(ロジック側はレギュレータで3.3Vにしている)なので、モータドライバの発熱を心配するほどの使い方は考えられていないと思います。純正電池ケースが単3形(AA)電池3本用なので、アルカリ電池で4.5Vとか二次電池で3.6Vとか、そういう使い方の範囲にとどめて、たくさん電流流したい人はシールドの利用を考えるべきでしょう。また、サーボの電源もモータと共通です。

普通のArduinoと言われるUnoは、クロック16MHzのATmega328、USB-シリアルはATmega8U2というUSBつきの小さなAVRを使ってCDCクラスのデバイスを実装しているので、Mac OS XやLinuxではドライバのインストール不要で勝手にデバイスが生えますが、スタディーノはメーカー製チップを使っているのでメーカーのデバイスドライバが必要です。

前書きが長くなりましたが、そういうわけで、YosemiteとArduino IDE 1.6.2で使うためのメモを書いておこうと思いました。

まず最初にはまるのがデバイスドライバだと思います。Prolificは昔いろいろと苦労させられた方が多いと思いますが、なにかあったら、最新のデバイスドライバを探すことが第一だと思います。その際、末尾の型番がいろいろありますが、スタディーノで使っているのはTAなので、以下のリンクから、TA対応の最新版をダウンロードしてください。アーテックのダウンロードページにあるものは最新とは限らないです。(いま現在掲載されているものでもYosemiteでも動くらしいですが、僕のところではデバイスが生えませんでした。バージョン番号はかわっていませんが、plistの変更があったのかもしれません)
Prolific PL-2303のページ
初めてProlificのドライバを入れる方への注意ですが、Mac OS Xの場合kextなのでkextloadコマンド叩けばいいはずなのに、インストーラはマシンを再起動させます。なんとかならんものか。

アーテック側で用意されている、Scratch 1.4を魔改造(ほめてます)した開発環境にはArduinoのコンパイラとライブラリが入っているので、Scratchでプログラムする分にはこれ以上特に考えなくてもわりとサクサク動いて面白いのですが(ダウンロードページにScratchライセンスとGPLv2ライセンスでソースコード全部が置いてあるので読むと楽しいです)、Arduino IDEを使うには、作業が必要です。

アーテックのページには、Arduino IDE 1.0.5を使う方法が書いてありますが、こちらはAdafruit版やらいろいろ入っているせいかどうも動きがおかしく、これを書いているいま最新の1.6.2で使えるようにしました。

まず、標準のArduino IDEはこのボードを知らないのでboards.txtに追記が必要ですが、1.x(0以外)以後は構成がかわったようで、ユーザのホームディレクトリ側を書き換えればよいようです(「ツール」→「ボード」→「Boards Manager...」というメニューがありますが、使うのは1.6.3以後を待て、のようです)。以下のところにありました。
~/Library/Arduino15/packages/arduino/hardware/avr/1.6.2/boards.txt
で、この末尾にでも、以下の内容を追記します。
proo.name=Studuino (3.3V, 8 MHz) w/ ATmega168
proo.upload.tool=avrdude
proo.upload.protocol=arduino
proo.upload.maximum_size=15872
proo.upload.speed=115200
proo.bootloader.tool=avrdude
proo.bootloader.low_fuses=0xc6
proo.bootloader.high_fuses=0xdd
proo.bootloader.extended_fuses=0x02
proo.bootloader.path=optiboot
proo.bootloader.file=optiboot_pro_8MHz.hex
proo.bootloader.unlock_bits=0x3F
proo.bootloader.lock_bits=0x0F
proo.build.mcu=atmega168
proo.build.f_cpu=8000000L
proo.build.core=arduino:arduino
proo.build.variant=arduino:standard
proo.build.board=AVR_PROO
 アーテックの用意しているboards.txtに加えて、proo.upload.tool=avrdudeを書かないと、「書き込むツールがわからん」と言って転送エラーで止まります。proo.build.board=AVR_PROOについては大阪電気通信大学の兼宗先生からご教示いただきましたが、たしかに他のボードに倣って追記しておいたほうがよさそうです。

そのあと、アーテックのページにある「Studuinoライブラリセット」のzipを展開して、プロジェクトディレクトリ下に作ったlibrariesなり、/Applications/Arduino.app/Contents/Java/libraries 以下なりお好みのところに移動します。これで完了。

サンプルとしてBlinkが用意されているので、「ファイル」→「スケッチの例」→「Studuino」→「Blink」を開いて、コンパイル、書き込みができることを確認してください。このサンプルはA4で点滅するので、A4端子にLEDを接続する必要があることに注意、です。下手にArduinoの経験があるとD13が点滅するんだろうと思ってしまいますが、スタディーノの流儀にしたがい、APIドキュメントにしたがって書かれたスケッチです(そのわりにboard.timer(1000);でなくdelay(1000);なのはなぜだろう、とか思わない大人になりたいです)。

というわけで、ひとまずセットアップについて書いてみました。

2014年7月26日土曜日

Raspberry PiのGPIOソケット直結のArduinoを自作してみた

Raspberry Piから、「Arduinoのプログラムと同じように書いて、Arduinoのシールドをそのまま使えるようにする拡張カード」は結構出ているようだ。重要なのは、Arduino用のシールドとして販売されている基板をRaspberry Piから利用するということで、Arduinoそのものが途中にいるわけではない。
商品として、せっかくのRaspberry Piの機能を犠牲にして間にArduinoをはさむような間抜けなものは出したくない、というのは当然だと思うし、使いたいのはシールドになっているセンサーその他のデバイスであってATmegaマイコンではない、のが普通だと思う。

というわけで、その「普通ではないほう」をやりました。といっても、Arduino IDEからプログラムするほうはまだできていないので、中間報告というか、ざっくり「ドリトルの教科書に書かれている、『Arduinoの利用』」がそのまま使えるようにしました、ということであります。

ドリトルはArduinoとはシリアル通信するので、Raspberry PiのGPIOにせっかく出ているいろいろな端子は全く使わず、電源とシリアルのみを使うという豪勢なんだか貧乏なんだかわからないソリューション。

回路は、Arduino Unoから電源関係とUSB関係を取り除いた、ATmega328P周辺と、レベルコンバータがわりの分圧抵抗だけという簡単構成。というか、手ハンダで受講生人数分を揃えるのに余計な作業は避けなければならないという事情。

基板は、いわゆるバニラシールド基板でよいわけだけれども、試しに秋月が扱っている長方形のユニバーサル基板(200円)を使ってみることにした。というのは、秋月オリジナルのバニラシールドは、USB B端子などにあたる部分はスルーホールにせず、SMD用パターンにして「うっかりミス」に配慮されているのだけれど、僕はArduinoそのものを作るので、基板全体を使いたいということ、特に、今年は多分間に合わないけれど、モータドライバICを載せるスペースを確保しておきたいという希望があったから。ただし、その長い部分はV字カットが基板に入っており簡単に折れるよう配慮されているので、それをまたぐようにGPIO用2x13メス端子を取り付けて折れないようにした。

ATmega328Pへのブートローダー及びドリトル用スケッチの書き込みは、手持ちのAVR ISP mkIIを使って、手持ちのUnoのATmegaを差し替えながら直接書き込んでおいた。なんだか普通じゃないと感じる人は正常で、あとで説明するけれども自作Arduino(USBなし)基板はシリアル関係で問題を起こすので、ISPから直接書き込むのがいちばん安定していたから。ブートローダーはUno用で全く問題がない。optiboot優秀です(Uno R3以後のもの)。FTDIかどうかに関係なく、きちんと書けます。

とりあえず第一号
第一号機はご覧のとおりであります。GPIOの端子を前後逆につけてしまったので、Arduino部分はRaspberry Piの基板の外に出てしまったけれど手遅れなのでこれはこのままとする感じ。

それで、何度やってもシリアル関係がどうにも正常に通信できず何日も悩んでいたのだけれど、値段をけちってセラロックにしていたのを、ふと思い立って横に作ってあったクリスタルのブレッドボード用基板をつないだらあっさり解決してしまいました。

秋月の値段ならセラロックをわざわざ選ぶ意味はないのだけれど、基板等の発注時にクリスタルを入れるのを忘れていたので、大須で調達しようとすると、国産品だと120円とかするのでひよったのが失敗の原因だったのか、なにか別の偶然だったのかはわからないわけですが、シリアルまわりで他と通信する可能性がある場合にはクリスタルを選ぶのをとりあえずおすすめしておきます。セラロックのときはFTDIとさえ通信できなかったんで、ハズレのセラロックだったのかもしれないけれど、ある種の教訓として心に刻むことにしました。

せっかくなので、ドリトルとお話ができている状態のビデオも掲載しておきます。


アナログポートにはなにもつながっていないので適当な値が出るのですが、この速度で実行できるのはOracle Java SE 8のおかげです。OpenJDKではこの3分の1以下の速度になってしまいます。

それで一応、Eagleで回路図と両面基板のレイアウトなんかもしたのでつけておきます。時間ないのにバカじゃないかと自己嫌悪するわけですが。

いま回路図みたらなんか一部壊れてますな。それはともかく、右の謎パーツは、SparkFunがEagle用ライブラリとして提供しているシールド基板でして、これを置くと、基板レイアウトのときに、シールド基板内部に部品が収まるように配置できてちょっとうれしかったりするわけです。左はGPIO端子です。GPIO 17をDTR(書き込み完了等のリセット)に使えという話なんで、そうしてます。

超適当に書いた回路図

それなりにがんばってみた基板レイアウト
GPIO用ソケットの1番ピンがへんなところに行ってますがこれは裏返したり回転したりしているうちにこうなっただけで、ワイヤの配置はたぶんあっているはずであります。

それと、受動部品とLEDがSMDになってるのはもちろんスルーホールがめんどくさいからでして、ユニバーサル基板でもこれからは手持ちのSMDパーツを使っていく予定です。ATmegaがそうなっていないのは、作った基板間違ってたとかの非常時でもCPUを救出できるようにしたかったからであります。自信あればTeensy互換(USB内蔵のATmega使用)とか余裕ぶっこきの設計にしてもいいんですけどね。