2014年5月31日

赤外線LEDとフォトトランジスタでシリアル通信

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

久々のArduinoネタ。
赤外線LED(OSI5FU5111C-40)とフォトトランジスタ(L-51ROPT1D1)を使ってシリアル通信をする。
最終的にATtiny85に載せる計画なので、SerialではなくSoftwareSerialを使っています。

送信側はこんな感じ。
普通のLEDと同様に抵抗1本を入れる。


受信側はこんな感じ。
トランジスタ(2SC1815)を入れてD10に接続。


これを向かい合わせにして、配置する。


プログラムは以下のような感じ。
送信側
#include <SoftwareSerial.h>

SoftwareSerial sender(10, 11);

void setup() {
  sender.begin(1200);
}

void loop() {
  sender.println("Hello World!");
  delay(1000); 
  sender.println("1234567890");
  delay(1000);
  sender.println("abcdefghijklmnopqrstuvwxyz");
  delay(1000); 
}

受信側
#include <SoftwareSerial.h>

SoftwareSerial receiver(10, 11, false);

void setup() {
  receiver.begin(1200);
  Serial.begin(9600);
}

void loop() {
  if (receiver.available()) {
    Serial.write(receiver.read());
  }
}

送信側のプログラムは、「Hello World!」→「1234567890」→「a〜z」を1s毎に出力、受信側は赤外線で受け取ったデータをSerialにそのままフォワーディングするような感じ。
仕組み的には独自のプロトコルではなく、Serial(SoftwareSerial)を使っているので特に複雑な訳でもなくサクッと使えるのが利点。

環境にもよると思いますが、この構成だと約20cmくらいまで離しても通信できました。
通信距離を伸ばすには赤外線LEDの球数を増やす、電圧を上げる(もちろん高出力タイプに置換した上で)等で出力を強くする必要あります。

次の記事では送受信×2で双方向(全二重)を実現させます。

3 件のコメント:

  1. SoftwareSerial receiver(10, 11, false)のfalseはどのような働きや意味をしているのでしょうか。
    リファレンスにはないので疑問に思いました。

    返信削除
    返信
    1. inverse logicです。
      trueにすると負論理になります。

      なので、今回の場合falseを指定してる意味はありません。
      いろいろ変更して動作確認をしていたので、そのまま残してました。

      削除
    2. ありがとうございます。

      削除

記事へのコメントはいつも確認している訳ではないので、お返事が遅れる場合があります。
ご質問やご意見は twitter@9SQ へお送り頂けると早くお返事できると思います。