ラズベリーパイ3で『温度が上がったらエアコンのスイッチを押すやつ』を作る【サーボモータSG90の動作確認編】

テクノロジー

やりたいこと(最終目標)

部屋の温度が上がったらエアコンのスイッチを押す装置の製作

夏のある時期には、研究室のエアコンが3時間くらいで自動で切れてしまう。室温が上がりすぎると研究室にあるサーバーに影響が出てしまうので、自動でエアコンが切れても自動で付け直す装置をラズベリーパイで作ることで、サーバーを熱から守る。

手順

①温度センサー(DHT11)で部屋の温度を測定

②室温がある温度以上になったらサーボモータ(SG90)を回してエアコンのスイッチを押して室温を下げる

※このとき、すでについているエアコンを押して消してしまう事がないように、温度測定(もしくはサーボモータ起動)は温度上昇に合わせて一定間隔で行う。

今回の作業内容

今回は、サーボモータ(SG90)の動作確認を行います。

前回の温度測定と合わせて、「ある温度以上ならサーボモータを回す」というプログラムを書きます。

サーボモータをラズパイに接続

基本的には、以下の記事を参考にさせていただきました。

Raspberry Pi講座 Servo ( SG90, SG92 ) - Hobby robot laboratory

接続方法は、

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度の位置に一度だけ回るようにしています。

次回の作業

温度測定のタイミングを調整し、実際にエアコンのスイッチに取り付けます(クライマックス)。

コメント

タイトルとURLをコピーしました