3.7Vのリチウム電池で動作する点滅回路を作りたかったのですが、Arduinoでそれが実現できました。
基本この2点で作れます。
左側:FT232RLモジュール 5V 3.3V USB to TTL シリアル コンバーター (プログラム時に必要)アマゾンで2個¥799
右側:ArduinoProMini Aliexpressで¥416(送料込み)
これには3.3V8MHzと5V16MHzの2種類があります。
(価格は2023/8/29日現在)
電力が大きいLEDや電球を使う場合はこのユニットが便利です。
10個15A 400W MOS FETトリガースイッチ駆動モジュールPWMレギュレーターコントロールパネル ¥999
回路図
12Vヘッドライトランプの点滅
こんな感じで作りました。➡
LED6個用 Arduinoプログラム ここからダウンロード
ヘッドライトの点滅実験の回路図
ウオーキング用の回路図
トランジスターは2SC1815で、LEDはダイソーのクリスマスツリー用(2022年)です。現時点(2023/9)では販売していないようです。ダイソーのUSBテープライトを3分割して使うか、乾電池3本用の装飾LEDを使ってください。乾電池2本用では調整用抵抗を入れないと使えませんので注意してください。
最初は
Arduino用開発プログラムArduinoIDEをダウンロードしてインストール
Arduino IDEはソフトウェア |アルドゥイーノ (arduino.cc) からダウンロードできます。
USB変換ボードをなぎます。
左側は FT232RLモジュール 5V 3.3V USB to TTL シリアル コンバーター
右側はArduinoProMini 中央はArduinoProMini に付けるメスタイプのコネクターで、必要な長さでカットします。シリアル コンバーターのピンは部品として入っています。
ここでの注意事項です。シリアル コンバーター に設定ピンがあり(黄色丸)、3.3V用と5V用の切替があります。切替をお忘れなく!
裏向きのピンもあるようです。VCCとGNDが同じ位置になるように挿します。何も書いてない状態で赤丸のLEDが点滅すればVCCとGNDは正解です。逆方向なら壊れます。
ArduinoIDEでプグラムを転送します。
下記のプラグラムをダウンロードするがコピペして 基板の種類とUSBを選んで転送します。表示が英語の場合はFile➡Preferences➡Languageを日本語に変えます。
何もつないでなくても、基板の点滅していたLEDの動きが変われば正常です。
3.3Vび場合は8Mh、5Vは16Mh ArduinoIDEがここの設定で自動的にタイマー変数を調整します。ここの設定も要注意です。⇓
LED3個用点滅回路
このプログラムはここからダウンロードできます。
/*
LED3個の2023/8/29
完成バージョン
https://pink-cats.com/
led_flashi_3piece_complete.ino
*/
class flash {
int ledPin;
long OnTime;
long OfTime;
long WAITETime1;
long WAITETime2;
int loopcount;
int ledState;
int ledmove;
int setcount;
int led;
unsigned long setMillis1;
unsigned long setMillis2;
public:
//---------(pin w1 on off w2 loop)--------
flash (int pin,long wate1 , long on, long off, long wate2 ,int lp ) {
ledPin = pin;
setcount=lp;
pinMode(ledPin, OUTPUT);
OnTime = on;
OfTime = off;
WAITETime1 = wate1;
WAITETime2 = wate2;
loopcount = 0;
led=0;
ledState = LOW;
setMillis1 = 0;
setMillis2 = 0;
}
void Update() {
unsigned long timeMillis = millis();
if (timeMillis - setMillis2 >= WAITETime1) {
if (setcount > loopcount) {
if ((ledState == LOW) && (led == 0)) { //最初の1回目はLEDがONでスタートするように
ledState = HIGH;
digitalWrite(ledPin, ledState);
led=1;
setMillis1 = timeMillis;
}
if((ledState == HIGH) && (timeMillis - setMillis1 >= OnTime)) {
setMillis1 = timeMillis;
ledState = LOW;
digitalWrite(ledPin, ledState);
} else {
if ((ledState == LOW) && (timeMillis - setMillis1 >= OfTime)) {
setMillis1 = timeMillis;
ledState = HIGH;
loopcount++;
digitalWrite(ledPin, ledState);
}
}
} else {
ledState = LOW;
digitalWrite(ledPin, ledState);
if (timeMillis - setMillis1 >= WAITETime2) {
loopcount=0;
setMillis1 = timeMillis;
setMillis2 = timeMillis;
led=0;
}
}
}
}
void lanpoff() {
ledmove = LOW;
digitalWrite(ledPin , ledmove);
}
void lanpon() {
digitalWrite(ledPin , HIGH);
}
};
int button = 4; // 停止ボタンピン
int swsts;
//----------pin w1 on off w2 loop-------
flash led1(6, 0, 50, 50 , 500, 5);
flash led2(7,400, 50, 50 , 100, 5);
flash led3(8, 0, 50, 50 , 500, 5);
flash led4(LED_BUILTIN,0 , 50, 50,200,4); //基板LED
void setup() {
pinMode(button, INPUT_PULLUP);
}
void loop() {
swsts=digitalRead(button);
if (swsts == LOW) {
led1.lanpon();
}else {
led1.Update();
led2.Update();
led3.Update();
led4.Update();
}
}
LED6個用 Arduinoプログラム ここからダウンロード
/*
2023/08/28
LED6個
https://pink-cats.com
led_flashi_6piece_complete
*/
class flash {
int ledPin;
long OnTime;
long OfTime;
long WAITETime1;
long WAITETime2;
int loopcount;
int ledState;
int ledmove;
int setcount;
int led;
unsigned long setMillis1;
unsigned long setMillis2;
public:
//---------(pin w1 on off w2 loop)--------
flash (int pin,long wate1 , long on, long off, long wate2 ,int lp ) {
ledPin = pin;
setcount=lp;
pinMode(ledPin, OUTPUT);
OnTime = on;
OfTime = off;
WAITETime1 = wate1;
WAITETime2 = wate2;
loopcount = 0;
led=0;
ledState = LOW;
setMillis1 = 0;
setMillis2 = 0;
}
void Update() {
unsigned long timeMillis = millis();
if (timeMillis - setMillis2 >= WAITETime1) {
if (setcount > loopcount) {
if ((ledState == LOW) && (led == 0)) { //最初の1回目はLEDがONでスタートするように
ledState = HIGH;
digitalWrite(ledPin, ledState);
led=1;
setMillis1 = timeMillis;
}
if((ledState == HIGH) && (timeMillis - setMillis1 >= OnTime)) {
setMillis1 = timeMillis;
ledState = LOW;
digitalWrite(ledPin, ledState);
} else {
if ((ledState == LOW) && (timeMillis - setMillis1 >= OfTime)) {
setMillis1 = timeMillis;
ledState = HIGH;
loopcount++;
digitalWrite(ledPin, ledState);
}
}
} else {
ledState = LOW;
digitalWrite(ledPin, ledState);
if (timeMillis - setMillis1 >= WAITETime2) {
loopcount=0;
setMillis1 = timeMillis;
setMillis2 = timeMillis;
led=0;
}
}
}
}
};
//----------pin w1 on off w2 loop-------
flash led1(3, 0,50, 50 , 1000, 2);
flash led2(4, 50,50, 50 , 950, 2);
flash led3(5, 100,50, 50 , 900, 2);
flash led4(6, 150,50, 50 , 850, 2);
flash led5(7, 200,50, 50 ,800, 2);
flash led6(8, 250,50, 50 ,750, 2);
/* 5回繰り返しバージョン
flash led1(3, 0,50, 50 , 1000,5);
flash led2(4, 50,50, 50 , 950, 5);
flash led3(5, 100,50, 50 , 900, 5);
flash led4(6, 150,50, 50 , 850, 5);
flash led5(7, 200,50, 50 ,800, 5);
flash led6(8, 250,50, 50 ,750, 5);
*/
/*中央によるバージョン
flash led1(3, 0,50, 50 , 1000,5);
flash led2(4, 50,50, 50 , 950, 5);
flash led3(5, 100,50, 50 , 900, 5);
flash led4(6, 100,50, 50 , 900, 5);
flash led5(7, 50,50, 50 ,950, 5);
flash led6(8, 0,50, 50 ,1000, 5);
*/
flash led7(LED_BUILTIN,0 , 50, 50,200,1); //基板LED
void setup() {
}
void loop() {
led1.Update();
led2.Update();
led3.Update();
led4.Update();
led5.Update();
led6.Update();
led7.Update();
}
このプログラムは flash led1 から始まる部分にコントロールを集中させています。
flash led1(3, 0,50, 50 , 1000, 2) はLEDを3番につなぎ、0ms待ち50m点灯、50ms消灯しそれを2回繰り返します。そのご1000ms待機(1S)です。ここを書き換えると自由に設定可能です。