やりたいこと(最終目標)
部屋の温度が上がったらエアコンのスイッチを押す装置の製作
夏のある時期には、研究室のエアコンが3時間くらいで自動で切れてしまう。室温が上がりすぎると研究室にあるサーバーに影響が出てしまうので、自動でエアコンが切れても自動で付け直す装置をラズベリーパイで作ることで、サーバーを熱から守る。
手順
①温度センサー(DHT11)で部屋の温度を測定
②室温がある温度以上になったらサーボモータ(SG90)を回してエアコンのスイッチを押して室温を下げる
※このとき、すでについているエアコンを押して消してしまう事がないように、温度測定(もしくはサーボモータ起動)は温度上昇に合わせて一定間隔で行う。
今回の作業内容
今回は、サーボモータ(SG90)の動作確認を行います。
前回の温度測定と合わせて、「ある温度以上ならサーボモータを回す」というプログラムを書きます。
サーボモータをラズパイに接続
基本的には、以下の記事を参考にさせていただきました。

接続方法は、
SG90の茶色のコード(GND)⇒ラズパイの6番ピン(GND)
SG90の赤色のコード(5V電源)⇒ラズパイの4番ピン(+5V)
SG90の橙色のコード(PWM信号)⇒ ラズパイの 7番ピン(GPIO4)
と接続してください。
ソースコード
コードも、上の記事のものそのままで、動作確認しました。
動作確認メインコード(上の記事を引用)
# -*- coding: utf-8 -*- import RPi.GPIO as GPIO import time #SG92Rをコントロールするための class SG90_92R_Class: # mPin : GPIO Number (PWM) # mPwm : Pwmコントロール用のインスタンス # m_Zero_offset_duty : """コンストラクタ""" def __init__(self, Pin, ZeroOffsetDuty): self.mPin = Pin self.m_ZeroOffsetDuty = ZeroOffsetDuty #GPIOをPWMモードにする GPIO.setup(self.mPin, GPIO.OUT) self.mPwm = GPIO.PWM(self.mPin , 50) # set 20ms / 50 Hz """位置セット""" def SetPos(self,pos): #Duty ratio = 2.5%〜12.0% : 0.5ms〜2.4ms : 0 ~ 180deg duty = (12-2.5)/180*pos+2.5 + self.m_ZeroOffsetDuty self.mPwm.start(duty) """終了処理""" def Cleanup(self): #サーボを10degにセットしてから、インプットモードにしておく self.SetPos(90) time.sleep(1) GPIO.setup(self.mPin, GPIO.IN) """コントロール例""" if __name__ == '__main__': #Useing GPIO No. to idetify channel GPIO.setmode(GPIO.BCM) Servo = SG90_92R_Class(Pin=4,ZeroOffsetDuty=0) try: while True: print('what is current temperature') T = input() T = int(T) print('T = ', T) if T > 23: Servo.SetPos(90) time.sleep(1) Servo.SetPos(180) time.sleep(0.5) Servo.SetPos(90) time.sleep(1) except KeyboardInterrupt : #Ctl+Cが押されたらループを終了 print("\nCtl+C") except Exception as e: print(str(e)) finally: Servo.Cleanup() GPIO.cleanup() print("\nexit program")
例えば、
Servo.SetPos(90)
によって、「90度の位置に」サーボモータが回ります(90度回るということではありません。どこが90度の位置かは、動かして確認してみてください)。
この動作確認コードにより、コマンドに23より大きい数を入力し、Enterを押すと、サーボモータが動くと思います(90度の位置→180度の位置→90度の位置)。
次に、 「ある温度以上ならサーボモータを回す」 コードを書きました。つまり、前回の記事
との合体バージョンです。
「ある温度以上ならサーボモータを回す」コード
# -*- coding: utf-8 -*- import RPi.GPIO as GPIO import time import requests import dht11 #define GPIO 14 as DHT11 data pin Temp_sensor=14 #SG92Rをコントロールするための class SG90_92R_Class: # mPin : GPIO Number (PWM) # mPwm : Pwmコントロール用のインスタンス # m_Zero_offset_duty : """コンストラクタ""" def __init__(self, Pin, ZeroOffsetDuty): self.mPin = Pin self.m_ZeroOffsetDuty = ZeroOffsetDuty #GPIOをPWMモードにする GPIO.setup(self.mPin, GPIO.OUT) self.mPwm = GPIO.PWM(self.mPin , 50) # set 20ms / 50 Hz """位置セット""" def SetPos(self,pos): #Duty ratio = 2.5%〜12.0% : 0.5ms〜2.4ms : 0 ~ 180deg duty = (12-2.5)/180*pos+2.5 + self.m_ZeroOffsetDuty self.mPwm.start(duty) """終了処理""" def Cleanup(self): #サーボを10degにセットしてから、インプットモードにしておく self.SetPos(90) time.sleep(1) GPIO.setup(self.mPin, GPIO.IN) """コントロール例""" if __name__ == '__main__': #Useing GPIO No. to idetify channel GPIO.setmode(GPIO.BCM) Servo = SG90_92R_Class(Pin=4,ZeroOffsetDuty=0) GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) # Use BCM GPIO numbers # Initialise display # lcd_init() instance = dht11.DHT11(pin = Temp_sensor) headers = { 'Content-Type': 'application/json', } #data = '{"value1":"time","value2":"result.temperature","value3":"result.humidity"}' try: while True: #get DHT11 sensor value result = instance.read() print('Temperature = ',result.temperature,'C','Humidity = ',result.humidity,'%') if result.temperature > 25: Servo.SetPos(90) time.sleep(1) Servo.SetPos(180) time.sleep(0.5) Servo.SetPos(90) #time.sleep(1) time.sleep(1) except KeyboardInterrupt : #Ctl+Cが押されたらループを終了 print("\nCtl+C") except Exception as e: print(str(e)) finally: Servo.Cleanup() GPIO.cleanup() print("\nexit program")
これにより、室温が25度より高ければ、サーボモータが回ります。
実際に動かしてみたときの動画
※動画では、上のコードの内容と違い、90度の位置に一度だけ回るようにしています。
次回の作業
温度測定のタイミングを調整し、実際にエアコンのスイッチに取り付けます(クライマックス)。
コメント