見出し画像

[Python]Raspberry Pico wで自動餌やり機作って見た

一年ぶりの投稿ですね…
自己学習としてpythonを勉強する際に作ったものを紹介したいと思います


用意するもの

  1. Raspberry Pi Pico w

  2. サーボモーター MG 996R

  3. ジャンパ線

  4. 固定具(ブラケット)

  5. その他(輪ゴム、紙コップ)

材料のリンク

amazonで買うと高いですがリンク貼っておきます


結線図

サーボモータを動かすには
Vcc(電源):+5[V]
GND(基準電位):0[V]
PWM(パルス幅変調:pulse width modulationの略)
の3種の結線が必要になります

結線図

電源と基準電位は俗に言うプラス・マイナスですがPWMはあまり馴染みがないかもしれません。
PWMは電圧のONOFFによりパルス波を生成し電圧が高い時間(信号がゼロでない期間)の割合を認識して制御しています。
信号がゼロでない期間を信号の周期(一つの波)で割った値(割合)をデューティー比と言います。
このデューティー比を変化させることでサーボモーターの角度を指定することができます。

※デューティー比やPWMのような制御工学の話は長くなるのでここで割愛とさせて下さい

コード(python)

Raspberry Pi Pico wにコードを書き込みます
開発環境はthonnyを使いました
PCとRaspberry Pi Pico wの接続と認識の方法等は割愛します

コードの概要

  1. Raspberry Pi Pico wでnetに接続(接続できるまでループ)

  2. ntpサーバから時刻を取得

  3. 取得した時刻を変数に年月日時分秒でa~fに格納

  4. 時刻取得から変数iで40秒間ループ

  5. ループ中は時刻の判定(指定した時刻、正午)

  6. ループ中は変数の時刻をプログラム内でカウント、繰り上げ(1時間でntpサーバから取得し直す)

※ループ期間iが40秒なのはテストをするためなので実際に使う場合は数時間単位にするべきだと思います

コード本文

from machine import PWM, Pin
import utime
import network
import ntptime
import urequests
from ssid2 import SSID, PASS, TOKEN,channel,url

led = machine.Pin('LED',machine.Pin.OUT)
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(SSID,PASS)

servo1 = PWM(Pin(0))
servo1.freq(50)
max_duty = 65025
dig_0 = 0.0725    #0°
dig_30 = 0.0883   #30°
dig_60 = 0.1042   #60°
dig_90 = 0.12     #90°
dig_m30 = 0.0567  #-30°
dig_m60 = 0.0408  #-60°
dig_m90 = 0.025   #-90°

while(not wlan.isconnected()):
        print('接続中…')
        utime.sleep(1.0)
print('接続済')
i=0
_jst = ntptime.time() + 3600 * 9
_tm = utime.localtime(_jst)
a = int(_tm [0])
b = int(_tm [1])
c = int(_tm [2])
d = int(_tm [3])
e = int(_tm [4])
f = int(_tm [5])

while(i<40):
    try:
        print(str(a) +'年'+ str(b) + '月' + str(c) + '日' + str(d) + '時' + str(e) + '分' + str(f) + '秒')
        servo1.duty_u16(int(max_duty*dig_m90))
        if d == 4 and e == 02 and f == 00:
            print("指定時刻")
            servo1.duty_u16(int(max_duty*dig_60))
            text_message = 'message=' + 'Rasberry Pi Pico W NOWTIME:' + str(a) +'年'+ str(b) + '月' + str(c) + '日' + str(d) + '時' + str(e) + '分' + str(f) + '秒'
            print(text_message)
        if d == 12 and e == 00 and f == 00:
            print("正午なら")
            servo1.duty_u16(int(max_duty*dig_60))
            text_message = 'message=' + 'Rasberry Pi Pico W NOWTIME:' + str(a) +'年'+ str(b) + '月' + str(c) + '日' + str(d) + '時' + str(e) + '分' + str(f) + '秒'
            print(text_message)
            break
        led.value(1)
        utime.sleep(0.5)
        led.value(0)
        utime.sleep(0.5)
        i += 1
        f += 1
        if f >=60:
            f = 00
            e +=1
        if e>= 60:
            print("時間を校正します")
            _jst = ntptime.time() + 3600 * 9
            _tm = utime.localtime(_jst)
            a = int(_tm [0])
            b = int(_tm [1])
            c = int(_tm [2])
            d = int(_tm [3])
            e = int(_tm [4])
            f = int(_tm [5])
    except:
        machine.idle()


コードの詳細な説明は別記事にしようと思います

実際に動かして見た

実際に動くのは00:12です。
餌のかわりに乾電池を入れています。


今後の課題

できたこと

とりあえず動いた(^_^;)
pythonで少し実用的なものができた

改善したいこと

サーボモータの電圧を安定させるためにはコンデンサが必要
Raspberry Pi Pico w単体(PCなし)で稼働させる

追加したい機能

温度センサを取り付ける
メールかスラックで通知する
カメラで確認できるようにする
時間ではなくスラックやメールの通知でサーボモータを動かせるようにする

あとがき

この一年間はBPさんと仕事をしていたりVue.jsを覚えたり上流工程(基本設計)を担当していたり基本情報技術者の試験勉強など忙しく過ごしていました。
アウトプットは完全に忘れていましたが、また再開したいと思います。
今回のRaspberry Pi Pico wの自動餌やり機はもとからこれを作る目的でpythonの勉強を始めたわけではなく、新しい言語を習得するためにPythonを学習しているうちに電子工作でも使われていることを知り、大学の頃の実験を思い出しながら作って見ました。
PWMやデューティー比の制御工学はかなり懐かしかったです(^_^;)

参考文献


この記事が気に入ったらサポートをしてみませんか?