誰でもできる電子工作・プログラミング趣味ブログ

電子工作とプログラミングを趣味にする人口を増やすため、
誰でもできる電子工作とプログラミングを紹介します。

ESP-WROOM-02(ESP8266)でDCモータドライバ(DRV8830)をI2C通信で駆動

2015年10月29日 | 電子工作
今回のプロジェクトで最も重要な部分「ESP-WROOM-02でDCモーター制御」の実装報告。

これまでのブログで掲載した通り、DCモータの制御はTI製のDCモータードライバーのDRV8830を使用します。
また、ESP-WROOM-02とDRV8830はI2C通信を使用して制御を行います。

実は今回の実装は一筋縄ではいかず、結構苦労しました。
先回からの更新が遅れたのは、報告できる形に出来るまで時間を要したからでした。

苦労点は以下の3件
 1.DRV8830を表面実装タイプを購入したばかりにDIP化に苦労
 2.ESP-WROOM-02をブレッドボードに実装して動作させるのに苦労
 3.ESP-WROOM-02とDRV8830間の通信がうまくいかず苦労

それぞれ苦労した内容を以下に詳述します。

1.DRV8830を表面実装タイプを購入したばかりにDIP化に苦労
 実は秋月電子では、DRV8830をモジュール化した部品も販売されていたのですが、
 ピン配置が一列となった基板で幅を要する部品でしたので、自分でDIP化することに挑戦!

 <モジュール化されたDRV8830>
 http://akizukidenshi.com/catalog/g/gK-06273/ 1個170円

 半田付けを頑張れば何とかなるだろうと高を括っていたのですが考えが甘かった。
 モノが届いてチップの足間ピッチが予想以上に狭く、手持ちのコテ先よりも狭いことが判明。
 まず、勇気を出してコテを握るのに2日かかりました。

 素子を1個廃棄に追いやるまで実装方法を試行錯誤しながら取り組んだ結果、何とか成功しました。
 既知の方法かもしれませんが、一応方法ご紹介します。

 (1)まずは、変換基板側に半田をたっぷり載せます。ランド間は思いっきりショートした状態。
 (2)はんだ吸い取り(ソルダーウィック)を使用して、ランド間のショートを無くし、薄めのはんだ面にする。
   はんだを吸いすぎると素子が実装できなくなるので適度な量となるように調整。
 (3)もう片側も同様にはんだを載せた状態とする。
 (4)素子を基板に載せ、素子の足にはんだごてを当ててはんだを溶かす。
 (5)最後にもう一度はんだ吸い取りを足部分に当てて更に余分な半田を吸い取ります。
 (6)片側も(4),(5)と同じ要領で実施
 (7)最後はテスターで導通チェック!
 問題なければ、変換基板にピンヘッダを装着して完了です。2個目はコツを掴み短時間で実装できました。
 

 今回使用した変換基板とピンヘッダは以下の通り。
 ・MSOP(10ピン 0.5mmピッチ)-DIP化変換基板 (5枚入) 100円
  http://akizukidenshi.com/catalog/g/gP-06863/
 ・ピンヘッダ 1×40 (40P) 35円
  http://akizukidenshi.com/catalog/g/gC-00167/

2.ESP-WROOM-02をブレッドボードに実装して動作させるのに苦労
 次にESP-WROOM-02をブレッドボードに実装して動作させようとしたのですが、何故か動かない。
 実は先回アップした回路図に誤りがありました、、、

 ESP-WROOM-02起動時に、IO0, IO2, IO15の端子状態で通常モード起動、フラッシュモード起動を切り分けていることが判明。
 てっきり上記3端子はフラッシュモード起動時にのみ端子処置が必要と思っていましたが、通常起動時も必須とのことです。
 通常モード起動時は
  IO0 : HIGH
  IO2 : HIGH
  IO15 : LOW
 フラッシュモード起動時は
  IO0 : LOW
  IO2 : HIGH
  IO15 : LOW

 上記の端子処理が必要となります。先回アップした回路図は上記IO0とIO15がオープン状態であったので修正済みです。
 端子処理後、問題なく動作しました。

3.ESP-WROOM-02とDRV8830間の通信がうまくいかず苦労
 ESP-WROOM-02にプログラムを書き込み実装するも、DRV8830とI2Cの通信が成立せず、
 デバッグ用としてI2C通信最後の戻り値(0~4の値)をLEDの点滅回数でわかるように実装して動作確認をするも、
 常に戻り値は"2"のまま。戻り値"2"は、"スレーブ・アドレスを送信し、NACKを受信した"状態とのこと。
 送信しているスレーブアドレスが誤っているか、そもそも通信できていないかのいずれかであることは判ったのですが、
 原因が判らず、この問題を解決するのに3日かかりました。

 結論としてArduinoのwireライブラリを使用する場合、I2Cのスレーブアドレス指定は実際のアドレスから1bit
 右シフトした値を使用する必要があるようです。
 0bit目は自動で付加されるので、プログラム上は7bitアドレス指定となっていたのでした。

 今回DRV8830の端子A0とA1はオープンにした状態であったので、スレーブアドレスは0xC8(書き込み用)と0xC9(読み取り用)ですが、
 Wire関数に指定するアドレスは、1bit右にシフトした値の0x64とすべきだったのです。
 参考までにテスト用プログラム(スケッチ)を掲載しておきます。

  


上記苦労を乗り越え、最終的にモーター駆動できました。ブレッドボードの実装は汚いですが、ご勘弁下さい。


モーター駆動テスト回路図も参考までに添付します。




最新の画像もっと見る

コメントを投稿