ブログトップ

電子工作やってみたよ

マインドストームのジャイロボーイのプログラム 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 | 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)