質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

87.37%

Arduinoを用いた焦電センサの値でのLEDテープの点灯方法

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,302

score 3

前提・実現したいこと

焦電センサの値を取り、HIGHになった時にLEDテープが点灯、LOWになると消えるようにしたい。
色々と調べるとArduinoの内部電力だけだと負荷が大きいとのことだったので外部からACアダプターをつなげている
LEDテープはWS2812、焦電センサはPaPIRs(VZ)、Arduinoはバージョン(1.8.9)を使用している。
ここに質問の内容を詳しく書いてください。
1.コードを書いて本来センサの値から光ったり消えたりして欲しいのにずっと付いたままの状態になっているのでどうすれば正しいセンサの値を反映させられるかを知りたいです。
→センサーの値が0になった時に7つ目のLEDのみが消えるようになったのを全部消えるようにしたい

該当のソースコード

#include <Adafruit_NeoPixel.h>
const int sensor = 2; ////
#define PIN 6       //信号端子のピン番号
#define LED_NUM 150  //LEDの数

Adafruit_NeoPixel ledtape = Adafruit_NeoPixel(LED_NUM, PIN, NEO_GRB + NEO_KHZ800);  //3つめのパラメータは使うLEDテープの制御ICがWS2812ならNEO_KHZ800 / WS2811ならNEO_KHZ400

void setup() {
  Serial.begin(9600);
  pinMode(PIN, OUTPUT); ////
  pinMode(sensor, INPUT); ////sensor(つまり2番のピン)は入力する場所として使います
 ledtape.begin();
  ledtape.show();   //一旦全てOFFの状態で反映
}

void loop() {
  int sensorState = digitalRead(sensor);//sensor(2ピン)のお知らせを読んで、「来た(HIGH)」or「来ない(LOW)」を「sensorState」と名付けた場所に入れておきます!

 uint16_t i, j;
 if(sensorState == HIGH){

 for(j=0; j <256; j++) {
   for(i=0; i < ledtape.numPixels(); i++) {
     ledtape.setPixelColor(i, rotateColor((((i) * 256 / ledtape.numPixels()) + j) & 255));
   }
   ledtape.show();
   Serial.print(sensorState);
   delay(40);
 }
}
else{
ledtape.setPixelColor(6,0,0,0);//LEDはきえる
Serial.print(sensorState);
delay(40);
}
}
//RGBの色の移り変わり関数
uint32_t rotateColor(byte WheelPos) {
  if(WheelPos < 85) {
   return ledtape.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  } else if(WheelPos < 170) {
   WheelPos -= 85;
   return ledtape.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  } else {
   WheelPos -= 170;
   return ledtape.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }

}

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

+1

・ 「試した」

LEDテープ、焦電センサそれぞれの単体のコードは試した

あなたが「試すという行為をした」こと自体に意味があるわけではありません。(まぁ、試さないよりはいいですけれど...)
こういう接続で、このスケッチで動かしてみたら、こういう結果が得られた、という事実が解決への情報になるのです。なので、それを書いて下さい。
(質問は編集出来るので、追加情報は回答を使うのでなく質問を編集/追記しましょう)

・ LED初期化不備

LEDをどういうプログラムで確認したかわかりませんが、本番プログラムでは

void setup() {
  ledtape.begin();
  ledtape.show();   //一旦全てOFFの状態で反映
  pinMode(PIN, OUTPUT); ////
  pinMode(sensor, INPUT); ////sensor(つまり2番のピン)は入力する場所として使います!!
}


LEDテープの制御で使うピンの設定の前にledtapeの制御が呼ばれています。当然ながら、まともに動かないでしょう。

なので、LEDが点灯している状態からリセットやプログラムの書き込みを行ってもLEDの初期化(全消灯)は行われません。

・ Serial初期化

loop()中にSerial.print()があるので、一応setup()にSerial.begin()を入れてやって下さい。あるいは、Serial.print()を削除するか。

・ 長いループ

焦電サンセを試した時、プログラム開始直後はセンサ出力(というかArduino入力)はHighでしたか、Lowでしたか。焦電サンセの性質上、あなたがセンサの前で作業をしていたらHighになっている可能性が高いと思います。
であれば、本番プログラムでも多分Highになっているでしょう。
そうすると、プログラムはいきなり

void loop() {
  int sensorState = digitalRead(sensor);//sensor(2ピン)のお知らせを読んで、「来た(HIGH)」or「来ない(LOW)」を「sensorState」と名付けた場所に入れておきます!

  uint16_t i, j;
  if (sensorState == HIGH) {

    for (j = 0; j < 256; j++) {
      //略
      delay(1000);
    }
  }


のforループに入るわけです。

このループは、中で1000m秒すなわち1秒待って256回繰り返すので、終わるまでに4分強かかります。この期間、LEDの色は少しずつ変わりますが、センサの状態にかかわらず消えることはありません。
(時々勘違いしている人がいるので念の為。if文はそこに到達した時に一度だけ()の中の式を評価して動作を分岐するのです。分岐した後、条件が満たされなくなっても、今回で言えばsensorStateがLowになったとしても突然とif文から出ていく、なんてことは起こりません)

人感センサなので4分点きっぱなし、という動作もありだとは思いますが、もっと短時間で反応して欲しいならプログラムの構造を考え直す必要があります。

・消灯処理の不備

  if (sensorState == HIGH) {
    //(略)点灯の処理
  }
  else {
    ledtape.setPixelColor(6, 0, 0, 0); //LEDはきえる!s
  }


これでは消えるわけありません。それぞれのLEDに0を設定したあと、Adafruit_NeoPixel::show() (この場合はledtape.show())を呼んで下さい

・ シリアルボートを見失う件

Arduinoの電源はどこから取っていますか? LEDの電源と同じところから取っているのであれば、LEDの電流が多くなって電圧が下がってしまい、Arduino(のUSB-シリアル変換部分)が動作出来なくなったのだと思います。
とりあえず、冒頭の
#define LED_NUM 150  //LEDの数
を例えば5ぐらいにしてLEDの点灯数を制限してどうなるか見てみましょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

PaPIRs OUT 出力電流は、最大 100μA なのでプルダウン抵抗は 50kΩ 以上

Arduino - WS2812 
D6 → 470Ω → DIN ( DOUT は、出力 )
GND - GND
ACアダプタ DC5V → +5V ( Arduino には接続しない GND のみ共通 )
全点灯する場合は 9A 以上必要 60mA × 150 = 9A

接続説明 LINK 

まずは、単体でのテストを勧めます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

回路図がわからないのでなんともですが、、

そのセンサの仕様を見ると、出力はオープンソース(オープンエミッタ)のようです、
これでは、センサがOFFになってもLowレベルになってくれません。
ということで、センサの出力ーGND間に10Kほどの抵抗入れてみたらどうでしょうか。(プルダウン抵抗)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/19 01:04 編集

    回答ありがとうございます。
    プルダウン抵抗というものが必要だということはサイトを見ていると書かれてあったので10kΩの抵抗を入れていました。

    回路図のイメージを追加しました。
    ないパーツは他の似た役割のパーツの画像を使用しました。

    キャンセル

0

![イメージ説明](eec9669a55a8800fd05e3873f7032bd4.png)
回路図はこんな感じです。
なかったパーツは似たような役割の画像を使いました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-1

for文を使ったら解決しました
他のところでも長文ありがとうございました!

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/25 22:53

    一番興味があったのがシリアルポートが見えなくなる件だったのですが、それはどのように解決しましたか。

    キャンセル

  • 2019/10/26 01:41

    これまでは最新のiMacを使って作成してたので、タイプ変換が必要だったので他のpcを使って試したところ今の所は問題なく使用できてます。

    キャンセル

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

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る