Raspberry Pi Picoを100V電源で動く装置のオフタイマーにする話。
Raspberry Piの使い方でいろいろなワードで検索するもなかなか応用したものに当たらない。もっぱらLチカといってLEDをチカチカさせましたみたいなのばかり。
俺の知りたい情報はそんな子供だましじゃねえ!
知りたいのは起動時タイマーカウントスタートとともにオン状態だったAC電源がタイマー終了とともにオフになるという至極単純なものだ。(ある意味子供だまし)
そのものずばりの情報はなかったのでこれはネット上で一番乗りかなと勝手に期待して情報を晒す。
そんなに高度なもんじゃなくかなり初歩的なものだからRaspberry Pi初心者にはもってこいの課題だと思う。
では解説する。
【関連】
用意するもの
必ず要るもの
Raspberry Pi Pico
今回は一応Raspberry Pi Picoを用意する。
Amazonでもよく品切れしているからほしいならしばしば見に行ってみたほうがいい。もっとも確実に入手するなら送料かかるが秋月電子が確実だ。
Raspberry Pi Pico ラズベリーパイピコ: マイコン関連 秋月電子通商-電子部品・ネット通販
Amazonで買ってもよし。秋月電子で買ってもよし。はたまたスイッチサイエンスで買ってもよしだ。
Raspberry Pi Picoは基本Wi-Fi機能とかの無線機能がなく、OSも入らない本当にシンプルなマイクロコントローラーだから余計な機能はいらないっていう今回の俺みたいな人にぴったりなマイコンボードなんだ。
なぜならっていう理由を後述する。
AC-DCコンバータ
これは外付けにすれば一般的なUSBアダプターがあれば事足りるが装置に組み込みデバイスとしていれる場合には必要になる。
Amazonだとさすがに適当なものが見つからずAliExpressで買うことにする。
Raspberry Piは5Vの直流で動く。だから普通のAC100Vから変換してやるかモバイルバッテリーみたいなのが必要だ。
だがモバイルバッテリーだとそっちが切れたら使い物にならなくなるから今回はAC-DCコンバータを使う。
かつてiPhoneやらAndroidスマホを新品で買うとほとんど付属していたACアダプターと同じ機能のものだ。
ただし今回使うのは表がきれいな箱で覆われていない基板むき出しのやつだ。それなら100円足らずで手に入るから。
逆に業務で使うんだったらむき出しのほうがプロっぽいwww。
ソリッドステートリレー(SSR)
これは適当なので安いのが秋月電子でしか見つからなかった。
ソリッド・ステート・リレー(SSR)キット 25A(20A)タイプ: 組立キット(モジュール) 秋月電子通商-電子部品・ネット通販
▼これの右の小さい基板がSSR
どうしてリレーの枕にソリッドステートというタイトルがついているのか知らん。
がしかしコンパクトでリレー特有のカチっという電磁石がついているでもなし、安いしこれは良いものかもしれない。
入力電圧は3V〜8Vで100Vの出力をON/OFFしてくれる。ちなみにリンク貼ってある秋月電子のSSRはキットになっていて自分ではんだ付けが必要なので注意。
上記の数点は必要な機材で、以下はなくてもできるもの。
分解して再利用する可能性あるなら要るもの
ブレッドボード
電子工作のあたりまえ、あるある、最近電子工作にハマり始めた俺はまだこのブレッドボードを素直にブレッドボードと呼ぶのにいささか恥じらいがある。
ど、ど、ど素人だから。
でもすべてはんだ付けで固めてしまうと分解してまたなにかに作り直したいときに面倒だから完全量産でないかぎり使うことをおすすめする。
ジャンプワイヤー
ブレッドボードとともにこれも完全量産でないかぎりあったほうがいい。っていうかブレッドボード使ったらこれが必要になる。
すきなところに電線を繋げられるリード線ということ。
ジャンプワイヤーには3種類あるので少々注意が必要だ。
- オスーオスタイプ
- メスーメスタイプ
- オスーメスタイプ
今回はオス-オスタイプを使う。
ヘッダーピン
ブレッドボード、ジャンプワイヤーとともに電子工作の基本三種の神器とでもいってしまってよいかもしれないのが最後のヘッダーピンだ。
ヘッダーピンにもオスタイプとメスタイプがある(メスはヘッダーピンと呼ばないか)が今回はオスタイプを使おう。Raspberry Pi Picoのボードに穴が空いているのでそこに通してはんだ付けするため。
作成の動機
ここで今回こういうものを作った動機について少し話を盛らせてほしい。
なにしろ業務上必要だったのだ。
ずぶの文系なのに装置物の研究開発に配属されいるが、電気を使うのでAC電源を使う。
AC電源を使うといえどもずーっと電源入れっぱなしだと危ないよねということで、じゃあ装置にタイマーつけようぜということになった。
当初はできあいですぐ使えるオフタイマーをネットで隈なくさがしていたがオフタイマーというのはまず見当たらないか見当たっても結構高い。数千円平気でする。
じゃあ、Iot機器でコンセントのオンオフをクラウド管理でやってくれるスマートプラグなるものがあるからそれ使っちゃえばいいじゃんって思ったのだがちょっとそれはそれで間抜け感が拭いきれない。
まるで開発を諦めましたって感じだ。
諦めるなら諦めるで一応やるだけやってみるかということで調べた結果、今回のようなものが形になったのだ。
ソフトウェア
ではハードが揃ったらセッティングしていこう。
プログラムコードをRaspberry Pi Picoに入れる方法について
いまさらRaspberry Pi Picoの初期設定なんてネット上に溢れかえっているのでここで説明するのは無駄だから省く。
以下リンクのいずれかまだ辿れるものがあったら参照すればわかると思う。
ただ詳細は置いておいても概要だけは述べておく。どのサイトもなかなか大枠について教えてくれないから素人からしたらこれをやるとどうなるのっていうのがわかりにくかったのだ。
- PC(MACでもよい)にてRaspberry Pi Picoのファームウェアをダウンロードする
これをRaspberry Pi Picoに入れないと開発するよう応えてもらえないから必要なのだ。ただしそれはPythonでやる場合で違う言語で開発する場合はまた違ってくると思う。 - Raspberry Pi Picoをパソコンとつなげる(最初につなげるときはボタン押しながらUSB接続)
- ストレージモードでRaspberry Pi Picoがつながるのでそのルートフォルダに1でダウンロードしたファイルをコピーする
- そうするとRaspberry Pi Picoがファイルを消化していったん接続が途切れたような状態になりストレージとして見えなくなるが問題ない。ただしい動き。
- パソコンでの開発環境Thonnyをダウンロードしてインストールする。これを使ってユーザーがPython言語でプログラムを書き、Raspberry Pi Picoへの書き込みまでやってくれるソフトである。
参考↓
ラズベリー・パイPicoマイコン スタートアップ・マニュアル - 何度かデバッグをやって出来上がったらパソコンからUSBケーブルを外して他のバッテリーやらACDCコンバータと接続しても同様の動きをすれば完了
参考リンク
- はじめての「Raspberry Pi Pico」で大ハマりした話。初心者でも分かる使い方&初期設定の手順 – マイコン技術Navi
- Raspberry Pi Picoの初期設定【MicroPython・CircuitPythonファームウェアインストール手順】 | あろしーど←MicroPythonとCircuitPythonの違いについて素人は知らないので述べていてほしかった
- セットアップマニュアルPDF
- Raspberry Pi PicoをMicroPython環境(CircuitPython化)した後に元に戻す方法 – uepon日々の備忘録
Windows7で認識しない解決策あり Raspberry Pi Pico の使い方 ~セットアップからLED点灯まで~ - machine.Pin 使い方|uPyC|noteファームウェアの場所はRaspberry Pi Documentation – Microcontrollers→Raspberry Pi Picoページ→左サイドバー→MicroPython→Drag-and-Drop MicroPython
- ラズパイ(Raspberry Pi)のGPIOを再確認! まずは汎用入出力からマスターしよう | Device Plus – デバプラ
Thonny開発環境で最初にやること
Thonny開発環境でやることは
- メニュー→ツール→オプション→インタプリタタブ→デバイス選択でMicroPython(Raspberry Pi Pico)
- 同じウィンドウでPort選択はTry to detect port automaticallyのままで大丈夫だったが、Raspberry Pi Picoが繋がっているポートが選べれば選んでおいたほうがよいらしい
プログラムコード
当初はタイマー割り込みとか使わなアカンの?って寒々としていたが作り上がったものを見たらなんのことはないスリープいれればいいだけじゃんみたいな。
では1行ずつ解説しておく。
import machine
import utime
from machine import Pin
#ディップスイッチ1桁目秒数定義以下同様
Dig_0_Sec = 5 #30分なら800
Dig_1_Sec = 10 #1時間=3600
Dig_2_Sec = 20 #2時間=7200
Dig_3_Sec = 40 #4時間=14400
led = Pin(25, Pin.OUT)
sw_AC = Pin(15, Pin.OUT)
led.value(1)
num = 1 #ループ状態スイッチ
sw_0 = Pin(0, Pin.IN) #1桁目用ピン設定
sw_1 = Pin(1, Pin.IN) #2桁目用ピン設定
sw_2 = Pin(2, Pin.IN) #3桁目用ピン設定
sw_3 = Pin(3, Pin.IN) #4桁目用ピン設定
r0 = sw_0.value()
r1 = sw_1.value()
r2 = sw_2.value()
r3 = sw_3.value()
OffTimerSec = r0 * Dig_0_Sec + r1 * Dig_1_Sec + r2 * Dig_2_Sec + r3 * Dig_3_Sec
while num > 0:
sw_AC.value(1)
utime.sleep(OffTimerSec)
led.value(0)
sw_AC.value(0)
num = 0
import machine #・・・マシンクラスをインポートするっていったらただの直訳だけど、いろいろmachineには詰まってるだろうから重要。あまり気にしないでおく。
import utime #・・・時間の管理をしたいときにはこれをインポートしておくとスリープ操作ができるんだろうなって解釈している。
from machine import Pin #・・・マシンクラスからPinというオブジェクトをハンドリングして操作できるようにする
#▼ここは便宜上本番数値にしないで短時間で試験できるように5秒とか10秒とか短い時間を定義している#4桁ディップスイッチを使う前提で2進数で設定時間を累積するつもり
Dig_0_Sec = 5 #単位ディップスイッチ1桁目秒数定義以下同様 30分なら800
Dig_1_Sec = 10 #1時間=3600
Dig_2_Sec = 20 #2時間=7200
Dig_3_Sec = 40 #4時間=14400
led = Pin(25, Pin.OUT) #・・・LEDがつくところは一応ランプもついでに光らせているだけ
sw_AC = Pin(15, Pin.OUT) #・・・GP15ポートをAC電源リレー出力にする
led.value(1) #・・・稼働中はLED光らせるということ
num = 1 #・・・ループ状態スイッチ
sw_0 = Pin(0, Pin.IN) #・・・1桁目用ピンとしてGP0設定
sw_1 = Pin(1, Pin.IN) #・・・同じく2桁目用ピン設定
sw_2 = Pin(2, Pin.IN) #・・・同じく3桁目用ピン設定
sw_3 = Pin(3, Pin.IN) #・・・同じく4桁目用ピン設定
r0 = sw_0.value() #・・・ディップスイッチ0番を読む(1か0が入る)
r1 = sw_1.value() #・・・同じくディップスイッチ1
r2 = sw_2.value() #・・・同じくディップスイッチ2
r3 = sw_3.value() #・・・同じくディップスイッチ3
OffTimerSec = r0 * Dig_0_Sec + r1 * Dig_1_Sec + r2 * Dig_2_Sec + r3 * Dig_3_Sec #・・・ディップスイッチの立ってるものだけ秒数として加算する→OffTimerSecがスリープ時間となる
while num > 0: #・・・numが0より大きい間以下を繰り返す
sw_AC.value(1) #・・・ACリレーにONを出力
utime.sleep(OffTimerSec) #・・・指定時間だけスリープする(ACはONのまま)
led.value(0) #・・・スリープ終了後LED消す
sw_AC.value(0) #・・・同じくスリープ終了後ACリレーをオフにする
num = 0 #・・・ループを終わらせることで再びACがONにならないようにする
4桁のディップスイッチのすべてのビットを使って時間設定をしているが、これをさらに応用して全ビットがオフだったら無制限にACをONにするとか、3ビットは時間設定に使って1ビットは繰り返しON/OFFの設定にするとかってやってもよいだろう。
もっと安くしたい
Raspberry Pi Picoも安いことは安いがそれでも今回のようにタイマーとして使うだけならオーバースペックだ。
ただいま別のボードを探して取寄中なので入手したらコスト改善として治す。ただし使用する言語がPythonではなくなるはずなのでまた文法の勉強が必要になるがアルゴリズムはできているので大した話ではない。
できたらここに追記するか新しい記事にしてリンクを追記したいと思う。
【追記】PythonではなくArduinoIDE環境に移植
その道のプロでもないのに1個のパソコンにArduinoIDE環境だったりラズベリーパイピコ用にPython開発環境だったりを入れておくのはもったいないので上記のPythonコードをArduinoで動くように移植した。
これだけでも調べながらデバッグしたりなんだりで半日かかってしまって恥ずかしい。でもこれでPython環境をアンインストールできる。
const int DS_0_Sec = 5; //#30分なら800に変更
const int DS_1_Sec = 10; //#1時間=3600
const int DS_2_Sec = 20; //#2時間=7200
const int DS_3_Sec = 40; //#4時間=14400
double OffTimerSec = 0;
int num = 1;
void led_blink(int OnSec,int OffSec,int n){
for(int i=0;i<n;i++){ digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(OnSec); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(OffSec); // wait for a second
}
}
// the setup function runs once when you press reset or power the board
void setup() {
Serial.begin(9600);
int val0, val1, val2, val3; // initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
pinMode(0, INPUT);
pinMode(1, INPUT);
pinMode(2, INPUT);
pinMode(3, INPUT);
OffTimerSec = digitalRead(0) * DS_0_Sec;
OffTimerSec += digitalRead(1) * DS_1_Sec;
OffTimerSec += digitalRead(2) * DS_2_Sec;
OffTimerSec += digitalRead(3) * DS_3_Sec;
Serial.println(OffTimerSec);
led_blink(100,100,10);
pinMode(15, OUTPUT);
digitalWrite(15, HIGH);
}
// the loop function runs over and over again forever
void loop() {
while (num > 0) {
led_blink(100,900,OffTimerSec);
num = 0;
digitalWrite(15, LOW);
}
}