春休み
2023年04月07日 春休み
春休みで静かだった学校が、新学期に向かって賑わいを取り戻してきました。
そんな中、詳細はヒミツですが、非常勤講師の先生から「LEDを5段階調光でき、電源を切っても明るさが保持される」システムを依頼され、製作しました。

ユニバーサル基板に実装して、ある程度の個数を生産するとのことで、千円程度で購入できる小型Arduino互換開発ボードのSeeed XIAO SAMD21を採用しました。
以下に回路図を示します。

以下にスケッチを示します。
#define saveInterval 120 //Interval of saving(seconds).("saved" flag will be reset this interval) #include <FlashStorage.h> FlashStorage(lumine, int); unsigned pins[][3]={ {5}, {1, INPUT_PULLUP, HIGH}, //lumi 2 {2, INPUT_PULLUP, HIGH}, //lumi 3 {3, INPUT_PULLUP, HIGH}, //lumi 4 {4, INPUT_PULLUP, HIGH}, //lumi 5 {5, INPUT_PULLUP, HIGH}, //lumi 1 {6, INPUT, HIGH}, //Voltage of input. {A7, OUTPUT, 0}, //Output }; unsigned lumi = 0; unsigned update = 0; bool saved = false; unsigned long saveTiming = 0; void setup() { for(unsigned i = 1; i <= pins[0][0]+ 1; i++){ pinMode(pins[i][0], pins[i][1]); } lumi = lumine.read(); analogWrite(pins[7][0], lumi); } void loop() { if(abs(millis()- saveTiming) > saveInterval* 1000){ saved = false; } if(!digitalRead(pins[6][0]) && !saved){ digitalWrite(8,HIGH); lumine.write(lumi); saved = true; } if(saved){ digitalWrite(9,HIGH); } for(unsigned i = 1; i <= pins[0][0]; i++){ bool stat = digitalRead(pins[i][0]); if(pins[i][2] != stat){ pins[i][2] = stat; if(!stat){ lumi = i* 255/ 5; analogWrite(pins[7][0], lumi); } } } }
フラッシュメモリに明るさ(lumi)を保存するのですが、フラッシュメモリには書き込み寿命があるため頻繁に保存するわけにはいきません。そのため、電源が切れたときにだけ保存するようになっています。
これを実現するために電源電圧を監視し、電源が切れたのを検知できるようにしています。
これだけでは保存するまでにマイコンが動作を停止してしまうため、3.3Vラインに100μFの電界コンデンサを接続、電源が切れてもすぐにはマイコンが止まらないようにしています。
このコンデンサが電圧監視に影響を及ぼさないために、5Vラインにはダイオードを入れています。
「LEDを5段階調光でき、電源を切っても明るさが保持される」という要件はそんなに難しくないようで、実はソフトウェアとハードウェアの知識を両方持っていないと実現不可能なのです。
同じものを授業で作るわけではありませんが、このようなハードウェアとソフトウェアのコラボレーションを体験できるのは、電子工学ならではです。

蒲田校 佐藤
n-41175501 at 20:18 | この記事のURL | |