FC2ブログ
汎用ヒト型決戦遊具はじめました。
ROBOXERO(22) DC制御安定化
2012年02月26日 (日) | 編集 |

汎用ヒト型決戦遊具の一号機ゼロタンク。
ベースのキャタピラ走行部分を安定化させて早く次のステップに進みたいところです。



タミヤのPOWER DASH モーターへの換装は効果覿面で、とてもパワフルに移動できるようになりました。

また、キャタピラの接地面を小さくすることで、
・摩擦を減らし旋回しやすくできる反面
・急停止・急発進時には前後に傾きやすくなる
というバーター関係も実感できました。
重量や遊び方の状況に応じて調整すれば大丈夫そうです。

残ったの課題がDCモーター制御の不安定さです。



暫くモーターを回し続けると、回転したまま制御を受け付けなくなるという欠点。
また、時折、発進の制御自体も受け付けなくなるという欠点です。

モータードライバーICがものすごく熱くなることや、モーターに結構な電流が流れ、ノイズがArduinoに悪さをしているという可能性を考え、対処してみることにしました。



まずは熱対策。
モータードライバーIC用の小さな放熱板が欲しかったのですが、ぴったりのものが中々見つからず。
千石電商の2Fで小さめで放熱効果の高そうなものを選んでみました。

th_CIMG0118.jpg
(要塞っぽい感じに。)

ちょっと大きくなりすぎたので、今後アルミ版などで自作してもよいかもしれません。



次は、DCモーターへのノイズキラーコンデンサの取り付け。
こちらこちらこちらのサイトを参考に、原理もよく分からないまま0.1μFのセラミックコンデンサをプラマイの間に半田付けしてみました。

th_CIMG0120.jpg
(コンデンサは糖衣のガムみたいでおいしそう)

プラスとマイナスの間にパーツを繋いじゃってショートはしないのかと思いましたが、コンデンサには「交流は通すけれど直流は通さない」という性質があり、それがまたバッファのような役割をしてくれているようです。(いまいち分かっていませんが。)

また、急発進時には電流不足が起こり、CPUの電流不足でリセットやノーコンが起こる可能性もあります。
これにはキャパシタという役割のコンデンサをつけることで解決を図れるようなのですが、もし今後またトラブルが起きるようならやってみたいと思います。



結果的には、次のステップに進めそうなほど、足回りがパワーアップ&安定化しました。
500gほど追加搭載してテストしましたが、なんとか動けるレベルです。



なぜ500gを追加搭載テストが必要かというと、もちろんキャノンを搭載するためです。

ということで次回から「電動ミニガンの軽量化&制御回路作り」を行ってみたいと思います。

スポンサーサイト



ROBOXERO(21) 充電池のポールシフト!?
2012年02月23日 (木) | 編集 |

電池の極性がひっくり返る、そんな話を聞いたことがありますか?



新しいモーターを搭載して楽しく遊んでいたのですが、キャタピラー用のモーターが動かなくなりました。
さて、なぜでしょう。



モーター自体は生きているのですが、arduino経由だと動かなくなります。
しばらく放置すると動いたりもするのですが、ほどなく止まります。
さて、なぜでしょう。



いくつか原因になりそうなものをリストアップしました。

・モータードライバーが壊れた。←放置で動くということは壊れていないかも。
・DCモーターのノイズが関係している可能性←後述
・電圧が高すぎるor低すぎる←これが一番ありそう。
・モータードライバーの3つの電源(IC用、モーター用、制御用)の電圧←これの可能性大。



遊べたり遊べなかったりというのは、たぶん電圧が関係していると予想できます。
その仮説が正しければ・・・電圧十分な外部電源なら正常動作するはずであり、同時に充電池で作った独立電源に問題があることが特定できます。

さっそく以前作った外部電源に接続したところ、何の問題もなく動作してくれる事が判明しました。
電源周りを電池用にチューニングする必要があったようです。



電圧を測定してみました。

・外部電源(7.5V 1.6A)使用時
サーボ供給用のコネクタ電圧 7.2V
Arduinoの5V POWER ピン 5V

・独立電源(1.2×6本=7.2V)使用時
サーボ供給用のコネクタ電圧 4.4 V
Arduinoの5V POWER ピン 2.9 V

あれれ、たしかにタコ足配線にはなっていますが、今の今までこんなに低い電圧で動いていたというのは想定外でした。
内部電源では全然動作基準を満たしていなかったということです。
今まで問題なく動いたのは、満充電時などにたまたま電圧条件をクリアできていただけの話のようです・・・。



さらにモータードライバーICの説明書を見ると、
1)ロジック側電源電圧は 4.5~20V
2)制御電源≦出力電圧
という2つの条件を満たす必要があると書いてあります。

満たせていないのは、どうやら条件1のようです。



今度はモータードライバICの電源をArduino経由ではなく、サーボ電源端子から直接取得するようにしてみました。
さあ、これで大丈夫でしょう!




結果、依然としてダメでした。

さすがに心が折れそうになってきましたが、
改めて7.2V充電池電源をテスターしてみますと、なんと5Vしかありません。コレではダメです。
でもハッキリとダメなところが見つかっただけでもかなりホッとします。



なぜ5Vしかないのか。
満充電してからさほど遊んでいませんが・・・

今度は1つ1つの充電池を計測してみます。

・・・そこには驚愕の事実が!



なんと、電池のプラスとマイナスが逆転していました!
これにはびっくりでございます。我が目を疑いました。
何を言っているかわからないかもしれませんが、乾電池の乳首がマイナスで、お尻がプラスになっていたという話です。
こんなケッタイな乾電池は初めて見ました。本当に楽しい経験ができました。。
ちなみに、極がひっくりかえっていたのは6本のうちの1本だけでした。


原因はほぼ間違いなく充電方法のミスです。
こちらに取り扱い説明書がありますが、
この簡易版チャージャーでは1コや3コの充電ができない仕様なのでした。
昨晩、明らかに3コ充電して寝ました・・・。



気持ちよく寝られそうな解決でしたが、もう1つ問題が残っていました。
それは、20秒程度モーターを回し続けると、止まらなくなってしまう、というトラブルです。
この新しい問題については今のところ全く検討がついていません。



今後必要になるかもしれない、モーター制御に関してのブックマークをメモ。
モーター性能比較表
マブチモーターのデーターシート
澤村電気工業によるモーター解説
DCモーターの基礎
ノイズキラーコンデンサー事例集

ROBOXERO(20) 130モーター
2012年02月22日 (水) | 編集 |

キャタピラによる前後移動は軽々とできるようになったのですが、
カーブやその場旋回となると少し厳しいようです。
重量オーバー気味であります。

あまりキャタピラについて考えたことがなかったのですが、
ゴムで摩擦が高く、しかも接地はそれなりの面です。
旋回にはかなりの負荷がかかることになります。
戦車が実はかなり無茶な動きだということにも気づかされます。



現状がノーマルのマブチ130モーター使用なので、
トルクの高いモーターに換装すればなんとかなりそうな気もします。

130モーターはミニ四駆用のものが品揃え豊富で、お値段も手頃です。

店頭でスペックを見比べ、「POWER DASH」というのを選んでみました。

th_CIMG0116.jpg
(シールが貼ってあるだけなんですが、高級品の感じがします。
 370円でブルジョア気分。)



検索して見ると、同型モーターを詳細に比較したページもありました。
『ラボ#01 どのモーターが良いのか?(1)』

2倍近くのトルクが期待できるようです。

ROBOXERO(19) 初シールド
2012年02月21日 (火) | 編集 |

今回は人生で初めてのArduino用シールドを作りました。
シールドというのは、Arduinoの基盤にかぶせて使う拡張パーツみたいなものを指します。
ちなみに基盤に回路を半田付けするのも今回が人生初です。

作成にあたってはエレキジャックの「(連載)ユニバーサル基板のプロになる!」シリーズが大変参考になりました。



配線図を設計(というかメモ)したら、とにかく作ります。エイヤっと作ります。
半田付けの実技は1年半前に経験済みなので、これを思い出しながらやります。
ICの基盤への付け方など、詳細がいまいち分かっていませんが、初仕事なのでとにかく動くものができればよいという意気込みで挑みます。


th_CIMG0113.jpg
(2つのモータードライバーと配電を管理するためのシールドです。)


th_CIMG0114.jpg
(裏側はこんな感じ。我流すぎて怪しいです。でも素人には被覆線が無難です。)



いざ接続してみますと、どうしても左キャタピラの後退だけ動きません。
ブレッドボード上での「あれ、動かないぞ」とは比べものにならないくらい投げ出したくなります。
見た感じはちゃんと接続されていますが・・・
モータードライバーICの故障でしょうか。ICの付け直しは面倒すぎます・・・
さて、どうしたものか。



深呼吸して冷静に考えます。
目の前にある材料を整理します。

Arduino・・・たぶん正常。不良品のウワサは聞かない。
シールド基盤・・・サンハヤト製。世界に名だたる国産品。
モータードライバー・・・東芝製。世界に名だたる国産品。
プログラマー・・・
自分。素人以下。
はんだ作業員・・・自分。今日が人生3回目ぐらい。

この一覧のうち、怪しい箇所は一目瞭然ですね。
何事も冷静になることが大事です。

さっそくプログラムを再確認。たぶんバグなし!
ということは、はい犯人は半田付け!

いやちゃんと半田付けしましたよ、見れば分かるじゃないですかと反論する自分を押し切り、
一見ちゃんとつながっているように見える該当箇所の配線を少し多めの半田で補強してみました。

結果は、・・・バッチリ動作しました。
素人はまず自分の腕と頭を疑うことが大事、という教訓でございました。



そんなこんなで、RX-7.5ゼロタンクの心臓部が無事、完成しました^^

th_CIMG0115.jpg
(ガシーン!ドッキング。シールドはこれが楽しいです。)

ブレッドボードに比べ配線が外れにくいので、動作もより安定しています。

HSWB-4FとArduino、2つのCPUを搭載することで、
砲座担当と移動担当の二人乗りだった初期のガンタンク気分を楽しめています。

ROBOXERO(18) 正しい起動
2012年02月20日 (月) | 編集 |

前回、起動時にサーボが変な挙動をして手に負えないとわめいてしまいましたが、
適切なアドヴァイスをいただき収束しました。



1)プログラムエディタ内のホームコマンドボタンをクリック
2)スタートアッププログラムボタンをクリック
という順で起動プログラムを作成すれば、
HomeSet,HOMEPOS,POWERの各命令が正しい順番で実行されるプログラムができるということでした。

結果、無事起動できました!

詳しくは前回記事のコメント欄をどうぞ。



ホームポジションを設定しないうちにサーボの電源をいれると、サーボが勝手に全力でゼロ位置に移動してしまうということが問題のようでした。
しかも電力も全開なので、電力不足によるCPUリセット(起動音が何度も鳴る)も併発していたのでした。

なにはともあれ、これにて一件落着であります^^

ROBOXERO(17) 電流不足?
2012年02月18日 (土) | 編集 |

以前からある問題なのですが、
無線モード受信モード状態でスイッチを投入したとき、全サーボがあらぬ方向にミーっと動いてしまい大変危険です。

プチロボでも同じような経験があるので、おそらく電流(電圧)不足です。
完全なる憶測ですですが、CPUが正常に動作しないためシリアルコマンドが発信できず、サーボが受け取った電圧をPMWコマンドとして認識してしまうため、と思われます。



PC接続モードではこの現象は起きませんし、
無線モードでも起動直後の誤動作さえ乗り切れば電圧が安定し言うことを聞くようになるので、
最初の誤動作をなんとか押さえつけるべく格闘中です。
この問題が解決しないことには先にすすめません。

ROBOXERO(16) RX-7.5 仮組
2012年02月10日 (金) | 編集 |

RX-7.5ゼロタンクを仮組してみました。





・arduino
・ブレッドボード
・モータードライバーTA7291P×2コ
・タミヤの工作キットもろもろ

モータードライバーのピンの順番、使い方などは建築発明工作ゼミに丁寧な解説があります。



まだテスト段階ですが、今後足回りが調整で改善しない場合、例のぐるぐるサーボにチェンジするかもしれません。
それでも電源のオンオフなどを制御できるArduinoはオプション搭載などに役立つのです^^

ROBOXERO(15) シリアルまとめ
2012年02月05日 (日) | 編集 |

記事がやたらと長ったらしいので、まずは成果のVTRからどうぞ!





HSWBからのサーボ信号をArduinoの液晶に表示させるにあたり、
miconoさんのスケッチを拝借したところ成功したわけですが、
もやもやが残るので、そのあたりの理解を深めておこうと思います。

そもそも、Serial.read()は
「読み込み可能な最初の1バイトのデータを返します(by Arduinoをはじめよう)」
という解説なのに、なぜmiconoさんのスケッチではパケットをすべて読み込むことができるのか。



答えは全部「PIC AVR 工作室別館 arduinoのシリアル入出力について」
に書いてありました。
シリアル通信について、ものすごく分かりやすく書かれています。


リンク先の内容を、補足も加えて箇条書きメモにしてみます。

【ビットとバイト】
・1ビットは、信号を0か1かで表わした二進数。
・1バイトは、1ビットを8つ並べたもの。
・1バイトは2の8乗=256通りなので、16進数2桁で表すことができる。

【シリアル信号の基本】
・シリアル信号は1本の電線があればできる。
・シリアル信号とはモールス信号のように電気のオンオフでビット情報を伝えるやり方。
・シリアルの語源は「つらなった状態」1ビットの情報が連なっている様子。
・どれぐらいの時間オン状態にすれば1ビットとみなすか、のルールが通信速度。

・シリアル信号の始まりの合図になるビットバターンがあり、その後に本命のデータが入る。
・何も信号がない場合、信号線には5Vが流れ続けている。(arduinoの場合)
・1バイト分の信号の始まりの合図になるスタートビットは0Vの1ビット。
・1バイト分の信号の終わりの合図になるストップビットは5Vの1ビット。
・スタートビットとストップビットの間に、8ビットが入る。
・ので、8ビットのデータ(1バイト分)を伝えるには、10ビット分必要になる。
・通信速度9600bpsとなっていた場合、1秒間に960バイトのデータを受け取るという意味。

・1バイトのデータをつらねたものが、パケット。
・パケットデータも数バイトで作った始まりの合図と終わりの合図に挟まれている。

・RS-232Cは、パソコン同士のシリアル通信規格。
・信号の電圧は、規格によって違う。
 マイコン:3.3Vとか5V
 RS-232C規格:15V
 規格によってプラスとマイナスが反対のこともある。
・RS-232Cの電圧が高いのは遠距離通信想定のため。滞留電気をマイナス電圧で解消している。
・電圧の違う信号規格のやりとりには変換器(レベルコンバーター)を使う。
・arduinoはマイコン用もPC用も両方扱える。
・2本目の電線を使って、データの歩調を合わせる信号を送るのがフロー制御。

前置きを箇条書きしただけでかなり長くなってしまいましたが、ひとつひとつの項目は至極簡単なので、私は理解できました。
やっと本題。



【arduinoのシリアル処理】
・arduinoはフロー制御がない代わりに、受信バッファを持っている。
・受信バッファには1024バイトのSRAMのうち128バイトが割り当てられている。
・ちなみに115200bpsの場合、0.01秒でバッファがあふれる。

・Serial.available()は、バッファにどれだけデータが溜っているかを調べている。(たぶん)
・Serial.read()は、バッファの先頭の1バイトを読み取っている。
・Serial.read()で読み取られたバッファ上の1バイトは、消去され、次の1バイトが先頭になる。
・Serial.read()は、1回定義されるごとに1回実行される。
 例)スケッチ上でc=Serial.read()を通過するたびに、
 バッファ内のデータが1バイト消去され、1バイト進む。
・Serial.flush()は、バッファ内のデータをクリアする。



arduinoにおけるシリアルの基本を、かなり完璧に把握できた気がします。
やりたいのはHSWBボートからのサーボ用シリアルパケットを読み込み、
受信データに応じて分岐させることです。

モニタリングして調べた結果、
FA,AF,01,09,1E,04,01,24,FA,00.00.CD
というようなデータが送られてきており、
サーボの位置を指定すると、
7つ目と8つ目の数値に変化が起こることがわかりました。
サーボの絶対位置指定に対し、8つ目が上の桁、7つ目が下の桁を示しているようです。

たとえば、HSWBのプログラムでR16=988(R16コネクタに接続されたサーボの絶対位置を988に指定)というコマンドを実行すると、
7つ目は、00と表示されます。
R16の数字を+1するごとに、データも+1されていきます。

なので、
0)バッファを消す。
1)バッファのシリアルデータをループで読み取る。
2)FAの次にAFが出るパターンを見つけたら、
3)バッファのシリアルデータを4回読み込んで消費し、
4)5回目に読み込んだデータを変数にキープ。
5)キープした変数を調べる。
6)キープした変数に応じて分岐、実行。

とすればよさそうです。

いざスケッチ!



//HSWB-4Fのサーボ用シリアルパケットを
//arduinoのシリアルRxで読み取り分岐するスケッチ。
//HSWBには任意のサーボに988,989,990のサーボ位置絶対指定の
//コマンドが出るようプログラムしておく。
//指定したサーボの信号線をarduinoのRxにつなぐ。

#define LED1 13 //13番ピンはLED1
#define LED2 8 //8番ピンはLED2

void setup(){
  pinMode(LED1, OUTPUT); // 出力に設定
  pinMode(LED2, OUTPUT); // 出力に設定
  Serial.begin(115200);//シリアル入力をHSWBのサーボ信号速度にあわせる
}

void loop(){
  int rx;
  int c;
  rx=Serial.available();//シリアルバッファのデータ数
  if(rx>0) {//シリアルバッファにデータがあるか調べる
    for(int i=0;i<rx;i++) {
      c=Serial.read();
      delay (1);//このディレイは入れた方がうまく動く。以下同様。
      if (c==250){//読み取ったデータがFAか?
        c=Serial.read();
        delay (1);
        if (c==175){//さらにパケットの2文字目がAFなら受信開始。
          for(int ii=0;ii<5;ii++) {//3~6番目のデータを捨てる
            delay (1);
            c=Serial.read();
          }
        }
      }
    } 
    c=Serial.read();//7番目のデータをキープ
    switch (c){//データの内容により分岐。
    case 11
ROBOXERO(14) HSWBパケットモニタ
2012年02月01日 (水) | 編集 |

arduino単体で動く(はずの?)
HSWBパケットモニタが完成?しました。


th_CIMG0010.jpg
(・HSWBのショートパケットを2行で表示!
 ・チェックサムの手前までギリギリ表示!たまにはみ出る。
 ・私のプログラム技術の都合上、うっすらと表示!)



必要なもの
・普通のarduino(私はDueminanoveしか持っていません。)
・液晶モニタ(私のは秋月電子で買ったSC1602BSLB・バックライト付)
・10kと書いてある可変抵抗

配線例
arduino:液晶
0:(HSBWのサーボ信号へ。一番最後につける。)
2:14(液晶DB7)
3:13(液晶DB6)
4:12(液晶DB5)
5:11(液晶DB4)
10:6(液晶enable)
11:5(液晶R/W)
12:4(液晶RS)
GND:可変抵抗:3(液晶CONTRAST)
GND:2(液晶0V)
5V:1(液晶5V)




以下、スケッチ。




#include <LiquidCrystal.h>

LiquidCrystal lcd (12,11,10,5,4,3,2);//液晶配線設定
void setup(){
  lcd.begin(16, 2);//液晶を横16桁・縦2行に設定
  Serial.begin(115200);//シリアル入力をHSWBのサーボ信号速度にあわせる
}
void loop(){
  int rx;
  //リターン(受信)(ここからmicono先生のプログラムを拝借・カスタマイズ)
  rx=Serial.available();//データ数
  if(rx>0) {
    for(int i=0;i<rx;i++) {
      if(i<5){//4つ目のデータまでなら1行目に表示
        lcd.setCursor(i*3,0);
      }
      else {//5つ目のデータ以降は2行目に表示
        lcd.setCursor(i*3-15,1);
      }
      lcd.print(Serial.read(),HEX);
      lcd.print(",");
    }
    lcd.clear();//液晶リセット
    Serial.flush();//受信データクリア
  }
}





ROBOXERO(13) シリアル受信2
2012年02月01日 (水) | 編集 |

毎日少しずつ進展中。



前回arduinoに液晶表示させましたが、なんとか受信シリアルを表示させてみました。
arduinoのRX端子にHSWB-04Fの16番サーボの信号を接続。
プログラムが適当なので数値がどんどん流れてしまいますが、モニタリングできています!
綺麗に表示させる方法は難しいので今日はパス。
端子を手動で抜き差しすると表示がストップするので(どんなプログラムじゃ!)、
強引に読み取ります。



16番から特に指令を出していない状態の信号ですが、
読み取れた数字は、
FA,AF,01,09,1E,04,01,24,FA,00.00.CD
となりました。

さっそくサーボの仕様書のパケット書式資料と見比べます。

FA,AF:パケットの先頭を表すヘッダー
01:サーボID。コネクタにつきサーボ1個なので、たぶん全てのサーボを01番として制御している。
09:フラグ。命令指定。この場合はたぶんサーボのデータを要求している。
1E:アドレス。命令に使うメモリマップ上のアドレス。
04:レングス。上で指定したアドレスからのメモリ個数。
01:カウント。サーボの数。ショートパケットの時は1。
24:データ1。メモリーマップに書き込む数値1
FA:データ2。
00:データ3。
00;データ4。
CD;チェックサム。検算用。

仕様書の書式にぴったり合致してスッキリしました^^
(検算は保留。)



あとはフラグのデータか何かを拾って判別に使えば、最初にやろうと思っていたことはギリギリできそうですが、どうなんでしょう・・・


ロボゼロのパーツ販売がはじまりましたね。
サーボ1500円というのは激安です。
6~7万円で2体目が作れてしまいそうです。また散財しそうで、恐ろしい話です。
(私はすでにサーボホーン付きの冊子を5冊追加で買ってしまったところでした。。。)