Adafruit の NeoPixel Ring 12連フルカラーと超音波センサを利用した電子工作
お世話になっております。
この度、Arduinoを使って電子工作にチャレンジを使用と思い、実行したところ上手くいきませんでしたので、質問させていただきます。
現在、超音波センサの距離に応じてNeoPixel Ringを光らせるモノを作っております。
プログラム自体は無事?(デバッグをしてもエラーはでていない)書けていると思うのですが、
写真の通りに配線をしたもののショートしてしまいます。
配線をどのように変更すれば上手く動くようになるのか、ご教授お願いします。
配線写真のリンク
写真1
写真2
写真3
写真4
写真5
写真6
特になし
該当のソースコード
C
1/* 2 * 最大32256バイトのフラッシュメモリのうち、スケッチが3614バイト(11%)を使っています。 3 * 最大2048バイトのRAMのうち、グローバル変数が41バイト(2%)を使っていて、ローカル変数で2007バイト使うことができます。 4 */ 5 6//ライブラリの読み込み 7#include <Adafruit_NeoPixel.h> 8#define MAX_VAL 64 // 0 to 255 for brightness ➡ 8bitの範囲で輝度の調整 9#define DELAY_TIME 50 10 11int echoPin = 2; 12int trigPin = 3; 13double Duration = 0; 14double Distance = 0; 15int Neopixel_Count = 60; 16int Neopixel_Pin = 4; //NeoPixelを接続するデジタル出力ピン 17 18//インスタンスの生成 19Adafruit_NeoPixel strip = Adafruit_NeoPixel(Neopixel_Count,Neopixel_Pin,NEO_GRB + NEO_KHZ800); 20/*Adafruit_NeoPixelの各パラメータについて 21 * 22 * 1つ目のパラメータは、使用するLEDの個数を表す。使用するLEDの数に設定すればメモリの節約になる➡ 23 * 2つ目のパラメータは、使用するピンの番号(input)を表す。ピンの接続先に注意すること➡Neopixel_Pin 24 * 3つ目のパラメータはデータの並べ方や転送速度を表す。変更する必要もなさそうだし、正直よくわからんからそのまま。 25 */ 26// NEO_RGB Pixels are wired for RGB bitstream 27// NEO_GRB Pixels are wired for GRB bitstream 28// NEO_KHZ400 400 KHz bitstream (e.g. FLORA pixels) 29// NEO_KHZ800 800 KHz bitstream (e.g. High Density LED strip) 30 31 32void setup() { 33 pinMode(echoPin,INPUT); 34 pinMode(trigPin,OUTPUT); 35 36 //インスタンスの使用 37 strip.begin(); 38 strip.show(); 39 /* 40 * 「インスタンス名.begin()」でインスタンスの使用を開始。 41 * この時すべてのLED上に関する、Arduino上のチャンネル用メモリに0が書き込まれる。➡LEDの初期化 42 * 「インスタンス名.show()」でArduinoからLEDへ転送され、一時的にLEDがオフになる。 43 */ 44} 45 46void loop() { 47 digitalWrite(trigPin, LOW); 48 delayMicroseconds(2); 49 digitalWrite( trigPin, HIGH ); //超音波を出力 50 delayMicroseconds( 10 ); // 51 digitalWrite( trigPin, LOW ); 52 Duration = pulseIn( echoPin, HIGH ); //センサからの入力 53 Duration = Duration/2;//往復距離なので片道の距離に置き換える 54 Distance = Duration*340*100/1000000;//音速を340m/sと定義し、片道距離の正規化を行う。 55 if (Distance < 2 ){//どの距離でLEDを光らせたいか決める 56 theaterChaseRainbow(DELAY_TIME); 57 strip.show(); 58 } 59} 60 61 62//虹色にLEDを光らせる 63void theaterChaseRainbow(int wait){ 64 for (int j=0; j<256; j++){//256色➡0~255パターンの色の変化をさせるため 65 for (int i=0; i<strip.numPixels(); i++){//インスタンス名.numPixelsでLEDの個数を取得 66 strip.setPixelColor(i,i+j); 67 } 68 } 69} 70 71/*インスタンスにカラーデータを書き込む関数 72 * インスタンス名.setPixelColor(i,c); 73 * i番目のLEDにcで表されるカラーデータを書き込む関数 74 * ➡for文を使えば番号をずらすことができるから、1本の信号線で全てのLEDを光らせることができる 75 */ 76
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
使用基盤:Aruduino UNO
超音波センサ:HC-SR04
LED:NeoPixel Ring 12連フルカラー
追記(2/12 9:00)
色々ご指摘ありがとうございます。回路図作成に手間取ってて返信が遅れました。
写真の件については申し訳ございません。違う種類のものが混ざっていたようです。
プログラムについて補足させていただきますと、
超音波センサーで距離を取得し、一定の距離以下(今回はとりあえず2としておきましたが、2未満は難しいという事ですので後ほど修正させていただきます。)になったとき、
LED 12連Ringが虹色に点灯するプログラムを書かせていただきました。
また、センサが感知するたびにLEDが光るというようにしたいです。
ゆくゆくは、9Vのモバイルバッテリーを搭載させ持ち運びができるようにする予定です。
回路図もfrizingを用いて書かせていただきました。ご迷惑をお掛けしますが、再度ご教授お願いします。
追記2(2/12 12:00)
配線自体は上手くいったようですが、プログラムが思う通りに動いてくれません。
ご指摘いただいた通り、超音波センサの距離の閾値を変えてみましたが、上手く反応していない状態です。ご教授よろしくお願いします。
C
1/* 2 * 最大32256バイトのフラッシュメモリのうち、スケッチが3614バイト(11%)を使っています。 3 * 最大2048バイトのRAMのうち、グローバル変数が41バイト(2%)を使っていて、ローカル変数で2007バイト使うことができます。 4 */ 5 6//ライブラリの読み込み 7#include <Adafruit_NeoPixel.h> 8#define MAX_VAL 64 // 0 to 255 for brightness ➡ 8bitの範囲で輝度の調整 9#define DELAY_TIME 50 10 11int echoPin = 2; 12int trigPin = 3; 13double Duration = 0; 14double Distance = 0; 15int Neopixel_Count = 60; 16int Neopixel_Pin = 4; //NeoPixelを接続するデジタル出力ピン 17 18//インスタンスの生成 19Adafruit_NeoPixel strip = Adafruit_NeoPixel(Neopixel_Count,Neopixel_Pin,NEO_GRB + NEO_KHZ800); 20/*Adafruit_NeoPixelの各パラメータについて 21 * 22 * 1つ目のパラメータは、使用するLEDの個数を表す。使用するLEDの数に設定すればメモリの節約になる➡ 23 * 2つ目のパラメータは、使用するピンの番号(input)を表す。ピンの接続先に注意すること➡Neopixel_Pin 24 * 3つ目のパラメータはデータの並べ方や転送速度を表す。変更する必要もなさそうだし、正直よくわからんからそのまま。 25 */ 26// NEO_RGB Pixels are wired for RGB bitstream 27// NEO_GRB Pixels are wired for GRB bitstream 28// NEO_KHZ400 400 KHz bitstream (e.g. FLORA pixels) 29// NEO_KHZ800 800 KHz bitstream (e.g. High Density LED strip) 30 31 32void setup() { 33 pinMode(echoPin,INPUT); 34 pinMode(trigPin,OUTPUT); 35 36 //インスタンスの使用 37 strip.begin(); 38 strip.show(); 39 /* 40 * 「インスタンス名.begin()」でインスタンスの使用を開始。 41 * この時すべてのLED上に関する、Arduino上のチャンネル用メモリに0が書き込まれる。➡LEDの初期化 42 * 「インスタンス名.show()」でArduinoからLEDへ転送され、一時的にLEDがオフになる。 43 */ 44} 45 46void loop() { 47 digitalWrite(trigPin, LOW); 48 delayMicroseconds(2); 49 digitalWrite( trigPin, HIGH ); //超音波を出力 50 delayMicroseconds( 10 ); // 51 digitalWrite( trigPin, LOW ); 52 Duration = pulseIn( echoPin, HIGH ); //センサからの入力 53 Duration = Duration/2;//往復距離なので片道の距離に置き換える 54 Distance = Duration*340*100/1000000;//音速を340m/sと定義し、片道距離の正規化を行う。 55 if (Distance < 5 ){//どの距離でLEDを光らせたいか決める 56 theaterChaseRainbow(DELAY_TIME); 57 strip.show(); 58 } 59} 60 61 62//虹色にLEDを光らせる 63void theaterChaseRainbow(int wait){ 64 for (int j=0; j<256; j++){//256色➡0~255パターンの色の変化をさせるため 65 for (int i=0; i<strip.numPixels(); i++){//インスタンス名.numPixelsでLEDの個数を取得 66 strip.setPixelColor(i,i+j); 67 } 68 } 69} 70 71/*インスタンスにカラーデータを書き込む関数 72 * インスタンス名.setPixelColor(i,c); 73 * i番目のLEDにcで表されるカラーデータを書き込む関数 74 * ➡for文を使えば番号をずらすことができるから、1本の信号線で全てのLEDを光らせることができる 75 */
追記3(2/12 14:30)
LEDリングのサンプルコードを利用したところ、信号線に信号がいっていることがわかりました。
ただし、課題として
・自身が書いたLEDリングのソースコードだと虹色に光らない➡そもそも思うように光らない
・超音波センサを反応させ続けないとプログラムが動かない➡1回の値の取得で継続的に動作させたい
ということが明らかになりました。
この課題を改善するためには、どのようにプログラムを書き換えればよろしいでしょうか?
(LEDリングの信号線のpinの位置はコードに合わせて変えております。)
}