2005年12月4日 更新
2004年10月30日 作成
PICマイコンを使って、赤外線リモコンを作ってみました。PIC12F675を使った一品で、R6(単3形)乾電池2本の電源で、数メートル離れた場所から、交通信号機のおもちゃ「ひかり201号」を操作できます。
PDF形式のマニュアルを用意しましたので、どうぞご覧ください。
ボタンを押すと、赤外線の信号が出るという、単純明快な品物です。
ただし、信号が出るのはボタンを押した瞬間だけです。ボタンを長く押し続けても、意味がありません。
信号機本体では、ボタンごとに次の意味を持たせてあります。
ボタンの色 | 送出値 | 機能 |
---|---|---|
青 | 1 | 設定する値を進める。 |
黄 | 2 | 設定する機能を選択する。 |
赤 | 3 | 信号の状態をすぐに進める。 |
青と黄は、設定を行うボタンです。赤は、押すとすぐに信号が変わります。押しボタン式信号のボタンとしても、使います。
ちなみに、こんなこだわりがあります。
今回は、受信側の信号機本体で、リモコン受信モジュールを用いた本格的な受信回路を使っています。なので、リモコンのほうでも、本格的な信号を出せるようにしました。
「NECフォーマット」(http://www.necel.com/ja/faq/mi_com/__com_remo.html)は、赤外線リモコンの規格のうちの1つです。次の特徴があります。
ちなみに、カスタムコードが「00XXh」となる場合は、どのメーカーでも自由に使えることになっています。そこで、今回の信号機のリモコンは、カスタムコードを「0033h」としました。
リモコンを実現するためには、こんな要素が必要です。
比較的必要な要素が少ないので、8ピンのPICマイコンPIC12F675を使うことにしました。
PIC12F675には、次の特長があります。
ちなみに、この用途であればADコンバータを内蔵したマイコンは必要ありません。同じような構成でADコンバータを省略したPIC12F629を使ったほうが、本当はいいのかもしれません。でも私は、PIC12F629とPIC12F675の2種類を取り揃えておくのがたいへんなので、8ピンのマイコンを使うときはいつも、PIC12F675を使っています。PIC12F629は、140円で買えたりするのですが、価格差は10円だけですから。
そんなわけで、回路図は次のようになりました。赤外線LEDは大きな電流を必要とするので、トランジスタで増幅をしています。クロックには、信号機本体と同じ4.19MHzのセラミック発振子を使いました。
ちなみに、以前の回路図では、トランジスタが2SC1815Yとなっていますが、コレクタ電流が流れすぎて、壊れる可能性があります。2SC2120など、より大きなコレクタ電流を流せるトランジスタを使ったほうが、安全です。
プログラムの流れとしては、単純に次のように考えました。
プログラムリストは、次のリンクにあります。MPLABの、バージョン6などで使えます。
せっかくですから、PIC12F675の基本的な使い方をふまえて、プログラムの説明をします。
PIC12F675では、最大で6つのI/Oポートを使えます。でも、最初にきちんと設定をしないと、それぞれのピンが別の用途に割り当てられてしまうこともあります。
プログラムを書きはじめる前に、まずは「コンフィギュレーションビット」の設定です。
「GP3/MCLR端子はI/Oピンとして使います」
4番ピンは、リセット用の端子としても、I/Oポートとしても使えますが、今回はI/Oポートとして使います。
「外部のセラミック発振子をつなぎます」
クロックの選択で、XTを選ぶと、2番ピンと3番ピンは、セラミック発振子や水晶発振子とつなぐことになります。
次は、プログラムの中で行う設定です。こちらの設定は、プログラムの中で自由に変更できるので、用途によっては状況に応じて同じピンを複数の機能で使い分けることもできそうです。
「コンパレータは使いません」
movlw H'07' ;コンパレータを使わない movwf CMCON
コンパレータを有効にしてしまうと、5番、6番、7番のピンが通常のI/Oピンとして使えなくなってしまいます。コンパレータの機能は、デフォルトで有効になっているので要注意です。
「ADコンバータは使いません」
clrf ANSEL ;ADコンバータは使わない
PIC12F675には、ADコンバータがついています。ADコンバータが有効になっていると、7番、6番、5番、3番のピンがアナログ用に割り当てられる可能性があります。これらのピンをデジタルとして使う場合は、必ずANSELレジスタを操作します。デフォルトではアナログ入力に設定されているので、要注意です。
I/Oポートの入力と出力を設定
movlw B'00001011';GP0,1,3が入力 movwf TRISIO
I/Oポートには、「入力」と「出力」の2つの使い方があります。ボタンが押されたかを調べるのは「入力」の仕事で、LEDに信号を送るのは「出力」の仕事です。入力と出力は、いつでもTRISIOレジスタを書き換えれば、切り替えられます。「1」にしたビットが入力、「0」にしたビットが出力になります。でも、ビット3(4番ピン)は、入力しかできません。
今回は、GP0,GP1,GP3を入力とし、残りを出力として使っています。
PICマイコンには、SLEEPという命令があり、使うとクロックを停止して止まります。SLEEPの状態では消費電力がたいへん少なく、待っている時間が多いリモコンでは重宝します。
でも、ボタンを押したときには、動作をきちんと再開させなければなりません。ボタンが押されたら割り込みが起こるようにすれば、割り込みによりSLEEP状態が終わり、マイコンの動作が再開されるようになります。
movlw B'00001011' ;GP0,1,3を割り込みの対象に movwf IOC clrf STATUS ;Select bank 0 clrf INTCON ;Clear INTCON bsf INTCON, 3 ;Set Port change enable bit bsf INTCON, 7 ;Set Global Interrupt Enable bit
このあたりで、割り込みの設定をしています。
割り込みが起きると、4番地に飛ぶので、4番地からは割り込み処理ルーチンを書きます。処理が終わったら、retfie命令で、もとの場所に戻れます。
; 割り込みではじまる場合 warikomi org H'04' movf GPIO, W ;Read GPIO to stop warikomi status clrf INTCON ;割り込み禁止 retfie
割り込みルーチンへ行くときと帰るときには、少しくせのある動作をするようですので、詳しくはデータシートを読みましょう。
ボタンが押された場合には、LEDを点滅させるルーチンへ行きます。
「sendir」のルーチンで、送信をしています。
送信では、細かいタイミングを考える必要があります。4.19MHzの発振子を使った場合、1秒間に実行される命令の数はおよそ104万8600回になります。タイミングは、この実行速度から逆算して計算します。
例えば、38kHzの1周期は、27.59回命令を実行するのにかかる時間に相当します。なので、27命令周期か28命令周期で光を点滅させれば、だいたい38kHzで点滅させられたりします。
このようにして、ひたすら命令の数を数えながらプログラムを書くことで、NECフォーマットの信号を出すソフトウエアが完成しました。
さて、次は信号機本体を完成させなければなりません。
次の記事: 動きつつある新型自作交通信号機「ひかり201号」--灯器とケーブルと交差点を作る(2004-11-01)
前の記事: 自作信号機ユニット「ひかり201号」の新要素--赤外線リモコンで操作できる交通信号機のおもちゃ(企画)(2004-10-03)