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使用)とか余裕ぶっこきの設計にしてもいいんですけどね。