カテゴリー別アーカイブ: 電子工作

自作Sanguino

ArduinoDuemilanove328 (ATmega328)ではピン数やメモリーが足りなくなった場合、ArduinoMega(ATmega1280)という選択肢があります。

ArduinoMegaは以下のようにDuemilanove328に比べて大幅に拡張されています。

Duemilanove328 Mega
デジタル入出力ピン 14本 53本
アナログ入力ピン 6本 16本
flash memory 32KB 128KB
RAM 2KB 8KB

しかし、値段が、Duemilanove328が約¥3,200なのに対し、Megaは約¥7,000と値段もメガです。

また、MegaのATmega1280は今のところ入手が簡単でないのと、表面実装パッケージ(TQFP64)なので、自作のハードルは高いです。

SanguinoはATmega644Pを使用したArduino互換機(拡張機)で、以下のスペックとなります。Duemilanove328とMegaの中間といったところでしょうか。

Duemilanove328 Sanguino Mega
デジタル入出力ピン 14本 24本 53本
アナログ入力ピン 6本 8本 16本
flash memory 32KB 64KB 128KB
RAM 2KB 4KB 8KB

また、ATmega644PはDIPパッケージなので、ブレッドボードで簡単に使えます。

日本ではSanguino互換のマイクロファン製REDUINO-GHOST644Uが入手しやすいと思います。ただし、完成品ではなくキットです。約¥3,780で販売されています。

Sanguinoについて、詳しくは↓を参照してください。

http://www.microfan.jp/sanguino

ということで、Sanguinoを作ってみました。

ATmega644Pは秋月で¥500で購入しました。

f:id:studio_k:20100807000948j:image:w320

■以下は導入メモ。

回路は↓を参考に。

http://sanguino.cc/hardware

自作arduinoの時は内蔵オシレータを使用して8MHzで動作させましたが、Sanguinoは8MHzのブートローダが用意されていないので(自分でコンパイルすれば可能なようですが)、クリスタルを使用して16MHzで動くようにしました。セラロックの方が回路は簡単になりますが、ATmega644Pではセラロックは安定しないというような情報がありましたので、とりあえず今回はクリスタルを使用しました。

arduino-0018がインストール済みとします。

http://code.google.com/p/sanguino/downloads/list からSanguino-0018r2_1_4.zipをダウンロードし、

Sanguino-0018r2_1_4.txtに従い、解凍後のSanguinoをarduino-0018\hardware\の下にコピーします。(arduino-0018\hardware\Sanguinoになる)

ブートローダは以下を使用します。

D:\Sanguino-0018r2_1_4\Sanguino\bootloaders\atmega644p\ATmegaBOOT_644P.hex

ブートローダーの書き込みとFuseBitの書き込みは↓を参考に。

http://www1.parkcity.ne.jp/kama/Arduino.htm

http://pc.watch.impress.co.jp/docs/column/musashino_proto/20090806_307235.html

Arduino IDEから”Tools”-“Board”で”Sanguino”を選択

後はArduinoと同じように使えます。

※8/13 文章全体を見直しました。


Interface誌6月号 SH-2A基盤

先日発売された、Interface6月号にはSH-2A基盤が付録で付いてきます。

SH-2Aはクロック:144MHz/RAM:1MBとのことで、過去の付録基盤を含めて最高クラスのスペックです。

先日Amazonで予約していた2冊が届きました。記事をざっと読み、基盤単体としてもお買い得だと思うので、さらに2冊追加購入することにしました。

これまで、付録基盤がつくたびに(複数冊)購入し、解説本等でも勉強しつつやっと使えそうかなというところで、次の付録基盤(付きの雑誌)が発売されて、、、ということを繰り返してきましたが、そろそろターゲットを絞った方が良いのではないかと今更ながら気づきました。

機能・性能・入手性を考慮し、今後は以下の2系統で行きたいと思います。

ハイスペック:SH系

ロースペック:AVR系

これからしばらくは今回のSH-2A基盤で遊んでみたいと思います。

思えば、初めて購入した付録基盤(付きの雑誌だってば!)はInterface2006年6月号のSH-2基盤でした。(これはあまり評判はよくありませんでしたが)こちらも3枚ほど転がっていますがまだ使えると思います。

こちらで紹介した2足歩行ロボはこのSH-2基盤でした。


Arduino倒立振子にジャイロセンサーを追加

だいぶ間が開いてしまいましたが、、、Aruduinoで作った倒立振子ジャイロセンサーを搭載して試してみました。
結果は2・3秒は立つようになりましたが、まだまだうまくいきません。
制御のやり方が根本的に間違っているのだと思います。
モータードライバを子供に返さないといけないのと、他にやりたいこともあるので、倒立振子はしばらくお休みします。


ジャイロセンサー

秋月の2軸ジャイロセンサーモジュール(AE-GYRO-SMD)を試してみました。

f:id:studio_k:20100315225047j:image:w240

ジャイロセンサーは回転の角速度が取れるはずなのですが、何かおかしいです。

回転させた後、回転を止めたときに反対向きに回転させた時の値になってしまいます。(うまく説明できませんが。)

WEB上の情報を調べたところ、温度ドリフトの影響を除去するためのハイパスフィルターが影響していることがわかったので、C6, C7をショートしたところ、それらしい値が取れるようになりました。

【参考】http://d.hatena.ne.jp/n-u-ki/20100216/p2

しかし、センサーメーカー(村田製作所)の回路例と同じなのですがね。。。

センサーを温めたりすると、値が変わるようになってしまいましたが、プログラムの工夫でなんとか回避できると思います。


Arduinoで倒立振子に挑戦

これまで実験してきたもので倒立振子を作成してみました。
f:id:studio_k:20100314195551j:image:left:w240

CPU: Arduino
センサー: 加速度センサー(KXM52-1050)のみ
モータードライバ:ダイセン電子工業 モータードライバ
モーター:ダイセン電子工業 ギヤドモーター(30:1)

ハードは子供に作ってもらいました。

結果は。。。写真で手が支えていることから分かるように、うまくいきませんでした。
それらしい動きはするものの1秒も持ちません。

加速度センサーで重力加速度を計測することで傾きが分かるだろうと思いましたが、(懸念はしていましたが)モーターによる動きが加速度センサーに影響を与えてしまっているようです。
倒立振子の制御についてWEBを検索してみたところ、ジャイロセンサーとロータリーエンコーダで制御しているものが多いようです。

手持ちのジャイロセンサーがあるので、次回試してみたいと思います。


Arduino+ダイセンモータードライバー(その3)

f:id:studio_k:20100306175500j:image:w240

いろいろ実験して、前回から分かったこと。

■生AVR+ダイセンモータードライバー

  • ダイセンモータードライバーの6番ポートを使用するとおかしくなる。
  • WinAVRのコンパイルの最適化は関係ない。(-Osでも問題なし)
  • データ送信後の終了処理の前のWAITは少し必要(1msぐらい)。

■Arduino+ダイセンモータードライバー

  • ダイセンモータードライバーの6番ポートを使用しなければ問題なし。
  • スレーブアドレスは1ビット右シフトする。Wire.beginTransmission(0x14>>1);

モータードライバの1ポートが使えないものの、これで万事問題なしでした。

そういえば、以前からこのモータードライバの6番ポートはおかしいとのうわさがあったのですが。

もっとも、今回実験したボードは1年ぐらい前に購入したものですので、今は直っているかもしれません。

また、結局関係なかったのですが、Arduino IDEでコンパイルの最適化オプションは変えられないようです。

Arduino IDEのソースを確認したところ、コンパイルオプションのところがハードコーディングされていました。

pde.jarをjarコマンドで展開して、classファイルをバイナリエディタで変更したところ、

最適化オプションを変更できたことは確認できました。

【最終版スケッチ】

b[5] = 0; のところを b[5] = 50; とかにすると、すぐに止まってしまう。


Arduino+ダイセンモータードライバー(その2)

前回、うまくいかなかった、Arduinoでダイセンモータードライバーを動かす実験ですが、少しゴール(スタート?)が見えてきました。

まず、先日の生AVRブレッドボードで動かしてみます。

前回のコメントでぽよこまだんなさんからアドバイスいただいて、SCLとSDAはモータードライバー側でプルアップされているので、直結すれば良く、配線はすっきりです。

f:id:studio_k:20100228212904j:image:w240

プログラムはI2Cのところから作らないといけないので、ここを参考にしました。

最初は一応動くものの、すぐに止まってしまう状態でしたが、以下の2点でだいぶ改善できました。

  • WinAVRのコンパイルの最適化を-Osから-O0または-O1にする。
  • データ送信後の終了処理の前に少しWAITを入れる。

これで5分ぐらい持つようになりました。

Arduino上での動作は次回へつづく。