レーザモジュールと受光モジュールを使いました。
RaspberryPi Picoで制御するレーザを使った映画防犯ブザーやUART通信をしてみました。
レーザーと受光モジュール
簡単紹介
※レーザー光が目に入ることにより重大な障害を起こす可能性があります。
人に向けたり、のぞき込んだりしてはいけません。

レーザモジュールの先端を調整することで、拡散したレーザの集束調整できます。
(固定してできないものもありますが、どっちが製品としての正常状態化はわかりません)
ポインタ左が十分なレーザ光、右は先端を回転させて拡散した状態。
モジュールによっては接着されていて調整できないものもあるようです。

◆関連記事
ピン配置
◆レーザモジュール

◆受光モジュール

外観
◆レーザモジュール
ピンヘッダは購入時からアングルタイプが実装されていたが、ストレートに換装した。

◆レーザモジュール(オリジナル版)

◆受光モジュール

使ってみた
◆開発環境
Arduino環境で開発しました。
制御するマイコンボードはRaspberry Pi Picoを使用しました。
ライブラリ不要で、内容は電子工作のLチカとボタンの入力状態を読み取るデジタル入出力です。
◆レーザとピンヘッダの付け替え
レーザモジュールと受光モジュールはセット販売されていることが多く、このモジュールのほとんどは5mW以上の高出力です。
レーザの規格については触れませんが、安全を考慮して2mW以下の低出力モジュールへ換装しました。電源電圧に5Vを印加したレーザを白い壁に照射しました。
左のポインタが2mW、右が5mWです。
5mWの方の強く光っているように見えます。

電圧による違いによる強度を比べてみます。
5mWレーザを使い5V印加時と3.3V印加時の光強度を比べてみました。
下図左が5V、右が3.3Vです。
左のモジュールは若干拡散が見えますが、5Vの方が強く光って見えます。

図を載せていませんが、2mWモジュールの5V印加時と5mWモジュールの3.3Vは同等程度に見えます。
(光強度測定器で測っていないため目視による主観です)
◆レーザの発光と受光
レーザモジュールは電圧を与えることで発光します。
受光モジュールは負論理(レーザを受光することで0V)信号を出力します。
電源電圧に依存して出力信号が変化します。
受光モジュールの応答をモニタしました。
黄ラインがレーザモジュールへの入力信号(Highが発光)、青ラインが受光モジュールの出力信号
(Lowが採光状態)です。
RP2040(Clock 133MHz)の最速のLチカでは、センサモジュール側は応答できないようです。
レーザモジュールの発光が遅いか、または受光モジュールの応答が遅いか切り分けはできませんが、Low/Highの切り替えは最低でも10us程度必要なようです。

※水平分解能はウエイト毎に変更しています。(スケール値が違います。)
受光時の電圧を測定しました。
電源電圧により出力電圧が変化します。
図上部のキャプションはセンサへ供給した電圧です。

受光したレーザ強度に対して出力電圧は変化ありませんでした。
◆レーザでUART
レーザを使ってUART通信をしました。
どのくらいのボーレートまで通信できるかを試してみました。
結果は14400bps以下で通信できました。
それよりも早いボーレートの場合、文字の誤認など通信が成立しない状態でした。
くわしくはこちらで実験しています。

◆映画防犯レーザセンサ
映画の防犯システムでみられるレーザとセンサーを使った防犯システムです。
レーザを遮るとブザーが鳴ります。
こちらでスケッチと回路を紹介、動画再生できます。

準備
◆開発環境
Arduino環境でRaspberryPi Picoを使用します。
Arduino環境の準備はこちらの記事で紹介しています。
◆ボードライブラリ
Raspberry Pi Picoを使用します。
Arduino IDEのボードマネージャからRP2040用のライブラリのインストールとボードの選択をします。
ボードライブラリには「Raspberry Pi Pico/RP2040 by Earle F. Philhower, III」を使用します。
Generic RP2040またはRaspberry Pi Picoを使用します。
追加のボードマネージャのURL | https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json |
検索 | RP2040 |
ボードライブラリ | Raspberry Pi RP2040 Boards(x.x.x)※ |
選択するボード | Raspberry Pi RP2040 Boards(x.x.x) > Raspberry Pi Pico |
◆モジュールライブラリ
この記事では追加のモジュールライブラリは必要ありません。
準備
◆ピンヘッダとレーザモジュールの付け替え
購入時からアングルタイプのピンヘッダが実装されていました。
ブレッドボードで作業をしたいのでピンヘッダをストレートに変更しました。
センサモジュールのセンサはリードピンが長すぎてレーザを受光しにくいので5mmほど切断しました。
レーザモジュールの出力は5mWの強出力なので、安全のためにユニバーサル基板に2mWのレーザを載せて使用しました。
各画像左が購入時、右側が作業後です。

スケッチサンプル
レーザチカ
説明
レーザの発光と消灯を繰り返します。
LEDの点滅(Lチカ)と同じです。
配線

スケッチ
#define LAS_PIN (0)
#define WAIT_US (100)
void setup()
{
pinMode(LAS_PIN, OUTPUT);
while(1)
{
digitalWrite(LAS_PIN, HIGH);
delayMicroseconds(WAIT_US);
digitalWrite(LAS_PIN, LOW);
delayMicroseconds(WAIT_US);
}
}
void loop()
{
}
結果
レーザ発光時の様子です。
電圧Highで発光、Lowで消灯します。

レーザ受光
説明
レーザを検出したらボード実装LED(GPIO25 緑)を消灯、未検出時には点灯します。
受光するレーザは「レーザLチカ」で使用したセットとスケッチを使用します。
配線

スケッチ
#define SENSOR_PIN (1)
void setup()
{
pinMode(SENSOR_PIN, INPUT_PULLDOWN);
pinMode(LED_BUILTIN, OUTPUT);
while(1)
{
digitalWrite(LED_BUILTIN, digitalRead(SENSOR_PIN));
}
}
void loop()
{
}
結果
レーザを受光している様子です。
レーザがセンサーの中心に照射されるように角度を調整します。

センサーの信号はレーザを受光している間はLow,レーザを受光されていない間Highを出力します。
出力される信号(High)は電源電圧と同じ電圧です。
以下はレーザを受光していない間の信号です。
2.5V付近で発振が始まり、2.5V以下ではレーザの受光に関係なく電源電圧と同じ電圧を出力し続けました。

(青 = 電源電圧、黄 = 出力信号)
映画防犯ブザー
説明
レーザを遮るとブザーが鳴りだす防犯システムを作ります。
レーザ側は常時発光しているだけのものです。
センサ側は遮光状態になったら1秒鳴動、0.5秒消音を3回繰り返します。
電源を入れたらレーザがセンサ部に照射するように調整します。
センサがレーザを受光した状態から監視状態になります。
基板上の緑LEDが点灯しているのが監視状態です。
この状態でレーザを遮ることでブザーが鳴動します。
ブザーにはUME638-1.5Vを使用しています。
(なるべく大きな音を出すため)
ブザーの電源は1.3~2.5Vでしたが、なぜか減圧すると鳴動しなかったので3.3Vをそのまま使っています。
トランジスタはブザーのスイッチに使っています。
配線

スケッチ
#define SENSOR_PIN (1)
#define BUZZER_PIN (0)
void setup()
{
pinMode(SENSOR_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_BUILTIN, OUTPUT);
}
void loop()
{
digitalWrite(LED_BUILTIN, LOW);
if(digitalRead(SENSOR_PIN) == HIGH)return;
digitalWrite(LED_BUILTIN, HIGH);
while(1)
{
if (digitalRead(SENSOR_PIN) == HIGH)
{
for (int i = 0; i < 3; i++)
{
digitalWrite(BUZZER_PIN, HIGH);
delay(1000);
digitalWrite(BUZZER_PIN, LOW);
delay(500);
}
break;
}
}
}
結果
※ブザー音が鳴ります。再生音量に注意
レーザを遮る動作をなるべく素早く行いましたがしっかり検出しました。
レーザUART
説明
レーザを使ったUARTをします。
送信側にはUARTシリアル変換アダプタを使用し、TXピンをレーザのAnode側に接続します。
受信側にはレーザをセンサで受光した時の信号はUART信号とは逆ロジックになるため、センサの信号出力に論理反転IC(74HC04D)を使いロジック反転させます。
スケッチはRaspberryPi Picoを使い受信したUARTの情報をUSBシリアル(COM)に出力します。
実行時には送信側のボーレートとスケッチのボーレート(UART0_BAUDRATE)値を一致させた状態にして送受信します。
配線

スケッチ
#define UART0_BAUDRATE (9600)
void setup()
{
Serial.begin(115200);
Serial1.begin(UART0_BAUDRATE);
}
void loop()
{
if(Serial1.available())
{
Serial.write(Serial1.read());
}
}
結果
ボーレート14,400bps以下でUART通信できました。
それより高いボーレートでは正確な通信ができない結果でした。
下図、ではセンサ側はArduinoIDEのシリアルモニタ、レーザ側にはUARTシリアル変換モジュールを使いCOM14で認識されました。
送信にはTeratermを使いました
Teraterm側から “tamanegiBLOG!!”と入力するとArduinoIDEシリアルモニタにも同文字列が表示されました。

ボーレートごとの波形をモニタしました。
黄はレーザ側、青はセンサ側でロジック反転回路を通過した後の波形です。
14,400bps以下で通信できていましたが、センサの信号立ち上がりにはっきり遅延があります。
いつ通信が破綻してもおかしくなさそうです。
9,600bpsでもパルス幅に対して10%強の遅延がありますが、どうにか通信継続できそうに見えます。

レーザ受光時のセンサの応答は10us弱程度の立ち上がり遅延がありました。
今回UARTのロジックに変更するためロジック変換ICを使っているので遅延加算されたことも考えられます。
コメント