レーザモジュールとセンサーモジュールを組み合わせてハンドスピナーを作りました。
小型の携帯扇風機の回転数など測ることができます。
記事の内容
注意
この記事では可視光レーザーを使用します。
保護メガネを使うなどレーザーが直接目に入らないよう十分に気を付けて作業する必要があります。
可視光レーザモジュールとセンサーモジュールを使って回転物の回転速度を計測する基板を制作します。
・完成物の紹介
・準備
・作成作業
ハンドスピナーの回転数を測ったり、ポータブル扇風機の回転数を測ったりできます。
完成物の紹介
レーザーとセンサーで作った回転測定器
![](https://tamanegi-digick.com/wp-content/uploads/2024/06/lcounter-top.jpg)
ハンドスピナーの回転数を測ってみました。
レーザーとセンサーの間にハンドスピナーのブレードを割り込ませます。
小さな基板の上にモジュールを並べているので、ブレードが基板やモジュールにぶつかりやすいです。
今回のサンプルスケッチは1秒間にレーザーが遮光された回数を表示します。
次の動画は2ブレードのハンドスピナーを使っているので、表示されたカウンタを半分にした値が1秒間の回転数です。
DCモータの回転数を測ってみました。
今回DCモータのシャフトに爪楊枝を取り付けています。
両端出しの爪楊枝ではないのでOLEDに表示された回数が1秒間の回転数になります。
以前このレーザーとセンサーの組み合せで一秒間に250,000回程度まで計測しました。
高速に回転するDCモータでも約80回/秒なのでまだまだ余裕で測定できます。
準備
ライブラリ
この電子工作ではArduino環境で、RP2040-Zeroを使って制御します。
RP2040-ZeroとOLED SSD1306をコンパイルするためのライブラリをインストールして作業します。
Arduino環境とライブラリのインストールはこちらの記事を参照
ボードライブラリ
選択するボード | Raspberry Pi RP2040 Boards(x.x.x) > Generic RP2040 |
確認時のバージョン | 3.8.1 |
モジュールライブラリ
機能/モジュール | ライブラリ名 | 検索 | 確認時のバージョン |
---|---|---|---|
SSD1306 | Adafruit SSD1306 by Adafruit | SSD1306 | 2.5.1 |
SSD1306 | Adafruit GFX Library by Adafruit | GFX | 1.11.3 |
Adafruit GFX Library byAdafruitは、Adafruit SSD1306 by Adafruitをインストールするときに関連ファイルとして一緒にインストールするかを問われるので、一緒にインストールします。
材料と工具
材料 | 用途 | 細かい情報 |
---|---|---|
マイコン基板 | センサーの読み取り OLEDへの結果表示 | Waveshare RP2040-ZERO |
可視光レーザモジュール | 発光してセンサーモジュール入光します | 赤色 630nm, <1mW |
センサーモジュール | レーザモジュールを受光します | |
OLEDモジュール | 結果を表示します | 0.96inch SSD1306 I2C 青色発色 |
ユニバーサル基板 | 部品を実装します | (W)70mm x (H)50mm 2.54mmピッチ 横24, 縦18穴 |
ピンソケット | モジュール類を着脱可能にします | 2.54mmピッチ 9pin x 2pc(RP2040-ZERO用) 4pin x 1pc(OLED用) 3pin x 1pc(レーザー) 3pin(低型) x 1pc(センサー用) |
樹脂スペーサ | 基板の足にします | Hexスタンドオフ M3 x 6mm x 4pc Hexナット M3 x 4pc |
配線 | 配線 | 適当な長さで |
半田 | 半田作業 | 適当な半田 例 ヤニ入り Φ1.0mm ダイソーで購入 |
半田ごて | 半田作業 | 使い慣れたものを |
レーザーモジュールは1mWのモジュールとピンヘッダをユニバーサル基板に取り付けて使用しています。
出来上がった基板です。
デバッグやユーティリティを考えてピンヘッダやスライドスイッチがついていますが、今回の解説ではシンプルな構成での配線作業にするため除外します。
![](https://tamanegi-digick.com/wp-content/uploads/2024/06/lcounter-1.jpg)
配線
接続配線は以下の通りです。
![](https://tamanegi-digick.com/wp-content/uploads/2024/06/lcounter-wiring.jpg)
ユニバーサル基板上での配置、配線は以下で行います。
レーザーモジュールの光線上にセンサーモジュールが受光できるように配置します。
OLEDとRP2040は測定物がぶつからない位置に配置します。
「Sensor Module」のピンソケットは、レーザとの高さ軸を合わせるために背の低いピンソケットを使用します。
![](https://tamanegi-digick.com/wp-content/uploads/2024/06/lcounter-universal-wiring.png)
ユニバーサル基板の配置は、完成状態の図(下図)を水平方向に裏返したイメージです。
![](https://tamanegi-digick.com/wp-content/uploads/2024/06/lcounter-top.jpg)
下図は配線後の状態です。
スイッチや、ピンヘッダなど余計な配線がありますが、最後はポリガンではんだ個所を保護します。
作業
作業は次の3ステップで進めます。
1.部品実装
2.スケッチの書き込みと動作確認
3.レーザー受光アライメント
1.部品実装
初めにピンソケットを取り付けます。
作業性では背の低い3Pinから行い、残りのピンソケットを取り付けます。
続いてワイヤーを取り付けます。
必要な長さにワイヤーを切断しておくのが理想ですが、1セットしか作らない場合は「現物合わせ」でも十分です。
現物合わせ:方端をハンダした後に反対側の端子位置までの長さに合わせて切断します。
最後に半田の外観と導通チェックをして終了です。
![](https://tamanegi-digick.com/wp-content/uploads/2024/07/lcounter-back.jpg)
2.スケッチの書き込みと動作確認
スケッチはコピペすることで使用できます。
Arduinoを起動しスケッチを書き込みます。
RP2040-Zeroを使い、1秒間にレーザを遮光した回数をOLED SSD1306に表示します。
スケッチ
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "pico/stdlib.h"
#define SSD1306_SDA (0)
#define SSD1306_SCL (1)
#define SSD1306_RESET (-1) //使用しないので -1を設定する。
#define SSD1306_ADDRESS (0x3C) //I2Cアドレスは 0x3C
#define SSD1306_WIDTH (128) //解像度 128 x 64 で使用します。
#define SSD1306_HEIGHT (64)
#define SENSOR_PIN (2) //センサーピン
#define TIME_1SECOND (1000000) //1s = 1,000,000us
bool timer_Measurement( repeating_timer_t *rt);
Adafruit_SSD1306 display(SSD1306_WIDTH, SSD1306_HEIGHT, &Wire, SSD1306_RESET); //I2C0を使用する
u_int8_t FlagStat = LOW; //最後に読み取ったセンサーの状態
long HIGHCounter = 0; //センサーの反応回数
u_int32_t After1s_us;
void setup() {
//センサーのピン設定
pinMode(SENSOR_PIN, INPUT_PULLDOWN);
//OLEDピン設定
Wire.setSDA(SSD1306_SDA);
Wire.setSCL(SSD1306_SCL);
if(!display.begin(SSD1306_SWITCHCAPVCC, SSD1306_ADDRESS)) {
for(;;);
}
After1s_us = time_us_32() + TIME_1SECOND;
}
void loop() {
u_int8_t Dat = digitalRead(SENSOR_PIN); //センサーの状態を読み取る
//1.センサーの状態確認とカウンターの更新
//センサーの状態がHIGHならカウントアップ
//次の周回で状態がLOWになるまでカウントは変化しない。
if(FlagStat == LOW) {
if(Dat == HIGH) {
HIGHCounter ++;
FlagStat = HIGH;
}
}
else {
//センサーHIGH待機状態に更新
if(Dat == LOW) {
FlagStat = LOW;
}
}
//2.1秒経過確認
u_int32_t now_us = time_us_32(); //起動からの時間読み取り(us)
if(After1s_us < now_us) {
//情報の更新
display.clearDisplay();
display.setTextSize(2);
display.setCursor(0, 0);
display.setTextColor(SSD1306_WHITE);
display.printf("%ld times", HIGHCounter);
display.display(); //バッファ転送(表示)
HIGHCounter = 0; //カウンタクリア
After1s_us = now_us + TIME_1SECOND; //次の1秒設定
}
}
3.レーザー受光アライメント
調整機構はありませんが、ピンとソケットの「遊び」を使ってセンサの中心にレーザーを調整します。
調整できたらレーザの遮光と採光を繰り返して、OLEDにカウントが表示されるのを確認します。
![](https://tamanegi-digick.com/wp-content/uploads/2024/07/lcounter-alignment.jpg)
コメント