• 目次 -Page-
  • コンテンツ -Menu-
  • リンク -link-
  • 赤外線通信ってなに?
  • このページでは赤外線通信を用いてPICとPICで通信を試みます。
    赤外線とは人の目には見えない光です。
    詳しい事は記号の出し方が分からないので省略します(汗)
    必要なものは「赤外線LED」と「赤外線受信モジュール」です。

    写真左のLEDが赤外線LED、右の黒いものが赤外線受信モジュールです。
    右の写真は実験の様子。
  • 赤外線受信モジュールの仕様
  • 赤外線受信モジュールには「キャリア周波数」というものがあります。 「40kHz」とか「38kHz」となっているはずです。 テストで使用するモジュールは「38kHz」のものなので「38kHz」でテストしていきます。
    「キャリア周波数ってなんやねん?」って思いますが、その周波数に合わせた周波数で赤外線LEDを点滅させないと受信モジュールが働かないということのようです。 つまりは送信側は38kHzの周波数で赤外線LEDを点滅(方形波)させる必要があるということです。
    次に赤外線受信モジュールには「出力パルス幅」というものが記載されています。 またまた「「出力パルス幅ってなんやねん?」と思いますが、赤外線受信モジュールが出力する「HIorLOW時間」のようです。 つまりは赤外線受信モジュールが「Hi」と判断した場合は「Hiを出力パルス幅分出力」し、「Lo」と判断した場合は「Lowを出力パルス幅分出力する」ということです。 今回テストに使用するモジュールの出力パルス幅は「600μs」なので「600μs」を元にテストを進めていきます。
  • 制御はどうするの?
  • 仕様の項目で説明したように、受信モジュールは600μs事にHiかLowを出力します。赤外線LEDは38kHzで点滅させると書いたのですが、これでは周期がマッチしません。 その謎は「受信モジュールからHiを出力したい場合は600μs間38kHzの周波数で赤外線LEDを点滅させる」ということです。 必然的にLowを出力させたい場合は600μsの間赤外線LEDを消灯していればいいのです。
     
    周波数が38kHzなので周期が26μsと求める事ができます。
    よって、23回点滅を繰り返せば≒600μsということになります。

    上の画像を見てもらうと分かりますが、赤外線LEDからHiを出力すると受信モジュールはLowを出力します。逆に赤外線LEDからLowを出力すると受信モジュールはHiを出力します。 この辺りをしっかり把握していないとマイコンのプログラムを作成する段階でミスをしてしまいます。
  • 送受信用のデータ構成を考える
  • 赤外線通信と制御の方法がわかったら後はデータをどう送るかということを考えるだけ。 まずはどれだけの制御をするかということにかかってきます。 複雑な制御を細かく指示するコントローラを作る場合はビット数を増やさないと対応できません。 しかし、今回のコントローラはマイコンの内臓オシレータを使用するため、あまり長いビットだと データがうまく伝わらない可能性があります。そこで、今回はこれだけはあれば何とかなるかなと おもう「4ビット」でデータを構成したいと思います。

    4ビットデータと考えた場合、上図のようなデータになります。 受信側はスタートビット「1」を監視し、「1」が入力された後に順次600μs事にデータを拾うようにします。 この場合、「1」を監視しますが受信モジュールは反転するので本当は「0」の監視ですね。お間違いのないように。 データビットを2ビットにして全体を8ビット通信にする方法もありますが、ビットを短くするとあらゆるリモコンの 影響を受け易くなってしまいます。実際10ビットでもテレビの一部のボタンで反応したりします。 データの作り方を間違ってるのかな?
  • 送信用の回路
  • 送信回路としては赤外線LEDに100mAを与えるのがメインになります。
    もちろん100mAをかけ続けるのは良くなく、点滅周期でのみ赤外線LEDを点灯させます。

    回路図は上図のようにしてみました。この回路では100mA流れませんが、今回は通信距離に とらわれないので適当に光る範囲で回路を組んでみました。 簡単に言うと手持ちの部品で回路を構成したと言う事ですね。送信スイッチを押すと順番に データを繰り上げて送信するようなプログラムにする予定です。
    大した回路じゃないですね。回路図には書いてませんが、スイッチの入力はプルアップする必要がありますね。
  • 受信用の回路
  • 受信側の回路図もいたって簡単です。

    赤外線モジュールは電源とOUT端子の3本で構成されています。素直に電源をつないでOUTを PICのポートに入力するだけでテストする分には大丈夫です。受信データ確認用にLEDを二つつけました。 本来は4つつけて試すのが一番いいのですけどね。
  • 送信側プログラム(CCS-C)
  • 送信側プログラムで注意すべき事は特にない。
    しいて言うならば赤外線LEDの点滅時間。
    これを間違うと永遠に受信はしないので注意が必要です。
    タイマーを使う方法もあるかも知れませんが、動作を把握し易いように動きを見てとれるようにプログラムしてみました。 赤外線LEDを点滅させるサブルーチンと600μs間消灯しているサブルーチンを作り、それを必要な個数呼び出している だけです。ひょっとするとアセンブラで書いたほうが早かったかも?
     
    ソースはここ
     
    回路図がPIC12F675だったのにプログラムがPIC18F2320なのは気にしないで。
    設定変えるだけだからわかるよね?
    プログラムの内容はスイッチが3つあって、押すとスイッチごとのデータを送信してるだけです。
  • 受信側プログラム(CCS-C)
  • 受信側のプログラムはどうしようか迷いました。 ネットで検索した結果、このやり方がベターなのかと思いプログラムしてみました。
     
    まずはスタートビットを監視し、スターとビットを検出すると600μs事にポートの状態を確認。 順序だってればデータの部分を変数に代入するというやり方です。今回は3つのパターンしかつかわないかったので 変数は2個しか用意していません。
     
    動作としては出力にLED3つとモータが一つある回路で、「1」が送信されてくるとLEDが順に点灯します。 「2」が送られてきた場合はLEDを点滅させながらモーターを動かします。「3」の場合はモーターだけ動かします。 モーターは振動モーターなので動かしたり止めたりしてます。
     
    ソースはここ
     
    このプログラムで実際にうまく動くか不安でしたが、取りこぼしもなく動いています。他のリモコンからの信号を受信して 動いてしまいますがビット数が少ないのでしかたないでしょう。ビット数を増やすかデータ方式を考えて回避する事も簡単でしょう。
  • おもちゃにしてみました
  • 送信機側です。紹介したプログラムはPIC12F675用ではありませんが、おもちゃには消費電力を考えて675を使用しました。3つのボタンを押すとそれぞれのデータを送信します。
     
    持ち易いグリップつきのケースに入れてみました。
    受信機側です。基板の下に振動モータが貼り付けてあります。受信するとLEDが光るので透明のケースに入れました。室内で計った結果、距離的には10mくらいは大丈夫でした。。
    Design & Programming - 天姫 -
    Copyright (c) 2007-2009 amahime All Rights Reserved.