OctoPrint用ラズパイの電源を制御する
基本仕様
ラズパイZEROを使用
ラズパイは3Dプリンタの電源と連動して起動/終了させる
電源制御
3Dプリンタの電源切りを判断し,ラズパイを正常終了(シャットダウン)して電源切りとするため,UPSと電源ON/OFF回路を作ることになる
ソフトコントロールした方が柔軟性が高いのでいつものとおりAVRを使用することとしATtiny13aを使用する
ラズパイZEROはWiFi使用時でも最大消費電流200mA程度(入力5V)→ 効率を多めにみても5V500mA入力できれば良しと見積もる
ラズパイの起動/終了確認はGPIOの8ピン(UART_TXD)を監視することで行う → OSのシリアル利用設定が必要でシリアルコンソールとなる,シリアルは負論理なので使用可能になるとON(1)となる(終了でOFF)
シャットダウン要求はGPIOの7ピンを利用して制御,ラズパイ側でGPIOを監視してシャットダウンする
GPIOは3.3VロジックなのでATtiny13aも3.3Vで使用する
回路図
- 元電源が入るとATtiny13aとリポ充放電モジュールが通電
- ATtiny13aは起動後FETのONでラズパイを起動させGPIOの監視を行う
- 元電源が切れると電圧の関係でFETへの充電はバッテリーに切り替わる
- ATtiny13aは元電源OFFを感知してラズパイにシャットダウン要求しシャットダウン後FETをOFF(電源断)する
- バッテリーはダイソーのUSB充電ライターのリポ(200mAh)を利用
- ON時の5V出力安定のため100μFを付けた(オシロでチェックしたところ無くても問題なしだったが排除していない)
- スイッチ部はGrd共通のためPチャネルFETとなる
- ラズパイ3などに変更する場合はダイオードの許容電流に注意
ソフトウェア
ATtiny13a
//3Dプリンター用ラズパイ(octoPi)電源制御プロクラム
// octoPiPower.ino V1.3
//
// ATMEL ATTINY13 / ARDUINO
//
// +-\/-+
// ADC0 (D 5) PB5 1| |8 Vcc
// ADC3 (D 3) PB3 2| |7 PB2 (D 2) ADC1
// ADC2 (D 4) PB4 3| |6 PB1 (D 1) PWM1
// GND 4| |5 PB0 (D 0) PWM0
// +----+
//
// PB0 - OUT FET ON/OFF
// PB1 - OUT raspi control (PIN7)
// PB2 - IN raspi sense (PIN8)
// PB3 - OUT LED
// PB4 - IN power
//
// 処理フロー(V1.2まで)
// ①元電源ONにより本機(ATTINY13)がON
// ②ラズパイの電源をONさせる(FET ON)
// ③電源(PB4)とラズパイの状態(PB2)を監視
// ④電源OFFでラズパイにシャットダウンを通知(PB1)
// ⑤ラズパイが終了したらラズパイの電源OFF(FET OFF)
// ⑥⑤により本機もOFFもしくは元電源がONなら終了状態へ移行
// 処理フロー(V1.3から③以降変更)
// 電源連動となるので電源OFFからの復帰はない,また,リブートを可能とした
// ③電源(PB4)を監視
// ④電源OFFでラズパイにシャットダウンを通知(PB1)
// ⑤ラズパイが終了したらラズパイの電源をOFF(FET OFF)
//
#include <avr/io.h>
#include <avr/sleep.h>
#include <util/delay.h>
//接続PIN
#define FET PB0 //電源SW制御
#define RASP7 PB1 //ラズパイ指示(ONでシャットダウンさせる)
#define RASP8 PB2 //TXD(通信ポート)で起動判断(負論理なので通常はON)
#define LED PB3 //動作状態を示すLED
#define POWER PB4 //主電源
void setup() {
//PIN(入力)
pinMode(RASP8, INPUT);
pinMode(POWER, INPUT);
//PIN(出力)
pinMode(FET, OUTPUT);
pinMode(RASP7, OUTPUT);
pinMode(LED, OUTPUT);
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
//ラズパイ電源ON
digitalWrite(FET, HIGH); //ラズパイON
digitalWrite(RASP7, LOW); //ラズパイ指示初期化
//ラズパイ起動待ち
while(!bit_is_set(PINB, RASP8)) {
digitalWrite(LED, HIGH);
_delay_ms(900);
digitalWrite(LED, LOW);
_delay_ms(100);
if(!bit_is_set(PINB, POWER)) {
digitalWrite(RASP7, LOW); //ラズパイシャットダウン指示
digitalWrite(FET, LOW); //ラズパイ電源OFF
return; //loop()で元電源OFF待ち
}
}
digitalWrite(LED, HIGH);
//元電源OFF待ち
while(bit_is_set(PINB, POWER)) _delay_ms(1000);
//ラズパイへシャットダウン指示
digitalWrite(RASP7, HIGH);
//シャットダウン待ち
while(bit_is_set(PINB, RASP8)) {
digitalWrite(LED, HIGH);
_delay_ms(500);
digitalWrite(LED, LOW);
_delay_ms(500);
}
//20秒待ち,電源OFF実行
for(int n = 0; n < 20; n++) {
digitalWrite(LED, HIGH);
_delay_ms(100);
digitalWrite(LED, LOW);
_delay_ms(900);
}
digitalWrite(RASP7, LOW); //ラズパイシャットダウン指示
digitalWrite(FET, LOW); //ラズパイ電源OFF
}
//終了
void loop() {
sleep_mode();
}
ラズパイ
ピン監視+シャットダウンプログラムを/etc/rc.localから起動
プログラムは参考の「While loop」版を元にほぼそのままで使用(7ピン監視は10秒間隔にしている)
※)割込み版はバックグランド動作しない
完成ボード
バッテリーは基板の裏に配置した
接続
ラズパイとの接続用にソケットを作製
ピンはラズパイ上から右ピンに多いので接続のやり易さから左右反転させている(基板の裏からみるとラズパイ上と同じ位置になる)
必要なのは8ピンまでだが切り良く10ピンまで対応できるようにしている(ただし不必要なピンは接続していない)
システムテストによる調整
最終確認にてソフトウェアの調整を行った
- シャットダウン要求でシャットダウン後の電源OFFまでの時間を20秒にした(当初は5秒)→ 8ピンがOFF直後に電源OFFすると正常終了していないためディレイを入れている
- 元電源OFFでシャットダウンまでにONになったらシャットダウン中止を削除(ラズパイ単体なら良いが3Dプリンタと連動なので必要ない)
- ラズパイ起動後にて元電源OFF前にシャットダウンされたら電源OFFを削除(3Dプリンタと連動のため不必要と再起動を可能にした)
尚,3Dプリンタとの電源連動は(コンセントで連動でも良いが)DCDCで24Vから5Vにダウンさせ入力する予定である
(電源ON)
(電源OFF)
調整により電源OFFまで長くなっている(安全のためでもある)
参考