同じようにネギを振っているだけじゃつまらない
前回までで、マイクロはちゅねは自分でネギを振れるようになりました。しかし、ずっと同じペースで延々とネギを振っているだけでは、見ていてすぐに飽きてしまいます。
いろいろな外界の状況に応じて動くように改良すると、俄然面白くなってきます。今回は、動きに変化をもたせるための情報をマイコンへ与えるという話です。
音楽を聞かせてネギを振らせてみよう
面白くてつぶしの効くテーマとして、音楽に合わせてネギを振らせることを考えてみましょう。たとえば以下の動画に出てきます。
ここで「音楽に合った振り方とは一体何か」という深遠な問題もあるのですが、まずは「音が大きければ速くネギを振り、音がしなくなると止まる」といった程度の簡単な方法を想定することにします。
基本的なやり方は、アナログ・オーディオ信号をマイコンのADC(A/Dコンバータ)に入力して電圧を測定し、その結果からネギ振り速度を計算するというものです。ただしオーディオ信号は微弱なので、マイコンのADC(たとえば10bit精度でフルスケールが3.3Vなら、3.3V/2^10=3.22mVの分解能しかない)に直接入れても変化を検出できません。図1のように簡単なアンプを通す必要があります。
ADCにつながったら、次に考えなければいけないのは、どれだけの速度でデータを処理するかという事です。オーディオのサンプリングレートとしては一般に44.1KHz等がよく使われますが、それを鵜呑みにするのではなく、次に挙げたことなどを検討します。
- ADC自体がそのレートで動作するか
- マイコン・プログラムの速度が間に合うか
- 本当にそのレートで処理することが必要か
たとえばネギ振りは、メカの反応速度の限界ゆえ1秒に高々10回位しかできないものですが、その速度を1秒に44100回も細かく調整してみたところで意味がありません。よって、音量に反応させるのであれば、ずっとゆっくりしたサンプリング・レートで構わないという事になります(図2)。また、ある一瞬での音量ではなくて、一定時間(ウィンドウ)内の平均音量の値を利用したほうが自然になります。
マイコンで処理をするときは、時間感覚が重要
ここで、音量ではなく、スペクトラムアナライザのように周波数で反応させたくなった場合も考えてみましょう。この場合、それなりに高速な(検出したい周波数の2倍以上の)サンプリングが必要ですが、後述の割り込み処理が追いつかなくなる可能性が出てきます。表1に示したとおり、44KHzといったレートでデータを取り込んで処理するのは、低速なマイコンには相当荷が重いです(アセンブリ言語20命令ぶんしかない)。多点FFTのような比較的重い演算を行おうとすれば、高速マイコンでも簡単ではありません。データレートを落とすか、もしくは別の簡易アルゴリズムを使うといった工夫が必要です。
表1 センサなどの信号を扱う際には、マイコンの処理速度がどの程度のものか感覚をつかんでおく必要がある。ネギ振りなら楽勝だが、高品質オーディオなどを扱おうとすると低速マイコンでは辛い。演算などを施すならなおさら
高速パソコンの1クロック(3GHz) | 0.00000000033秒 |
高速PICの1命令実行(40MIPS) | 0.000000025秒 |
低速PICの1命令実行(1MIPS) | 0.000001秒 |
高速PICのADC変換(500ksps) | 0.000002秒 |
オーディオ・サンプリング (44KHz) | 0.000022秒 |
高速ネギ振り1回(10Hz) | 0.1秒 |
つまり、音声やセンサといった実世界の情報を扱う場合には、マイコンの速度やデータレートといった類の時間感覚を具体的に持つことがとても大事です。マイコンの速度はパソコンなどと比べれば桁違いに遅いですし、メモリの量も数桁少ない(パソコンではギガバイト単位のメモリがあるが、マイコンではキロバイト単位)ので、パソコンでやっている演算処理をそのまま持ってくるのは、通常難しいです。
ADCを使うためのマイコン・プログラミング
マイコン・プログラム上でADCを使うには、割り込みを使うのが常套手段です。ほとんどのAD変換処理では、まずADCのハードに変換開始トリガを送り、変換が終了するまで待ち、ハードから変換結果を読み出す、というステップを踏みます。このプログラムの構造例を図3に示します。図3では、ADCの起動や終了検出をタイマ割り込みのベクタ内部で行うようにしています(そうすると、変換を一定周期にしやすい)。しかし、タイマ割り込みでなく、ADCの終了割り込みを使う方法もあります。
マイコンのADC経由で、多くの種類のセンサを活用できる
今回はADCに注目しましたが、その理由は、ADCを介して多種のセンサをつなぐことができるからです。図4のような加速度センサ、ジャイロ(回転検出)、温度など沢山のセンサが、アナログ出力を持ちます。その値を読み取るうえでADCは欠かせません。センサは非常に進歩の早い世界で、数年前には考えられなかったような高性能・小型のものでも、いつの間にか通販で数百円で入手できるようになっていたりします。
ホビーで買える範疇では、たとえばSparkFun ElectronicsやStrawberry Linuxのサイトなどで珍しい物が沢山見つかります。ぜひ面白いセンサをつなげて、マイクロはちゅねに楽しい動きをさせてみてください。
最終回となる次回は、マイクロはちゅねどうしやパソコンとの通信について紹介します。