編集履歴一覧に戻る
Ryosuke_Kinoのアイコン画像

Ryosuke_Kino が 2024年01月26日17時18分30秒 に編集

コメント無し

本文の変更

# 背景 作成中... # 用意したもの |名称|概要| |---|---|

-

|Spresenseメインボード|キスト| |Spresense拡張ボード|テキ| |HC-SR04|超音波距離センサ|

+

|Spresenseメインボード|ローパワーでハイパフォーマンスなエッジコンピューィングが可能な、Sonyが開発したIoT向けボードコンピュータ。| |Spresense拡張ボード|spresenseメインボードにArduino Uno 互換のピンソケットを追加し、さらにmicroSDロッやヘッドフォンジャック等様々なインターフェースが使えるようになるもの。| |HC-SR04|SparkFun製の超音波距離センサモジュール。2cmから4mまでの物体の距離を接触せずに測定可能。| |Anycubic MEGA X|Anycubic社の3Dプリンター。本体部分の印刷に使用。| |PLAフィラメント|3Dプリンタ用の樹脂素材。本体部分の印刷に使用。| |ExtraBASS SRS-XB01|Sonyが発売している有線接続可能なワイヤレススピーカー。| |AUX3.5ミリステレオケーブル|両端が3.5ミリのミニプラグであるAUXケーブル。spresenseとSRS-XB01の接続に使用。|

# 仕組み 〜〜〜 # プログラム

-

〜〜〜

+

LEDテープを利用するためのライブラリ「[SpresenseNeoPixel-master](https://github.com/hideakitai/SpresenseNeoPixel)」が必要 ``` #include <Audio.h> #include <Arduino.h> #include <SpresenseNeoPixel.h>

+

//超音波センサー #define trigPin 8 //超音波センサーで使用するピン #define echoPin 9 //超音波センサーで使用するピン #define baserange 40 //mm #define range 40 //mm #define firstline 20 //mm #define endline baserange + range * 8 //Beep音の周波数設定 #define DO 262 #define RE 294 #define MI 330 #define FA 349 #define SO 392 #define RA 440 #define SI 494 #define HDO 523 #define OUT 0 //Beep音の音量設定 #define VOLUME -20 //-90~0 (db) ////////////////////////////////////////////////////////////////////////// // LEDストラップの設定 const uint16_t PIN = 6; // データ用のピンを指定 const uint16_t NUM_PIXELS = 30; // 点灯させるLEDの数を指定 SpresenseNeoPixel<PIN, NUM_PIXELS> neopixel; int ledIndex = 0; ////////////////////////////////////////////////////////////////////////// // 色の設定 int col[3]; // RGBの値を格納する配列 float hue = 0.0; // 色相(0.0〜1.0) float brightness = 0.5; // 明るさ(0.0〜1.0) float saturation = 1.0; // 彩度(0.0〜1.0) ////////////////////////////////////////////////////////////////////////// // 音の設定 AudioClass* theAudio; void setup() { Serial.begin(9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); theAudio = AudioClass::getInstance(); theAudio->begin(); //puts("initialization Audio Library"); theAudio->setPlayerMode(AS_SETPLAYER_OUTPUTDEVICE_SPHP, 0, 0); neopixel.clear(); neopixel.framerate(40); Serial.println("Start"); } void loop() { long duration, distance, beforeloop; digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = (duration / 2) / 29.1 * 10.0; //超音波センサで取得した距離(mm) if (distance < firstline + baserange && beforeloop != DO) { theAudio->setBeep(1, VOLUME, DO); hue = 0.0; // 赤色に設定 hsv2rgb(hue, saturation, brightness, col); // HSVで指定した色を、color[]に格納 neopixel.set(col[0], col[1], col[2]); // LEDの色をRGBで指定 neopixel.show(); // LEDを点灯 beforeloop = DO; } else if (distance <= (firstline + baserange + range) && beforeloop != RE) { theAudio->setBeep(1, VOLUME, RE); hue = 0.083; // 橙色に設定 hsv2rgb(hue, saturation, brightness, col); // HSVで指定した色を、color[]に格納 neopixel.set(col[0], col[1], col[2]); // LEDの色をRGBで指定 neopixel.show(); // LEDを点灯 beforeloop = RE; } else if (distance <= (firstline + baserange + range * 2) && beforeloop != MI) { theAudio->setBeep(1, VOLUME, MI); hue = 0.083 * 2.0; // 黄色に設定 hsv2rgb(hue, saturation, brightness, col); // HSVで指定した色を、color[]に格納 neopixel.set(col[0], col[1], col[2]); // LEDの色をRGBで指定 neopixel.show(); // LEDを点灯 beforeloop = MI; } else if (distance <= (firstline + baserange + range * 3) && beforeloop != FA) { theAudio->setBeep(1, VOLUME, FA); hue = 0.083 * 4.0; // 緑色に設定 hsv2rgb(hue, saturation, brightness, col); // HSVで指定した色を、color[]に格納 neopixel.set(col[0], col[1], col[2]); // LEDの色をRGBで指定 neopixel.show(); // LEDを点灯 beforeloop = FA; } else if (distance <= (firstline + baserange + range * 4) && beforeloop != SO) { theAudio->setBeep(1, VOLUME, SO); hue = 0.083 * 5.0; // 水色に設定 hsv2rgb(hue, saturation, brightness, col); // HSVで指定した色を、color[]に格納 neopixel.set(col[0], col[1], col[2]); // LEDの色をRGBで指定 neopixel.show(); // LEDを点灯 beforeloop = SO; } else if (distance <= (firstline + baserange + range * 5) && beforeloop != RA) { theAudio->setBeep(1, VOLUME, RA); hue = 0.083 * 7.0; // 青色に設定 hsv2rgb(hue, saturation, brightness, col); // HSVで指定した色を、color[]に格納 neopixel.set(col[0], col[1], col[2]); // LEDの色をRGBで指定 neopixel.show(); // LEDを点灯 beforeloop = RA; } else if (distance <= (firstline + baserange + range * 6) && beforeloop != SI) { theAudio->setBeep(1, VOLUME, SI); hue = 0.083 * 9.0; // 紫色に設定 hsv2rgb(hue, saturation, brightness, col); // HSVで指定した色を、color[]に格納 neopixel.set(col[0], col[1], col[2]); // LEDの色をRGBで指定 neopixel.show(); // LEDを点灯 beforeloop = SI; } else if (distance <= (firstline + baserange + range * 7) && beforeloop != HDO) { theAudio->setBeep(1, VOLUME, HDO); hue = 0.083 * 11.0; // マゼンタ色に設定 hsv2rgb(hue, saturation, brightness, col); // HSVで指定した色を、color[]に格納 neopixel.set(col[0], col[1], col[2]); // LEDの色をRGBで指定 neopixel.show(); // LEDを点灯 beforeloop = HDO; } if ((distance < firstline || endline <= distance) && beforeloop != HDO) { Serial.println("Out of range"); // 範囲外 theAudio->setBeep(0, 0, 0); // 音量を0に hue = 0.0; // 無色に設定 brightness = 0.0; // 明るさを0に設定 hsv2rgb(hue, saturation, brightness, col); // HSVで指定した色を、color[]に格納 neopixel.set(col[0], col[1], col[2]); // LEDの色をRGBで指定 neopixel.show(); // LEDを点灯 beforeloop = OUT; } } // HSV->RGB / RGB->HSV 変換 // https://gist.github.com/postspectacular/2a4a8db092011c6743a7 float fract(float x) { return x - int(x); } float mix(float a, float b, float t) { return a + (b - a) * t; } int* hsv2rgb(float h, float s, float b, int* rgb) { float rgbf[3]; rgbf[0] = b * mix(1.0, constrain(abs(fract(h + 1.0) * 6.0 - 3.0) - 1.0, 0.0, 1.0), s); rgbf[1] = b * mix(1.0, constrain(abs(fract(h + 0.6666666) * 6.0 - 3.0) - 1.0, 0.0, 1.0), s); rgbf[2] = b * mix(1.0, constrain(abs(fract(h + 0.3333333) * 6.0 - 3.0) - 1.0, 0.0, 1.0), s); rgb[0] = rgbf[0] * 255; rgb[1] = rgbf[1] * 255; rgb[2] = rgbf[2] * 255; return rgb; } ```

# デモ動画 〜〜〜 # 課題 〜〜〜 # 終わりに # 参考文献