立命館守山高校 Sci-tech部 Arduinoからダイセン6CHモーターコントローラの動作成功。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Arduinoからダイセン6CHモーターコントローラの動作成功。

DSC_1184.jpg

モッパーさんのところのソースを改造した、Arduinoから6CHMCBを制御する関数できました。

#include <Wire.h>
char motor_pow[5] = {0,0,0,0,0}; //モーター出力用

void setup(){
Wire.begin(); // join i2c bus
}

void loop(){
Motor(0, 100);
delay(200);
Motor(0, -100);
delay(200);
}

//------------------------------------------------------------
//ダイセン6chモーターコントロールボード
//モーターnumは0~5
//入力valは-100~100 0でストップ 999でブレーキ
void Motor(int num, int val){
int mot;

if(val < 0 && val >= -100){
val = abs(val);
motor_pow[num] = val + 128;
}else if(val >= 0 && val <= 100){
motor_pow[num] = val;
}else if(val == 999){
motor_pow[num] = 128;
}else{
return;
}

Wire.beginTransmission(0x14>>1);
Wire.send(motor_pow[0]); // 1ch
Wire.send(motor_pow[1]); // 2ch
Wire.send(motor_pow[2]); // 3ch
Wire.send(motor_pow[3]); // 4ch
Wire.send(motor_pow[4]); // 5ch
Wire.send(motor_pow[5]); // 6ch
Wire.endTransmission();
}

結局はこのプログラムで上手く動いたのですが、少し紆余曲折がありました。
それが、このプログラムを動かしてダイセンモーターで正転と逆転を繰り返していると、切り替え時に1割ぐらいの確率でArduinoがフリーズしました。
この原因は、急にモーターを切り替えたときに流れる数AのPeak電流がArduino側に漏れて誤動作を起こしているのではないかと考え、ケーブルのSCLの間にその辺にあった適当な1.5kΩの抵抗を入れたら誤動作しなくなりました。
本当ならモータードライバの抵抗を弄るべきなのでしょうが、チップ抵抗とか弄るの嫌すぎるのでこういう対症療法に出るしか無かったです。
6CHMCBはI2Cにとってかなり悪影響のあるノイズを出すそうなので、もし酷ければシリアルを使って動かしてみます。


とにかく、長時間正確な動作が出来たので、モータードライバについてはだいたい目処が立ちました。
車体重量に対してモーターが非力なのも、四駆にする事で対処できそうです。
ついでに重心が下がって前が重くなるので坂で転がり落ちることも無いと思います。

次はラインセンサです。
前方に9個、後方に3個ほどつけようかと考えてます。
今年は似非PD制御ではなくちゃんとしたPD制御やりますよ…





今日のGOODアイテム
DSC_1179.jpg
バイスにスチールウール挟んだだけです。
が、これが半田ごて拭くのにかなり良い! めっちゃ綺麗に拭き取れます。
goot こて先クリーナー ST-40
この商品とよく似たアイデアですが、これよりずっと安くできます。
ボンスターロールパッド12個入
なんせたわしは12個入りで160円ですから。

もうちょっとほどいたら差し込んで使うことも可能かも知れません。

コメントの投稿

非公開コメント

ノイズの種類

ダイセン電子工業のモータードライバは、FETのゲート電流を考えておらず、ノイズが発生してもおかしくない回路です。
ダイセン電子工業の回路図を見て分かるとおり、FETのゲートと78HC08との間に抵抗がありません。

トランジスタとは電流を増幅します。
一方FETとは”電流を流さなくてもスイッチングできるトランジスタ”・・・ではありません。
たしかに、ゲートに電圧をかけて、しばらく時間が経てば電流は流れなくなります。
ゲートには隠れたコンデンサがあり(入力容量)、それを充電することによって、ソース・ドレイン間の抵抗が高くなったり低くなったりします。
http://www.semicon.toshiba.co.jp/shared/doc_pdf/com_pw-mosfet_03_200903.pdf の4ページ参照

だから、抵抗なしでコンデンサを充電するなんてことをしたら、瞬間的(数ナノ秒)の間、大電流が流れるのは当たり前です。
これがノイズになると考えられます。

ブログにも書きましたが、自作モータードライブ回路にて、実際にマイコンとFETのゲートの間の抵抗を47Ωにした場合、(理論上最大瞬間電流が約100mAのため)、I2C通信ができなくなりました。470Ωにした場合(理論上最大瞬間電流が約10mAのため)、I2C通信ができるようになりました。
他に条件は変えていません。
(使用したFET:2SK2232 & 2SJ334 FETに接続したマイコン:PSoC PSoCに指令を出したマイコン:Arduino またここでのI2C通信ができるorできないについては、もう一つArduinoを用意し、そのArduinoと PSoCに指令を出す用Arduino とのI2C通信が出来ているかどうかを調べました)

しかしながら、勘違いしていただきたくないのが、GNDを通じてモーターのノイズは伝わってこないということです(電磁波は考えない)。
だって、モーターのバッテリーとマイコン用バッテリーの間ではGNDしかつながっていませんし、信号線一本で電位差は伝わらないですよね。(そもそも電圧というのは2つを比べて初めて分かるものですから)
伝導ノイズが発生するときというのは必ず2本以上の信号線が共通しています。

だから、僕のこの仮説が正しければ、
①Arduinoと6CHMCB間のSCLの1.5kΩの抵抗をまずとって
②モーターを動かしてArduinoがフリーズすることを確認する
③他の条件は一切変えず、モーターだけを外して同じことをする
この実験をした場合、③でもArduinoが何回かに一回フリーズするはずです。

他人のブログで勝手な推測をした上、長々と書いてすみません。
------------------

自作半田クリーナーいいですね~。
それは思いつきませんでした。

No title

はじめまして。
香川県で子供たちのRoboCupJunior出場をサポートしているまつるとと申します。

ちょうどArduinoとダイセン6chモータドライバとの通信を試行錯誤していたのでかなり参考にさせていただきました。
ありがとうございます。

ちょっと気付いたことがあったのでコメントさせていただきます。
--
int motor_pow[5] = {0,0,0,0,0}; //モーター出力用

Wire.send(motor_pow[0]); // 1ch
--
と、int型のデータをWire.sendで送信しているようですが、
うまくいきましたか?

うちの環境ではうまくいかなくて、モーター4つを同時に回せませんでしたので、
char型(1バイトデータ)でキャストし直して使わせていただきました。


Wire.send()関数の引数がchar型だと思うので、
データのオーバーフローが起きないようにしてみると安全かと思われます。

勝手に書き込みさせていただき、失礼いたしました。

No title

>ZEROさん
いえいえ、自分は回路の知識が半端なので助かります。じゃんじゃん書き込んで下さって結構です。
ということは、FETのゲートと74HC08のパターンを剥いて間に抵抗を挟めば安定動作が見込める可能性があるということでしょうか。
抵抗とモーターを外してフリーズするかの実験の方、早速やってみたいと思います。
もし、おっしゃっている突入電流がノイズの原因であれば6CHMCBの改造か、若しくはもう東芝のモータードライバICで組もうと思います。
実はテストに使ったモーターにノイズキラーコンデンサがついてなかったので、そっちも確かめる必要があります。
もし時間があれば、オシロでの確認もしてみたいと思います。

>まつるとさん
はじめまして。
お役に立てて嬉しい限りです。
確かにchar型ですね。なんでこっちでは動いてるんでしょうか…
とりあえず、こういうのはバグの基なので修正しておきます。
ご指摘ありがとうございました。

No title

FETのゲートと74HC08のパターンを剥いて間に抵抗を挟むというのは、めんどくさいと思うので、VccとGnd間に数百μFのコンデンサをつけて、電流食ってもいいようにしてみて様子見たほうがいいかも知れません。

あと、Arduinoの電源をパソコンから供給している場合、もしくは、TJ3内部のDC-DCコンバーターを利用している場合は、電源電圧が4.5V付近の可能性があります。それによって、さらに不具合が促進されている可能性があります。
4.5Vを下回るとマイコンはリセットすると思って設計したほうがいいと思います。
一度テスターで確認してみてください。
もしどうしても4.5V付近であれば僕のおすすめの5V出力は
http://www.marutsu.co.jp/shohin_64922/
です。
これだと、モータのバッテリーからマイコンの電源へ供給しても問題なく動きます。ただし、その場合モータのバッテリーの電圧が一時的に下がることを想定して、このDC-DCコンバーターの"入力"にダイオードとコンデンサを入れることをおすすめします。

電源

FETのゲートと74HC08のパターンを剥いて間に抵抗を挟むというのは、めんどくさいと思うので、VccとGnd間に数百μFのコンデンサをつけて、電流食ってもいいようにしてみて様子見たほうがいいかも知れません。

あと、Arduinoの電源をパソコンから供給している場合、もしくは、TJ3内部のDC-DCコンバーターを利用している場合は、電源電圧が4.5V付近の可能性があります。それによって、さらに不具合が促進されている可能性があります。
4.5Vを下回るとマイコンはリセットすると思って設計したほうがいいと思います。
一度テスターで確認してみてください。
もしどうしても4.5V付近であれば僕のおすすめの5V出力は
http://www.marutsu.co.jp/shohin_64922/
です。
これだと、モータのバッテリーからマイコンの電源へ供給しても問題なく動きます。ただし、その場合モータのバッテリーの電圧が一時的に下がることを想定して、このDC-DCコンバーターの"入力"にダイオードとコンデンサを入れることをおすすめします。
プロフィール

立命館守山高校 Sci-tech部

Author:立命館守山高校 Sci-tech部
立命館守山高校、Sci-tech(サイテック)部のブログです。
研究の途中結果や、日記、連絡事項などを載せていきます。

主な成績
ロボカップジュニアレスキューセカンダリ2010
世界大会5位

やってること
バイオディーゼル燃料を使ったバイオカートの制作
AR(拡張現実)の研究
クルーレスソーラーボート大会への出場
ロボカップジュニアへの出場
レールガン制作
など

リンク
過去ログ
最新記事
最新コメント
アクセスカウンタ
合計閲覧者数

現在の閲覧者数
カテゴリ
検索フォーム
アクセス解析
    ブロとも申請フォーム

    この人とブロともになる

    QRコード
    QR
    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。