RobovieMaker2(12)純正ジャイロをつける


VS-RC003に純正ジャイロの「VS-IX001」を接続してみます。





フラットケーブルの圧着は初めてですが、こちらを参考に万力で行いました。
1発で10本全部のケーブルが圧着できるのは痛快そのもの。
念のため隣接ケーブルとのショートをテスター確認しましたが、大丈夫のようです。
コネクタの方向は少し悩みましたが、フラットケーブルに対してコネクタを同じ向きにするのが正解です。
(2つ目のコネクタは、1つ目のコネクタをケーブルに対して向きを変えず平行移動させたような位置関係です。)




ジャイロセンサの接続箇所はいつもの骨盤ウラです。

th_CIMG4121.jpg

ギリギリ入りました。これが加速度センサも兼ねてくれているので、ランドセル内に入れていた加速度センサは不要になりました^^
フラットケーブルの出口用に旋盤でスリットを開けています。
ちなみに太腿のところで光っているのは、効くかどうか怪しいですが気休めに貼っているノートPC用の放熱シートです。




次は設定です。
基本的な設定についてはマニュアルが丁寧なので従えばOKです。↓
http://www.vstone.co.jp/




さてどのサーボにフィードバックをかけるか。
これはロボゼロと同じ設定にしておきます。
つまり、
・股のピッチ軸と足首のピッチ軸
・股のロール軸と足首のロール軸
の4カ所です。
モーターの反映方向が逆になっている箇所は、設定の係数にマイナスをかけておきます。




ジャイロの影響度については、設定から数値を入力する方法と、スライドバーで調整する2つの方法があります。
あれ?スライドバーで調整した数値は、ロボットをスタンドアロンにした時に反映されてるの?されてないの?
という素朴な疑問が残りますが、「反映される」が正解でした。↓
http://lets-robot.com/modules/bluesbb/thread.php?thr=51&sty=1&num=l50




これにて装備と基本設定は一通り終了。
内容1年前とほとんど変わりませんが、全体の安定度が向上している・・・はず・・・なのです。

th_CIMG4122.jpg

太腿がサーボが熱くなりやすいので冷ましながら歩行特訓しています。
スポンサーサイト

テーマ : 自然科学
ジャンル : 学問・文化・芸術

RobovieMaker2(11)ハイパーターミナル


VS-RC003とのシリアル通信がうまくいかない件。
方々にご迷惑おかけしております。
ここ1ヵ月ほど、シリアル通信との格闘で足踏みしておりました。




Arduinoから1バイトごとにdelay(1)を送ってみましたが、変わらず。
設定した送信ボタンを連打することでコマンドが入力されることがあるという状況。




あまりにも進捗がないので、一番の基礎まで戻りました。
ホコリを被っていたLet's Note を引っ張り出してWindowsXPのハイパーターミナルからVS-RC003とのエコーバックテストを行ってみました。
スイッチサイエンスのFTDI USBシリアル変換アダプターを使いました。




115200等、ハイパーターミナルの設定をマニュアル通りに設定。




変換器のRXとTXをショートさせるループバックテストは合格。ちゃんと機能しています。




VS-RC003とRX、TX、GNDを接続してテスト。
・・・文字化けNGです。




マニュアル通りにやって動かないはずはないぞと、しつこくいろいろと試してみると、
単独のキー(たとえばa)を押し続けると、途中から文字化けが治り正しく表示されることが判明しました。
さらに押し続けるとキャッシュが一杯になるためか、文字化けゾーンに突入します。
これがマニュアルにもある(B.Wさんにもご指摘いただいた)、コマンドの最初は受信に失敗する現象のようです。




であればと、改行ナシのダミーを送ってから本命コマンドを送る方式に切り替えてみましたが、好転せず。
結局、10回ほど同じコマンドを送り続けるタイプの方が安定しました。
それでもボタンリリース時の停止信号は上手く入らなかったりと、いろいろと不便です。




さあ時間も残り少ないぞということで、VS-C3を導入しました。VS-C1を持っていますが、C3はユニットが小さくて助かります。




しかし慎重に接続しているのに、なぜかVS-C3が反応せず。(黄色LEDも反応なし。)
ボードを予備のものに交換してみたところ、あっさりつながりましたので、シリアルコマンドを送り続けた方のボードは、故障してしまったようです。
コントロール権を返還するコマンドを送ってもみましたがうまくいきません。どこか変なところに変なデータが入ってしまったのでしょう。




VS-C3を買ってから気付いたんですが、SBTBT→Arduino→I2C→VS-RC003なら安定したかもしれません。




モーション開発時間短縮のために、VS-IX001も買ってしまいました。
ジャイロ部分が見慣れた銀色パーツで秋月と同じになっていますが、
温度ドリフトなどはどれくらい押さえられているのでしょうか。値段と技術力に期待です。

中身を完全にVISTON化してしまったロボゼロは現在970グラム。
歩行モーションさえ作れればロボワンに間に合うかもしれません。
なんだか3年間ずっとこの繰り返しです。

テーマ : 自然科学
ジャンル : 学問・文化・芸術

RobovieMaker2(10)こまったこと2


//////////【Arduinoのスケッチ】
void setup() {
Serial.begin(115200); // 115200bpsでポートを開く
}
void loop() {
Serial.println("w 2009f6 01 00");//※サーボオンコマンド
}
///////////


とすることで、
ArduinoからVS-RC003へとシリアル送信ができることがわかって喜んだのもつかの間、

//////////【Arduinoのスケッチ】
void setup() {
Serial.begin(115200); // 115200bpsでポートを開く
}
void loop() {
Serial.println("w 2009f6 01 00");//※サーボオンコマンド
delay(1000);//1秒休む。
}
///////////


という風に、1秒のディレイを入れただけでシリアルを受けてくれなくなることがが判明しました。
通常の操作コマンドも、同じコマンドを3行以上連続で送信ことでまあまあ動いたてくれたりしますが、
ロボを操作するには心もとないです。

【確認】
・VS-RC003のコントローラーボタン入力のLEDはコマンド送信時に点滅している。
・VS-RC003の受け入れはたぶんTTLレベル。サインスマートArduino nano互換もTTLで出しているハズ。
・ArduinoはTXピンから送信しているので、115200bpsには対応できているハズ。
・通信ケーブルにフェライトコアを入れてみたりケーブルを短くしてみましたが変化なし。
・電源投入時のみ長押し判定なのかもしれないが、マニュアルにはそういうことは書いていない。
・同コマンド3行連続送信の場合の成功率は90%ぐらい。
・同コマンド2行連続送信の場合の成功率はごく稀。
・Serial.print("w 2009f6 01 00\r\n"); 改行コードを左記に変更しても結果は同じ。
・Arduino UNOでも同じ症状。




コマンド送信が成功したかどうかを監視するチェックプログラムがあるのかなとも思ったのですが、
オフィシャルの「C言語で操作するサンプル」をみても、チンプンカンプンな上に、受信のチェックはしていても、送信のチェックは特に行ってない模様。

ここ一週間ほど、この件でずーっと悩んでいます。
助けてオビ・ワン・・・

テーマ : 自然科学
ジャンル : 学問・文化・芸術

RobovieMaker2(9)こまったこと


Wiiコントローラー+拡張コントローラで困ったこと。
たぶん世界で自分しか困っていないのですが、
「NES/SNET to Wii Adapter」という製品を経由した場合、
セレクトとスタートの同時押しができません。




具体的には、SBDBTでRCB3フォーマットを出力したとき、
セレクトを押したとき:80,0,C,40,40,40,40,C
スタートを押したとき:80,0,3,40,40,40,40,3
二つ同時押したとき:80,0,F,40,40,40,40,3
となるはずで、純正の拡張コントローラーでもそうなるのですが、
「NES/SNET to Wii Adapter」を経由してしまうと、
二つ同時押したとき:80,0,0,40,40,40,40,3
となってしまいます!

セレクトを押しながらスタートを押しした時と、押したセレクトをリリースしたときが同じ値なんでやんす。
実は姫路ボード時代もスタート+各ボタンの設定ができなくて謎だったのですが、ドングルが問題ということがようやく判明しました。

果てしなく困ります。
選択肢は、

1)セレクト+Aなどで代用。
2)Arduinoで中継機を組み直す。

次のロボワンにぎりぎり間に合わないぐらいに追い込まれているので、まずは1のボタン代用プログラムを試してみます。

テーマ : 自然科学
ジャンル : 学問・文化・芸術

RobovieMaker2(8) 変数番号のアドレスへの変換


VS-RC003はシリアル通信でボード内部の変数を書き換えることができます。
方法は、シリアル通信資料に詳しく載っています。




ところで、変数表の変数番号に数値を代入するには、まずその変数番号に対応するアドレスを求める必要があります。
アドレスの値は、200800+(変数番号)×2で、16進数表記になります。

16進数の足し算をやると朦朧とするので、エクセルにしてみました。

vs_rc_henkan.jpg

という感じに表に書きこみ、ボックスB4の中の式を、
=DEC2HEX((B2*2)+HEX2DEC(200800))
とします。
ボックスB2に変数番号を入れると、B4のボックスにアドレスが表示されます。エクセル便利。
そんな小ネタでした。

テーマ : 自然科学
ジャンル : 学問・文化・芸術

RobovieMaker2(7)カルマンフィルタの導入2


th_ 2014-08-03

カルマンフィルタ導入のまえにいくつか準備が必要です。
まず、アマゾンでも廉価で扱っている「MPU-6050 使用 3軸ジャイロスコープ・3軸加速度センサー モジュール」を、Arduinoに接続し、データを読み込んでみます。




接続方法はこちらを参考にします。

センサ - Arduino
VCC - 5V
GND - GND
SCL - ANALOG 5
SDA - ANALOG 4
INT - DIGITAL 2

となります。




ここで、I2Cについて学びます。
剣菱Pさんの「零からの零からの電子工作 第64回:I2C」が抜群にわかりやすいです。神。
I2Cは2本の電線を使った通信方式で、○番アドレスのデータをくれと呼び出すと、○番アドレスのデータはこういう返答するようなイメージです。データは基本的に1バイトのようで、それを必要な回数分行うようです。




ArduinoにI2Cライブラリを組み込みます。
GitHubというサイトからDLできます。DLできるといってもちょっとコツが必要です。
https://github.com/jrowberg/i2cdevlib
のページを開くことで、右下のDLボタンからファイル全体を入手できます。

DLしたファイルから、「i2cdevlib / Arduino / I2Cdev」と、「 i2cdevlib / Arduino / MPU6050」の2つのフォルダを、Arduinoのライブラリに加えます。




さっそくサンプルを試してみます。さきほどDLしたファイルの中の、
「 i2cdevlib / Arduino / MPU6050 / Examples / MPU6050_raw / MPU6050_raw.ino」
をArduinoで実行すると、 MPU6050からI2Cで取得したデータをArduinoのシリアルモニタで確認できます。
自分の頭の整理のために、サンプルスケッチをさらに簡略化してみます↓
(センサの初期化を省略しているので、うまく動かない場合があります。その時は手を加える前のスケッチを実行してください。)



【少し簡略化したArduinoサンプルスケッチ】

//MPU6050のデータをI2Cで取得し、シリアルモニタに書き出す。
//ボーレートは38400

#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050.h"
#include <math.h>

MPU6050 accelgyro;

int16_t ax, ay, az;
int16_t gx, gy, gz;

void setup() {
Wire.begin();
Serial.begin(38400);
accelgyro.initialize();
}

void loop() {
accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
Serial.print("a/g:\t");
Serial.print(ax);
Serial.print("\t");
Serial.print(ay);
Serial.print("\t");
Serial.print(az);
Serial.print("\t");
Serial.print(gx);
Serial.print("\t");
Serial.print(gy);
Serial.print("\t");
Serial.println(gz);
}




ライブラリががんばってくれるので、サンプルはとてもシンプルになります。




 2014-08-03a

上のスケッチを実行したときのシリアルモニタです。
左側の3つが加速度センサのx,y,z軸、右の3つがジャイロセンサのx,y,z軸の未加工の値です。
センサは静止状態ですが、数字が細かく振れているのがわかります。

このスケッチの場合、基盤のパーツをオモテ、ピン側を手前においたとき、
Xが前後、Yが左右、Zが上下に振ったとき値になります。
飛行機に例えると、
・axは上昇の向きでプラス、下降でマイナス。
・ayは右ロールでプラス、左ロールでマイナス。
・azはそのままならプラス最大、ひっくり返すとマイナス最大。
・gxはロールで右回転でプラス、左回転でマイナス。
・gyはピッチ前回転でプラス、後ろ回転でマイナス。
・gzはヨー軸左回転でプラス、右回転でマイナス。
という風になっているようです。

これでなんとか数値を取得することはできました!




ここまでやってきてアレですが、なんとかしたいのは温度ドリフトであって、カルマン補正はどちらかといえばセンサの向き、ブレを補正する式のようです・・・。

テーマ : 自然科学
ジャンル : 学問・文化・芸術

RobovieMaker2(6) カルマンフィルタの導入1




ロボゼロの足裏は小さいです。(足裏の前後はロボワン規定ギリギリですが、左右が小さいです。)
ですので、どうしてもジャイロに頼りたくなります。
上の動画は、前回のロボワンの数日前に撮影したものです。
GIYさんの繊細な歩行モーションをベースに、かなり我流でいじっていますが、そのアラをジャイロが吸収してくれています。
スピードも結構出ていますし、段差の走破力も相当なものです。ジャイロは偉大です。
(相当な負担があったらしく、本番ではコケまくりになりました。いいとこ見せたかった・・・)




ジャイロの大敵は温度ドリフトです。
ジャイロの中央値が温度などの要因で刻一刻と変化していくのが、温度ドリフトです。
以前はジャイロセンサをカートリッジ式にしてみたり、起動前に静止して中央値を再取得してみたりと克服を試みましたが、根本的な解決にはなっておらず、不確定要因に不安を抱きつつの神頼み状態になっていました。




調べるうちに、「カルマンフィルタ」というドリフト補正方法に出会いました。
これは加速度センサの値を使って、ジャイロの補正をするものです。
しかもArduinoでも補正計算が可能のようです。
ちょうど、MPU-6050使用の3軸ジャイロ・3軸加速度センサー(すごく安い)を持っていますので、これを使ってみます。




カルマンフィルタを無事導入できるのか、arduinoでの計算速度・転送速度は実用に耐えうるのか、VS-RC003にデータを適切に遅れるのか、ジャイロ補正はちゃんと設定できるのか。ハードル山積みですが攻略法は揃っているようなのでがんばります。

プロフィール

二名川(ニナガワ)

Author:二名川(ニナガワ)
ホビーロボットをレトロゲームが発展したものと捉えて楽しく遊び倒します。
子供が夢を見ている時間帯に稼働します。

宣伝:電子出版しました。
「コンソロイド ガイドブック」
46107_CONSOLOID_GUID_FACE_200.jpg





■作成中の機体
汎用ヒト型決戦遊具 ~RX計画~
RX-7.5 ゼロタンク
RRf-0.6 ゼニィ
RXM-7.9 ゼムネス
RX-7.5R 量産型ゼロタンク
RX-7.5Fp ファミタンク仮設1号
RX-7.7 ゼロキャノン
RX-7.8 ゼログレイ
SMS-0.1 ゼロライナー
以下続く

ブログ内検索
最近の記事
最近のコメント
カテゴリ
月別アーカイブ
リンク