いろいろ実験して、前回から分かったこと。
■生AVR+ダイセンモータードライバー
- ダイセンモータードライバーの6番ポートを使用するとおかしくなる。
- WinAVRのコンパイルの最適化は関係ない。(-Osでも問題なし)
- データ送信後の終了処理の前のWAITは少し必要(1msぐらい)。
■Arduino+ダイセンモータードライバー
- ダイセンモータードライバーの6番ポートを使用しなければ問題なし。
- スレーブアドレスは1ビット右シフトする。Wire.beginTransmission(0x14>>1);
モータードライバの1ポートが使えないものの、これで万事問題なしでした。
そういえば、以前からこのモータードライバの6番ポートはおかしいとのうわさがあったのですが。
もっとも、今回実験したボードは1年ぐらい前に購入したものですので、今は直っているかもしれません。
また、結局関係なかったのですが、Arduino IDEでコンパイルの最適化オプションは変えられないようです。
Arduino IDEのソースを確認したところ、コンパイルオプションのところがハードコーディングされていました。
pde.jarをjarコマンドで展開して、classファイルをバイナリエディタで変更したところ、
最適化オプションを変更できたことは確認できました。
【最終版スケッチ】
#include <Wire.h> #define TJ3M_ADDR (0x14>>1) byte b[6]; int i =0; void setup() { Wire.begin(); pinMode(13, OUTPUT); delay(100); } void loop() { Wire.beginTransmission(TJ3M_ADDR); for (int j=0; j<6; j++) { if (i==j) b[j] = 50; else b[j] = 0; } b[5] = 0; Wire.send(b, 6); Wire.endTransmission(); if ((i&1) == 0) digitalWrite(13, HIGH); else digitalWrite(13, LOW); delay(10); i++; if (i>=6) i=0; }
b[5] = 0; のところを b[5] = 50; とかにすると、すぐに止まってしまう。
PONTA 様
モッパーと申します。遅いコメントで申し訳ありません。
Arduino でダイセンモータードライバーを制御しようとしてハマり、こちらのサイトを随分参考にさせて頂きました。こちらでの動作報告が無ければ諦めたと思います。本当にありがとうございました。当方はちょっと現象が違うので、以下に当方での解決策をアップさせて頂きましたのでご報告させて頂きます。
http://moparlab.sblo.jp/article/32042991.html#comment
今後ともよろしくお願いします。