2020年1月31日金曜日

DRV8830をESP32-DevKitCで動かした話




 卒論発表が終わった日にモータ回してる中の人です.発表自体は特に問題なく終わったので,あとは卒論を提出するのみです.ヤッタネ.
 今回はESP32でDRV8830を動かした話です.I2Cで制御できるMDとしては一番ポピュラーなICで中の人も何度か使っていますが,ESP32と一緒に使ったことがありませんでした.復習もかねて動かしてみましょう.



1.回路回り

 IC自体は絶対最大定格が7Vとなっていますが,実際は5Vあたりが上限になります(実はDACの関係で5V一択になります).ICの裏面にはGNDパッドがあるため,回路設計やはんだ付けの際には十分気を付けてください.
 VCCが1つだけなので,ロジック電圧とモータ電源電圧が一致するはず(と思いたい)です.ロジック電圧とモータ電源電圧が違う場合は,レベル変換のICや回路をロジック側に追加します.
 モータにかける電圧はDACで生成しており,0.48[V]から5.06[V]のまで57段階で調整できます.昇圧回路などはないので,この範囲をフルに使う場合は電源電圧を5V以上になります.フルにしないとあまり使えないので,結局モータ電源電圧は5V一択になります.(6Vとかを生成しても結局5.06Vで頭打ちになる)
 パスコンは0.1uFが最低になっていますが,10uFを突っ込んだ方が安定します.あとはモータの端子にセラコン直付けがでどうにかなります.
 I2C線のプルアップは様子を見つつやってください.単体で動かすならSCL/SDAともに10kで動きました.
 ISENSEの抵抗は適宜付けますが,電流制限がいらない場合はGNDに落としておきましょう.
A0/A1はアドレスの設定に使います.各ピンをGND/未接続/VCCのどれかに設定することで変えられます.
 FAULTnはレジスタ1(FAULT)と同期する形で,障害を通知します.使わないときは未接続にするか,抵抗を介してVCCにつないでおきましょう.障害が発生したときにはLowになるので,LED(と電流制限抵抗)をつけておくことでレジスタを読まなくても障害発生がわかります.

参考:シリアル・インターフェイス内蔵、低電圧モータ・ドライバ 日本TI

2.I2C

 ユーザが叩くI2Cのレジスタはわずか2本と,わかりやすい構造です.

2.1アドレス

 A1/A0ピンでアドレスを指定するのですが,データシート上ではアドレス(書き込み)とアドレス(読み込み)とありますが,DRV8830は7bitアドレスのはずです.
 これは,I2Cの仕様として,7bitのアドレスの後に読み込みか書き込みかを示すビットを付与する仕組みになっているためです.よくよく見てみると,同じピンの状態における読み込み/書き込みアドレスは1つ違いになっています.
 ArduinoのWire.hでは,最後の1bitを自動付与するので,アドレスはデータシートにあるものの上位7bitを書き込むことになります.(A1=A0=0だと0xC0>>1 = 0x60)

2.2レジスタ0(0x00)

 出力電圧や回転方向の指定はここで行います.
 ┌────┬──┬──┐
|D7- D2  |D1 | D0 |
 ├────┼──┼──┤
 |VSET    |IN2 |IN1|
 └────┴──┴──┘
 VSETがモータの電圧,D1/D0で回転の仕方を決めます.
 VSETは0x06から0x3Fまでの整数を設定します.もし電源電圧が0x3F(=5.06[V])より低い場合は,電源電圧以上の電圧を指定しても出力されません.
 D1/D0=0で惰性,1で逆転,2で正転,3でブレーキと,普通のMDの方向指定とあまり変わりません.

2.3レジスタ1(0x01)

 障害通知用です.
 ┌────┬────┬───┬──┬───┬──┬────┐
|D7        | D6-D5 | D4    | D3 | D2   | D1 | D0       |
 ├────┼────┼───┼──┼───┼──┼────┤
 | CLEAR |未使用 |ILIMIT|OTS|UVLO|OCP| FAULT  |
 └────┴────┴───┴──┴───┴──┴────┘
 D7に1を書き込むときは,D0が0になっていることを確認しましょう.障害が発生している状態でやっても意味ないですからね.

参考:シリアル・インターフェイス内蔵、低電圧モータ・ドライバ 日本TI
   I2Cの基本データフォーマット 電子工作室

3.動かしてみた


 とりあえず動かしてみました.昔作った基板にたまたまDRV8830が載っていたので,使いまわしてます.秋月で売っているDRV8830のブレークアウトボードレベル変換IC10uFセラミックコンデンサ10k抵抗x2,5Vレギュレータ9V電池あたりで代用ができそうです.
ソースコードはこちらから.

4.まとめ

 ロジック電源とモータ電源が分離していないなど電源回りに癖がありますが,それを除けば扱いやすいMDです.



©2020 shts All Right Reserved.

2020年1月25日土曜日

GS1502動かしてみた


 卒論発表の資料作っているはずの中の人です.最近はスライドの作成に手間取っております,はい. 今回は自宅で熟成を重ねたサーボモータの話です.

 サーボモータでよく使われているのはRCサーボ(SG90とその無限回転Ver.)とかだと思います.ですが,今回使ったサーボモータはリニアサーボモータという,別の種類のサーボモータになります.RCサーボモータは回転運動をしますが,リニアサーボモータは直線方向の運動をするものです.

1.とりあえずGS1502を眺める


GS1502.1円玉はデカいだけ(すっとぼけ)
 この手のサーボは2010年ごろには存在したようで,小さなRC飛行機やRCヘリ向けなようです.
 パットコネクタ周りを見た感じだと,SG90あたりとあまり変わらない制御ができるのではないかなぁと思いました.赤が+Vcc,黒がGND,白がPWMだと考え,動かしてみることにしました.


2.眺めたので端子を交換する

 一通り眺めたので,ここから作業開始です.手始めに,ESP32-DevKitCには使いにくそうなコネクタをQiに交換しましょう(2550とQiってどっちがメジャーな呼び方なんだろうか).
とりあえずぶった切る
Qi圧着して終わり
 交換自体はさほど時間はかかりませんでした.PA-09いいね.

3.動かす

 交換も終わったのでマイコン(ESP32を使用)とつないで動作確認です...

仕様一切知らんのだが

 ええ,仕様が全く分かりません.とりあえずCR1630ってICが乗っていたので調べたのですが,データシートが見当たらない...
 まあ最初の方でSG90と同じ制御だろって考えたので,そのままの方法で動かしてみました.とりあえずコードの方はこちらから.


なんもしてないのに

動きました


 これはブログを書けとの思し召しなのだろうかって思いましたが,おそらくRCサーボと同じ規格で使うことを想定しているため動いたと思います.あくまで推測ですが.
 となると,パルス幅は700[us]-2300[us]で,1500[us]に設定すると真ん中で停止する感じですね.ArduinoのServoライブラリでいえば700[us]が0[deg],2300[us]が180[deg],1500[us]は90[deg]に相当するので,今回作ったコードよりもライブラリを使った方が楽に動作確認できそうです.

4.最後に

 意外とすんなり動きました.やっぱり(仕様ががっちり決まってる)共通規格は偉大.あと,ホビーラジコン系の部品は精度がいい上に小さい部品もあるので,物理的に動くものを作るときは有力な選択肢になりそうです.

©2020 shts All Right Reserved.