GW短期集中連載!マイクロはちゅねで楽しいネット工作の世界へ

第5回マイクロはちゅねに、目と耳をくっつけてみる

同じようにネギを振っているだけじゃつまらない

前回までで、マイクロはちゅねは自分でネギを振れるようになりました。しかし、ずっと同じペースで延々とネギを振っているだけでは、見ていてすぐに飽きてしまいます。

いろいろな外界の状況に応じて動くように改良すると、俄然面白くなってきます。今回は、動きに変化をもたせるための情報をマイコンへ与えるという話です。

音楽を聞かせてネギを振らせてみよう

面白くてつぶしの効くテーマとして、音楽に合わせてネギを振らせることを考えてみましょう。たとえば以下の動画に出てきます。

ここで「音楽に合った振り方とは一体何か」という深遠な問題もあるのですが、まずは「音が大きければ速くネギを振り、音がしなくなると止まる」といった程度の簡単な方法を想定することにします。

基本的なやり方は、アナログ・オーディオ信号をマイコンのADC(A/Dコンバータ)に入力して電圧を測定し、その結果からネギ振り速度を計算するというものです。ただしオーディオ信号は微弱なので、マイコンのADC(たとえば10bit精度でフルスケールが3.3Vなら、3.3V/2^10=3.22mVの分解能しかない)に直接入れても変化を検出できません。図1のように簡単なアンプを通す必要があります。

図1 音楽に合わせて動きを変化させるには、何はともあれ、オーディオ信号をマイコンのADCに入力する必要がある。ヘッドホンなどの信号は微小なので、簡単なアンプを通して振幅を大きくする
図1 音楽に合わせて動きを変化させるには、何はともあれ、オーディオ信号をマイコンのADCに入力する必要がある

ADCにつながったら、次に考えなければいけないのは、どれだけの速度でデータを処理するかという事です。オーディオのサンプリングレートとしては一般に44.1KHz等がよく使われますが、それを鵜呑みにするのではなく、次に挙げたことなどを検討します。

  1. ADC自体がそのレートで動作するか
  2. マイコン・プログラムの速度が間に合うか
  3. 本当にそのレートで処理することが必要か

たとえばネギ振りは、メカの反応速度の限界ゆえ1秒に高々10回位しかできないものですが、その速度を1秒に44100回も細かく調整してみたところで意味がありません。よって、音量に反応させるのであれば、ずっとゆっくりしたサンプリング・レートで構わないという事になります図2⁠。また、ある一瞬での音量ではなくて、一定時間(ウィンドウ)内の平均音量の値を利用したほうが自然になります。

図2 音量の値が欲しければ、一定期間内でのADC出力の平均値をとるのが良いが、過剰に高速なサンプリングをしても意味がない。これに対し、ある周波数帯の情報が欲しければ、その2倍以上の周波数でサンプリングする必要がある
図2 音量の値が欲しければ、一定期間内でのADC出力の平均値をとるのが良いが、過剰に高速なサンプリングをしても意味がない

マイコンで処理をするときは、時間感覚が重要

ここで、音量ではなく、スペクトラムアナライザのように周波数で反応させたくなった場合も考えてみましょう。この場合、それなりに高速な(検出したい周波数の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の終了割り込みを使う方法もあります。

図3 ADCを使うにあたっては、割り込みを利用するのが常套手段。ここには、タイマ割り込みによって一定周期でAD変換のトリガをかけるコード例を示す。この他にも、AD変換終了で割り込みをかける方法もある
図3 ADCを使うにあたっては、割り込みを利用するのが常套手段

マイコンのADC経由で、多くの種類のセンサを活用できる

今回はADCに注目しましたが、その理由は、ADCを介して多種のセンサをつなぐことができるからです。図4のような加速度センサ、ジャイロ(回転検出⁠⁠、温度など沢山のセンサが、アナログ出力を持ちます。その値を読み取るうえでADCは欠かせません。センサは非常に進歩の早い世界で、数年前には考えられなかったような高性能・小型のものでも、いつの間にか通販で数百円で入手できるようになっていたりします。

ホビーで買える範疇では、たとえばSparkFun ElectronicsStrawberry Linuxのサイトなどで珍しい物が沢山見つかります。ぜひ面白いセンサをつなげて、マイクロはちゅねに楽しい動きをさせてみてください。

図4 マイコンのADCを使えるようになると、それだけで多くのセンサを利用できるようになる。センサは日進月歩の世界で、非常に高性能・小型のものが安価に手に入るようになってきた
図4 マイコンのADCを使えるようになると、それだけで多くのセンサを利用できるようになる

最終回となる次回は、マイクロはちゅねどうしやパソコンとの通信について紹介します。

おすすめ記事

記事・ニュース一覧