酒と薔薇の日々(その2)

好きなことだけ求めて生きるアスペ気味のINTJ人

ArduinoのPWMがヘン (使わない機器が繋がっているPinも明示的にデータを出力(停止)しておくこと)

2016年10月26日 22時35分10秒 | マイコン(ESP32・Arduino等)

PWMでフルカラーLEDチップを動かす基盤をブレッドボードで組んでみて、一応動くようなのでユニバーサル基盤で作ることにした。

10年前のPicで作っていた手書き設計用紙を持ち出して、鉛筆・消しゴムでカキかき、消しけし・・

秋月のデータシートを素人ながら見つつ・・・(素人にゃ大変なんです)

昨日、自分を励ましつつ基盤を完成した。

ジャンパーピンで、個別LEDとパッケージLEDどちらかの回路に切り替えられるようにし、

手持ちの個別LEDはRGBごと製造年代が全く違うので、後日差し替えができるようにとICソケットに挿す方式に。(ICソケットは1本足が折れていて廃棄予定だったもの)

アノードコモンなので、255を出力すると消灯、0でフル点灯となる。

さて、点灯してみると点いていないはずのLEDが薄くついているのを発見・・・

この時点から2日間の長く辛い心の旅が始まった。

こんな症状どこのサイトを覗いても書いてない。

一時は、「PWMはタイマールーチンと競合する」という記事を見つけて疑ってみたがどうも関係ないようで。

まあ、悩みましたわ。

   :

   :

どうにもわからないので、10年前に購入したお城を引っ張り出して、マニュアルが無いもんだから手探りで使い方を思い出して、などなど試行錯誤

#define LED_R 9
#define LED_G 10
#define LED_B 11
 
void setup(){
  pinMode(LED_R, OUTPUT);
  pinMode(LED_G, OUTPUT);
}
void loop() {
   analogWrite(LED_R, 0);
   analogWrite(LED_G, 0);
   delay(1000);
}

上記のソースであれば、ちゃんとBlueは消灯している。

でも、setup()内でpinMode(LED_B, OUTPUT); と書いていると、見事にanalogWrite(LED_B, 0);の行がないにも関わらず光りましたが!

------ 次に ------

#define LED_PIN1 9
#define LED_PIN2 10

void setup(){
  pinMode(LED_PIN1, OUTPUT);
  pinMode(LED_PIN2, OUTPUT);
}
void loop() {
  int i,j;
  for (i=0; i<256; i=i+2){
    // iの値でLEDを点灯させる
   analogWrite(LED_PIN1, i);
   j = 255 - i;
   analogWrite(LED_PIN2, j);
   delay(10);
  }
  for (i=255; i>-1; i=i-2){
    // iの値でLEDを点灯させる
   analogWrite(LED_PIN1, i);
   j = 255 -i;
   analogWrite(LED_PIN2, j);
   delay(10);
  }
}

上のソースになった途端に、プログラム内で全く記述していない11番ピンが勝手に光りだす!

結局、単なるanalogWriteなら問題は生じないが、for文でループを回すと、別のピンへ変な信号が出力されているらしい・・

原因はこの時点ではまったくわからんかった。

オシロで見ると11番Pinの波形は、波打つように形を変えている。

このぐらいなら発光は暗いが、

これなんか結構明るく光っている。無視できない程に。

まるで何かに誘導されているように波形も脈打つように姿を変える。

ヒデー。アリエンじゃろう

ならば、11Pinを明示的に analogWrite(11,255) としてみたらどうカイ とやってみたところ、

見事、11Pinへの変な出力は無くなりました。LEDも光っていない。

結局、「装置がつながっている端子はちゃんと出力を停止なりの措置を確実にしてやらないと勝手な動作をする」ということが判った。

ネットでググっていた時に「Arduinoは内部で思いもかけないポートを使って内部処理をしているので、外部機器をたくさんつけると思いもかけないところで勝手にモーターが回ったりする」というものがあった。

恐ろしや。

ハードウエアってむつかしいですわ。

まして、私みたいに孤軍奮闘+電気的知識皆無の素人には敷居が高い・・・・・

今回だって、自分で組んだ回路がおかしいのかとすんごく悩みましたから。

変な方へハマらなくてよかった。高っかいお城のおかげです。(今は2万円程度になっているらしいが。)

 

ソースは次のように追記

  for (i=0; i<256; i=i+2){
   analogWrite(LED_PIN1, i);
   j = 255 - i;
   analogWrite(LED_PIN2, j);
   analogWrite(11, 255);   // 追加部分
   delay(10);
  }

  for (i=255; i>-1; i=i-2){
   analogWrite(LED_PIN1, i);
   j = 255 -i;
   analogWrite(LED_PIN2, j);
   analogWrite(11, 255);
   delay(10);
  }

 

まあ、それにしてもよくできました!

だーれもほめてくれんし、自分でほめちゃろう!

ぽんっ