鍬形です。HM-StarterKitでマイクロマウスを始めようの連載Part 3です。前回は環境構築とハードウェアの取り扱い、サンプルプログラムStep 0の動作確認についてご紹介しました。今回はサンプルプログラムStep 1を用いてレジスタの設定方法の解説と、HM-StarterKitのブザーの鳴らし方をご紹介します。
プログラムの書き込みと動作
step1_buzzerをビルドしてマイコンに書き込みます。HM-StarterKit/Sample_software/step1_buzzerにあるプロジェクトファイルHM_StarterKit.mtpjをCS+で開いてビルド、書き込みを行います。ビルドと書き込み方法は第2回に解説があるのでご覧ください。
書き込み基板をRUNモードに切り替えてからリセットスイッチを押すと「ブー」とブザーが鳴ります。鳴らない場合はバッテリーが接続されているか、本体電源がONになっているかご確認ください。

各自ブザー音をご想像ください。
ブザーの鳴る仕組み
ブザー音はHM-StarterKitに搭載された電磁ブザーによって鳴ります。電磁ブザーにはコイルと磁石が内蔵されており、コイルに流れる電流に応じて磁石が動く構造になっています。電流を素早く変化させることで磁石が振動して音が鳴ります。電流の変化が速いほど振動も速くなるのでブザー音が高くなります。電磁ブザーの原理について詳しくは下記サイトをご覧ください。

赤丸で囲んだ部分が電磁ブザーです
ちなみに製品マニュアルには圧電ブザーと表記があるのですがこれは誤植でした。圧電ブザーは圧電素子の振動で音を鳴らすブザーです。
ブザープログラム解説
ブザーを振動させる電流はマイコンによって制御されています。具体的にはブザーに接続されたマイコンのピンから0Vと3.3Vの電圧を高速に切り替えながら出力します。
そこで今回は「0Vと3.3Vを交互に出力する」プログラムについてレジスタの機能を中心に解説します。本記事の解説内容はマニュアルの「マイクロマウス HM StarterKit パート3 『取扱説明書』 ソフトウェア解説編」 P3と対応しています。(※マニュアルの閲覧には製品に同梱されたパスワードが必要です)
レジスタにマイコンの設定を書く
マイコンに搭載された様々な機能はレジスタで設定できます。「0」と「1」の2進数で書かれており、たいていはあるモードを有効にする際は1、無効にする際は0をレジスタに書き込みます。例えるなら人間がマニュアルを読んで作業するのと同じようにマイコンはレジスタを読んで作業するイメージです。
「ある作業はどこを読めばわかるか」という情報は人間が読むマニュアルにおいてはページ、マイコンが読むレジスタにおいてはアドレスといいます。つまりレジスタのアドレスを指定して0か1を書き込むプログラムを書くことでマイコンに好きな作業をさせることができます。レジスタについて詳しくは下記サイトをご覧ください。
マイコンのどの機能がレジスタのどのアドレスに該当するかはマイコンのマニュアルに書かれています。2000ページ以上あるので初心者が読むのは結構しんどいです。
幸いHM-StarterKitでは基板に搭載された周辺機器を使用するための設定はサンプルプログラムに全て書かれているので、マニュアルを読んだりレジスタの細かい設定を知らなくても走らせることができます。なので本記事やHM-StarterKitのソフトウェアマニュアルの解説が難しいと感じた場合はメインプログラムであるHM_StarterKit.cの流れだけわかればオッケーです。マイコンの仕組みやロボットの作り方が気になった時に調べることをおすすめします。
GPIOの設定
ブザーの電圧を制御するためにはマイコンのGPIOピンを使います。GPIOとはGeneral-purpose input/outputの略で、汎用入出力という意味です。マイコンのGPIOピンといえば電圧の入力にも出力にも使えるピンということになります。入力は周辺機器からマイコンに電圧が入力されることを指し、出力はマイコンから周辺機器に電圧が出力されることを指します。今回はマイコンからブザーに電圧を出力するので、GPIOピンを出力モードで使用することになります。
ポート方向レジスタ(PDR)
ブザーが接続されているマイコンのポートBの5番(PB5)を出力モードにしましょう。GPIOピンを出力モードにするにはポート方向レジスタ(PDR)にデータを書き込みます。ポートの入出力の方向を設定できるレジスタです。0を書き込めば入力、1を書き込めば出力モードに変わるので、PB5のPDRレジスタに1を書き込みます。
ここで実際にPDRレジスタの設定を行っているサンプルプログラムを見てみましょう。各種レジスタのアドレスはサンプルプログラムのiodefine.hで定義されています。下記のコードはこちらに書かれています。
struct st_portb { union { unsigned char BYTE; struct { unsigned char B7:1; unsigned char B6:1; unsigned char B5:1; unsigned char B4:1; unsigned char B3:1; unsigned char B2:1; unsigned char B1:1; unsigned char B0:1; } BIT; } PDR; //中略 } //中略 #define PORTB (*(volatile struct st_portb __evenaccess *)0x8C00B)
st_portbという構造体(struct)の中にPDRという共用体(union)が定義されています。
unsigned char B5:1;
はB5という名前で1bit分メモリを確保するという意味になります。1bitとは2進数の1桁分を指します。111と書いたら3桁なので3bitです。
書き込み先であるポートBのPDRのアドレスは0x8C00Bです。マイコンのマニュアルP692にPORTB.PDR 0008 C00Bhと書かれています。下記のように定義することで0x8C00BにPB7からPB0までのアドレスが定義されます。ちなみに先頭に0xとつくのは後に続く数字が16進数で表記されていることを意味しており、2進数だと桁が多くて見づらいときによく使われます。
#define PORTB (*(volatile struct st_portb __evenaccess *)0x8C00B)
アドレスが指定できたら次は出力モードにするために1を書き込みます。iodefine.hでアドレスを指定したので現実の住所でいうところの1丁目2番地3号のようにPORTB.PDR.BIT.B5と指定して1を代入します。これでPB5が出力モードになりました。サンプルコードではこちらになります。
ポート出力データレジスタ(PODR)
PB5が出力モードになったのでいよいよブザーを鳴らすために電圧を出力します。PDRと同じように出力のオンオフもレジスタで設定できて、ポート出力データレジスタ(PODR)といいます。マイコンマニュアルP693にあります。設定方法はPDRと同じなので是非探してみてください。
マイコンの出力(3.3V)をオンにする際はPODRに1を書き込み、オフ(0V)にする際は0を書き込みます(ちなみにオンをHigh、オフをLowとよくいいます)。サンプルコードではこちらになります。
while(1){ PORTB.PODR.BIT.B5 = 1; for(i = 0; i < 100; i++); PORTB.PODR.BIT.B5 = 0; for(i = 0; i < 100; i++); }
for文では0から100までカウントアップする処理をさせてHighとLowの間に待機時間を追加しています。High、Lowのテンポがブザーの音の高さに影響するため、カウントアップする数字を大きくすれば音が低く、小さくすれば音が高くなることが確認できるはずです。この待機時間がないとHigh、Lowのテンポが速すぎて人に聞こえない超音波をブザーが発したり、回路に負荷を与えてしまうことが考えられます。
クロックの設定
for文によるカウントアップ処理の速さはマイコンのクロックに依存します。マイコンの様々な処理のタイミングはクロックに合わせて動いているので、クロックが速いほど処理速度が速くなります。ロボットにおいてクロックはモータの速度制御など様々な場面で用いられるため、今後も非常に重要な要素になります。
システムクロックコントロールレジスタ3(SCKCR3)
クロックの設定もレジスタに記述されています。システムクロックコントロールレジスタ3(SCKCR3)というレジスタです。マイコンのマニュアルではP260に書かれています。3bit分使用しており5種類のモードの設定できるみたいですね。こちらもアドレスの設定方法はPDR、PODRと同じなので探してみてください。
Step 1のサンプルプログラムではクロックに低速オンチップオシレータ(LOCO)を使用しています。レジスタにはデフォルトで0が代入されているので他の値を代入しなければ勝手にLOCOになってます。マイコンのマニュアルP255によるとLOCOが1秒あたりにクロックがカウントする回数(発振周波数)は125kHzです。つまりfor文によるカウントアップ処理は125kHzで動いていることがわかります。
ちなみにStep 2以降のサンプルプログラムではさらに高速なクロックを外部からマイコンへ入力しているので、Step 2のレジスタの設定でStep 1のメインプログラムを動かすと音が高すぎて超音波になると思います。外部クロックによるマイコン処理の高速化は次回ブログにて解説いたしますのでお楽しみにしててください。
ブザーの使いどころ
今回鳴らしたブザーはロボットの動作確認において非常に有用です。ロボットの状態に応じてブザーを鳴らす処理を書いておくことで「ロボットが想定通り周囲を認識しているか」「認識した状況に合わせて想定通りの処理を実行したか」などが確認できるようになります。
例えば迷路内にてロボットが行き止まりに遭遇したら「ピピッ」と2回音が鳴るようにすることで、想定通り行き止まりを認識するかどうかが確認できます。動作確認中の動画を撮っておくことで動きが何度も確認できる点も便利です。
ロボットの状態をLEDで表示する場合も多いのですが、LEDだとロボットの動きを目視で追いきれなかったり、記録用の動画内でLEDの色が白飛びしてしまう場合があります。マイクロマウスのように素早く動くロボットの動作確認には離れていても認識できるブザーの音声が有効なのです。
またロボットが動作中であることを周囲に知らせるために音楽を鳴らすことも有効です。特に人が立ち入る場所にある産業用ロボットは動作中に音楽が鳴ることが多いです。マイクロマウスをうっかり踏みつぶされないようにご機嫌な音楽をプログラミングすることもご一考ください。アールティの研修ブログではブザーによる疑似和音演奏の例が紹介されています。非常にレトロで味わい深い音色なので是非ご覧ください。
- Pi:Co製作(宇野)マイクロマウス研修Part27 疑似和音の考え方 | アールティ 移動型ロボットブログ
- Pi:Co製作(宇野)マイクロマウス研修Part33 歌謡曲をBEEP音で作る | アールティ 移動型ロボットブログ
- Pi:Co製作(宇野)マイクロマウス研修Part38 疑似和音を鳴らしながら走る[完結編] | アールティ 移動型ロボットブログ
まとめ
本記事ではサンプルプログラムStep 1のブザーを鳴らすコードを用いて、マイコンのGPIOとクロックを中心にレジスタの仕組みと設定方法を解説しました。レジスタのアドレスを指定して様々なデータを書き込むことで、マイコンに好きな動作をさせられることがご理解いただけたかと思います。
HM-StarterKitキャンペーン価格のお知らせ
手のひらサイズのマイクロマウスキット「HM-StarterKit」
33%OFFの特別価格で販売中!
製品ページはこちら

アールティロボットショップで購入する
また、6月10日(木)からは学生マイクロマウスサークルを対象としたプレゼントキャンペーンを開催予定です!詳細をお楽しみに!