ブログトップ

電子工作やってみたよ

ジャイロボーイのプログラムいじり出してから もう 3か月も経ちました。
時間の過ぎるのは、早いですね。
この夏休みに孫が遊びにくるということなので、マインドストームを渡すことが出来るように何とかジャイロボーイソフトを終わりにしたいのですが、なかなか納得いくまでの理解が出来ません。
あの天才と言われた将棋の加藤九段も77歳でC級2組から落ちて現役を辞めるとニュースになっていましたが、天才でも若い時のままというわけにはいかないのですね。
ましてや、ただの凡人が歳を取ったらどうしたらいいのでしょうか。
まあ 無理せずに最善を尽くしてみます。

c0335218_20413527.jpg
ネットで「倒立振子」を検索したら「半日で作る倒立振子」というのが出てきました。
この人のブログ 素晴らしいですね。 丁寧に解りやすく書かれており、プログラムなども全部発表されて細かく説明されています。
その中で、倒立振子の制御動作を一言で分かりやすく説明している式がありました。

転載始め***************************************************

モータの回転力= k1 × 躯体の傾き(角度)
          +k2 × 躯体の傾きの変化率(角速度)
          +k3 × 車輪軸の移動速度
          +k4 × 車輪軸の移動距離

転載終了***************************************************

これ ジャイロスコープ EV3ソフト と全く同じですね。
実際にはこの式に積分要素などが入ってきますが基本的には全く同じ。
アメリカで考えられたものも、遠く離れた日本で考えられたものも目的が同じならば同じ形になるのはすごいですね。
特に3行目と4行目の項 k3 × 車輪軸の移動速度 と k4 × 車輪軸の移動距離
よく思いつくものですね。 これは倒立振子の制御では常識なのでしょうか。
私は、これ無くても制御できるのではないかな、と思い3行目と4行目の項 外してやってみました。
K1,K2にあたる係数をいろいろ変えてやって見たのですが足の動きがオーバーシュートしてしまい制御できませんでした。
この3行目と4行目の項が理解できれば、今回の勉強はおしまいということにしたいのですけれど。
この方は エクセルを使って倒立振子のシュミレーションも発表されています。
わたしは 回路シュミレーターのサーキットビュアーにのせてみたいですね。


わが家のアジサイです。 周りの家には真っ白なのが多いですが我が家にはありません。
分けてもらっておこうかな。

c0335218_22344960.jpg
作っていたトウモロコシ ついに食べられてしまいました。
まだひとつだけですが、器用に皮をむいてありました。
四つ足動物に皮むけるのでしょうか。 サルが出たのでしょうか。
やるやると言ってながらまだ「網」つけてなかったですからね。
やはり 言葉より行動ですね。







by telmic-gunma | 2017-07-30 23:29 | レゴ マインドストーム | Trackback(17) | Comments(0)

ジャイロボーイをいじっていて、いままでに解ったこといくつか書いて見ます。
アフレルに聞いたことや、私がいじってみて類推したことです。
正解である保証はありません。

デバッグでの問題点
1.ジャイロボーイのEV3ソフトには、ブレークポイントがありません。
2.変数の内容(数値)をパソコンで見ることが出来ません。
3.変数の内容を見るのはEV3の顔に表示して確認します。これはリアルタイムで変化が見えるのでいいですね。
  テキストのグリッドモードで10行表示できます。変数10個表示できるわけですね。
4.センサーの内容(数値)はデーターロギングのオシロスコープモードで見える。
  これは値の変化がチャートに残るので動きがわかります。

ジャイロボーイのEV3ソフトで解ったこと
1.自立制御のループは1回転10mSec位の時間で回っている。
  動作処理時間は8.5mSecで1.5mSecの無駄時間が加算されているようです。
  タイマー割り込みは使用せずに時間処理しているようです。
2. ジャイロセンサーを角度モードで使用するとゼロ点のドリフトが大きい、20度くらいずれる。
  このため角速度モードで使用しているのかな。
3.変数 gAng  角度データ(ジャイロセンサーの角速度を積分して作っている)
4.変数 gSpd  角速度データ(ジャイロセンサーの角速度をちょっと加工して使用)
5.変数 mSum モーターの回転角度を読み取り積分してスタート地点からの移動距離
6.変数 mSpd  モーターの回転角度から計算した移動速度。



c0335218_20420525.jpg







by telmic-gunma | 2017-07-01 20:56 | レゴ マインドストーム | Trackback | Comments(2)

マインドストームのジャイロボーイのプログラム EV3ソフトからC言語(もどき)に書き換えが済んで、おぼろげながら少し分かってきました。
変数の内容については、アフレルで教えてもらった方法でひとつづつ変数の値をジャイロボーイの顔に表示して調べ始めたところです。
変数を一つ表示すると前に表示していた変数が消されてしまうので効率わるいです。 何か考えないと。

画面を見やすくするためにジャイロボーイの形をかえました。 重心が高くなりモーメントが変わったためでしょうか、少し不安定になりました。
ソフトの定数はもとのままです。

c0335218_18161801.jpg

以下が、2輪自立動作をする部分のフィードバックプログラムのところです。
最初の方は、イニシャライズの部分ですので、実際の自立動作をするところは意外とコンパクトという感じをもちました。
8個あるマイブロックはみな一回しか使われずかつネスティングは1段なので メイン1本の形にして見やすくしました。

変数の内容が解ってきたら、細かなコメントをこれに書き込みますね。

「引用元)EV3 model program descriptionsGyroBoy Program Descriptions」

→リンク先
https://le-www-live-s.legocdn.com/sc/media/files/ev3-program-descriptions/ev3-program-description-gyroboy-8f351eb6ca8c99121f27be9cb2b12ad6.pdf

ジャイロボーイの全プログラムリスト

[M] ループヘッド

(RTS) マイブロックの先頭
Lモーター(右足)PortA イニシャライズ
Lモーター(左足)PortD イニシャライズ
ジャイロセンサー Port1 リセット
タイマー2リセット

mSum = mPos = mD = mDP1 = mDP2 = mDP3 = cDrv = 0;
cLo = gAng = pwr = st = Cstr = Cdrv = 0;
ok = X

Sleeping


( gOS )
Do
gMn = 1000;
gMx = -100;
gSum = 0;

For ( i = 0; i<200; i++ )
{
gyro = [ ジャイロセンサーの角速度値];
gSum = gSum + gyro;
if ( gyro > gMx ) gMx = gyro;
if ( gyro < gMn ) gMn = gyro;
wait(0.004) // 4mSec wait
}
while(( gMx - gMn ) >= 2 )
gOS = gSum / 200;

gAng = -0.25;
speed_up( );
Awake( );
st = 1;

// ここ迄が自立動作初期化ルーチン
// **********************************************
// ここ以後が二本足自立動作を行うところ。

[BAL] // 二本足自立のバランス処理ループヘッド

if ( cLo == 0 ) // ( GT head )
{
tInt = 0.014;
Timer1 = 0; // タイマー1をリセット
}
else
{
tInt = Timer1の経過時間 / cLo;
}
cLo = cLo + 1; // ( GT end )

タイマー1の経過時間測定;

a = 0.005; // ( GG head )
gOS = (ジャイロ角速度 × a ) + ( 1 - a ) × gOS;
gSpd = ジャイロ角速度 - gOS;
gAng = gAng + ( gSpd × tInt ); // ( GG end )


buff = mSum // ( GM head )
mSum = ( モーターAの回転角度測定値) + ( モーターDの回転角度測定値)
Diff = ( モーターAの回転角度測定値) - ( モーターDの回転角度測定値)
mD = mSum - buff;
mPos = mPos - mD;
mSpd = (( mD + mDP1 + mDP2 + mDP3 ) / 4 ) / tInt; //( GM end )
mDP3 = mDP2;
mDP2 = mDP1;
mDP1 = mD;

mPos = mPos - ( tInt × Cdrv ); // ( EQ head )
buff2 = ( 0.8 * gSpd ) + ( 15 * gAng );
pwr = ( -0.02 * Cdrv ) + buff3 - buff2;
if ( pwr > 100 ) pwr = 100;
if ( pwr < -100 ) pwr = -100; // ( EQ end )

mPos = mPos - ( Cdrv * tInt ); //(cntrl head)
右駆動 = pwr + ( Cstr * 0.1 );
左駆動 = pwr - ( Cstr * 0.1 ); //( cntrl end )


if ( | pwr | ) < 100 ) Timer2をリセット // ( CHK head )
if ( Timer2 > 1 ) ok = 真; // ( CHK end )

b = GGの直前の時刻; Timer1使用
a = 現在の時刻; Timer1使用
待機時間の値 = 0.005 - ( a - b );
wait( 待機時間 );

while( ok <> 真 )
{ ; );

GOTO BAL




この前 教えていただいた アルストロメリアの花です。
だいぶ数が増えたのでまたのせます。

c0335218_18181931.jpg
この調子でいくと、ブログごとに新しい花を乗せられるかも。









by telmic-gunma | 2017-06-18 19:48 | レゴ マインドストーム | Trackback(11) | Comments(4)

ジャイロボーイのマイブロック GM, EQ, cntrl について調べてみました。


c0335218_20413527.jpg


***************************************************************************
Label GM

buff = mSum

mSum = ( モーターAの回転角度 測定値 )+( モーターDの回転角度 測定値 )

mDiff = ( モーターAの回転角度 測定値 )ー( モーターDの回転角度 測定値 )

mD = mSum - buff

mPos = mPos - mD

mSpd =(( mD + mDP1 + mDP2 + mDP3 ) / 4 ) / tInt

rtn

***************************************************************************
Label EQ

mPos = mPos - tInt * Cdrv

buff2 = ( 0.8 * gSpd ) + ( 15 * gAng )

buff3 = ( 0.08 * mSpd ) + ( 0.12 * mPos )

pwr = -0.02 * Cdrv + buff3 - buff2

IF pwr > 100 THEN pwr = 100

IF pwr < -100 THEN pwr = -100

rtn


***************************************************************************
Label cntrl

mPos = mPos - ( Cdrv * tInt )

右駆動 = pwr + ( Cstr * 0.1 )

左駆動 = pwr - ( Cstr * 0.1 )

rtn

***************************************************************************


数学の拡張命令における掛け算や足し算などの優先順位は以下の通り通常の数学と同等でした。

2 + 3 * 4 => 2+ ( 3 * 4 ) 答えは 14です。


a * b + ( 1 - a ) * c => ( a * b ) + ( ( 1 - a ) * c )





いま 庭に咲いている花です。  名前は不明です。

c0335218_20123857.jpg




by telmic-gunma | 2017-06-12 08:33 | レゴ マインドストーム | Trackback | Comments(2)

ジャイロボーイ マイブロック GG 調べました
機械的にBASIC言語もどきには、すぐできたのですが、ではここで何をしているのと、言葉で説明するところまで理解できていません。
また 使われている変数の意味、内容も分かりません。
まずは、全体をこんな感じで流してみて、それから相関関係など調べながら理解を進めるということでしょうか。
こつこつ行くしかないでしょうね。


c0335218_20413527.jpg

位置的に対応するところの下にBASIC言語もどきで書いてみます。
昔の象形文字を翻訳しているようなものですか。
ロゼッタストーンでしたか、歴史で習いましたね。

「引用元)EV3 model program descriptionsGyroBoy Program Descriptions」

→リンク先
https://le-www-live-s.legocdn.com/sc/media/files/ev3-program-descriptions/ev3-program-description-gyroboy-8f351eb6ca8c99121f27be9cb2b12ad6.pdf

c0335218_20111562.jpg
こちらは まとめて書いてます。
まだ 変数や個別の動作など分かりません。
理解できたら書き直します。



c0335218_20112738.jpg



今日も採れたイチゴです。 孫に食べさせてあげたいけど、宅急便では送れないよね。

c0335218_20120671.jpg





by telmic-gunma | 2017-06-03 20:42 | レゴ マインドストーム | Trackback | Comments(0)


ジャイロボーイのソフト 初期設定のマイブロック gOS(サブルーチン)
私なりに理解できたので下に記載します。
全体から見ればごく一部ですけれど、まとまってから発表しようとするといつになるか分らないので出来たところから発表します。

まずは、言葉だけで表現していきます。 つぎにBASIC言語もどきで書いてます

gOS は自立するためのフィードバック制御がかかる前の処理です。
ジャイロセンサーの値が0.8Secの間(4mSecごとに200回データをとる)、連続して2より小さい値になるとここを抜け出します。 
すなわち ジャイロボーイをスタンドに座らせて0.8秒間ふらつかずに安定したら次の自立動作に進むということですね。

数値の単位は、たぶんですがジャイロボーイを90度前に倒すとジャイロセンサーの出力が90の数値になるので数値の1が角度の1度とおもわれます。 ちなみに後ろに倒すとー90となります。

オリジナルのソフト見やすくするため3つに分けて拡大してあります。
つながる部分は、解りやすくするため重複しています。

「引用元)EV3 model program descriptionsGyroBoy Program Descriptions」

→リンク先
https://le-www-live-s.legocdn.com/sc/media/files/ev3-program-descriptions/ev3-program-description-gyroboy-8f351eb6ca8c99121f27be9cb2b12ad6.pdf

c0335218_13241778.jpg

c0335218_13242567.jpg


c0335218_13243275.jpg

上記のオリジナルソフトをBASIC風に書いてみました。
このまま動くものではありません。
流れや考え方が解りやすくならないかなと思い書きました。
もし おかしいな と思われるところがありましたら、コメントで教えてください。
c0335218_16183118.jpg

私のように マインドストームの適正年齢を遥かに超えた人間にとっては動作の流れを見るのは、このほうが考えやすい気がします。

ただ どっちのソフトがいいの なんて言ってはいけないのでしょうね。
各々気に入った方を使えばいいのですから。
やはり 子供に初めていじらせるには、マインドストームの方がゲーム感覚でいじれるから良いのでしょうね。

このソフト 初めてみた時は、皆目解からなかったのですが、あちこちの方向から何日かかけてアタックしていたら少しづつ霧が晴れるような感じで見えてきました。
マイブロックは全部で8個あるので、まずはこれらを一つづつ片づけてからですね。

忘れないで書いておきたい事なのでここに書いておきます。
メインのルーチンは大きく分けて2つあります。
(A)自立だけのコントロールをする部分と、(B)カラーセンサーなどで感じて何か動作をするルーチンです。
このうち B の部分を抹消してブログラムを書き込み動作させても自立動作は正常でした。
今後はこの状態でテスト、解析するつもりです。





これ 庭に満開で咲いている「なでしこ」です。(たぶん)
ネットでみたら形は似ているけれど違う種類が100個くらいあるのにびっくりです。
c0335218_17041722.jpg


by telmic-gunma | 2017-06-01 17:19 | レゴ マインドストーム | Trackback | Comments(2)

ジャイロボーイの基本的な数値を計ってみました。

全重量(充電式バッテリー搭載して)   817g
身長(高さ 接地部からてっぺんまで)  235mm
幅(タイヤ接地部外側)         130mm
ジャイロセンサーの中心の高さ(接地部より)75mm
重心の高さ(接地部より)        125mm
車輪の直径                55mm


ジャイロセンサーのプログラム上の使われ方について

プログラム上の使用箇所  3か所
   マイブロック RST   リセット
   マイブロック gOS  測定ー角速度
   マイブロック GG   測定ー角速度

とりあえず 上記のものを調べました。 忘れないうちに書いておきます。

疑問点は、ジャイロセンサーで「角度」を測るのではなくて、「角速度」を計っていることですね。(角度の測定モードは付いているにもかかわらず。)
累積誤差が出ないのかしら。
前回のジャイロボーイの動画では誤差の累積は見受けられませんね。
まあ 1時間とか動作させていれば、そのうちやってみます。




c0335218_20413527.jpg

庭に咲いたはなです。  名前はちょっとわかりません。
c0335218_10011358.jpg


by telmic-gunma | 2017-05-31 10:11 | レゴ マインドストーム | Trackback | Comments(2)