Fukaのアイコン画像
Fuka 2022年09月25日作成
製作品 製作品 閲覧数 853
Fuka 2022年09月25日作成 製作品 製作品 閲覧数 853

距離センサを使ったランダムライト

距離センサを使ったランダムライト

概要

Spresenseと距離センサを使用して、
距離によって色が変わるライトを作成したので下記にまとめます。

必要部材

  • 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 に 編集 をしました。 (メッセージ: 初版)
ログインしてコメントを投稿する