工作と競馬2

電子工作、プログラミング、木工といった工作の記録記事、競馬に関する考察記事を掲載するブログ

LEDバーライトの自動操作

概要

LEDバーライトの自動操作を自動操作するための改造を行った。


背景と目的

最近、LEDバーライトを使用することになった。希望とする仕様としては、

  • 給電直後から点灯する
  • 明るさ、色の調整ができて、給電遮断後も記憶できる

という2点。しかし、購入前にこう言った細かい仕様は書いていないので、とりあえず、手ごろな値段で明るさ、色の調整ができるASSEUI WD-LED-1308Bという製品を買った。

www.amazon.co.jp

入手後、さっそく使ってみたところ、やはり上記の通りの仕様にはなっていなかった。仕方がないので、少し改造を施して自動で設定されるようにする。


詳細

1.改造方法の検討

この製品には、操作ボタンがついているが、試しにボタンのカバーを開けてみると、以下のような基板が出てきた。タクトスイッチが載っており、片側がGND、片側が基板上のマイコンの入力につながっており、操作するとGNDとつながってLOW信号が基板上のマイコンに入力されるようだ。なので、タクトスイッチの代わりに電子的に操作できるように制御信号線を繋いで乗っ取れば操作できそうだ。

f:id:dekuo-03:20200711171726j:plain


2.回路の改造

実現すべきことは、以下。

  • 点灯ボタン、暗くするボタン、調色ボタンを自動操作できる
  • 改造後にもボタン操作は使えるようにする

検討した結果、回路は以下のようにする。外部に操作ボタン乗っ取り用マイコンとしてAttiny85を用意し、電源はLEDバーライト基板からいただく。3本のGPIO出力で3つのタクトスイッチを乗っ取る。また、点灯しているかどうかを知る手段として、LEDの駆動パルス信号を乗っ取り用マイコンに取り込む。(後述のハードウェア実装を参照)今回はやっていないが、この駆動パルス幅を読み取って、明るさ設定値を知ることができるので、将来的に、明るさを自動的に調整するときに役立つ。 なお、乗っ取り用マイコン側のGPIOとタクトスイッチの間に入れているダイオードは、ボタン操作時に、Attiny85側のGPIOがGNDとショートするのを防ぐため。(適当な大きさの抵抗でもいいが)

f:id:dekuo-03:20200711171309p:plain


3.ハードウェア実装

上記の改造を施した結果が以下。基板がむき出しだが、どうせ人の手で操作するわけでもないし、見えるところに出さないので後で適当に養生テープか何かでカバーする。

黄色いリード線は、LEDの駆動パルスのラインから信号をもらってAttinyのPB0に入力している。 ※ダイオードの代わりに抵抗がついているがこれは検討中のもの。

f:id:dekuo-03:20200711171734j:plain f:id:dekuo-03:20200711171741j:plain


4.マイコンソフトウェア

マイコンは、Attiny85の載る以下の小型ボード。

Amazon | HiLetgo® 3個セットDigispark Kickstarter Attiny85 マイクロ USB 開発ボード Arduino ATtiny MCUに対応 [並行輸入品] | ブレッドボード | 産業・研究開発用品 通販

3年近く前に買って、動作確認した程度で、ろくに使わずに眠っていたものだが、ついに日の目を見る時が来た。

blog.livedoor.jp

Arduino環境で開発ができるのだが、3年もたつと以前と同じ環境が使えるのか不安ではあったが、あっさり同じ方法で書き込み出来た。

ソースコードは、以下。 電源投入後、GPIO設定して、点灯、色味、明るさの順で自動操作とやるだけ。

#define GPIO_DRIVE 0 // 出力
#define GPIO_POWER 1 // 電源ボタン
#define GPIO_COLOR 2 // 調色ボタン
#define GPIO_DARK 3 // 暗くするボタン
#define PULSE_WDITH 50 // パルス幅
#define DELAY_WAIT 100 // 待ち時間
#define DELAY_BOOT 1000 // 起動後待ち時間
#define DELAY_CHECK 10 // usec

// パルス出力
void pulse(int gpio) {
  digitalWrite(gpio, LOW);
  delay(PULSE_WDITH);
  digitalWrite(gpio, HIGH);
}

// 出力のチェック
int check_output(int n) {

  int k = 0;
  int c = 0;

  for (k = 0; k < n; k++) {
    if (digitalRead(GPIO_DRIVE) == HIGH) {
      c++;  
    }
    delayMicroseconds(DELAY_CHECK);
  }

  return c;
  
}

// 電源ON
void power_on() {

  // 出力が0ならパルス出力
  while (check_output(100) == 0) {
    pulse(GPIO_POWER);
    delay(DELAY_WAIT);
  }

}

// 色
void set_color() {
  
  pulse(GPIO_COLOR);
  
}

// 明るさをn段下げる
void darken(int n) {
  int i;
  for (i = 0; i < n; i++) {
    pulse(GPIO_DARK);
    delay(DELAY_WAIT);
  }
}

void setup() {
  
  // GPIO設定
  digitalWrite(GPIO_POWER, HIGH);
  pinMode(GPIO_POWER, OUTPUT);
  digitalWrite(GPIO_POWER, HIGH);
  pinMode(GPIO_COLOR, OUTPUT);
  digitalWrite(GPIO_COLOR, HIGH);
  pinMode(GPIO_DARK, OUTPUT);
  digitalWrite(GPIO_DARK, HIGH);
  pinMode(GPIO_DRIVE, INPUT);

  // 点灯
  power_on();
  delay(DELAY_WAIT);

  // 明るさを下げる
  darken(5);
  delay(DELAY_WAIT);

  // 色を変える
  set_color();
  
}

void loop() {
                     
}


5.動作確認

以下のように、ちゃんと動いた。電源投入後、少し時間がかかるのは、Attiny85の起動に時間がかかっているせいと思われる。(Arduinoブートローダって重いのかな?)

www.youtube.com


まとめと今後の課題

無事、自動操作できるようになった。これで、ちゃんと使えそう。