二足歩行ロボットコミュニティサイト

【サイトの使い方】  【サイトマップ】  【お問い合わせ】 
ロボット動画  |   ロボット写真  |   BBS  |   ダウンロード  |   イベント予定  |   スタッフ日記  |   リンク  |  
ログイン パスワード    新規登録   パスワード紛失  

 

第17回 LED拡張ボードの高度な設定

最初にお詫びです。
前回の内容で説明を忘れていましたが、CPUボードの設定ダイアログから拡張機器にLEDを追加した後、サーボモータの位置補正や操作マッ プのようにCPUボードへのデータ書き込みを行わないと、CPUボードを再起動した際にLED拡張ボードの設定が消えてしまいます(現時点で前 回の内容は修正済みです)。
今回の説明も同様ですが、拡張ボードの設定を適用した後は、必ずCPUボードへの書き込みを行ってください。

さて、今回はより多彩なLEDの光らせ方を説明します。

LEDの明るさ変化の正体は光の点滅

前回の内容で、LEDの明るさが変わりましたが、実はLEDは常に同じ明るさでしか光っていません。
LEDは流れる電流の大きさによって明るさが変わる性質を持っていますが、LED拡張ボードからは常に一定の電流しか流れていないのです。
それでは、なぜ明るさが変わったのでしょうか?
実は、拡張ボードで光らせたLEDは目で追えないほど速い周期で点滅を繰り返しており、その点滅の周期においてLEDが点灯している時間が 長いほど明るく見えるというわけです。
そして、ポーズスライダの「LED DUTY 0」と「LED DUTY 1」でその点灯時間を設定しています。

このように、一定の周期でON,OFFの状態を繰り返す信号を「PWM」といいます。また、この周期の中で時間的に何%ONにするか(場合によっ てはOFFにするか)という設定を「デューティ比」といいます。「LED DUTY」のDUTYと同じですね。
PWMの信号を図で説明すると以下のようになります。

PWMの図解
PWMの図解

また、専門的な説明は以下をご参照ください。
wikipedia:PWMとは(一番上)
wikipedia:デューティ比とは

ちなみに、実はロボットのサーボモータも同じPWMによる信号で動いています。サーボモータは信号のデューティ比を角度とみなして動いて います。
この話は、今後の連載でサーボモータのより詳細な設定のところで説明する予定です。

なお、LED拡張ボードではデューティ比は必ず0〜255の範囲で設定します。デューティ比のパーセンテージに対して0〜255が当てはまるとい う仕組みです。
また、LED拡張ボードではデューティ比を100%にすることができません。これはLED拡張ボードに使用している制御ICの仕様によるもので、 設定できるデューティ比は最大で約99.6%になります。

PWMの周期を長くして目に見える点滅をさせる

PWMの周期は設定によって変更することができます。周期を長くすることで点滅の速度を遅くすることができます。
ここで、RobovieMakerとロボットを通信開始してメニューから「プロジェクトの設定」→「モードスイッチ/音声の設定・書き込み」をクリ ックし、「拡張機器」→「変更」→「デバイスの詳細設定」と進んで再びLED拡張ボードの設定ダイアログを表示してください。
ダイアログを表示したら、もう一度内容を良く見てみましょう。

LED拡張ボードの設定ダイア

ログ

ダイアログの下半分は一旦置いておいて、ここは中央の「LED変数設定」に注目してください。
こちらには、DUTY0,DUTY1,PSC0,PSC1,SEL0,SEL1の6つの設定項目とそれに対する設定値が表示されており、DUTY0は33、DUTY1は34、それ以 外は0になっています。
これらは、LED拡張ボードが動作するときに、CPUボード内のどの変数の値を読み取って動作するかという設定に当たります。
例えば、現在はDUTY0が33番目の変数=33番のポーズスライダの値を、DUTY1が34番目の変数=34番のポーズスライダの値を、それぞれ参照し て動作するようになっています。
また、PSC0やSEL0などの「0」の設定には特別な意味があり、この場合は0番の変数の値を読み取るのではなく、あらかじめLED拡張ボードが デフォルトとして持っている値で動作するようになります。

それでは、PWMの周期をポーズスライダから操作できるようにしてみましょう。
PWMの周期の長さを設定する項目はPSC0,PSC1になります。前者はDUTY0に対する周期、後者はDUTY1に対する周期になります。
PSC0を35、PSC1を36に設定し「適用」ボタンをクリックしてください。
設定を適用したら、CPUボードのROMにデータを書き込むことも忘れずに行ってください。

PSCの設定
PSC0を35に、PSC1を36にそれぞれ設定

次に、PSC0,PSC1の値を操作するポーズスライダを画面に表示します。
ポーズスライダのプロパティ設定ダイアログから、35,36のポーズスライダの「スライダ有効」にチェックを入れてください。
「LED PSC0」と「LED PSC1」のポーズスライダを表示したら、まず昨日のように、「LED DUTY0」と「LED DUTY1」を127付近に設定し、続い て「LED PSC0」と「LED PSC1」を大きくしてみてください。
すると、どうでしょう。LEDが一定間隔で点滅を始めるはずです。「LED PSC」のスライダの数値を大きくするほど点滅の間隔が遅くなりま す。
また、点滅を始めた状態で「LED DUTY」の数値を操作すると、数値が小さい場合は点灯時間が短く、大きい場合は長くなります。

LEDの点滅が変化する
※画像をクリックすると点滅の動画を再生(WMV形式)
「LED PSC0」と「LED PSC1」を動かすと点滅パターンが変わる

先ほどの説明の通り、「LED PSC」を大きくするとPWMの制御周期が長くなるのでLEDの点滅が遅くなります。また、「LED DUTY」を大きくす るとPWMの周期中に信号をONにする時間割合が増えるため、LEDが長く点灯するようになります。

ナイトライダー風にLEDを点滅させる

これまでの説明では、必ず「LED DUTY0」「LED PSC0」の数値を変えるとLED0〜7を操作でき、「LED DUTY1」「LED PSC1」の数値を変えると LED8〜15を操作できました。
しかし、実はLED拡張ボードでは、「LED DUTY0」「LED PSC0」でLED8〜15を操作したり(その逆も然り)、更にはLED0〜15を個別に光らせ たりすることもできます。
ただ、少し構造や設定方法が特殊なので、これから詳しく説明したいと思います。

RobovieMakerからロボットと通信を開始し、もう一度LED拡張ボードの詳細設定ダイアログを表示してください。
今度は「LED変数設定」のSEL0を37、SEL1を38に設定して適用してください。設定を適用したら忘れずにCPUボードに設定を書き込みます。
続いてポーズスライダのプロパティ設定から、37,38のポーズスライダを「スライダ有効」にしてください。
これで表示される「LED SEL0」と「LED SEL1」を操作すると、LEDが個別に点滅したりします。

LEDの点滅が個別に変わる
※画像をクリックすると光り方の変化の動画を再生(WMV形式)
「LED SEL0」と「LED SEL1」を動かすと点滅が個別に変わる

一体この原理はどうなっているのでしょうか?これから詳しく説明します。

まず、LED0〜15の全てのチャンネルは、「LED DUTY0」「LED PSC0」と「LED DUTY1」「LED PSC1」のどちらの設定に従うかというパラメー タを個別に持っています。
更に詳しく説明すると、この設定は0〜3の4通りの中から選択し、それぞれの設定でLEDは以下のように動作します。

  • 0・・・「LED DUTY0」「LED PSC0」「LED DUTY1」「LED PSC1」の設定にかかわらず、常にLEDは消えている
  • 1・・・「LED DUTY0」「LED PSC0」「LED DUTY1」「LED PSC1」の設定にかかわらず、常にLEDは点いている
  • 2・・・LEDは「LED DUTY0」「LED PSC0」の設定に従って点滅する
  • 3・・・LEDは「LED DUTY1」「LED PSC1」の設定に従って点滅する

そして、その設定を行うのがこの「SEL」というパラメータです。
ここで、「SELはSEL0とSEL1の二つしかないじゃないか」という意見があるかと思いますが、ここからが更にややこしいところ、実はSEL0は LED0〜7を、SEL1はLED8〜15をまとめて設定するのです。

唐突ですが、ここで16桁の2進数の数字を書いてみましょう。

0111010100010011←10進数の「29971」です

次にこの数字を2桁ごとに区切ります。

01 : 11 : 01 : 01 : 00 : 01 : 00 : 11

2桁の2進数出表すことのできる数は、「00」「01」「10」「11」の4パターンのみです。
そう、SELのパラメータを2進数にした上で2桁に区切ったときの、区切り一つで、一つのLEDの光り方を設定するのです。
ということは、各LEDの光らせるパターンを2進で考えて、それを「LED SEL0」「LED SEL1」に設定すれば良い訳ですね。
しかし、ポーズスライダは10進数か16進数でしか数字を表現できず、2進数に対応していません。では、どうすればよいのでしょうか?
実はここで16進数が役に立ちます。以下のページを参照してください。このように、16進数と2進数にはわかりやすい対比関係があるのです 。

wikipedia:二進数・十進数との対応

ということは、数値を16進数で表記すれば、一桁に2つのLEDの設定がきっちり入ることになります。
ちなみに、代表的なLED SELの設定値を16進数で表記すると以下のようになります。ぜひ参考にしてください。

  • 0x0000・・・8ch全てが常に消灯する
  • 0x5555・・・8ch全てが常に点灯する
  • 0xaaaa・・・8ch全てが「LED DUTY0」「LED PSC0」に従う
  • 0xffff・・・8ch全てが「LED DUTY1」「LED PSC1」に従う

先ほどの動画にもあるように、モーション中でこの設定を使いこなせば、例えばネオンサインのように順番にLEDを光らせたり、マス目状に LEDを配置して文字を表示したりするようなことも可能です。
イメージ的には、ナイトライダーの車みたいなものです(やっとタイトルにつながった)。

検索:ナイトライダー

現在のバッテリ電圧に応じてLEDの明るさを変えてみる

ここまでの設定は、LED拡張ボードを操作する設定は全てポーズスライダから参照するようにしていました。
ただ、LED拡張ボードの設定は参照変数を指定するものであり、当然ポーズスライダ以外の変数も設定することができます。
例えば、SEL0やSEL1に、ゲームパッドの入力状態を取得する241番や242番の変数を設定すると、コントローラのボタン入力にあわせてLEDが 様々に点滅するようになります。
それでは、これを応用して現在のバッテリ電圧に応じてLEDの明るさが変わるように設定してみましょう。

これまで同様、まずLED拡張ボードの設定ダイアログを開いてください。
LED変数設定で、PSCとSELの設定はデフォルトのままでよいので0を設定し、DUTYに現在のバッテリ電圧が代入される239番の変数を設定しま す。
今回はDUTY0に239を設定して、はLED0〜7に電圧の値を反映させて見ましょう。

LED変数設定
PSC・SELをすべて0に、DUTY0を電圧値を取得する変数239にそれぞれ設定

さて、これでバッテリ電圧に応じてLEDの明るさが変わるようになりました。簡単ですね...といきたいところですが、実はそうはいきませ ん。
239番の変数に入る数値は、バッテリ電圧をミリボルトに変換した値がそのまま入ります。例えば現在の電圧が5.0Vの場合、239番の変数に は5000が入ります。
これでは本来デューティ比が対応している0〜255の範囲を大きく上回り、正しい動きになりません。
この値をうまく0〜255の範囲に丸め込むことができれば正しく動くのですが、そんなことができるのでしょうか?
実は、LED拡張ボードのダイアログ下部「LED設定式」を利用することで、取得した変数の値を増減するなど、加工することができます。

設定ダイアログの下半分に注目してください。
「LED設定式」の項目は普段は設定できないようになっていますが、「LED設定式を有効にする」にチェックを入れると設定できるようにに なります。
この項目を有効にすると、DUTYの設定で読み取った変数に対して、「LED設定式」の変数を加えた計算を行い、それで算出された値をデュー ティ比として使用します。
LED設定式の具体的な数式は、ダイアログ下部に書いている「PSC = limit(v[vi_psc]+base)*k/0x1000」になります。
また「base」や「k」など、これに対して割り当てられる定数もあわせて設定します。

理論だけを説明してもなかなか頭に入りませんね。実際に値を設定して式を解いていってみましょう。
この式の正体は、中学校で習った単純な方程式です。式の変数に値を割り当てていけば、手で計算しても解けます。

まず、今回は電圧が約7.2Vの場合を最も明るくします。
ということは、変数239が約7200のときにデューティ比の値が255になればよいというわけですね。
取得した変数の値7200は、LED計算式の「v[vi_psc]」に代入されます。式の計算順から考えると、まずは変数に「base」の値が加算されま す。
「base」の値は、取得した変数に対するオフセットを設定します。今回の電圧値は、最低値が0から始まり、負の値も出てこないわかりやす い数値ですが、例えば数値の範囲が「-128〜+127」や「200〜400」などのように、上限・下限が0にならない場合は、「base」の値で加減算 をして上限・下限のどちらかが0になるように調整します(「base」を、前者なら128、後者なら「-200」にすれば良いです)。

変数に「base」を加算したら、次にその値に対してkを乗算し、更に0x1000で除算(割り算)します。 0x1000は16進数の1000です。ということは10進数に直すと4096です。 7200*kを4096で割ったときにちょうど255付近になる数値にするには、kをいくつに設定すればよいでしょうか? 255から少し頭が出ますが、kを146に設定すると「7200*146/4096 = 256.64062」となります。

LEDの計算式では、ここまでで求まった値に対して、最後に0〜255に収まるよう数値範囲制限をかけます。
この設定は「0≦PSC≦255」の部分に当たります。
PSCの左側に下限値、右側に上限値を入力します。最大の数値範囲は0〜255ですが、設定によってそれを更に狭めることもできます。

では、ここまでの設定をダイアログに入力しましょう。

LED設定式
base=0、k=146、0≦PSC0≦255にそれぞれ設定する

他にも変数には、ゲームパッドの現在のアナログスティック入力を取得する変数などもあります(変数番号244〜247)
DUTYの変数にそれらを設定し、LED設定式でうまく範囲内に収めれば、アナログスティックの倒し具合に応じてLEDの明るさを変えるなども 可能です。
いろいろチャレンジしてみてください。

次回予告

さて、次回は拡張ボードシリーズ第二弾、ジャイロ・加速度センサ拡張ボード「VS-IX001」について使用方法を説明していきたいと思いま す。
ジャイロセンサによるバランス制御や加速度センサによる自動起き上がりを使うと、ロボワンやロボットアスリート競技などで非常に有利 になります。


前のページ
第16回 LED拡張ボード「VS-IX004」を使う
コンテンツのトップ 次のページ
第18回 ジャイロ加速度センサ基板「VS-IX001」を使う


検索
Loading
メインメニュー