第6回目は…
みなさんこんにちは。第6回目は私YUUKIが担当させていただきます。
前回の記事ではモーターがうまく回らない時の対策についてでした。今回はマウスの前方についている光センサーについて見ていきたいと思います。
この記事では「マニュアルダウンロードページ(購入者限定)」にてダウンロードしていただいたマニュアルpart3のP8~11にある「光センサー」の欄について動作確認と簡単な解説をしていきたいと思います。
※マニュアルダウンロードページを開くにはHM-StarterKit同梱のカードに記載されているパスワードが必要になります。
光センサーの動作確認
はじめにHMキットに搭載されている光センサーですが、フォトリフレクタ(反射型フォトセンサー)と呼ばれるものです。上部についている赤外LEDから放出された光を物体に反射させ、下部のフォトトランジスタで受光することで出力電流が変化する光センサーです。
プログラム書き込みと値の確認
はじめにサンプルプログラムをビルドしFlash Programmerにてマウスに書き込んでいきます。(詳しくは第2回記事をご覧ください)
続いてTera Termにてセンサーの値を確認していきます。
Flash Programmerにて書き込みを終えた状態で、通信ケーブルを外さず、一度本体の電源を切り、FWモード(書き込みモード)からRUNモード(実行モード)にスイッチを切り替えます。
再度、HM本体に電源を入れTera Termを起動します。
起動してポートの設定をすると最初は文字化けします。ここは第2回でもご案内したシリアルポートの接続速度をあげてみてください。その後、「設定」にある「設定の保存」をするとシリアルの速度等が保存され、次回からすぐ確認できるようになります。
(第2回で書くべきでした…すいません…)
うまく表示されない場合…
マウスの電源や書き込み基板のモードスイッチの確認し、リセットボタンを押してみてください。
表示されるとこのようになります。
この状態で…
写真のように箱などをセンサーの前に置き、近づけたり離したりと動かしてみてください。
Tera Termに表示されている各センサーの値が変化するはずです。
この光センサーの発光部は赤外LEDを採用しています。テレビのリモコンに使われるものと同様にナイトモード等にセットしたカメラ越しに発光しているのが確認できるはずですが、私の端末では見ることができませんでした。
センサーに手をかざしTera Term上の数値がしっかり変動していればちゃんと動作しています。
これは後々迷路を走行させる前に行うセンサーの値の確認で使用します。
AD変換について…
ヒヤッとする誤解…
さて、センサーの動作確認でお見せしたTera Termの画面では、右、右前、左前、左と4つのセンサーの値と、その下にV-BATとあります…バッテリー電圧のことですね。
値を見ると2362…何も考えずに見ていると2.3Vあたり示しているのではと誤解します。
(しました…)
言い訳がましいですが、なぜ誤解したか説明します。
このキットのみご購入いただき充電を書き込み基板から行うと、バッテリーの電圧をモニターできません。この記事でご紹介しているのはマニュアルのStep3です。
これ以前にブザーやモーターを回したりしていますので意外とバッテリーを消費している方が多いかと思います。
STEP7のサンプルプログラムには電圧低下をブザーにて警告するプログラムが書き込まれているそうですが、STEP3では書き込まれていないので、電圧低下に気づくすべがここまでの作業でありません。
結果この値だけ見てバッテリーを使いすぎていたと誤解をしてしまうというわけです。
(初心者あるあるだと…信じています…笑)
光センサーのAD変換…
while(1){ while(1){ S12AD.ADANS0.WORD = 0x0047; //A/D変換をAN000,1,2,6のみ許可する //センサ発光 PORTA.PODR.BIT.B3 = 1; //PA3をHighに設定 PORT1.PODR.BIT.B5 = 1; //P15をHighに設定 PORT1.PODR.BIT.B4 = 1; //P14をHighに設定 PORT3.PODR.BIT.B1 = 1; //P31をHighに設定 for(i = 0; i < 100*1000/40; i++); //40で100usec S12AD.ADCSR.BIT.ADST = 1; //A/D変換を開始 while(S12AD.ADCSR.BIT.ADST); //A/D変換が終わるまで待つ PORTA.PODR.BIT.B3 = 0; //PA3をLowに設定 PORT1.PODR.BIT.B5 = 0; //P15をLowに設定 PORT1.PODR.BIT.B4 = 0; //P14をLowに設定 PORT3.PODR.BIT.B1 = 0; //P31をLowに設定 //センサの値を表示 SCI_printf("sensor_fr = %d\n\r",S12AD.ADDR6); SCI_printf("sensor_r = %d\n\r",S12AD.ADDR2); SCI_printf("sensor_l = %d\n\r",S12AD.ADDR1); SCI_printf("sensor_fl = %d\n\r",S12AD.ADDR0); //バッテリー電圧のA/D変換 S12AD.ADANS0.WORD = 0x0200; //A/D変換をAN006のみ許可する S12AD.ADCSR.BIT.ADST = 1; //A/D変換を開始 while(S12AD.ADCSR.BIT.ADST); //A/D変換が終わるまで待つ SCI_printf("V_BAT = %d\n\r",S12AD.ADDR9); for(i = 0; i < 100*1000*100; i++);
AD変換(Analog to Digital Converter)はアナログ信号をデジタル信号に変換するものです。
正確な計測(アナログセンサーで測定した距離など)や設定のためにこの変換処理は必要となります。
HMキットに使用されているマイコンRX631は、逐次比較方式の 12 ビットの A/D コンバータを内蔵しています。センサーからは 12bit、4096(2¹² = 4096)分割で出力されます。
また赤外LEDの発光と受光するフォトトランジスタの立ち上がりに遅延があります。
Step3_lightsensorでは122行目でフォトトランジスタが立ち上がるのを待ってからAD変換を開始しています。
このStep3は、あくまでも動作確認が主題となっています。なので4つのセンサーを同時に発光していますが、これでは各センサーが別の光も一緒に受光してしまうため、壁を認識することはできません。
なので迷路走行にむけたStep7のプログラムでは一つずつ発光させ、AD変換を行いループしています。
※上記のコード、マニュアルとサンプルプログラムどちらも135行目のコメントが間違えています…(AN006だと光センサーになっています。正しくはAN009です。)
バッテリー電圧の確認…
では、誤解したバッテリ電圧を見ていきます。
V_BATは、バッテリー電圧のAD変換された値を見ています。
入力された電圧(V) = 3.3(V) * AD 値(Tera Termに表示されている値) / 4096
V_BATということで、電源電圧を取っていますが、ここはレギュレーターの外から取っているので3.3Vのリファレンス電圧を超えてしまいます。
それはいけないので、この電源電圧を取る部分に1kΩの抵抗で挟んで分圧しています。
「1kΩ2つで挟んでいる部分のAD値」ということなので電源電圧を知りたい場合は上記の式の2倍にすると正確な電源電圧が分かるということです。
かなり省略していますがイメージとしては下記のようになります。
電源電圧(V) = 3.3(V) * AD 値(Tera Termに表示されている値) / 4096*2
ちなみに…最初に見た画像のAD値を代入して確認すると…
電源電圧(Ⅴ)=3.3(Ⅴ)*2326(AD値)/4096*2=3.747…
電源電圧=3.7V ということでバッテリーは問題ないことがわかります。
おわりに…
私自身の誤解をきっかけにAD変換について簡単に説明する…なんてありがちな流れで書いてみましたがいかがだったでしょうか…
誤解とはいえ初めてのもの、加えてデリケートなものを取り扱う以上、不安に感じたことを正常だと確認できることは、安全な開発につながると考えています。
第6回目の記事は以上になります。次回はマウスの基板にあるLEDの点灯についてです。
それではっ…
YUUKI
お知らせ
手のひらサイズのマイクロマウスキット「HM-StarterKit」
33%OFFの特別価格で販売中!
製品ページはこちら

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