Edited at

【IoT】ボタン長押しで電源OFFする回路とプログラムを考えてみた

More than 1 year has passed since last update.


はじめに

会社でRaspberryPiを使ったモバイルIoTデバイスの開発にチャレンジしていますが、Raspbianを搭載したRaspberryPiはOSが立ち上がるまで何もできないため、電源周りの制御が組みづらいのかなと思っています。

例えば最近のスマホでは、電源ボタンに下記のような機能が割り当てられていることが多いですよね。


  • 電源が切れた状態で電源ボタンを押すとON

  • 起動した状態で長押しするとOFF

  • 起動した状態で通常の押下はロック

しかし、普通のタクトスイッチに長押ししたら通電するなんて便利機能はありません。

これも何らかの仕掛けで通電の状態を制御する必要がありますが、OSが立ち上がっていない状態でも機能する必要があるため、RaspberryPi(Raspbian搭載)のようなOSの中で動作するアプリケーションでは手が出せない領域になってきます。

そこで、おすすめなのがATtinyなどの小さなマイコンとRaspberryPiを組み合わせる方法です。

Arduino(ATmegaシリーズ)が有名ですが、そこまで大きなマイコンでなくても、プログラムの大きさや制御する内容によってはもっと小さなマイコンで事足ります。

上記のような電源制御の回路とプログラムを考えてみましたので、参考にしてください。


Tinkercadで手軽に試してみる

2018-11-14_13h45_46.png

IoTデバイスを開発するためには部品を購入する必要がありますが、ATシリーズは Tinkercad でシミュレーションすることができます。

電子回路のみのシミュレーションもできますし、ArduinoATtinyもシミュレーションできますので、組み合わせて動作を確認することができます。

Amazonでポチる前に、ある程度の動作確認ができてから部品を購入する、ということもできますね。

今回は、Tinkercadを使って電子回路とプログラムをご紹介します。


作ってみた

電子回路とATtiny85のプログラムに分けてご紹介します。

今回出来上がったプロジェクトはこちらから試すことができます。

:link: Tinkercad:電源ボタン長押しOFFサンプル


電子回路

ブレッドボード上に下記の部品を配置しました。


  • 電源ボタンに該当するタクトスイッチ

  • 電源(のMOS-FET)を制御するATtiny85

  • 電気を必要とする部品(話の流れ的にRaspberryPiを配置するべきですが、Tinkercadに登録されていないためLEDを代用しています)

  • 電源そのもののスイッチの役割を担うMOS-FET(N型)

また、抵抗はATtinyに対してはプルダウン用、LEDに対しては負荷を下げるために使用しています。

2018-11-14_13h39_42.png

なお・・、MOS-FETを使用せず、直接ATtiny85からLEDに電流を流すこともできますが、たとえばたくさん電流を消費する部品の電源としたい場合、ATtinyの中を大電流が流れるとマイコンチップを壊して(焦がして?)しまいます。

なので、ゲートに電圧をかけるとドレインからソースに電流が流れる、という性質を持ったMOS-FET(トランジスタでもOKです!)を電源スイッチに利用するのが一般的のようです。


プログラム

ATtiny85のプログラムはC言語で記述します。

下記のように(もう少し整理できるかもしれませんが。。)ONとOFFの状態によって通電の経過時間を見るように制御しています。

int flg = 0;

int processed = 0;
unsigned long time = 0;

void setup()
{
pinMode(5, INPUT);
pinMode(0, OUTPUT);
digitalWrite(0, LOW);
}

void loop()
{
unsigned long now = millis();

if(digitalRead(5) == HIGH) {
if (time == 0) {
time = now;
}

if (processed == 0) {
if (flg == 0) {
// OFF to ON
digitalWrite(0, HIGH);
flg = 1;
processed = 1;
} else if (now - time >= 3000) {
// ON to OFF
digitalWrite(0, LOW);
flg = 0;
processed = 1;
}
}
} else {
time = 0;
processed = 0;
}

// wait 100ms
delay(100);
}

変数flg0のときは電源がOFF、1のときONとしています。

5番ピン(ATtiny左下)でタクトスイッチの通電状態を読み取ります。

タクトスイッチが押下(通電)になっていれば、HIGHになります。

flgがONの時にタクトスイッチが押されると、即座に電源をONにします。

逆にOFFの時にタクトスイッチが押されると、3000ms経過した(押し続けた)のちに電源をOFFにします。

電源のON/OFFは0番ピン(ATtiny右上)をHIGHにすることで電圧をかけてMOS-FETの通電を開始します。

delay(ポーリング間隔)は100msとしました。


まとめ

IoTが世間で賑わいを見せていますが、私たちが実際に手にしている製品はかなり高度な制御がなされています。

また、書き込みのできるROMもかなり手ごろな価格で入手できる時代になりました。

どうしても1チップでやり切らないといけないケースは稀だと思いますので、難しいことは別の部品を使って組み合わせてみる、というやり方も試してみてください。