概要
Spresenseと距離センサを使用して、
距離によって色が変わるライトを作成したので下記にまとめます。
必要部材
今回使用するメインのマイコン。拡張ボードとドッキングして利用しました。
※SPRESENSE™ 活用コンテスト 開催にあたり、ご提供頂くことが出来ました。
ありがとうございます!
今回は距離センサとして、「HC-SR04」という超音波センサを使用しました。
秋月電子で購入が可能です。
超音波距離センサー HC-SR04
LEDボード
8×8のフルカラーマトリックスLEDボードです。
たしかamazonで購入しました。
その他
- ブレッドボード
- 配線材等
必要に応じて準備が必要です。
配線
まず、電源を5[V]仕様にします。(使用する超音波センサが5[V]仕様のため)
初期状態でジャンパーピンが5[V]側になっているはずですが一応確認しておきます。
センサとLEDボードは下記の様に配線しました。
超音波センサの接続
基板面にピンが印字されているので、これを参考に配線します。
Spresense I/O | 超音波センサ |
---|---|
Vout | VCC |
GND | GND |
D4 | echoPin |
D5 | trigPin |
LEDボードの接続
購入時には配線が取り付けられていなかったので、事前に配線しました。
Spresense I/O | LEDボード |
---|---|
3.3V | +電源 (赤) |
GND | -電源 (黒) |
D7 | 信号線(黄色) |
ライブラリのインストール
マトリックスLEDを使用するにあたって、SpresenseNeoPixelのライブラリを利用させて頂きました。
SpresenseNeoPixel(GitHub)
ソースコード
使用したコードを記載します。
動作サンプル
#include <SpresenseNeoPixel.h>
const uint16_t PIN = 7; //使用するピン
const uint16_t NUM_PIXELS = 64; //8*8=64
SpresenseNeoPixel<PIN, NUM_PIXELS> neopixel;
#define echoPin 4 // Echo
#define trigPin 5 // Trigger
double dura = 0; //間隔
double dist = 0; //距離
double dist_light = 0;
void setup() {
Serial.begin(9600);
pinMode( echoPin, INPUT );
pinMode( trigPin, OUTPUT );
neopixel.clear();
neopixel.framerate(40);
delay(1000);
Serial.println("--start--");
}
void loop() {
static uint32_t prev_ms = millis();
static uint8_t state = 0;
//超音波センサ出力設定
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite( trigPin, HIGH );
delayMicroseconds( 10 );
digitalWrite( trigPin, LOW );
dura = pulseIn( echoPin, HIGH );
if (dura > 0) {
dura = dura / 2; //往復距離割る2
dist = dura * 340 * 100 / 1000000; // 音速=340m/s
Serial.print("距離 = ");
Serial.print(dist);
Serial.println(" cm");
}
dist_light = dist;
if (dist_light <= 10 && dist_light < 15)
neopixel.set(255, 0, 0);//red
else if (dist_light <= 15 && dist_light < 20)
neopixel.set(0, 255, 0);//green
else if (dist_light <= 20 && dist_light < 25)
neopixel.set(0, 0, 255);//blue
else if (dist_light <= 30 && dist_light < 35)
neopixel.set(255, 255, 0);//yellow
else if (dist_light <= 35 && dist_light < 40)
neopixel.set(0, 255, 255);//aqua
else if (dist_light <= 40)
neopixel.set(255, 255, 255);//white
neopixel.show();
delay(50);
}
改良の余地は十分にありそう...
完成品
とりあえず、動かす事は出来た。
が、感度差などまだまだ工夫できるところはあると思うので
更に改良していきたいと思います。
投稿者の人気記事
-
Fuka
さんが
2022/09/25
に
編集
をしました。
(メッセージ: 初版)
ログインしてコメントを投稿する