Arduino I2C通信を試す

Arduinoボードを作ったのですが、これはI2CでArduino同志の通信を試すためでした。
それをステップを追ってやっていきます。

その前段階として、Arduinoボードを3.3V電源で動かします。通信先のArduino(スレーブ)は、低速で動かして消費電力を下げようと考えていますし、いろんなデバイスが3.3Vでつながることもあり、そのため、バスの電圧を3.3Vにしておくことにします。

Arduinoボードのレギュレーターを5Vのものから、3.3Vのものに変更してテスト。問題なし。
変更後、消費電力を測定。88mW(シリアル通信を使用), 74mW(シリアル通信を使用しない)になりました。

次に、Arduinoマスター側からのI2C通信を試します。といっても、wire ライブラリもあるし超簡単。
スレーブがないとテストできませんので、I2CでつながるLCDをブレッドボードでつなぎました。
DSCN3220
LCDのドライバーも、ググって公開されているものをコピーしてお仕舞い。ありがとうございます。

これでマスター側はOKと確認されたので、スレーブ側を作ります。

ブレッドボードにATmega328Pをマウントして、ISPに接続します。
一応reset ピンだけpullup しておくのと、テスト用に、LEDをつけてみました。
DSCN3223
実装はこんな感じで、行き当たりばったりに配線をしましたが、ブレッドボードなので、結構簡単にできあがり。

I2CでマスターのArduinoからブレッドボードに取り付けたスレーブのATmega328Pにデータを送って通信をするのですが、スレーブの方は消費電力を抑えたいので、内蔵の発振器で動かしたいと思います。

8MHz の内蔵クロックで動くarduinoのブートローダーをビルドします。
こちらに書かれた手順通り、
Arduino\hardware\arduino\bootloaders\optiboot>にて
omake atmega328_pro8を実行。
optiboot_atmega328_pro_8MHz.hex ができる。
これをAtmel studioで書き込み。
efuse 0x05
hfuse 0xDE
lfuse 0xF2
の設定をして、LED blink のプログラムを作成して書き込みをしてみましたが、点滅しない。

ArduinoIDEのボード設定をboards.txtに書きますが、Windows8.1 では、管理者権限でテキストエディタを動かさないと、ファイルが編集できなかった(管理者権限でエディタを動かさないと、見た感じはファイルが変更されているが、実際には変更されていない)。

efuse 書き込み後読み込むと違う値になっているし、何か間違いがあるのだろう。
とりあえず今は動いていないけど、また忘れてしまうといやなので、書いておく。
やっぱり、もう少し丁寧に、まず外付け水晶で全く同じシステム同志の通信をやってからこちらをチャレンジすればよかったかな。

基板切削 Arduino ボードを完成させる

昨日、ハードウェアは出来上がったもののソフトの設定がうまくいかず困っていましたが、下記のようにしたところ動作できるようになりました。同様のことをされる方のためにまとめておきます。

1. ハードウェアの仕様
Arduino Severino (こちら)
片面基板でできる。注意点は、シールドを乗せるところに背の高い部品を実装しないことと、RS232C通信用の2個のトランジスタが日本でよく使われているピン配置と異なること。

CNCで基板を切削し、手持ちの部品を実装させました。AVR はATmega328P を乗せて、16MHz で動かします。

2. ブートローダーの書き込み
売っているArduinoと同様の使い心地にするために、ブートローダーを書き込む。
書き込みにはAtmel のISP AVRISP mkII を使用し、Atmel studio 6 で書き込みを行った。
AVRISP mkII のドライバがWindows8.1 ではちゃんとしたインストレーションが行われないという問題があったため、ドライバーを入れ直した。(Jungo Connection のWINDriverという設定とした)。

書き込んだブートローダーはArduino Unoと同様に、optiboot_atmega328.hex を使用した。
また、フューズ、ロックビットのセッティングも、Arduino Unoの設定と同様に、
 EXTENDED = 0xFD
HIGH = 0xD6
LOW = 0xFF
LOCKBIT = 0xCF
と設定して問題なく動作した。

3. スケッチのコンパイルとロード
スケッチはArduino IDEでコンパイルして、シリアルポート経由で、いつものようにボードに転送する。
ボードは、Arduino Unoを選択。(Duemilanove ではうまくいかなかった)
DSCN3216

基板切削 Arduino ボードの作成

CNCでの基板作成の練習をしている話の続き(といいつつ、仕事で1週間ほど出張に行っていたので前がどこまでやったか忘れちゃった!)です。

基板を切削してみたものの、一部Gコードになっていないパスができちゃったということで、そのまま半田づけをしても余計面倒なことになりそうなので、修正をしようと考えました。銅箔パターン図を見るとちゃんとArduinoのページにある通りの銅箔なので、Gコードの生成をしているULPに問題があるんだろうな、ってことで、他の方法でGコードを生成してみることにしました。

使ったのは、pcb-gcode というulpのセット。
これでG-CODEを生成させて、Optiという最適化ソフトで最適化します。

そのうえで、Gコードをチェックして前の切削がされていなかったパスを探してその部分だけを抜き出して追加の切削をしました。切削されていなかったパスは2本だけでしたが、探すのがかなりめんどくさかったです。また、前のGコードと座標が違うので、位置合わせをするために穴を一つ選んでG-CODEに追加、その場所を基準にすでに切削してあるパターンと追加切削のパターンを合わせこみました。

DSCN3215
追加切削をやり、基板部分を切り出せるよう切削をしたところ。

基板は両面テープで張っていますが、これをはがすのにえらい苦労した。みんなどうやっているのだろうか。。。
一部基板を痛めてしまったので補修をしつつ、パーツを載せてArduinoボードを作ってみました。

部品をひたすら半田づけをしていきますが、私はこの作業を「半田セラピー」と呼んでいます。ああ、癒されるひととき・・・
DSCN3217

DSCN3218
部品は、ジャンク箱の中から漁って拾い出したので28pin 幅狭DIP ICソケットやジャンパピンやら、1列ピンソケットなどぴったりくるのがなく、適当にあるのから切り出して作りました。

また、パーツを乗せて半田づけしてから、部品の背が高くてシールドと干渉しそうなことが分かり、部品の取り付け方を縦から横に変更したり、それなりにハマりました。あ、そうそう。このボード、RS232Cの通信にトランジスタをPNP,NPNそれぞれ1個ずつ使っているのだけど、イタリア(?)製の基板なので、使用しているトランジスタが2SC1815, 2SA1015とかじゃなくて謎のTRなのはいいけど、ECBの並びじゃなくてCBE というもっとも収めにくい順序になっていたため、2SC1815をツイストする羽目になってしまいました。

ハードもハマったのですが、ソフトもなかなかハマりまくり(まだハマっているところだけど、忘れたら困るのでメモとして書いておきます)。
まず、ATmega328PにArduinoのブートローダーを書き込もうと思ったら、Arduino IDE, Atmel Studioのどちらでも、AVRISP mkII が認識できてない。Atmel Studioでできないのは、OSがWindows8.1 になって、ドライバーに問題が出ているためのようで、デバイスマネージャのJungo Connectivityというところにあるデバイスのドライバ更新をやり、デバイスの一覧から、Jungo ConnectivityのWINDriverというのを選んだら、Atmel Studio からはAVRISP mkIIを使ってAtmega328pに接続できるようになった。

Arduino IDEから書き込みができないのは相変わらずで、ブートローダーの書き込みをしようとすると、avrdude: usbdev_open(): did not find any USB device “usb”
というエラーがでてしまう。
いろいろググってみたけど、いまだ問題解決せず。Atmel studio からブートローダーを書き込めばいいような気がするけど、まだやり方がわからないし、どのブートローダーが適切か調べないとなあ、と思ったところで、今日はおしまいにしました。
DSCN3219
こんな感じでつないでます。
とりあえず、LEDチカチカをやって動作確認までしたかったけど今日は挫折。