2011年9月28日水曜日

Arduino Uno R2



いつの頃からか、Arduino Uno がR2 というバージョンになっています。
(Arduino MEGA2560 もR2 に)

マイナーチェンジなので、通常の使用であれば、特に違いを意識せずに使えます。

最大の違いは、ATmega8u2 用の ICSP 端子が標準で付いています。
また、以前のバージョンのArduino Uno の様に、DFU モードに入るために、抵抗をつける必要はありません。


ICSP の5番、6番 (USB コネクタ寄りの2つ) をそのままショートすれば、DFU モードに入ります。


通常接続のArduino



DFU モードの Arduino


その後の DFU プログラミング の手順は以前と同じです。

Arduino Uno (R2) DFU プログラミングの手順

1) Arduino Uno をPC にUSB で接続
2) USB コネクタに近いICSP 端子の5-6間をショート(して離す)
3) dfu-programmer (という名前のソフト)を使用して、ATmega8u2 用のファームウェアを書き込む
$ sudo dfu-programmer at90usb82 erase
$ sudo dfu-programmer at90usb82 flash Arduino-usbserial-uno.hex
$ sudo dfu-programmer at90usb82 reset

4) USB コネクタを抜き差しして再起動

簡単になりました。


Arduino as ISP


Arduino はUSB シリアル接続で、簡単にプログラムを書き込むことが出来ます。
その他に、ICSP (In Circuit Serial Programming) 端子で書き込む方法があります。

この方法は、普通の使い方をする上では、全く必要ありません。
これまでこの端子は、気になりつつも使わずにいました。
前回、変則的ながら使う事になったICSP 端子の、本来の使い方を調べてみました。

ICSP を使ったプログラマは市販品を購入することも、自作することもできます。
今回は、「Arduino を使ったISP プログラマ(書き込み器)」というものがあるので、使ってみます。(ISP (In-System Programmer) とICSP は同じような意味だと思います。)

Examples の中にある「ArduinoISP」というプログラムを書き込みます。

注意:このプログラムはArduino Uno には対応していないそうです。

このプログラムを書き込んだArduino (2009: Duemilanove 以前) をプログラマとして使い、他のArduino、あるいは生のAVR にプログラムを書き込む事が出来ます。
Bootloader を書くこともできるので、2台目、3台目のArduino を自作する際に活用できます。


2台のArduino を接続します。(ISP:書き込み器, TARGET:新しく書き込む方、ICSP のピン番号は基板上の白いマーカーを1番に)

実際やってみると、例によって罠が有りました。

error: avrdude: stk500_getsync(): not in sync: resp=0x15

Mac 環境では、オートリセットが邪魔をするそうです。
対処法がこちらで解説されていました。

上記サイトを参考に、ISP側の 5V-Reset 間に 110Ωの抵抗を挿入して対処しました。
(上記サイトの「ATmega168 とATmega168p の問題」は、ATmega328p を使用する場合は関係ありませんでした。

配線を簡単にするため、専用のケーブルを作成しました。
これで、生のAVR にブートローダーやプログラムを書き込む事が出来ます。



Arduino ISP を使ったブートローダーの書き込み手順

1) Arduino (Duemilanove以前) に通常の手順で「ArduinoISP」 を書き込む
2) ISP 仕様のArduino と、新しくプログラムを書き込むArduino を接続する

3) Tools > Serial Port は1) のArduino を接続したポートを選択する。
4) Tools > Board は新しくプログラムを書き込むArduino に合わせる。
 ATmega328p に Uno 相当のブートローダー(Optiboot) を書く場合は "Arduino Uno" を、
 Duemilanove 相当のブートローダーを書く場合は "Arduino Duemilanove or Nano w/ ATmega328" を選択。

5) Tools > Burn Bootloader > w/ Arduino as ISP を選択する(ブートローダーの書き込み開始)

Arduino ISP を使ったプログラム書き込み
接続方法は上記手順と同じ、ただし、書き込み方法を設定ファイルで指示する必要があります。
preferences.txt にupload.using=arduinoisp を書き込む方法と、board.txt に同様の記述をする方法があります。
前者は、今後の書き込みを全てISP で行うので、後者をお勧めします。
設定ファイルの場所や、記入方法は、こちらを参考に。

*******

「簡単・お手軽なArduino」からちょっと離れてしまいますが、秋月の基板を使ってArduino を増産したり、ATmega8u2 をいじる場合に、ICSP 経由の書き込みは便利ではないでしょうか。


2011年9月20日火曜日

Arduino MEGA と旧Ethernet Shield


Arduino MEGA は、普通のArduino とShield 形状互換になってるので、大抵のシールドはそのまま使用できる。はずなのですが、、、
Ethernet Shield の様に、SPI 接続をしているものは要注意です。

私の使っている 「旧 Ethernet Shield」は、MEGA と互換性がありません。microSD のスロットが付いている「新 Ethernet Shield」は、そのまま MEGA で使用可能です。

原因は、MEGA(ATmega2560) とUno(ATmega328P) でSPI のピンアサインが異なるためです。
旧EthernetShield はATmega168/328 に合わせて、デジタル 11,12,13 番ピンを使っていました。新EthernetShield はどちらでも使えるよう、ICSP のポートからSPI の信号を取るようになっています。

対処法ですが、このように接続することで、プログラムの変更なしに動作させることができました。
(古い情報ではプログラムの修正が必要、というものがありますが、IDE 0022 では修正不要です。)

(Shield) - (MEGA), 11-51, 12-50, 13-52 を接続


詳しく見ると
旧EthernetShield 側


Arduino MEGA 側


MOSI,MISO,SCK の3本を接続します。(SS はそのまま)MEGA 側はDIGITAL でもICSP でも、使いやすい方から取ればOK です。

この接続では、MEGA の11,12,13 と接続したままになってしまいますが、特に問題は無いようです。

Arduino MEGA 購入



Arduino MEGA 2560 を買った!
というだけなんですが、、、

これまで何となく敬遠していました。

一番の理由は値段 (6495円で購入) ですが、いろいろ努力がたりない感じがするんですよね。
「ポートが足りなければMEGA にすれば良いよ!」というのが。

実際、こんなにポートの多いアマチュア向けマイコンボードはなかなか無いです。デジタル54 本、アナログ16本の 計70本が苦もなく使えます。(Arduino Uno はデジタル 14本, アナログ 6本, 計20本)

ファンクションキーなしの小型キーボードとか、6 オクターブくらいの鍵盤は直結できてしまいます。8x8 のLED マトリクスも、8桁の7 セグなんかも、ダイレクトに制御できます。配線が大変なのでやりませんが。

FLASHEEPROMRAM
MEGA(ATmega2560)256 KB4 KB8 KB
Uno (ATmega328P)32 KB1 KB2 KB


Uno に比べて大容量なので、メモリ大喰らいなプログラムをつくりたいなと思っています。

2011年9月16日金曜日

Arduino Ajax Web Server

MASHUP AWARDS 7 というコンテストが開催されています。
先日、その関連イベントの一つ(Mashup Camp in Tokyo)に参加しました。

Web のAPI はあまり馴染みがなかったのですが、なかなか面白そうです。
この技術をArduino のWeb サーバーに使えば、iPhone とArduino の連携手段として、有力なのではないでしょうか?

次のような手順で作成していきました。

1) GET (HTTP のGET) でArduino Server に値を渡せるようにする
2) XMLHttpRequest でページ遷移なしに値を取得できるようにする
3) JSON 形式で値を返すようにする
4) JSONP 形式で値を返すようにする

Arduino のプログラムは、IDE 標準サンプルの WebServer に少し手を加えただけです。
URL の末尾に付けるオプションに対応するのと、返すHTML データ(の中のJavaScript) に仕掛けがあります。



Arduino のプログラムはこちらです。
<新>http://djgj.sub.jp/TETRASTYLE/arduino/ajax_slim.txt
<旧>http://djgj.sub.jp/TETRASTYLE/arduino/Ajax_WebServer.txt

変更点(2015.10.21):
- Arduino.cc のIDE 1.6.5 に合わせた修正
- メモリ使いすぎだったので変数や関数名、値を短く変更
- "Access-Control-Allow-Origin: *" を追加
- JSONP からJSON に変更
- 外部ホストから操作するhtml のサンプルも追加→(サンプル)
  (Arduino サーバーのIP アドレスは 1) ページ埋め込み 2) ?host=xxx.xxx.xxx.xxx で渡す 3) ページ内のフォームで書き換える の3通り用意しました。

<説明は旧のまま>
Web ブラウザ(IE 未確認) からアクセスします。
サーバーのIPアドレス (標準では http://192.168.1.177/) にアクセスすると、動画のような画面になります。

JSON(P) でデータのみを取得する場合は
<-- data-blogger-escaped-br="" data-blogger-escaped-http:="">
返ってくる値
--> cb({"D":[D0,D1,D2,D3,D4,D5,D6,D7],"A":[A0,A1,A2,A3,A4,A5]});

デジタルポート(D0 - D7) のトグル(ON/OFF) は、各ポート毎、個別に送ります。(On と Off の指定はなく、現在の状態を反転します)
<-- data-blogger-escaped-btn="0<br" data-blogger-escaped-http:=""> <-- data-blogger-escaped-btn="1<br" data-blogger-escaped-http:=""> ...
<-- data-blogger-escaped-btn="7<br" data-blogger-escaped-http:="">