2019年5月22日水曜日

Raspberry PiでDRV8830を動かした話

 研究室課題の論文輪講やマウスの通信線の断線と圧着に四苦八苦している中の人です。
 数か月前に投稿したこちらの記事ですが、DRV8830だけ自分でコードを書いた?(ライブラリ使っただけでは?)ので少し解説していきたいと思います。(数か月放置してたのは内緒)


ICについて

DRV8830は1chのモータドライバで、最大の特徴はI2Cのみで出力電圧の制御を行う点です。別段精度の良いPWMが出ればいいのですが(Raspberry Piでも結構精度の高いPWMを出すことのできるライブラリとかもあるようです)、あまりあてにならない部分があったためI2Cが使えるこのモータドライバを使いました。
 

回路について


 DRV8830周りの回路はこんな感じです。データシート上ではVCCとGNDPWR間には0.1uF(最小)を挟めと書いてありますが、どうやら容量不足になりやすいらしいので追加で10uFを載せてあります。ISENSEには0Ω抵抗を入れましたが、ここの抵抗を変えることで最大電流を変えることができます。FAULTnは障害通知用の端子で、障害が発生するとLowになるのでLEDはこの向きでつけてあります。
 A0/A1はアドレス設定用の端子で、Low/NC/Highの3パターン^2=9通りで設定し、それに応じて書き込み用のアドレスと読み取り用のアドレスが変わります(データシートのp.12)。ここで注意したいのが、データシートでのアドレスがプログラム上のアドレスと一致しない(正確には1つシフトされている)点です。これについては後述。
 SDA/SCLは一応10kΩのプルアップ抵抗を挟んであります(多分いらない気もする)。

PCBについて


 今回は秋月とかで販売しているブレークアウトボードを使わずに自前でプリント基板を設計したのですが、このICの裏面にはサーマルパッドがあるため、普通のはんだでやるには少し工夫が必要でした。ざっくりいえばサーマルパッドに穴をあけ、裏側から熱を与えてはんだ付けを行う方法です。注意してほしいのが、穴からはんだを流し込むのではなくICをつける前にはんだで穴をふさいでおき、その後はんだごてを裏から当てるということです(参考:QFNパッケージをリフローオーブンを使わずにハンダ付け)。配線は...酷いです。

この配線は何があっても参考にしないこと。
(こんなにひどい状態でも動くあたりがすごい)

プログラミングについて

 今回はPythonから操作することとしました。I2Cを使う場合、幸運なことにPython-smbusが提供されているのでこいつを使うことにします。

#-*-coding:utf-8-*-
import smbus
import time

DRV8830_addr = 0x60
i2c = smbus.SMBus(1)
min_pow = 0x06
max_pow = 0x26

try:
    #test DC motor
    for i in range(min_pow, max_pow + 1, 1):
        i2c.write_byte_data(DRV8830_addr, 0, (i<<2)+1)
 time.sleep(0.1)

こんな感じで書けば動くはず。データシートではA0/A1をLowにした場合、書き込み時のDRV8830_addrは0xC0になるはずです。ですがI2Cの仕様上、7bitのICを区別するためのアドレスにR/W用のビットをくっつけているため、実際には0xC0 >> 1 = 0x60となります。最後のR/W用のビットはライブラリ側でつけられるようです。出力電圧と回転方向に関してはデータシートのp.13を見つつ、D7-D2に電圧、D1とD0に回転方向が来るように設定しました。

最後に

そこまで難しいわけではありませんが、データシートと違うじゃんみたいなところもあったのでそこだけ気を付ければ大丈夫な気がします。で、結構重要な話がありまして、実はこのIC...



単品なくなってたのね...(´・ω・`)
モジュールの販売は続けているようなのでほしい方はぜひそちらをお求めください。(この記事の大半意味なくなったのは?)


©2018 shts All Right Reserved.

0 件のコメント:

コメントを投稿