第8回 ジャイロ大実験 その1 ジャイロを可視化する

 コウヘイ君もやっとジャイロを使って歩くことができるようになりました。ほとんど木の上?じゃなかった鉄の棒にぶら下がっているコウヘイ君にとって、地の上?じゃなかった床の上の安定した生活は、なにか新鮮な感じを受けました。クリップやネジの上をガシャガシャと力強く、しかし、やっぱしなんとかおっかなびっくり歩いている姿は、地上での生活もまた楽しそうでした。

ジャイロの設定には、miconoさんのROBOMIC(ブログ)のページが大変参考になりました。特に、 『●週刊ROBOXERO専用オプションサポートページというのがあるのを皆さんご存知でしょうかsign02』 の情報提供は、大変助かりました。miconoさんありがとうございました。このような情報提供は、しかるべきところがしかるべき時期にちゃんと情報提供して頂きたいですね。(また脱線しそうなのでやめときます。)まだ覗いていない方がありましたら、一度覗いてみてはいかがでしょうか。

というわけで、コウヘイ君も一人前にジャイロを搭載したのですが、コウヘイ君は、地上だけでなく、木の上や、鉄の棒でも 「ジャイロを生かした演技ができたらいいな。」と思うようになりました。でも、「ジャイロってどうやって使うの?」、「このジャイロってどこまで使えるの?」ってことは、相変わらずよく分かりませんでした。

それならば・・・やってみるっきゃない!・・・ということで『コウヘイ君のジャイロ大実験(ダイジッケ~~ン!と読む)』が始まりました。しばらくの間、お時間がありましたら、お付き合い下さい。
 
(・・・・ということで、ここでの内容は(も)、クマゲラの浅識と体験に基づくドクダンとヘンケンに満ち溢れていいるところもあると思います。皆さんの中で取捨選択の上、ご参考にして頂けるものがありましたら、自己専任においてご活用頂ければ嬉しいです。
 また、合わせてここは違うよ、こんなふうに考えるといいよ。こんなこともあるよ。こんなことができたよ。などご意見を頂けますと、もっと嬉しいです。・・・・・・追記)

尚、ここでも上記のmiconoさんのROBOMICのページは大変参考になりました。たくさんの情報提供をありがとうございました。

末尾に、今回開発した(大げさな!・・・・使用した)プログラムも掲載させて頂きました。

今回もまた、、(超)長文になっちゃいました。関心のあるところがありましたら、拾い読みだけでもして頂けると嬉しいです。

∞……∞……∞……∞……∞……∞……∞……∞……∞

ジャイロ大実験には、ブランコを用いて行いました。ブランコは、身近な運動で観察しやすく、簡単に実験ができること。また、、前後方向の一方向の揺れ(ピッチング)のみであること、単純な動きの繰り返し運動で再現性があること、などから、ジャイロを再現させて、その特性を観察して、理解して、使ってみるモデルとしては、最適であると考えました。

(ちなみに、左右を軸にした回転(前後の揺れ)がピッチング、上下を軸として回転(左右の揺れ)することがヨーイング、前後を軸にした回転(左右の回転)がローリングと言うそうです。ウィキペディア調べ)

◆ジャイロ大実験の目的

今回のコウヘイ君のジャイロ大実験の目的を次の二つとしました。

1)ジャイロの特性を理解し、使い方を理解すること(今回ここまで)
2)ブランコをジャイロを使って行うこと(次回・・・・たぷん)

1)のジャイロの特性や使い方が修得して、その後に、2)のジャイロを使ってブランコのコントロールに挑戦してみたいと思います。特に、2)のジャイロを使って、ブランコを行うことができると、鉄棒や吊り輪、空中ブランコなどに使えるようなる可能性が開け(ると思い)ます。これらの運動では、ジャイロを使って空中ての姿勢がある程度分かるだけでも再現性の向上や、新たな演技など様々な可能性が広がるかも知れません。どこまでできるか分かりませんが、可能性は無限にひろがります。(おおげさぁ~。)

◆ジャイロの可視化(可聴化?)

◇ジャイロはナンジイロ?

ジャイロってなに?、ジャイロってどんな動きするの? など、ジャイロの働き(動き)が見えないと何とも、ど~にもならないので、ジャイロの出力を可視化に挑戦しました。可視化と言っても見えないので、可聴可(?)に挑戦してみました。ジャイロの出力の値によって音を変えることで可視化してみます。

◇前準備

ジャイロの値で音を出すために8オクタープの音源ファイルを作成しました。具体的には、 NCHのトーン ジェネレータというソフトで、1秒間つづ、C8からC0の音のWAVファイルを9つ作成し、一つのWAVファイルにまとめ、60SCR.txtのファイル名で保存しました。そしてこれをSDカードに書き込み、ロボでジャイロの出力に合わせて、それぞれの音を発生させるために使用します。


NCHは、動画から画像、音声等の編集ソフトから、ビジネスソフトと幅広く手掛けているようです。(http://www.nchsoftware.com/jp/index.html) 今回は、この中から音声作成ソフトを試用の形で使わせて頂きました。購入まで至りませんでしたが、非常に使いやすいソフトで、音を扱う機能もシリーズでいろいろ揃っていました。機会がありましたら購入を検討してみたいお勧めソフトのひとつです。(このソフトの詳細は http://www.nch.com.au/wavepad/jp/index.html を参照下さい)

振子運動とジャイロの関係の簡単なテスト程度でしたら、10秒以上連続している適当なwavファイルでも可能だと思います。(音程の判断は難しいかも知れません。) 

このブログでは、ファイルの添付(リンク)がてきません(よく分かりません)。WAVファイルの作成は手間がかかるので手っ取り早く、この音源ファイル(60SCR.txt)を使ってみたいい方は、クマゲラまでメールにて請求下さい。
(クマゲラのメールアドレスは、このサイトの質問コーナー クマゲラホットライン開通のお知らせ   を参照下さい)。

また、60SCR.txtの音源ファイルを既に使用している方は、上書きにご注意ください。または、その60SCR.txtの音源ファイルの後に追加してご使用ください。クマゲラも試してみましたがうまく鳴らせることができませんでした。なぜうまく鳴らなかったのかが、よくわからないので別ファイルで使っています。よい方法について情報をお持ちの方がおりましたら、ご教授頂ければ嬉しいです。

この音源ファイルを鳴らすプログラム(リスト1)を参考までに末尾に掲載しました。そのヘッダを以下に示します。このプログラムは、8オクタープの九つの音を1秒ごとにロボが鳴らすプログラムです。

;====リスト1===========.
;プログラムNo:6-130127
;プログラム名:SOUND TEST8
;プログラム機能:8オクターブの音源ファイルを鳴らす
;====================

◇音源ファイルによるジャイロの可視化(可聴化?)

この音源ファイルを、下記のプログラムで振子運動とともに(動画のように)実行させることで、ジャイロの動きを可視化してみました。

 

 

 確かに、ロボの姿勢の変化に合わせて(揺れに伴って)音が変化し、ジャイロが働いていることは確認できました。

 しかし、[その1]のジャイロの値による音の変化の度合い、[その2]ジャイロの中央値からの偏差による音の変化の度合いですが、確かに音の高さは変化してジャイロは働いていることは、確認できるのですが、その動きの変化と、音の関係については、狙ったようにも感じるし、そうでもないような・・・、少しずれているといえばずれている感じもしました。なにか考え違いをしているのかも知れませんし、なにか見落として足らないのかもしれません。なにかが違うような・・・、これでもいいような・・・。良く分かりませんでした。

 結局、絶対音感の乏しいクマゲラとしては、この音がジャイロのどの位置を表わしているのかの判別は難しく、新たな課題となってしまいました。


 ここで使用したプログラムを、このページの最後に掲載しました。プログラム(リスト2)のヘッダと簡単な説明を以下に示します。

;====(リスト2)==========.
;プログラムNo:7-130127
;プログラム名:ジャイロテスト 音による可視化
;プログラム機能:ジャイロの出力の値により8オクターブの音を出して確認する
;====================

 このプログラム(リスト2)は、ジャイロの値を取得して、その値を74を中心とする8段階の値(しきい値)と比較し、それぞれの音を発生させるものです。
前へ振れるほど高い音を、後へ振るほど低い音を鳴らします。

 以下に簡単にプログラム(リスト2)の構造をご紹介します。
このプログラムは、つぎの3つの部分から構成されています。
1)3つの基準音を鳴らす部分
2)ジャイロの値によってそれぞれの鳴らす音に分岐する部分
3)それ以降の音を鳴らす部分部分

つぎに簡単ですが、この3つの部分についてご紹介します。

1)3つの基準音を鳴らす部分

 3つの音を鳴らす部分では、まずOK_BEEP音を鳴らします。(CALL(OK_BEEP))これは、ロボの標準音(62SCR.TXT)のOK音です。プログラムの起動音に使っています。これが鳴ると制御がプログラムに移ったことを(人に)知らせています。

 次に、OK03_BEEP音、ERR03_BEEP音、ARA_BEEP音を鳴らしています。これらは、標準のOK音、ERR音、アラーム音を鳴動時間をそれぞれ約0.1秒と短くして使用しています。これらの音は、それぞれの鳴らすプログラム(末尾のリスト参照)でV03に2を設定することで2セクタとなり約0.1秒間鳴らすことがてきます。このあたりの詳細は、記事の音声ファイルの使用方法等の資料を参照下さい。

 ここで、鳴らしているのは、ジャイロで鳴らした時に、こんな音だよ。と確認するために鳴らしています。
 リスト2の概略の構成
(画像をクリックすると大きくなります)

2)ジャイロの値によってそれぞれの鳴らす音に分岐する部分

ここでは、ジャイロから値を取得する部分と、その値で分岐する部分から成ります。

ジャイロから値を取得する部分では、変数V390[(N390でも良い(同じ変数を参照している)]の値を変数V32に取り込んでいます。

ジャイロの値は、V390とV391を取り込むことで、できます。V390が前後方向(ピッチ)の値で、V391が左右方向(ヨー)の値のようです。(これもmiconoさんのブログで知りました。)

取り込みにWAIT(20)で0.1秒の待ちを入れてありますが、これは要らないような気がしますが、良く分かりません。ないと取得した値が不安定なときもあれば、ちゃんと取得できるときもあります。
この不安定になる現象は、他の要因かもしれません。また、使い方が間違っているのかも知れません。お時間がありましたら、いろいろ試してみてください。また、より詳しい知識をお持ちの方がおいででしたら、是非ご紹介下さい。

ジャイロから取り込んだジャイロの出力の値が値は、ニュートラルの値である74のときプログラム名がJP_CENで1)で確認したOK03_BEEP音を、58より小さいとプログラム名がUD-LimでERR03_BEEP、90より大きいとプログラム名がUP-LimでARA_BEEP音を鳴らしています。

またここでは、ジャイロの出力の値が58から90までの値についてJL-1からJL-8までの4刻みで8段階の音を鳴らす処理に分岐しています。

3)音を鳴らす部分部分

音を鳴らす部分では、各(音を鳴らす)プログラムのV01に鳴らす音の開始位置を指定して、音を鳴らすルーチン60-0_BEEPへ飛んでいます。音源ファイル(60SCR.txt)は、先に述べたように1秒ごとに8オクタープの音を並べたファイルなので、開始位置を1秒ごとに遅らすことでそれぞれの音を鳴らすことができます。鳴動時間が0.1秒なので、開始時間がこの1秒間の間に入っていれば、あまり神経質に設定しなくても大丈夫みたいです。

リスト2の音をならす流れ
(画像をクリックすると大きくなります)
 

拙い説明ですが、ざっと説明するとこんな感じです。「ここがよくわからないよ。」「もう少し詳しく・・・」、「ここは違うよ。」「こうするともっといいよ。」などご意見がありましたら、ご指摘、ご指導頂けると嬉しいです。

◇ジャイロの値

ジャイロの値の参照の方法にはいくつかの方法があります。今回は3つの方法で可視化に挑戦してみました。
第一の方法は、上記で使用したジャイロの値を直接に参照する方法です。
第二の方法は、中央値からの距離(偏差)で認識する方法です。2足歩行の場合には、直立からの傾きが重要なので適しているかも知れません。また、前後の判別を無くすことで、全体のプログラムを簡略化できます。
第三の方法としてジャイロの変化量に注目することが有効かもしれません。振子運動の折り返し点である変曲点を利用する場合に適しそうです。

これらの関係をイメージ図にしてみました。


振り子のジャイロの出力の可視化の方法

  ◇偏差による可視化


ということで、次に、偏差の絶対値でジャイロの値の判別を行ってみました。
偏差の絶対値でジャイロの値を確認するプログラム(リスト3)を末尾に掲載し、ヘッダを下記に示します。
;====(リスト3)=========.
;プログラムNo:8-130127
;プログラム名:ジャイロテスト 音による可視化 その2
;プログラム機能:ジャイロの出力の中央値からの偏差の絶対値により音を出して確認する
;====================

リスト3は、前か後ろへ振るほど高い音を鳴らし、中央ほと゛低い音を鳴らしてみます。

前か、後かで対応が変わる場合には、偏差を用いることになります。
ジャイロのサンプルプログラムで解説されているように、2足歩行の場合には垂直軸に対する傾きの割合が重要であるため、偏差を用いているのだと思います。
また、ブランコなどの往復運動での状態の把握でしたら、偏差の絶対値を使うことで、常に中心からどれくらい傾いているか、という指標を使うことがてきます。

◇音の可視化の試み

次に、この音を可視化すべく、wavwtone(http://wavetone.softonic.jp/)というソフトで音の可視化を試みました。音の高低を表示してくれるこのソフトで他の音は可視化して、音程を表示してくれますが、今回の音の表示には不向きで可視化には至りませんでした。
結局、音による可視化は、可聴化までで、断念しました。


◇プログラムがうまく動かない

音による可視化に取り組んでいました。何度も何度も振り子をみながら音を聞いているうちに「なにか変だ。」と思うようになりました。
サンプルプログラム(リスト3)を末尾に付けましたが、実はこのプログラムは、うまく動いていませんでした。どのようになるかは、是非、体験して頂きたく、そのまま掲載させて頂きました。このプログラム(リスト3)は、下記のように修正することで、狙ったような動作ができました。

リスト3の修正の例
(画像をクリックすると大きくなります)

この件について、検証のための小さなサンプルプログラムリスト4)も末尾に一緒に掲載しました。なにかおかしい時には、このような方法が有効である場合もあると思います。お時間がありましたら、眺めてみてください。

◆ジャイロの変数による可視化

 上記の偏差の絶対値のトラブルの解消の過程で、ジャイロの値を変数を用いて可視化する方法を思いつきました。

◇ジャイロの値を変数へ書き出す

ジャイロの値を変数を用いて可視化するプログラム(リスト5)を末尾に掲載しました。プログラムのヘッダを下記に、簡単な説明を以下に示します。

==== リスト 5 ========
;プログラムNo:10-130127
;プログラム名:ジャイロテスト 変数による可視化
;プログラム機能:ジャイロの出力の値を変数に出力して可視化させる
;====================
 
このプログラム(リスト5)は、ジャイロの値を変数のV20{(N20]からV110[(N110]に書き込み続けます。
終了は、プログラムエディタの[停止]ボタンをクリックしてください。終了させる前の約5秒間のジャイロの値を変数に書き込みます。終了しましたら、ステータスチェックの[全変数読出]で変数を表示させ確認して下さい。エンドレスで記録しているので、終了したところの変数は、記録した時間から見つけて下さい。

変数V127はタイマなので、最初に初期化して0をセットします。そのご0.005秒ごとにカウントアップされます。この変数を取得する(変数に書き出す)ことで時間を測ることができます。

リスト5の概略の構成
(画像をクリックすると大きくなります)

起動時の動きを確認したい場合には、④のカウンタのリセット処理への分岐のところを下記のように変更して終了処理に飛ばして下さい。起動から約3~5秒間の記録が取れます。

修正する行  JUMPIF(V16,>,110,V16_RESET)
修正する内容 JUMPIF(V16,>,110,EXIT)

プログラム(リスト5)の出力結果と、その結果をグラフ化したものを以下に示します。



ジャイロの値(リスト5)の出力結果
(画像をクリックすると大きくなります)
ジャイロ出力の可視化

◇変曲点の可視化

振り子運動では、変曲点(折返点)の認識が重要です。変数による可視化を用いて振り子運動の変曲点を探してみます。同時に、変曲点で音による可視化を行います。末尾に変曲点を可視化するプログラム(リスト6)を掲載しました。このプログラム(リスト6)では、変曲点の値は音で可視化すると同時に、変数にタイマ、ジャイロ値、偏差を書き出します。

;==== リスト 6 ================
;プログラムNo:11-130127
;プログラム名:ジャイロテスト 変曲点の可視化
;プログラム機能:変曲点でピッと鳴らして、ジャイロの出力を変数に出力して確認する
;=============================

変局点は、ジャイロの出力の値の今回(V11)と前回(V12)の値から、方向(値が大きくなっていくか、小さくなっていくか)を調べ(V13=V12-V11)、この方向の前回(V14)と今回の値(V15)を比較し、この方向が変わった時に、変局点を通過したと認識して、その値を(JP_CHGで)書き出します。



リスト6 変局点の判断の処理
(画像をクリックすると大きくなります)

  のとき変局点と他の値と区別させるために、30000を加算させて記録しています。つまり、記録からみると値が30000を超えているとき、その値は変局点(を通過したとき)の値となります。従って、実際の変局点は、その値より少し前の値となります。

文字で説明するとややこしく、プログラムでみるともっとややこしい流れとなり、もうゴチャゴチャ域です。お手数をおかけしますが、じっくり眺めてやってください。より簡単に見つかる方法がありましたら、ご紹介頂けると嬉しいです。

このプログラム(リスト6)の出力結果と、その結果をグラフ化したものを以下に示します。

変局点出力(リスト6)の出力結果と結果の見方
(画像をクリックすると大きくなります)
ジャイロ(変局点)出力の可視化
 
図でわかるとおり、出力の変局点は、実際の変局点より少し遅れていることが分かります。今回のジャイロの測定間隔の平均は0.14秒でした。変局点の認識は、方向を変わって初めて認識するので、この時点で最大一回の測定遅れが発生しています。そして、このとき変局点であることを認識して出力するまでに平均で0.1秒かかっています。ということで、変局点は、最大で、実際より0.2秒遅れていることが分かります。実際の動作では、記録などの出力動作がなくなると0.1~0.15秒くらいの遅れと考えることができるかも知れませんね。

また、今回は、変化量か゜0の値を変局点として扱っていませんでしたが、運動が連続であるならば、変化量が0の値も変局点として扱うことで、もう少し早く認識できるようになりそうですね。

今後の課題としては、この処理速度でいろいろな演技に時間的に間に合うかどうかですね。鉄棒では、動きが早いので、やってみないとわかりませんね。なんとも言えないところだと思います。ブランコや吊り輪、空中ブランコでは、比較的動きが遅いいので対応できるかもしれません。ジャイロを使ったよりバランスのとれた(?)動きができるかも知れませんね。

◆ジャイロの可視化について思うこと

今回は、オリジナルプログラムでジャイロの特性を体験すべく、できることを実験的に行ってみました。その結果として、なんとなくこんなもんか、みたいな認識はできたのですが、いろいろやっていくと、これ変だよ。みたいこともいろいろ起こっています(十分な整理ができていませんが・・・)。マイナス計算で体験したように、基本的なことが分かっていないために、根本的なところで大きな思い違いがおきているのがもしれません。

「ここのところが違うよ。」 「こう考えるとすっきりするよ。」などご指摘や、ご意見、アドバイスなど頂けるとうれしいです。
また、「逆にここのところをもう少し詳しく。」などご質問も歓迎します。

次回は、ブランコでじっさいにジャイロをつかってみたいと思っています。どのような結果になるのが分かりませんが、期待しないでお待ち下さい。

============= プログラムリスト ==============

◆ジャイロの可視化で使用したプログラム

この(鉄棒の)プログラムは、ブランコに乗った状態で初めてください。今回は、ジャイロの可視化がテーマですので、ロボは振り子状態で、動きません。振り子の開始は手で開始させて下さい。
ブランコの長さが短いと周期が早いので、なるべく長いブランコを工夫してください。コウヘイ君は、吊り輪用のバーを用いて約80cm(イスまで)の長さのブランコを使用しました。これで約1.8秒の周期(往復)でしたた。

下記のプログラムリストの [∞∞∞ この次の行から ∞∞∞∞∞∞] をから[∞∞∞∞∞ この前の行まで ∞∞∞∞∞]の間をコピーして、RXコントローラのプログラムに貼り付けてご利用下さい。
概略の手順は、以下を参考にして下さい。

◇ご利用の手順

1.プログラムエディタでプログラム名を[新規登録]で登録する
2.プログラム一覧にてそのプログラム名をクリックの後、[読出し]をクリックする
3.以下の実施したいリストをドラッグし、コピーする
4.プログラムエディタのブログラム領域に張り付ける
このとき、プログラムエディタは、漢字モードだと、コピー(CTL+C)や、貼り付け(CTL+V)が効かないのでご注意ください。半角モードで行って下さい。
5.貼り付けた状態を確認し、異常がなければ、[保存][実行]を行う

◇掲載プログラムの内容


以下に、上記の本文で使用した下記の6つブログラムのリストを掲載します。

;==== リスト 1 ================
;プログラムNo:6-130127
;プログラム名:SOUND TEST8
;プログラム機能:8オクターブの音源ファイルを鳴らす

;==== リスト 2 ================
;プログラムNo:7-130127
;プログラム名:ジャイロテスト 音による可視化
;プログラム機能:ジャイロの出力の値により8オクターブの音を出して確認する

;==== リスト 3 ================
;プログラムNo:8-130127
;プログラム名:ジャイロテスト 音による可視化 その2
;プログラム機能:ジャイロの出力の値の中央値からの偏差の絶対値により音を出して確認する

;==== リスト 4 ================;
;プログラムNo:9-130127
;プログラム名:マイナス演算の検証
;プログラム機能:絶対値をとるなど符号を反転させるためのマイナス演算を検証する

==== リスト 5 ================
;プログラムNo:10-130127
;プログラム名:ジャイロテスト 変数による可視化
;プログラム機能:ジャイロの出力の値を変数に出力して可視化させる

;==== リスト 6 ================
;プログラムNo:11-130127
;プログラム名:ジャイロテスト 変曲点の可視化
;プログラム機能:変曲点でピッと鳴らして、ジャイロの出力を変数に出力して確認する

◇【リスト 1】 8オクタープの音源ファイルを鳴らす


鳴らす音源ファイルについては、上記の本文を参照下さい。

(注・・・・下記リストは行間が詰められ見ずらいですが、このままコピーしてプログラムエディタには張り付けると、多少行間が回復し、見やすくなります(ハズです)。メモ帳等に張り付ける場合は適時修正してお使い下さい。・・・・またより良い方法がありましたらご教授下さい。)

∞∞∞∞∞∞∞∞ この次の行から ∞∞∞∞∞∞∞∞∞∞∞∞∞∞
;====================
;プログラムNo:7-130120
;プログラム名:SOUND TEST8
;プログラム機能:8オクターブの音源ファイルを鳴らす
;====================
V01=0
CALL(60-0_BEEP)
WAIT(200)
V01=22
CALL(60-0_BEEP)
WAIT(200)
V01=44
CALL(60-0_BEEP)
WAIT(200)
V01=66
CALL(60-0_BEEP)
WAIT(200)
V01=88
CALL(60-0_BEEP)
WAIT(200)
V01=110
CALL(60-0_BEEP)
WAIT(200)
V01=132
CALL(60-0_BEEP)
WAIT(200)
V01=154
CALL(60-0_BEEP)
WAIT(200)
V01=176
CALL(60-0_BEEP)
WAIT(200)
;V01=88
;CALL(60-0_BEEP)
;WAIT(200)
JUMP(EXIT)
;=== BEEP =============
:60-0_BEEP
V00=60
;------V01=0
V02=0
V03=2
V04=0
SOUND
WAIT(5)
RETURN
;==== END =========
:EXIT
∞∞∞∞∞∞∞∞ この前の行まで ∞∞∞∞∞∞∞∞∞∞∞∞∞∞

◇【リスト 2】 音源ファイルによるジャイロの可視化(可聴化?)


ジャイロの出力を8オクターブの音を出して確認することかできます。

∞∞∞∞∞∞∞∞ この次の行から ∞∞∞∞∞∞∞∞∞∞∞∞∞∞
;====================
;プログラムNo:7-130127
;プログラム名:ジャイロテスト 音による可視化
;プログラム機能:ジャイロの値により8オクターブの音を出して確認する
;====================
CALL(OK_BEEP)
WAITE(200)

CALL(OK03_BEEP)
WAITE(200)
CALL(ERR03_BEEP)
WAITE(200)
CALL(ARA_BEEP)
WAITE(200)
WAITE(200)
WAITE(200)

;-----------------------
:JYRO_LooP
V32=V390
JUMPIF(V32,<=,58,UD-Lim)
JUMPIF(V32,<,62,JL_1)
JUMPIF(V32,<,66,JL_2)
JUMPIF(V32,<,70,JL_3)
JUMPIF(V32,<,74,JL_3)
JUMPIF(V32,=,74,JP_CEN)
JUMPIF(V32,<,78,JL_5)
JUMPIF(V32,<,82,JL_6)
JUMPIF(V32,<,86,JL_7)
JUMPIF(V32,<,90,JL_8)
JUMPIF(V32,>=,90,UP-Lim)
JUMP(JYRO_LooP)
JUMP(EXIT)
;==== ここから 音発生処理 ======
:UD-Lim
CALL(ERR03_BEEP)
JUMP(JYRO_LooP)
;---------------------
:JP_CEN
CALL(OK03_BEEP)
JUMP(JYRO_LooP)
;---------------------
:UP-Lim
CALL(ARA_BEEP)
JUMP(JYRO_LooP)
;---;----;----;----;----
:JL_1
V01=0
CALL(60-0_BEEP)
JUMP(JYRO_LooP)
;---------------------
:JL_2
V01=22
CALL(60-0_BEEP)
JUMP(JYRO_LooP)
;---------------------
:JL_3
V01=44
CALL(60-0_BEEP)
JUMP(JYRO_LooP)
;---------------------
:JL_4
V01=66
CALL(60-0_BEEP)
JUMP(JYRO_LooP)
;---------------------
:JL_5
V01=88
CALL(60-0_BEEP)
JUMP(JYRO_LooP)
;---------------------
:JL_6
V01=110
CALL(60-0_BEEP)
JUMP(JYRO_LooP)
;---------------------
:JL_7
V01=132
CALL(60-0_BEEP)
JUMP(JYRO_LooP)
;---------------------
:JL_8
V01=154
CALL(60-0_BEEP)
JUMP(JYRO_LooP)
;---------------------
JUMP(EXIT)
;=== BEEP =============
:OK_BEEP
V00=62
V01=192
V02=0
V03=20
V04=0
SOUND
WAIT(100)
Return
:ERR_BEEP
V00=62
V01=213
V02=0
V03=20
V04=0
SOUND
WAIT(100)
Return
;================
:OK03_BEEP
V00=62
V01=194
V02=0
V03=2
V04=0
SOUND
WAIT(5)
RETURN
;----------------------
:ERR03_BEEP
V00=62
V01=216
V02=0
V03=2
V04=0
SOUND
WAIT(5)
RETURN
;----------------------
:ARA_BEEP
V00=62
V01=42
V02=0
V03=2
V04=0
SOUND
WAIT(5)
RETURN
;----------------------
:60-0_BEEP
V00=60
;V01=0
V02=0
V03=2
V04=0
SOUND
WAIT(5)
RETURN
;==== END =========
:EXIT
CALL(ERR_BEEP)
∞∞∞∞∞∞∞∞ この前の行まで ∞∞∞∞∞∞∞∞∞∞∞∞∞∞

◇【リスト 3】 ジャイロテスト 音による可視化 その2


ジャイロの出力の偏差の絶対値により音を出して確認するプログラムです。上記の本文でも記述しましたが、下記のプログラムは、機能の一部がうまく動きませんでした。

もし、関心がありましたら、下記のプログラムを実行し、現象を確認してみて下さい。そして、考えて見てください。

このプログラムの次に、この現象を検証するプログラム(リスト4)と結果を掲載しました。お時間がありましたら眺めてみてください。

∞∞∞∞∞∞∞∞ この次の行から ∞∞∞∞∞∞∞∞∞∞∞∞∞∞
;====================
;プログラムNo:8-130127
;プログラム名:ジャイロテスト 音による可視化 その2
;プログラム機能:ジャイロの値の中央値からの偏差の絶対値により音を出して確認する
;====================
CALL(OK_BEEP)
WAITE(200)

CALL(OK03_BEEP)
WAITE(200)
CALL(ERR03_BEEP)
WAITE(200)
CALL(ARA_BEEP)
WAITE(200)
WAITE(200)
WAITE(200)

:JYRO_LooP
V32=(N390-74
JUMPIF(V32,>=,0,JP_01)
V32 = -1 * V32
:JP_01
JUMPIF(V32,=,0,JP_CEN)
JUMPIF(V32,<,1,JL_1)
JUMPIF(V32,<,2,JL_2)
JUMPIF(V32,<,3,JL_3)
JUMPIF(V32,<,4,JL_4)
JUMPIF(V32,<,5,JL_5)
JUMPIF(V32,<,6,JL_6)
JUMPIF(V32,<,7,JL_7)
JUMPIF(V32,<,8,JL_8)
JUMPIF(V32,>=,8,UP-Lim)
JUMP(JYRO_LooP)
JUMP(EXIT)
;---------------------
:UD-Lim
CALL(OK03_BEEP)
JUMP(JYRO_LooP)
;---------------------
:JP_CEN
CALL(OK03_BEEP)
JUMP(JYRO_LooP)
;---------------------
:UP-Lim
CALL(ARA_BEEP)
JUMP(JYRO_LooP)
;=========================
:JL_1
V01=0
CALL(60-0_BEEP)
JUMP(JYRO_LooP)
;---------------------
:JL_2
V01=22
CALL(60-0_BEEP)
JUMP(JYRO_LooP)
;---------------------
:JL_3
V01=44
CALL(60-0_BEEP)
JUMP(JYRO_LooP)
;---------------------
:JL_4
V01=66
CALL(60-0_BEEP)
JUMP(JYRO_LooP)
;---------------------
:JL_5
V01=88
CALL(60-0_BEEP)
JUMP(JYRO_LooP)
;---------------------
:JL_6
V01=110
CALL(60-0_BEEP)
JUMP(JYRO_LooP)
;---------------------
:JL_7
V01=132
CALL(60-0_BEEP)
JUMP(JYRO_LooP)
;---------------------
:JL_8
V01=154
CALL(60-0_BEEP)
JUMP(JYRO_LooP)
;---------------------
JUMP(EXIT)
;=== BEEP =============
:OK_BEEP
V00=62
V01=192
V02=0
V03=20
V04=0
SOUND
WAIT(100)
Return
:ERR_BEEP
V00=62
V01=213
V02=0
V03=20
V04=0
SOUND
WAIT(100)
Return
;=== ----- =============
:OK03_BEEP
V00=62
V01=194
V02=0
V03=2
V04=0
SOUND
WAIT(5)
RETURN
;----------------------
:ERR03_BEEP
V00=62
V01=216
V02=0
V03=2
V04=0
SOUND
WAIT(5)
RETURN
;----------------------
:ARA_BEEP
V00=62
V01=42
V02=0
V03=2
V04=0
SOUND
WAIT(5)
RETURN
;----------------------
:60-0_BEEP
V00=60
;V01=0
V02=0
V03=2
V04=0
SOUND
WAIT(5)
RETURN
;==== END =========
:EXIT
CALL(ERR_BEEP)
∞∞∞∞∞∞∞∞ この前の行まで ∞∞∞∞∞∞∞∞∞∞∞∞∞∞

◇【リスト 4】 マイナス演算の検証


絶対値をとるなど符号を反転させるためのマイナス演算を検証してみるプログラムです。

次の演算は、どのような結果になるでしょうか?結果を見る前に一度考えてみてください。

∞∞∞∞∞∞∞∞ この次の行から ∞∞∞∞∞∞∞∞∞∞∞∞∞∞
;====================;
;プログラムNo:9-130127
;プログラム名:マイナス演算の検証
;プログラム機能:絶対値をとるなど符号を反転させるためのマイナス演算を検証する
;====================
V8=10
;---Work Reset ----------------
:LOOP_01
(V8=0
V8=V8+1
JUMPIF(V8,<,20,LOOP_01)
;-----------------
V11= 5
V12 = - 1 * V11
V13 = V11 * -1
V14 =(-1) * V11
V15 = -1
V16 = 0-1
V17 = 0-1 * V11
;-----------------
∞∞∞∞∞∞∞∞ この前の行まで ∞∞∞∞∞∞∞∞∞∞∞∞∞∞

結果はこんな感じになりました。



最初は、事象自体もよく理解できなかったのですが、よく考えてみれば、演算の優先順位がないのでこうなるのですね。遭遇してやっと理解できました。

◇【リスト 5】 ジャイロ変数出力


ジャイロの値を20~110の変数に書き出すテストはプログラムです。終了処理は作成していないので、修了はプログラムエディターの[終了]をクリックして終了させて下さい。

∞∞∞∞∞∞∞∞ この次の行から ∞∞∞∞∞∞∞∞∞∞∞∞∞∞
;=====================
;プログラムNo:10-130127
;プログラム名:ジャイロ変数出力
;プログラム機能:ジャイロの値を20~110の変数に出力する
;====================
V16=20
V127=0
;---Work Reset ---
:LOOP_01
(V16=0
V16=V16+1
JUMPIF(V16,<,123,LOOP_01)
;-----------------
V16=20
V16=V16+1
(V16=V127
V16=V16+1
(V16=(N390
:MEMO_SET
V16=V16+1
JUMPIF(V16,>,110,EXIT)
(V16=V127
V16=V16+1
(V16=(N390
JUMP(MEMO_SET)
:V16_RESET
V16=20
JUMP(MEMO_SET)
∞∞∞∞∞∞∞∞ この前の行まで ∞∞∞∞∞∞∞∞∞∞∞∞∞∞

◇【リスト 6】 ジャイロテスト 変数による可視化


ジャイロの出力をユーサー変数に出力して確認できます。

リストで使用している変数の説明は次の通りです。

V11:今回のジャイロの値
V12:前回のジャイロの値
V13:今回のジャイロの値の偏差([前回の値:V12]-[今回の値:V11])
V14:今回のジャイロの値の偏差の方向
(1:小さくなっている(V13が正)、2:大きくなっている(V13が負))
V15:前回のジャイロの値の偏差の方向(V14と同じ)
V16:変数の位置を参照する値
V19:ジャイロの値を取得している回数(1回目、2回目、60回目を認識する)
V127:タイマのカウンタ(0.005秒で一つ加算される)
V390:ジャイロの値(ピッチ・・前後方法)
∞∞∞∞∞∞∞∞ この次の行から ∞∞∞∞∞∞∞∞∞∞∞∞∞∞
;====================
;プログラムNo:8-130120
;プログラム名:ジャイロテスト 変数による可視化
;プログラム機能:変曲点でピッと鳴らして、ジャイロの出力を変数に出力して確認する
;====================
CALL(OK_BEEP)
WAITE(200)
WAITE(200)
WAITE(200)
V10 = 1 - 2
V11=0
V12=0
V13=0
V14=0
V15=0
V16=20
V17=0
V18=0
V19=0
V127=0
;---Work Reset ----------------
:LOOP_01
(V16=0
V16=V16+1
JUMPIF(V16,<,123,LOOP_01)
;---START----------------------
CALL(OK03_BEEP)
WAITE(50)
CALL(OK03_BEEP)
V16=20
(V16=V127
;---JYRO ----------------------
:JYRO_LooP
V19=V19+1
:MEMO_SET
V16=V16+1
;JUMPIF(V16,>,110,V16_RESET)
JUMPIF(V16,>,110,EXIT)
V12=V11
V15=V14
V11=(N390
(V16=V127
V16=V16+1
(V16=V11
JUMPIF(V19,=,1,JYRO_LooP)
V13=V12-V11
V16=V16+1
(V16=V13
JUMPIF(V13,>,0,JP_SM)
JUMPIF(V13,=,0,JP_EQ)
JUMPIF(V13,<,0,JP_BG)
CALL(ERR03_BEEP)
JUMP(JYRO_LooP)
;--方向性(大きくなっている、小さくなっている)の処理-----------------------
:JP_SM
V14=1
JUMPIF(V19,=,2,JYRO_LooP)
JUMPIF(V14,=,V15,JYRO_LooP)
JUMP(JP_CHG)
:JP_BG
V14=2
JUMPIF(V19,=,2,JYRO_LooP)
JUMPIF(V14,=,V15,JYRO_LooP)
JUMP(JP_CHG)
:JP_EQ
JUMP(JYRO_LooP)
:---方向が変わったときの処理--------------
:JP_CHG
V16=V16+1
(V16=V127
V16=V16+1
V11=(N390
(V16=V11 + 30000
CALL(OK03_BEEP)
JUMP(JYRO_LooP)
;----変数のアドレスのリセット-----------
:V16_RESET
V16=20
JUMP(MEMO_SET)
;----ここに来ることはないよ -----------
JUMP(EXIT)
;=== BEEP =============
:OK_BEEP
V00=62
V01=192
V02=0
V03=20
V04=0
SOUND
WAIT(100)
Return
;=== ----- =============
:OK03_BEEP
V00=62
V01=194
V02=0
V03=2
V04=0
SOUND
WAIT(5)
RETURN
;----------------------
:ERR03_BEEP
V00=62
V01=216
V02=0
V03=2
V04=0
SOUND
WAIT(5)
RETURN
;==== END =========
:EXIT
CALL(ERR03_BEEP)
WAIT(50)
CALL(ERR03_BEEP)
V16=V16+1
(V16=V127
V16=V16+1
(V16=V11
V16=V16+1
(V16=9999
∞∞∞∞∞∞∞∞ この前の行まで ∞∞∞∞∞∞∞∞∞∞∞∞∞∞

0 件のコメント:

コメントを投稿