[PR]記事内のアフィリエイトリンクから収入を得る場合があります
スポンサーリンク

Raspberry Pi Picoを100V電源のオフタイマーにする(pythonとarduino)

RaspberryPi Picoで100vオフタイマー 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も入らない本当にシンプルなマイクロコントローラーだから余計な機能はいらないっていう今回の俺みたいな人にぴったりなマイコンボードなんだ。

なぜならっていう理由を後述する。

RaspberryPi Picoで100vオフタイマー

AC-DCコンバータ

これは外付けにすれば一般的なUSBアダプターがあれば事足りるが装置に組み込みデバイスとしていれる場合には必要になる。

Amazonだとさすがに適当なものが見つからずAliExpressで買うことにする。

AC DC 3.3 v/5v/12 高精度降圧コンバータ ac 220 に 5v dc ステップダウントランス電源モジュール 1A 12 ワット|Switching Power Supply| – AliExpress

Raspberry Piは5Vの直流で動く。だから普通のAC100Vから変換してやるかモバイルバッテリーみたいなのが必要だ。

だがモバイルバッテリーだとそっちが切れたら使い物にならなくなるから今回はAC-DCコンバータを使う。

かつてiPhoneやらAndroidスマホを新品で買うとほとんど付属していたACアダプターと同じ機能のものだ。

ただし今回使うのは表がきれいな箱で覆われていない基板むき出しのやつだ。それなら100円足らずで手に入るから。

逆に業務で使うんだったらむき出しのほうがプロっぽいwww。

ソリッドステートリレー(SSR)

これは適当なので安いのが秋月電子でしか見つからなかった。

ソリッド・ステート・リレー(SSR)キット 25A(20A)タイプ: 組立キット(モジュール) 秋月電子通商-電子部品・ネット通販

▼これの右の小さい基板がSSR

RaspberryPi Picoで100vオフタイマー

どうしてリレーの枕にソリッドステートというタイトルがついているのか知らん。

がしかしコンパクトでリレー特有のカチっという電磁石がついているでもなし、安いしこれは良いものかもしれない。

入力電圧は3V〜8Vで100Vの出力をON/OFFしてくれる。ちなみにリンク貼ってある秋月電子のSSRはキットになっていて自分ではんだ付けが必要なので注意。

上記の数点は必要な機材で、以下はなくてもできるもの。

分解して再利用する可能性あるなら要るもの

ブレッドボード

電子工作のあたりまえ、あるある、最近電子工作にハマり始めた俺はまだこのブレッドボードを素直にブレッドボードと呼ぶのにいささか恥じらいがある。

ど、ど、ど素人だから。

でもすべてはんだ付けで固めてしまうと分解してまたなにかに作り直したいときに面倒だから完全量産でないかぎり使うことをおすすめする。

ジャンプワイヤー

ブレッドボードとともにこれも完全量産でないかぎりあったほうがいい。っていうかブレッドボード使ったらこれが必要になる。

すきなところに電線を繋げられるリード線ということ。

ジャンプワイヤーには3種類あるので少々注意が必要だ。

  • オスーオスタイプ
  • メスーメスタイプ
  • オスーメスタイプ

今回はオス-オスタイプを使う。

ヘッダーピン

ブレッドボード、ジャンプワイヤーとともに電子工作の基本三種の神器とでもいってしまってよいかもしれないのが最後のヘッダーピンだ。

ヘッダーピンにもオスタイプとメスタイプがある(メスはヘッダーピンと呼ばないか)が今回はオスタイプを使おう。Raspberry Pi Picoのボードに穴が空いているのでそこに通してはんだ付けするため。

作成の動機

ここで今回こういうものを作った動機について少し話を盛らせてほしい。

なにしろ業務上必要だったのだ。

ずぶの文系なのに装置物の研究開発に配属されいるが、電気を使うのでAC電源を使う。

AC電源を使うといえどもずーっと電源入れっぱなしだと危ないよねということで、じゃあ装置にタイマーつけようぜということになった。

当初はできあいですぐ使えるオフタイマーをネットで隈なくさがしていたがオフタイマーというのはまず見当たらないか見当たっても結構高い。数千円平気でする。

じゃあ、Iot機器でコンセントのオンオフをクラウド管理でやってくれるスマートプラグなるものがあるからそれ使っちゃえばいいじゃんって思ったのだがちょっとそれはそれで間抜け感が拭いきれない。

まるで開発を諦めましたって感じだ。

諦めるなら諦めるで一応やるだけやってみるかということで調べた結果、今回のようなものが形になったのだ。

ソフトウェア

ではハードが揃ったらセッティングしていこう。

プログラムコードをRaspberry Pi Picoに入れる方法について

いまさらRaspberry Pi Picoの初期設定なんてネット上に溢れかえっているのでここで説明するのは無駄だから省く。

以下リンクのいずれかまだ辿れるものがあったら参照すればわかると思う。

ただ詳細は置いておいても概要だけは述べておく。どのサイトもなかなか大枠について教えてくれないから素人からしたらこれをやるとどうなるのっていうのがわかりにくかったのだ。

  1. PC(MACでもよい)にてRaspberry Pi Picoのファームウェアをダウンロードする
    これをRaspberry Pi Picoに入れないと開発するよう応えてもらえないから必要なのだ。ただしそれはPythonでやる場合で違う言語で開発する場合はまた違ってくると思う。
  2. Raspberry Pi Picoをパソコンとつなげる(最初につなげるときはボタン押しながらUSB接続)
  3. ストレージモードでRaspberry Pi Picoがつながるのでそのルートフォルダに1でダウンロードしたファイルをコピーする
  4. そうするとRaspberry Pi Picoがファイルを消化していったん接続が途切れたような状態になりストレージとして見えなくなるが問題ない。ただしい動き。
  5. パソコンでの開発環境Thonnyをダウンロードしてインストールする。これを使ってユーザーがPython言語でプログラムを書き、Raspberry Pi Picoへの書き込みまでやってくれるソフトである。
    参考↓
    ラズベリー・パイPicoマイコン スタートアップ・マニュアル
  6. 何度かデバッグをやって出来上がったらパソコンからUSBケーブルを外して他のバッテリーやらACDCコンバータと接続しても同様の動きをすれば完了

参考リンク

Thonny開発環境で最初にやること

Thonny開発環境でやることは

  1. メニュー→ツール→オプション→インタプリタタブ→デバイス選択でMicroPython(Raspberry Pi Pico)
  2. 同じウィンドウで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);
  }
}
タイトルとURLをコピーしました