🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

3回答

1196閲覧

Arduinoを用いた電子工作の配線

mau

総合スコア13

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2021/02/10 08:54

編集2021/02/12 05:38

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 */

写真7(2/12 12:00)

追記3(2/12 14:30)
LEDリングのサンプルコードを利用したところ、信号線に信号がいっていることがわかりました。
ただし、課題として
・自身が書いたLEDリングのソースコードだと虹色に光らない➡そもそも思うように光らない
・超音波センサを反応させ続けないとプログラムが動かない➡1回の値の取得で継続的に動作させたい
ということが明らかになりました。
この課題を改善するためには、どのようにプログラムを書き換えればよろしいでしょうか?
(LEDリングの信号線のpinの位置はコードに合わせて変えております。)

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2021/02/10 13:35

> ショートしてしまいます。 ショートというのはあなたの解釈と思います。解釈ではなく、「起こっている現象」を「見たまま」教えて下さい。 ショートしているかどうかを知るのは意外と難しかったりします。 配線も、写真だけではなくあなたの意図したところの「回路図」を示してください。意図と、実際に行った結果である現物の写真を比べてこそ議論になります。
mau

2021/02/12 01:12

ご指摘ありがとうございます。回路図を添付させていただきました。再度、ご教授お願いします。
ozwk

2021/02/12 01:34

で、「ショートしている」の件は?何を見てショートしていると判断したのですか?
mau

2021/02/12 03:14

13pinの所の近くのLEDが点灯していなかったので、ショートしていると判断しました。 しかし、現状回路を組みなおしたところ、LEDリングが青く点灯するまでできたので、解決しました。
nac_tnk

2021/02/12 03:31 編集

現在、回路とスケッチでは、TRIGとECHO が逆になっているようだけど? fritzingの回路ね
mau

2021/02/12 04:30

ご指摘ありがとうございます。TRIGとECHO が逆にしましたが、上手く反応しません。
mau

2021/02/12 04:39

超音波センサ自体は反応を確認できましたが、LEDリングのプログラムが上手く機能していないようです。
thkana

2021/02/12 08:48

LEDが点灯しないという現象は、オープンでもショートでも、それ以外の配線間違いでもまたソフトウェアの間違いでも起こることです。それを「ショート」と判断しているので、「本当に起こっているのはどんなこと?」と疑問に思って皆が聞くわけです。 もしかして、「ショート」という言葉の意味を知らずに「なんだかよくわからない故障」とでもいう意味で使っているのですか? ショートは日本語で短絡、電気的に2点間が低抵抗で繋がれることをいいます。それ以外の現象はショートと呼びません。
thkana

2021/02/12 09:15

質問の主題が大きく変わったので、この質問へのリンクを記載した上で新しい質問にしたほうがよいのではないでしょうか。
mau

2021/02/12 09:22

@thkana 質問者に何の目的をもって回答欄に記述しているのかが分かりません。私は質問掲示板という場所を、質問に対して建設的な意見書き解決に導くところだと考えております。単に説教をしたいだけでしたら、質問掲示板に書くことではないですし、解決したことに対して掘り下げる必要もないかと思います。
thkana

2021/02/12 09:35

teratailのヘルプ https://teratail.com/help#about-teratail をご覧になりましたか? 「プログラミングをする中で起きた解決できない課題について本当に困っている人をサポートすること、また、価値のあるコンテンツを世の中に残し届ける事を目的としています。」 あなたの問題を解決することは確かに一つの目的ですが、「また」以降の部分、つまり同様の事態に陥った人が、事態を正しく判断して対処する手助けになる情報を整理して残すこともまたこの掲示板の目指すところです。間違いは間違いであると判じること、解決したことに対して掘り下げる必要もあるのです。
mau

2021/02/12 09:48

〉また」以降の部分、つまり同様の事態に陥った人が、事態を正しく判断して対処する手助けになる情報を整理して残すこともまたこの掲示板の目指すところです。間違いは間違いであると判じること、解決したことに対して掘り下げる必要もあるのです。 価値あるコンテンツが上述の発想のように定義されているのであれば、命題に対して真となりますが、価値あるコンテンツの定義もなく、独自判断で間違いと判じることと解決したことを掘り下げることを価値あるとするのは論理的に飛躍してます。
thkana

2021/02/12 09:58

> 定義されているのであれば そうではないという主張ですか?
mau

2021/02/12 10:00

私の考えは既に述べておりますが、逆に私の考えをどういう主張だと捉えますか?
thkana

2021/02/12 10:36

> 私の考えは既に述べておりますが 定義されている'のであれば' と仮定の話しかされていないように思うので、ではどうなのか確認させていただきました。 後から見る人の役に立つかどうかなんて知ったことではない、という主張かと思っています。
mau

2021/02/12 10:52

コンテキストの部分引用は、ミスリードに繋がります。コンテキスト全体を理解した上でコメントをお願いします。 メディア論的に質問掲示板を始めとするweb情報は、目的となる中心情報を集めるために存在すべきものであり、本のような周辺情報を取得するものではないので、全ての事柄を掘り下げることはそのコンテンツの価値を下げます。従って、超音波センサを使ってneopixelを虹色に点灯させる(中心情報)ことであり、ショートの定義について(周辺情報)書いたりするようなことは必要性がありません。故に、「後から見る人の役に立つかどうかなんて知ったことではない」は、異常なバイアスがかかっていることが言えます。
thkana

2021/02/12 11:05

メディア論なんざ知りませんが、議論したところでお互いの態度が変わるとも思えません。 では、とりあえずショートという想定は(多分)誤っているというコメントだけに留めておきましょう。後で読んだ人は真似をしてはいけません。 (特に技術的な)Q&Aサイトで解決の役に立つのは、解決できなくて困っている質問者による原因の推定ではなく、「何をしたか、何が起こったか」の事実の記載であることの方が遥かに多いです。
guest

回答3

0

とりあえず配線が違っています。
25とGNDの配線は外す
13とGNDを繋ぐ
結線図
この他に問題があるかどうかは見ていません。

超音波センサの距離に応じてNeoPixel Ringを光らせるモノを作っております。

組み合わせる前に、ただLEDを光らせるだけ、また距離センサで得られた値をシリアルで表示させるだけ、のプログラムをそれぞれ試して完動させていれば組み合わせるのもグッと楽になるはずです。

プログラム自体は無事?(デバッグをしてもエラーはでていない)書けていると思う

エラーが出ないことが動作の保証になるならば、

Arduino

1void setup(){ 2} 3void loop(){ 4}

が最強のプログラムのはず...ですが、そんなことは無いのは明らかです。
エラーが出るというのは、それがC++(Arduino)言語として成り立っていない、話にならないものだというだけのことであって、エラーは出ないのが当然。出ないからどうという話ではありません。
エラーが出ないというのはテストの回答欄を正しい日本語で埋めただけ、と考えれば丁度よいのでは。回答欄を文法的に正しい文章で埋めたって答えとして間違えていれば0点です。同様に、エラーが出なくてもプログラムのロジックが間違っていればなんにもなりません。


一応組んでみました。

距離センサで2cm以下の値を出すのがなかなか苦労です。3cmくらいまではわりとなんとかなるのですが、それより近くなると反射波を拾えなくなるのか大きな値になってしまったりします。

それとそのスケッチでは、一度反応するとあとはLEDの点灯は変化しません。それで満足ならいいですけど、スケッチの作りをみるとそうではなさそうです。どのようにしたいのかは全く書かれていないので知りませんが、考え直す必要があるでしょう。


この課題を改善するためには、どのようにプログラムを書き換えればよろしいでしょうか?

だから、考え直す必要がある、と... 考えてから聞いていますか?
theaterChaseRainbow関数はここが出どころと思います。元の関数が何をやっているか、ちゃんと理解するところから始めたらいかがでしょうか。

投稿2021/02/10 13:58

編集2021/02/12 08:57
thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nac_tnk

2021/02/10 14:19

あらら、そんな画像もあったんですね。私がチェックした画像は合っていました。 混ざっているようですね。
thkana

2021/02/10 14:32

確かに、写真5と6とは違うものだねぇ。
guest

0

気付いた所だけ。

・24個といえども、ネオピクセルは1個最大60mA程度使いますから
24*0.06A=1.44Aです。
USBのみの電源ならbeginの直ぐ後に、setBrightnessをしておいた方が良いです。
(64を用意していながら、setBrightnessをしていない)

・24個しかないのに60個あると登録しています。

・if (Distance < 2 )
2cm以内とはちょっと短すぎるのでは?取りあえず、10cm程度にしてテストした方が良いように思います。

<追記>
ネオピクセルの方がうまく機能していない、との事だけども、
単に

void theaterChaseRainbow(int wait){
for (int j=0; j<256; j++){//256色?0~255パターンの色の変化をさせるため
for (int i=0; i<strip.numPixels(); i++){//インスタンス名.numPixelsでLEDの個数を取得
strip.setPixelColor(i,i+j);
}//※
}
}

の部分に引数のwaitを入れていないからじゃないの?
※の行の後に「show」と「wait」入れたら?

このあたりはどう表示したいか?に関わってくるものだから
好きなように表示と距離取得を組み合わせてください。

投稿2021/02/10 11:49

編集2021/02/12 07:51
nac_tnk

総合スコア494

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nac_tnk

2021/02/10 11:56 編集

間違った。12個だったね。 HC-SR04のデータシート見てみたら最低2cmだったよ。
mau

2021/02/12 01:15

ご指摘ありがとうございます。回路図を添付させていただきました。再度、ご教授お願いします。
nac_tnk

2021/02/13 07:15

> 1回の値の取得で継続的に動作させたい との事だけど、普通はあり得ない仕様だよね。これが本当ならsetup関数で距離を取得した方が良い。 タッチセンサーのような感じで、トグル動作させたいのなら フラグ使って反転させる。 > そもそも思うように光らない theaterChaseRainbow関数内で、LED操作の基本が出来ていない。 ①ネオピクセルの色情報を書き換え ②ネオピクセルへと送信(show)で、その色を表示 ③表示時間(ウェイト) この①~③の繰り返しでパターンを変えていくのだけども、 現在、theaterChaseRainbow関数内は、Arduino内の色情報を変えているだけで表示していない。①のみ。 プログラムが終わってからloop関数でshowしている。
guest

0

ショートする、っていうのは配線を間違っているってことです。
まずは手書きでいいので、配線図を書きましょう。

投稿2021/02/10 09:30

y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mau

2021/02/12 01:16

ご指摘ありがとうございます。回路図を添付させていただきました。再度、ご教授お願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問