« HC08マイコンの使い方QY4A編 -《49》【製作】抵抗分圧式リモコン(1) | メイン | HC08マイコンの使い方QY4A編 -《51》【製作】抵抗分圧式リモコン(3) »

HC08マイコンの使い方QY4A編 -
《50》【製作】抵抗分圧式リモコン(2)


 マイコンのピンに来ている電圧を確認します。 抵抗分圧式リモコンのスイッチを押している間だけ動くプログラムを作ります。 そして、停止スイッチを押すまで動き続けるプログラムを作り始めます。
 

remocon_res_12.jpg

A-D入力の電圧を確認しているようす(クリックで拡大)
ジャンパ JP1 の 1~2番ピンをショートさせておく

 

 ハードウェアに問題がないかどうかを簡単かつ確実に確認する方法として、マイコンをソケットから取り外した状態で 16ピン(VSS)~5ピン(PTA4/AD2) 間の電圧を ディジタル・マルチ・メータ DMM で測定してみましょう。 上の写真を参考にしてください。 そのときの電源電圧として 16ピン(VSS)~1ピン(VDD) 間の電圧も忘れずに測定しておきましょう。
 

remocon_res_13.gif

 測定結果は上の表のようになりました。 電池を入れ替えたばかりなので、電源電圧は 3.21 V と高めです。 これを 電源電圧 3 V に換算してみると、右端の列のようになります。 前回 の一つ目の表と比べてみると、みごとに近い値となっていることがわかります。
 

◆ 抵抗分圧式リモコン対応プログラム(その1)を作る
 ハードウェアの確認が終わったところで、ソフトウェアの制作に移ります。 デバッグがしやすいという理由から、ユーザ・モード・モニタ入り MC908QY4Aマイコン (KMC908QY4A) と USB-HC08デバッグ・ツールを使うことにします。 ICソケットに ユーザ・モード・モニタ入りマイコン を入れておいてください。 最初の仕様は次のようなものです。

・ スイッチの押下状況に応じた直流電圧(電圧多重通信の一種)が抵抗分圧式リモコンからマイコン・カー本体へ送られてくるので、マイコンは PTA4/AD2 入力端子に入ってきた電圧を A-D変換する。
・ フルスケールを 6等分した各レベルを しきい値 (Threshold :スレッショルド) として、次のように対応させてスイッチの押下状況を判定する(前回 の 2つ目の表を参照)。
   フルスケールの 1/6 倍未満 ・・・・・ 前進SWオン
   フルスケールの 2/6 倍未満 ・・・・・ 左折SWオン
   フルスケールの 3/6 倍未満 ・・・・・ 右折SWオン
   フルスケールの 4/6 倍未満 ・・・・・ 後退SWオン
   フルスケールの 5/6 倍未満 ・・・・・ (停止)SWオン
   フルスケールの 5/6 倍以上 ・・・・・ 全SWオフ
★ スイッチの押下状況の判定に基づき、スイッチが押されている間だけそれに対応するモータ出力を行う。 スイッチが離されたらモータ出力をオフする。
・ 複数のスイッチを押した場合の動作については規定しない。

 この仕様をよく読むと、(停止)SW というのは気にする必要がないことがわかります。 ですから、次のように解釈してもかまいません。
   フルスケールの 1/6 倍未満 ・・・・・ 前進SWオン
   フルスケールの 2/6 倍未満 ・・・・・ 左折SWオン
   フルスケールの 3/6 倍未満 ・・・・・ 右折SWオン
   フルスケールの 4/6 倍未満 ・・・・・ 後退SWオン
   フルスケールの 4/6 倍以上 ・・・・・ 全SWオフ

 ソフトウェアによって何をするべきか、ここまでの話の意味が理解できていればそんなに難しいことはありません。 それでは、プログラム例を示します。 ちなみにこれは 第39回 の parallel_04 (正確には 第42回 の parallel_04u )を元に作成しました。

 マクロの定義では、A-D変換する入力信号のチャネルを指定しています。 それから、各 しきい値 をそれぞれ定義しました。 THRESHOLD5 は最初は使いませんが、ついでに入れておきました。

#define ADCH_RES        ( 2 )       // AD2(PTA4)

中略

#define THRESHOLD1      ( 255 * 1 / 6 )
#define THRESHOLD2      ( 255 * 2 / 6 )
#define THRESHOLD3      ( 255 * 3 / 6 )
#define THRESHOLD4      ( 255 * 4 / 6 )
#define THRESHOLD5      ( 255 * 5 / 6 )

 
 データの定義では、抵抗分圧式リモコンの入力電圧 A-D値を入れる変数を用意しました。

U1 addata_res;

 
 メイン関数はこんな感じで、かなりシンプルです。 

void main( void ) {
    init_hardware( );
    init_PORT( );
    init_ADC( );
   
    for ( ; ; ){
        input( );
       
        resistor_type_b1( );
    }
   
}

 
 リセット後のA-D変換器の初期化は、だいぶ見慣れてきた頃でしょう。

void init_ADC( void ) {
    ADCLK = 0x32;       // 3.2÷2=1.6MHz、8ビット、長期
    ADSCR = 0x1F;       // 単独変換、停止中
}

 

 入力処理の内容は、もう説明が不要だと思います。

void input( void ) {
    ADSCR_ADCH = ADCH_RES;
    while ( !ADSCR_COCO );
    addata_res = ADRL;
}

 

 そして今回の主役となる抵抗分圧式リモコンの処理は、こんなふうに書けました。

void resistor_type_b1( void ){
    if ( addata_res < THRESHOLD1 ){
        PORT_MT = MTR_OUT_FWD;
    } else if ( addata_res < THRESHOLD2 ){
        PORT_MT = MTR_OUT_TNL;
    } else if ( addata_res < THRESHOLD3 ){
        PORT_MT = MTR_OUT_TNR;
    } else if ( addata_res < THRESHOLD4 ){
        PORT_MT = MTR_OUT_BAK;
    } else {
        PORT_MT = MTR_OUT_STP;
    }
}

 

 入力信号の電圧に応じて、対応するモータ出力を決定するという仕組みになっています。 プロジェクトごと圧縮したものを resistor_01u.zip に置いておきますのでご利用ください。

 実際に動かして遊んでみると、パラレル式リモコンに比べてワイヤ数が少ないことが実感できると思います。 なんせ 2本しかないのですから、少ないですよね!
 

◆ 抵抗分圧式リモコン対応プログラム(その2)を作る
 今度は、次のような仕様のプログラムを作ってみましょう。

・ 前進・左折・右折・後退いずれかのボタンを押すと動作して、 停止 を押すと止まる。
・ それ以外については、(その1) の仕様と同じ(★を除く)。

 
 どうやって作るか考えていると、パラレル式リモコンのときにも似たようなプログラムを作ったことを思い出しました。 そうです、今回の (その1) と (その2) の関係は、第39回 の parallel_04 と 第40回 の parallel_07 の関係とまったく同じなのです。 と言われても普通は覚えていないでしょうから、もう一度そこのところを読み返してみてください。 さて、あのときの経験をそのまま応用すれば、(その2) のプログラムが完成・・・するでしょうか? 試しに書いてみると、こうなります。

// うまく動かない?
void resistor_type_b2( void ){
    if ( addata_res < THRESHOLD1 ){
        PORT_MT = MTR_OUT_FWD;
    } else if ( addata_res < THRESHOLD2 ){
        PORT_MT = MTR_OUT_TNL;
    } else if ( addata_res < THRESHOLD3 ){
        PORT_MT = MTR_OUT_TNR;
    } else if ( addata_res < THRESHOLD4 ){
        PORT_MT = MTR_OUT_BAK;
    } else if ( addata_res < THRESHOLD5 ){
        PORT_MT = MTR_OUT_STP;
    }
}

 

  このプログラムの狙いを書いておきます。 どのスイッチも押されていないときは、どの if 文も不成立なので出力ポートが変化しません。 オンにもオフにも変化しないため、前進・左折・右折・後退いずれかのスイッチを押したときの出力が保持される、という動きを期待しています。 第40回 の parallel_07 と同じです。


CodeWarrior のデバッガを動かしてみる!

 プロジェクトごと圧縮したものを resistor_ng02u.zip に置いておきますのでご利用ください。
USB-HC08デバッグ・ツールを使ってユーザ・モード・モニタ入り MC908QY4A にプログラムを書き込んでください。 まだデバッガ画面を終了しないでください。

 次のことを意識して、デバッグを行ってください。

【本日のデバッグの心得】

 USB-HC08デバッグ・ツールを使用中は、マイコン・カー本体の POWER スイッチをオン/オフすることによってモータ・ドライバIC の電源をオン/オフできます。 ブレーク・ポイントでプログラムを停止させたときなど、モータが回りっぱなしで止めたいときに利用できます。 マイコンの電源は影響を受けないのでデバッグを続けることができます。

 USB-HC08デバッグ・ツールを使用中は、マイコンの電源 VDD が 3V ではなく 5V になります。 抵抗分圧式リモコンの入力をプルアップする 1kΩ抵抗も 3V ではなく 5V に接続されます。 マイコンの電源が 5V になるということは、A-D変換器の基準電圧も 5V になります。 しかし、このことはデバッグを行う上でそれほど影響はありません。 フルスケールに相当する電圧の幅をディジタルの 8ビットで表現して、それを 6等分した値をそれぞれ しきい値 としているので、実際の電圧が何V というのは直接プログラムには関係しないのです。

 マイコン・カー本体は、何か台の上に置いてタイヤを床から浮かせておいてください。

 
 マイコン・カーの POWER スイッチをオンにしてください。 この状態で、マイコン回路には デバッグ・ツールから来る 5V が供給され、モータ駆動回路には乾電池の 3V が供給されています。

 デバッガの Start ボタン(緑色の矢印アイコン) をクリックしてください。 まだ何も動かないはずです。

 そこで、リモコンを操作してみてください。 期待したとおりには動きませんね? どうしたことでしょう? おそらく、(その1) の動きと同じような結果だったのではないでしょうか。 これは困りました・・・。

 それでは、いったんプログラムを停止します。 Reset Target ボタン(黒矢印に赤丸のアイコン) をクリックしてください。 電源をオフ→オンするダイアログが出たら、USB-HC08デバッグ・ツールの POWER スイッチをオフ→オンして OK をクリックしてください。 これでデバッガのリセットができました(第42回 も参考になる)。


 次は Source ペイン(Source の窓枠) をクリックしてから、一番上に Source というメニュー項目を表示させ、そこから Open Source File... をプルダウン選択します。 main.c を選択して OK をクリックしてください。
 

remocon_res_14.gif

 main.c が開いたら真ん中あたりまでスクロールして、下図の赤い矢印の位置にブレーク・ポイントを付けてください(その行で右クリック、Set Breakpoint )。
 

remocon_res_15.gif

 この状態で、デバッガの Start をクリックしてください。 まだ何も起こりませんね。

 気を付けて、リモコンの前進スイッチを押し続けてみてください。 指を離さないこと。 もしブレーク・ポイントで止まった場合は、「あれ?」 という気持ちをそのままに、前進スイッチから指を離さないまま Start を再度クリックしてください。

 いま、マイコン・カーのモータ出力は前進の状態ですね。 さて、ここからが重要なのです。 リモコンの前進スイッチから指を離してみてください。

 なんと、モータの回転が変わりましたね!? おそらく後退になっていると思います(左折や右折の可能性もある)。 そして、ブレークが掛かっているではありませんか! ちょっとこれはどういうことか調べてみましょう。 USB-HC08デバッグ・ツールの POWER スイッチはオンのまま、パソコン画面のデバッガもそのままにしておいて、マイコン・カー本体の POWER スイッチだけオフにしてください。 これでモータの回転を止めることができます。

 最も知りたいのは、A-D変換の結果がどうなっているのか、ということです。 Data ペインの addata_res を見ると、175 と表示されていました(他の数字でも大丈夫)。 THRESHOLD5 というのは、
  255 × 5 ÷ 6 = 212 (小数点以下切り捨て)
ですから、175 ならば 停止スイッチを押していると認識されて当然です。

 マイコン・カー本体の POWER スイッチをオンにして、デバッガの Start ボタンをクリックしてください。 モータ出力が停止したはずです。

 ここでちょっと立ち止まって、いったい何が起こっているのか考えてみましょう。 停止スイッチを押していないのに、押したような動きをする。 後退スイッチを押していないのに、デバッグ中にモータが後退の出力をしていた。 その理由は? また、期待通りの動きをするプログラムを作るには、どうすれば・・・?
 理由を考えるヒントがマイコン・カーの回路図(第41回)にあります。 ノイズ吸収のために付けてあるコンデンサ C8 0.1μF が何らかの影響を与えているのでは? もしそうだとすると、これをなくすわけにはいかないので、プログラム的にうまく解決しなくてはなりません・・・。 さて、どうすれば? 自力で作ってみよう、という方は、がんばって仕様通りに動くプログラムを作ってみてください。 わかったつもりになって、簡単簡単と言っているあなた、本当に正しく動作するプログラムを作れますか? ぜひ実際にチャレンジして、動作確認まで行ってみてください。

(続く)

 

 『参考文献』
「試しながら学ぶHC08マイコン入門」 (CQ出版)
  第9章 USB-HC08デバッグ・ツールを自作する
  第10章 統合開発環境CodeWarriorを使ってみる
  Appendix F KMC908QY4Aユーザ・モード・モニタ入りマイコンの知識
筆者のホームページ 『マイコン工作の実験室』

組み込みエンジニア KAWANO

 

カテゴリ:

トラックバック

このエントリーのトラックバックURL:
http://www.eleki-jack.com/mt/mt-tb.cgi/2992

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

カテゴリ

会社案内
情報セキュリティおよび個人情報の取り扱いについて

コメントとトラックバックは、spamを予防するために、編集担当が公開の作業をするまで非公開になっています。
コメントはそれぞれ投稿した人のものです。

Powered by
Movable Type 4.1