RaspberryPi PicoでZeroの間欠動作

RaspberryPi Picoとリレーを使って、RaspberryPi Zeroを30分に一度起動させると言った間欠動作させるテストを行いました。

 

■ RaspberryPi Picoでリレーを動かす

手始めにPicoでリレーを動かしてみます。
今回は下記のメカニカルリレーを使用しました。

 

ドライバ内蔵リレーモジュールキット ¥200
https://akizukidenshi.com/catalog/g/gK-13573/


 

ひとまず、リレーでLEDを光らせてみました。


はんだ付けがへたくそなのはご愛敬です。

リレーのINPUTは、GPIO17に接続し、1秒ごとにカチカチさせてみました。

from machine import Pin
import utime
relay = Pin(17, Pin.OUT)

while True:
    relay.value(1)
    utime.sleep(1)
    relay.value(0)
    utime.sleep(1)

 

いずれメカニカルリレーより安価に出来そうなMOSFETも試したいと思ってます。

ちなみにPicoのGPIO配列はこちら。

 

参考サイト:

Raspberry Pi Pico を使ってみる(回路とLチカ)
https://kirikoshokunin.hatenablog.com/entry/2021/04/13/234321

 

■ RaspberryPi PicoとリレーでZeroの間欠動作

続けてPicoによるリレー操作で、RaspberryPi Zeroを一定期間ごとに起動させる、いわゆる間欠動作をやってみます。

 

RaspberryPi Zeroの設定

まずZeroの方で、起動時に所定のスクリプト(Python)を走らせ、スクリプトが終わればシャットダウンするように設定します。

まずはスクリプトの自動実行ですが、

 

Raspberry Piでプログラムを自動起動する5種類の方法を比較・解説
https://qiita.com/karaage0703/items/ed18f318a1775b28eab4

・手軽にとにかく自動で起動させたいなら /etc/rc.local
・ユーザー権限で実行させたいプログラムは crontab @reboot
・GUIのプログラムはautostart
・しっかり管理したいならsystemd
・特別な事情があれば /etc/init.d

 

上記サイトによると、いくつか方法があるらしいのですが、お手軽に/etc/rc.localによる方法にします。

今回はテストなので、走らせたいPythonは何でも良いのですが、生きているかを確認するため、自分のウェブサイトにアクセスして、フォームを入力するという動作をすることにしました。

 

send_data.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import urllib
import urllib2

def send_data(value):
    url = 'https://hogehoge/input.php'
    params = {'input':1, 'temp':str(value) }
    params = urllib.urlencode(params)
    
    req = urllib2.Request(url)
    req.add_header('test', 'application/x-www-form-urlencoded')
    req.add_data(params)
    
    res = urllib2.urlopen(req)
    r = res.read()
    print(r)

send_data(1)

 

間欠動作させるには、スクリプト実行後シャットダウンする必要がありますが、間髪入れずにシャットダウンしてしまうと、設定変更ができなくなってしまうので、物理番号39(GND)、40(GPIO21)のピンをジャンパスイッチとして使うことにしました。

 

is_shutdown.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import gpiozero

def main():
	btn = gpiozero.Button(21)
	if btn.is_pressed:
		return '1'
	else:
		return '0'

if __name__ == '__main__':
    ret = main()
    sys.stdout.write(ret)

gpiozero.Button()は自動でGPIOピンに内蔵されているプルアップ抵抗を有効にします。
GPIO21を抵抗を挟んでGNDに接続することで、is_pressedがTrueの状態になります。

 

参考サイト:
ラズパイ(Raspberry Pi)のGPIOを再確認! まずは汎用入出力からマスターしよう
https://deviceplus.jp/hobby/raspberrypi-gpio/

 

スクリプトを実行するシェルスクリプトがこちら。

startup.sh

sleep 30
python /home/pi/send_data.py
mode=$(python /home/pi/is_shutdown.py)
if [ $mode = 1 ]; then
    sudo shutdown -h now
fi

is_shutdown.pyにより処理を分岐させることで、物理番号39、40を抵抗を挟んでジャンパしたときだけ、シャットダウンするようにできました。

最初に30秒スリープさせているのは、Wifiが接続されるまでラグがあるためです。
まぁただ、一定の余時間がないと、設定をミスって常にシャットダウンしてしまうようになったときに、修正するのが困難になるので、Wifi待ちが不要でもあった方が良いですかね。

 

startup.shを所定のフォルダに移動させて、

$ sudo mv ./startup.sh /usr/local/bin/

/etc/rc.localを編集します。

$ sudo nano /etc/rc.local

exit 0の前に、startup.shを追記

sudo bash startup.sh
exit 0

Zero側の設定は以上です。

 

RaspberryPi Picoの設定

次はPico側の設定です。こちらはリレーを動かすだけなので、最初のリレーを動かしたスクリプトとの違いはsleep時間だけです。

from machine import Pin
import utime
relay = Pin(17, Pin.OUT)

while True:
    relay.value(1)
    utime.sleep(3*60)
    relay.value(0)
    utime.sleep(27*60)

 

配線


LEDは不要ですが、リレーON時の通電確認用に残してます。

消費電力は、Zeroのデフォルト(Raspberry Pi OS with desktop)の状態だと1Wくらいで、Picoは90mWくらいだそうなので、うまくすれば、1/10くらいに抑えられそうです。

余談ですが、Picoと合わせて下記のワットチェッカーを買ったのですが、Picoの消費電力は小さすぎて測れませんでしたT_T

USB簡易電圧・電流チェッカー RT-USBVAC4QC
https://akizukidenshi.com/catalog/g/gM-10027/

 

今回は単純に時間でオフにしましたが、RaspberryPiは電源を切っても電力消費するみたいなので、Zeroの死活をPicoで確認してリレーを切るようにすればより良いですね。

電源を切っても100mW(20mA)を消費し続けるRaspberry Pi
https://ameblo.jp/bokunimo/entry-12497180827.html?utm_source=gamp&utm_medium=ameba&utm_content=general__bokunimo&utm_campaign=gamp_paginationList

 

一定時刻に起動したい場合はRTCモジュールが普通要りますが、ZeroがWifiに繋がる環境であれば、Zeroがネットワーク経由で持ってきた時刻をPicoに教える事で、簡易的なRTCとする事もできそうです。

 

ちなみにPicoにはSLEEP MODEというものがあって、消費電力を抑えられるそうですが、現状、MicroPythonからは使用できないようです。

Pico power management in micropython
https://raspberrypi.stackexchange.com/questions/121443/pico-power-management-in-micropython
(今のSDKも見ましたが記載はありませんでした)

 

追記===========

MicroPythonv1.16のクイックリファレンスにDeepSleepの記載を見つけたのですが、最新のリファレンス(v1.17)には記載がありません。うーん?

https://micropython-docs-ja.readthedocs.io/ja/v1.16ja/rp2/quickref.html#deep-sleep-mode

https://micropython-docs-ja.readthedocs.io/ja/latest/rp2/quickref.html

 

また下記サイトの末尾にDeepSleep時の消費電力が乗っているのですが、MicroPythonからはスリープは実行されていないとのこと(コメント欄)。

Raspberry Pi Pico のシリアルCOMが表示されないときの修復方法
https://bokunimo.net/blog/raspberry-pi/1460/

//追記===========

 

C言語で開発するなら省電力化もできますし、部品代も800円くらいなので、間欠タイマーとしての活用もありですね。

 

まぁただタイマーだけなら既存製品もありますし、わざわざPicoを使うなら、何かをPicoでモニタリングしながら、Zeroを時々起こして処理させる使い方が有益な気がします。

 

以上。Pico楽しい!

1 Comment

Add a Comment

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です