サーボのコントロール


昨夜は遅くまでラジコンに実装予定の組み込みLinuxを触ってました。

組み込みLinuxのファーストステップとして、シリアル接続が前提となるのですが、RS-232シリアルケーブルがそのまま繋がると思っていましたら、組み込みのRS-232 は10pin だったのです!

9pinのRS-232 ケーブルは用意してたのですが、これには困りました。

実際使われるpinはTX/RX、GNDと3本のケーブルのみでしたので、ピンを直刺しすることで対応できました。

また、この話は後日まとめてから書きます。

今日はサーボの制御について書きます。

サーボの制御はArduinoというイタリア生まれのマイコンで行っています。

普通の基盤だと決まったことしか出来ませんが、Arduinoは普通の基盤と違い配線の仕方と、プログラム制御で様々なことが出来ます。

サーボのコントロール方法は、パルス幅の信号長で角度を制御します。

実際はサーボ向けにライブラリがあり、角度を指定するだけで制御が行えます。

気をつける点としては、ラジコンのシャーシの稼動域よりもサーボの稼動域が広いことです。

サーボの稼動域がシャーシの稼動域を超えるとサーボが負荷で嫌な音を立てて潰れます。

実際に潰しましたので間違いないです!

なので先にサーボを取り外し、ラジコンに付属のプロポと同じ稼動域であるか、確認をオススメします。

以下はサーボと前後のモーターをシリアル通信で制御するコードです。

Arduinoでは短いコードで簡潔に書けます。

よろしければ参考ください。

#include
#define servoPin 9
#define Motor 3
Servo myservo;

void setup()
{

pinMode(Motor,OUTPUT);

myservo.attach(servoPin);

Serial.begin(9600);

Serial.println(“Ready”);

}

void loop() {

static int v = 0;

if ( Serial.available() > 0) {

char ch = Serial.read();

switch(ch) {

case ‘0’…’9′:

v = v * 10 + ch – ‘0’;

break;

case ‘s’:

if (v <= 45) v = 45;

if (v >= 135) v = 135;

myservo.write(v);

Serial.print(v);

Serial.println(‘s’);

v = 0;

break;

case ‘w’:

if (v <= 0) v = 0;

if (v >= 255) v = 255;

analogWrite(Motor,v);

Serial.print(v);

Serial.println(‘w’);

v = 0;

break;

}

}

}

以下は簡易な回路図のつもりです。
電源は外部電源を利用してます。外部電源はvinのpinから電源を引きます。
サーボ制御

回路図に1点間違いがありました。
モーターからのワイヤはモスの真ん中にさします。モスに繋がるマイナス電源は端にさします。

, , , , ,

  1. #1 by aki on 2009年10月30日 - 10:41 AM

    ラジコンとパソコンを趣味でやっているのですが、こちらのサイトを見て是非私もやってみたいと思い、色々調べているのですが、マイコン等に関しては全くの素人なので、Webで掲載している構成をまずは、真似てみようと思っています。
    そこで、一つ質問なのですが、こちらで使われているArduinoはどのタイプを使われてるのでしょうか。
    よろしければ、教えてください。

  2. #2 by o2 on 2009年10月30日 - 11:24 AM

    はじめまして infoalive のo2です。
    Arduino Duemilanove 328 を使いました。

    マイコンや電気については専門に習ったことがない私でもArduinoは組むことが出来ましたのでお薦めです。

    他にも mini や nano も試しましたが、若干扱いが難しいです。
    Arduinoは楽しいので是非是非取り組んでください。財布は厳しいですが。。

  3. #3 by aki on 2009年10月30日 - 2:27 PM

    早速の返信ありがとうございます。
    こちらのサイトを参考にして、以下のマイコン等を購入し、チャレンジしてみます。
    もし、不足している物があれば、ご教授いただければ幸いです。
    ちなみにSWITCHSCIENCE(スイッチサイエンス)で購入予定です。
    ラジコン側
    デュアルモータードライバTB6612FNG
    Arduino Duemilanove 328
    XBeeエクスプローラ5Vマイコン用
    XBeeシールド
    PC側
    XBeeエクスプローラUSB
    XBee無線モジュール・チップアンテナ型

  4. #4 by o2 on 2009年10月30日 - 3:47 PM

    私でよろしければアドバイスいたします。

    XBee無線モジュールはx2用意が必要です。
    XBeeエクスプローラ5Vマイコン用とXBeeシールドはどちらかひとつで足ります。

    最小構成としては以下になります。
    デュアルモータードライバTB6612FNG
    Arduino Duemilanove 328
    XBeeシールド
    XBee無線モジュール・チップアンテナ型
    PC側
    XBeeエクスプローラUSB
    XBee無線モジュール・チップアンテナ型

    細かな調整としては、バッテリーの口を2.1mmのACジャックにし、Arduinoに電源供給しました。
    たぶん近所でも手に入ります。
    http://www.takkyparts.com/detail.php?sku=235-AP02&line=578

    後は、ブレッドボードや、ピンが各種必要となります。

  5. #5 by aki on 2009年11月2日 - 9:04 AM

    o2さん、ご丁寧にありがとうございます。
    参考になりました。
    Arduinoに電源供給するバッテリーが7.2Vを使用予定なので、どのように5Vにするか現在模索中です。

  6. #6 by o2 on 2009年11月6日 - 4:47 PM

    その後無事解決したでしょうか?
    7.2VをACジャックから電力供給した場合、Duemilanove の Power の 5V と VINの両方から電力が得れます。
    詳しくはswitch-scienceさんが日本語で紹介してるページがあるのでそちらをご覧ください。
    http://www.switch-science.com/trac/wiki/ArduinoDuemilanove

  7. #7 by aki on 2009年11月9日 - 6:51 PM

    o2さん、ご報告が遅れて申し訳ございません。
    現在、PCからUSBでArduinoに接続した状態で、マウスのドラッグに合わせて、サーボ・モータ制御まで、できるようになりました。
    Arduinoには、Webに記載されているPGを参考にさせて頂きました。
    マウスのドラッグに関しては、C#で座標を取得し、角度計算をした後、Arduinoに信号を送りました。
    今は、USB接続からXbeeを利用した通信制御にチャレンジ中です。

  8. #8 by o2 on 2009年11月9日 - 7:10 PM

    akiさん、サーボ、モーターの制御まで出来たということは、もうすぐ完成ですね。
    今月開始したところなのに凄いです。
    私はここまで到達するのに四苦八苦しました(^^;

    今日はQステアについて投稿しました。
    技術として赤外線はとても面白いです。よければご一読ください。

  9. #9 by aki on 2009年11月9日 - 8:06 PM

    すみません。入力ミスです。
    サーボ・モータではなく、サーボだけです。
    モータに関しては、TB6612FNGの配線が理解できず、
    Xbeeと同時変更で模索中です。

  10. #10 by o2 on 2009年11月9日 - 11:41 PM

    TB6612FNGは確かにややこしいです。
    blogにも書いてませんので、ここで写真の回路に沿って説明まとめます。
    http://www.pololu.com/picture/0J927.600.jpg

    ○接続するPINは以下になります。※動かすモーターはひとつの前提
    – 写真左側
    GND – GND
    VCC – Power 5V (2.7 – 5.5 V)
    AO1 – モーター接続
    AO2 – モーター接続
    VMOT – Power VIN (4.5 – 13.5 V)

    – 写真右側
    PWMA – digital
    AIN1 – digital
    AIN2 – digital
    STBY – digital

    右側のAIN1のみLOW、他のdigitalを全てHIGHにすることで前進します。
    詳しくは4ページ目の「H-SW制御ファンクション」を参照ください。
    http://www.semicon.toshiba.co.jp/docs/datasheet/ja/LinearIC/TB6612FNG_ja_datasheet_080509.pdf

    モーターに繋ぐAO1、AO2はプラスマイナスどちらでも問題は起きませんが制御したい方向になるように接続ください。

    また、電圧を変えることでモーターの速度を調整出来ます。
    私はPWMAをanalogWriteにし、速度を変えてたのですが、資料の通りだと間違えてたかも知れません orz

    TB6612FNGは以前国内では手に入らなかったそうです。
    その為かネットに殆ど情報がありません。参考になれば幸いです。

  11. #11 by aki on 2009年11月10日 - 9:23 AM

    o2さん、ご丁寧にありがとうございます。
    TB6612FNGに関しては、これでクリアできそうです。
    Arduino側で少々問題が発生しました。
    Arduinoの上にXBeeシールドを乗せているため、Arduinoのpower部分が全て隠れてしまっているため、ジャンパワイヤが接続できません。
    ハンダで直に接続するべきか悩んでいます。
    あまり得意ではないので。
    o2さんは、すごいですね。
    短期間でここまで知識を持たれて尊敬いたします。

  12. #12 by o2 on 2009年11月10日 - 10:19 AM

    そうです。XBeeシールドで隠れますよね。。
    私は堅めのジャンパワイヤを曲げました。
    http://akizukidenshi.com/catalog/g/gP-02315/

  13. #13 by aki on 2009年11月10日 - 11:45 AM

    o2さん、それは思いつきませんでした。
    ありがとうございます。私もo2さんの方法を利用させていただきます。

  14. #14 by aki on 2009年11月24日 - 10:31 AM

    ご無沙汰しております。近状報告をします。
    TB6612FNGに関して悩み続けた結果、私は初歩的なミスをしているのに気づきました。
    私の使用しているモータが540を使っているため、TB6612FNGの電流では足らなかったのが原因でした。
    お恥ずかしいです。
    しかたがないので、当初ラジコンに付けていたアンプをArduinoと接続し、モータ制御をすることでとりあえず動いています。
    現状はWiiリモコンのボタンでラジコン制御をできる所まできています。
    wiimoteLibを使用してC#でPGを組んでいますが、XYZ軸を使用したラジコン制御が安定しないため、PGを色々と考えなおしている所です。
    PGが完成できましたら、また報告します。

  15. #15 by o2 on 2009年12月2日 - 3:03 PM

    ご無沙汰しております。

    Duemilanove の VINからであれば、RS-540であれば問題なさそうですよ?

    モーター装着できてなによりです。
    私はアンプから装着したことがないので、一点気になるのですが、アンプは3本の線ですよね?前進しか制御できないことはないでしょうか?

    私は詳しくないので返答もしどろもどろですが、又、色々と聞かせてください。

  16. #16 by aki on 2009年12月3日 - 11:04 AM

    @o2
    TB6612FNGは連続最大で1A出力に対して、540の適正電流が6Aであり、モータドライバ使用時にモータを制御仕様とすると、モータ側から駆動しようする音らしいものは聞こえるのですが、動かなかったために単純に電流不足と考えていました。
    私の考えミスかもしれないですね。
    アンプに関しては、o2さんの言うとおり電源・GND・信号の3本線になっています。
    PWMからanalogWite()の値で、正転・反転等・速度制御が可能でした。

    wiiリモコンの制御ですが、やっと完成しXYZ値を利用して、傾きによる前進・後進・速度・ハンドルが可能になりました。

  17. #17 by o2 on 2009年12月4日 - 10:18 AM

    ラジコン制御おめでとうございます。
    試していなかったアンプから制御できるのですね。また活用させていただきます。

  18. #18 by o2 on 2009年12月5日 - 4:18 PM

    私も早速akiさんに習いアンプをハックしました。

    analogWiteの値は以下の結果となりました。
    前進 63←187←静止→198→254 後進

    前進は数字が少ない程速く、後進は多い程速い結果となりました。
    バックへの切替は静止信号?(255、0、2〜?)を送る必要があるようです。
    どうも静止信号からバックへの切替がうまく行かない時があります。
    delay(1000)くらい与えると問題なく動作しました。

    アンプの制御がanalogWiteで可能であったとは驚きでした。
    情報ありがとうございます。

  19. #19 by aki on 2009年12月8日 - 9:28 AM

    o2さん早速されましたか。
    行動がお早いですね。私も見習わないと・・・
    アンプの件ですが、ご存知かもしれませんがアンプの種類によって、前進のみ(ラジコンレースで使われたりします)前進・後進の大きく2種類に分けられるのですが、(最近は切り替え可能)通常ラジコンプロポで前進から後進に切り替えるとブレーキング機能が働きます。
    (アンプ側の処理です)その関係上、前進からすぐに後進にしても反応しませんので、前進から後進へのタイムラグを作る必要がります。

    私は、ラジコンの受信機をarduinoに接続して、プロポから流れてくる信号をチェックしてアンプ制御が可能だと思いました。

(will not be published)

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)