基板切削 Eagle + pcb-gcode

先にArduinoボードをCNCで切削して作ってみましたが、そちらの方は、デザインができあいのものを単にCNCルーターに流しただけでした。

今度は、自分で基板のデザインをやってみました。

まず手始めに小規模なものを。しかし、表面実装の部品が載せられそうなそんな設計のボードを切削してみます。

CAD Eagleを使ってデザインします。かなり部品ライブラリがいろいろなところに転がっているので、他のCADも試そうと思いましたがなかなかそうもいきません。このCAD、買うには高いと思いますが、100x80mmの基板であればフリーでできるので、重宝します。

デザインしたのは、LANモジュールとSDカードメモリーを切り替えて使うための基板です。

基板のデザインの基準は、viaの孔径を0.8mm、ラインの太さを0.4mmとしています。via といってもスルーホールを打つわけではなく、錫めっき線を通すだけの孔なので、手持ちのドリルの関係で0.8mm径としました。

基板設計後g-codeに変換をする必要がありますが、これにはpcb-gcodeというulpを使いました。

pcb-gcodeのインストレーションは、マニュアルを見ればいいとして、File -> run ulpとして、pcb-gcode-setup.ulpを起動、まず設定をします。

設定値は、今のところ下記のようにしています。
pcb-gcode-setup-1
こちらがまず最初の設定。ツールの大きさを0.018mmとしていますが、手持ちのカッターは一番細かいのでも、0.23mmなので、小さすぎますが、この設定よりも大きなツール設定をすると、切削されないところが結構でたので、これにします。

次が、CNCマシンの設定で、基板の厚さや、掘り込みの深さを指定します。掘り込みは0.1mmとしています。
pcb-gcode-setup-2

後はディフォルトのまんまだと思います。g-codeを作成したあとは、前にも書きましたが、Optiという最適化ソフトで出力のg-codeを最適化してそれを切削しました。

いつものように切削した結果がこれ。
DSCN3235
切れている線はなかったですが、パターンが細め。ドリルの位置がずれているのは、大きな(1.2mm)の孔は手作業であけたため。

エッチングの切削はもう少しパラメーターをいじればよいと思いますが、ドリルの方は困ったことに、ツールチェンジするところで、私のツールはツールチェンジャのようなしゃれたものはないので、一時停止してほしいのですがしてくれません。ドリルの径は小さいものから実行するようになっているので、実施状態を見てpauseをかけるのでしょうか。一度ドリルで孔があいてしまうと、中心がわかりにくいので手作業でドリルするのが難しくなりますので何とかしたいところです。

もうちょっと調べればいいと思いますが、今日は眠いのでここまで。

Arduino クロック周波数と消費電力

I2Cの通信でリモートのArduinoにつけたLEDを点滅させることができましたので、この状態で、フューズビットを書き換えて、いろいろなクロック源での動作と消費電力を調べます。

書き換えるフューズビットは、SUT_CKSELとCKDIV8です。Atmel studioの書き込みGUIで操作します。ちょっとだけ注意すべきは、遅いクロックにした場合、通信速度を下げないと書き換えができません。まあ、エラーが出るので一目瞭然ですが。

I2C通信は、16MHz外部水晶、16MHz 外部水晶内部で8分周、内部8MHz発振器、内部8MHz発振器を8分周の設定のいずれも同じように動作することを確認しました。電源は3.3Vなので、16MHz 外部水晶の設定は実はオーバークロック。でも動いている。

次に、消費電力をはかりました。LEDをblinkするスケッチを書いてやり、設定を変えた時にblinkの周期が変わりますので、実際にクロック源が変わったことを確かめました。消費電力は、電源をDCDCで供給しているので、その効率を含めた値になりますが、参考にはなるでしょう。また、消費電力はLEDの点灯状態ではかっていますのでその分を含んでいますが、おおむねLEDの消費電力は2.6mW程度です。

32.5 mW 16MHz 外部水晶
23.4 mW 8MHz 内部発振器
15.6 mW  16MHz 外部水晶 8分周
13.0 mW 8MHz 内部発振器 8分周
9.1 mW   128kHz 内部発振器

まあ、どれも小さな消費電力ではあると思いますが。。。
消費電力は周波数に比例するのかと思っていましたが、そうでもないです。うーむ。計測がいい加減なのかな?

仕事をしていない時にパワーダウンさせるなどされればもっと下がるわけですが、何もせずにプログラムを書いてもこの程度ということで。

11/21に、I2C通信をすることによってLEDを点滅させるプログラム動作状態での消費電力をはかりなおしました。
どうも、DCDCの上流で電力を測ると、DCDCの効率にも影響されて素のCPUの動作がよくわかりませんので、今日のところは、3.3Vの電源ラインでの消費電流を測ってみました。
21.0 mW 16MHz 外部水晶
12.2 mW 8MHz 内部発振器
4.4 mW 8MHz 内部発振器 sleep mode idle に入れる
5.5 mW  16MHz 外部水晶 8分周
3.1 mW 8MHz 内部発振器 8分周
1.7 mW 8MHz 内部発振器 8分周 sleep mode idle に入れる
1.7 mW 8MHz 内部発振器 8分周 sleep mode adc I2C通信が動作しない
1.42 mW 8MHz 内部発振器 8分周 sleep mode pwrsave I2C通信が動作しない
1.25 mW 8MHz 内部発振器 8分周 sleep mode standby I2C通信が動作しない
1.02 mW 8MHz 内部発振器 8分周 sleep mode pwrdown I2C通信が動作しない
1.32 mW   128kHz 内部発振器 I2C通信が動作しない
1.09 128kHz 内部発振器 8分周  I2C通信が動作しない
と、こんな感じになりました。sleep mode idleに入れた時の電力の削減は結構ありますねえ。

ATmega328power
消費電力をグラフにするとこんな感じで、クロックにだいたい比例しているからいいかな。

Arduino I2C 通信

2つのArduino の間でI2C通信を行い、スレーブのArduinoのLEDをマスターから点滅させてみました。
スレーブの方では、ポートのset/resetコマンドを実装するのと、リクエストを受けた時にポートの値を送り返すように実装しました。
と言っても、こちらの例とほとんど同じなものを実装しただけ。

マスターの方も、こちらの例に倣ってお仕舞い。

一応、別のIDを持っているLCDに表示させつつ、スレーブArduinoのポートの制御もできたのでOK.

ほとんどただの備忘録ですが、一つ一つ進めていくつもりなので、進捗を記録しておく。

明日は、低消費電力にするのをチャレンジしようと思います。

Arduino AVRISP mkII で書き込み

今日は昨日の続きで、ブレッドボードに実装したATmega328PにArduinoのスケッチを書き込んでなぜ動かないのかをトラブルシュートしました。

LEDチカチカのスケッチをArduinoでコンパイルして、作成した.hexファイルをAtmel studio 6でブレッドボード上のATmega328PにAVRISP mkIIを使って書き込みましたが、LEDチカチカしません。

わけがわからなくなっていたので、16MHzの水晶と33p*2をブレッドボードに実装し、Fuseを16MHzの水晶を使用する設定(Arduinoボードと同じ設定)に書き込み、スケッチもArduino Unoの設定でコンパイルした.hexファイルを書き込みましたが、同様に動かない。

少し悩んだ後、書き込んだATmega328Pチップをこの間作成したArduinoボードに差しかえると、LEDがチカチカしました!
と、いうことは、書き込みはちゃんとできていて、ブレッドボードに実装した回路に問題があるということになります。
超単純な配線なのに、なんでだー。としばし悩み、同様にブレッドボードに実装している例をArduinoホームページに見つけて読んでみる(こちら)と、重要なヒントが。

真ん中へんに、
Pin 20 – AVcc – Suppply voltage for the ADC converter. Needs to be connected to power if ADC isn’t being used
とあります。つまり、AVccをつながないと動かないよ。ってことです。
というわけで、電源関係の配線をはしょらずにつないであげたら無事にLEDチカチカしました。わかってみれば単純な理由でしたが悩みました。
DSCN3228
これで、ソフトをいろいろ変えたりして試すことができるようになります。あーよかった。

ついでにAVRISP mkIIをブレッドボードに接続するのがちょっと厄介なので、ISPの6ピンコネクターをSIPに変換する基板を作ってみました。
DSCN3229
こんな感じ。いろいろと工夫している人がいますが、私は基板の配線が一番楽になるようなピン配置にしました。ので、ジャンパー線がたくさん要ります。まあ、どうってことないです。

AVRISP mkII でArduinoのスケッチを生AVRチップに書き込む方法のまとめ。
1. スケッチの.HEXファイルが残るようにする。
Arduino IDE のpreference.txt の場所を調べて、そこに、build.path=HEXファイルを置きたいディレクトリ
を書き込む。
2.スケッチをビルドすると、先ほど指定したディレクトリに.HEXファイルができるので、これをAtmel studio 6 のtools->device programmingからファイルを指定して、書き込む。
3. fuseビット、lock ビットを書き込む。
Arduino Unoと同じ値を試して問題なしでしたが、今後8MHz内蔵RC発振器の設定やさらに低速な設定を試していきます。

これでOKのはず。
ブートローダーを作成してもいいのですが、ブレッドボードの方はシリアルで書き込むI/Fを作っていないので、直接スケッチを.HEXファイルにコンパイルして、ISPから書き込んで動かすのが一番簡単そう。boards.txtを適切に設定したものを作るだけで、Arduinoの豊富なライブラリを使った楽ちんプログラミングができるのはとても良いと思います。

ふと空を見上げると、すっかり冬空って感じ。手持ちのカメラで手持ちで空を写してみたら、月とオリオン、シリウスが写ってました。ちょっとぶれているけど・・・
DSCN3233

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