Yossy が 2024年10月22日15時59分16秒 に編集
コメント無し
本文の変更
概要 --- 近年、熱中症警戒アラートの発令によって気温上昇に注意を向ける場面が増加しています。そこで私は、指さし温度・湿度計を制作し、より自分自身の体調管理に気を付けて行動したいと考えました。また、今回温度・湿度計を作成するにあたって皆さんに熱中症の警戒を呼びかける啓発活動に少しでも貢献できるのではないかと感じました。 概要を示す図 --- ![イメージ図](https://camo.elchika.com/29bfdb49b4a0d5e88765ad757f9a48ad0652de24/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32343932333332642d653061372d343463642d383934622d3431636537306133663539642f31633635333661362d623861612d346132382d393636322d353565333530313835626261/) アイデアの詳細 --- - イラスト作成を行う。 - サーボモータを使用して温度と湿度を示す。
- 一定温度になると何かしらのアクションを出力する。(例、緊急性のある音を出す、指を素早くふるなど)
- 一定温度になると何かしらのアクションを出力する。 (例、緊急性のある音を出す、指を素早くふるなど)
- Pythonを使用して気温や湿度を取得するプログラムを作成。 - 気温や湿度の目盛りの間隔とサーボモータの動作範囲を明確にする。 - サーボモータの使い方を理解する。 必要となる物品 --- |部品名称|型名|数量| |---|---|---| |Raspberry pi 4|| 1| |サーボモータ|SG90|2| |温度湿度センサ| BME280|1| |イラスト作成の道具|(板や紙、段ボールなど)| |~~ブレッドボード~~||~~1~~| |~~電池ボックス~~||~~1~~| |~~単三電池~~||~~4~~| ※Raspberry pi 4への電源供給を乾電池からする想定でしたが都合により実践できなかったため、今回はブレッドボードや乾電池などは使用しません。 「pigpio」ライブラリのインストール --- Raspberry Piの制御方法として「pigpio」ライブラリがあり、サーボモータの制御が可能となっています。 aptコマンドでインストールすることができます。 ![pigpioライブラリ](https://camo.elchika.com/29a70c04b7135ac0fb386473653eb85f6052cd80/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32343932333332642d653061372d343463642d383934622d3431636537306133663539642f33323931356366632d306534372d343964352d626632392d323136613832373139613539/) また、pigpioライブラリを使ってGPIOにアクセスするには、pigpiodを起動する必要があります。 ![自動起動](https://camo.elchika.com/9c9b0426c4d919aea05478f91a93dddff8f4dbeb/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32343932333332642d653061372d343463642d383934622d3431636537306133663539642f64613863656666332d666535342d346135362d396164612d383930383637333462326463/) これでサーボモータを使う準備ができました。 GPIOのピン配置について -- ![ピン配置](https://camo.elchika.com/3d4be857525ffd6b340b438b6406c04c7f331861/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32343932333332642d653061372d343463642d383934622d3431636537306133663539642f31346463643164392d366130642d343935622d616530612d336563386138333432623463/) 温度用サーボモータ部分 -- ++制御信号用の配線は、Raspberry PiのGPIO13(端子番号33)に接続して制御した。 電源用配線は、Raspberry Piの端子番号2に接続して制御した。 GND用配線Raspberry Piの端子番号6に接続して制御した。++ 湿度用サーボモータ部分 -- ++制御信号用の配線は、Raspberry PiのGPIO12(端子番号32)に接続して制御した。 電源用配線は、Raspberry Piの端子番号4に接続して制御した。 GND用配線Raspberry Piの端子番号30に接続して制御した。++ >**サーボモータには3本の配線が取り付けられています。 >配線は、赤線が電源、茶線がGND、オレンジ線が制御信号用配線となっています。** ![3本の配線](https://camo.elchika.com/4b0245683aa3a3873a4816b9069464858d32aa55/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32343932333332642d653061372d343463642d383934622d3431636537306133663539642f34636130313065312d373834652d343831622d616465652d643532633066333934383166/) サーボモータの動作範囲を調べる --- 次に目盛りの最大温度(40℃)、最小温度(0℃)、最大湿度(70%)、最小湿度(30%)を指すためのパルス幅を調べます。指定するパルス幅を変えながら「adjust.py」でサーボモータを動かし、最大温度・湿度または最小温度・湿度を指すように調整します。 ```Python:adjust.py import sys import pigpio SERVO_PIN = 12 //SERVO_PIN = 13 args = sys.argv f = 0 if ( len( args ) > 1 ): if ( args[1].isdecimal() ): p_width = int( args[1] ) if ( p_width >= 500 and p_width <= 2500 ): f = 1 if ( f == 1 ): print ("Servo set", p_width ) pi = pigpio.pi() pi.set_servo_pulsewidth(SERVO_PIN, p_width) else: print ("USAGE: python3 servo.py PULSE_WIDTH") print (" PULSE_WHDHT : Pulse range is 500-2500.") ``` 今回は、 - 40℃を指すパルス幅 →「2350」 - 0℃を指すパルス幅 →「1550」 - 70%を指すパルス幅 →「680」 - 30%を指すパルス幅 →「1500」となりました。 ソースコード -- このプログラムは温度や湿度を示すことが可能です。 また、温度が35℃以上、湿度が65%以上になった場合、指を素早く振るというプログラムです。 ```Python:指振りプログラム import pigpio import sys, time import smbus2 import bme280 MIN_TEMP = 0 MAX_TEMP = 40 MAX_PULSE = 2350 MIN_PULSE = 1550 MIN_HUMIDITY = 30 MAX_HUMIDITY = 70 MIN_PULSE_HUMIDITY = 1500 MAX_PULSE_HUMIDITY = 680 SWING_MIN_PULSE = 1000 # サーボモーターが振れる最小パルス幅 SWING_MAX_PULSE = 2000 # サーボモーターが振れる最大パルス幅 SWING_DELAY = 0.5 # モーターが振動する速度(秒単位) INT_TIME = 1 TEMP_SERVO_PIN = 13 HUMIDITY_SERVO_PIN = 12 BME280_ADDR = 0x76 pi = pigpio.pi() bus = smbus2.SMBus(1) calibration_params = bme280.load_calibration_params(bus, BME280_ADDR) delta_temp = (MAX_PULSE - MIN_PULSE) / (MAX_TEMP - MIN_TEMP) inter_temp = (MIN_PULSE * MAX_TEMP - MAX_PULSE * MIN_TEMP) / (MAX_TEMP - MIN_TEMP) delta_humidity = (MAX_PULSE_HUMIDITY - MIN_PULSE_HUMIDITY) / (MAX_HUMIDITY - MIN_HUMIDITY) inter_humidity = (MIN_PULSE_HUMIDITY * MAX_HUMIDITY - MAX_PULSE_HUMIDITY * MIN_HUMIDITY) / (MAX_HUMIDITY - MIN_HUMIDITY) def swing_motor(): # 温度サーボと湿度サーボを左右に振る動作 for _ in range(3): # 3回振る # 温度サーボモーターを振動させる pi.set_servo_pulsewidth(TEMP_SERVO_PIN, SWING_MIN_PULSE) pi.set_servo_pulsewidth(HUMIDITY_SERVO_PIN, SWING_MIN_PULSE) # 湿度サーボモーターも同時に動かす time.sleep(SWING_DELAY) # 温度サーボモーターを反対方向に振る pi.set_servo_pulsewidth(TEMP_SERVO_PIN, SWING_MAX_PULSE) pi.set_servo_pulsewidth(HUMIDITY_SERVO_PIN, SWING_MAX_PULSE) # 湿度サーボモーターも反対方向に振る time.sleep(SWING_DELAY) # モーターを停止 pi.set_servo_pulsewidth(TEMP_SERVO_PIN, 0) pi.set_servo_pulsewidth(HUMIDITY_SERVO_PIN, 0) def swing_motor_temp(): # モーターを左右に振る動作 for _ in range(3): # 3回振る pi.set_servo_pulsewidth(TEMP_SERVO_PIN, SWING_MIN_PULSE) time.sleep(SWING_DELAY) pi.set_servo_pulsewidth(TEMP_SERVO_PIN, SWING_MAX_PULSE) time.sleep(SWING_DELAY) pi.set_servo_pulsewidth(TEMP_SERVO_PIN, 0) # モーターを停止 def swing_motor_humidity(): # モーターを左右に振る動作 for _ in range(3): # 3回振る pi.set_servo_pulsewidth(HUMIDITY_SERVO_PIN, SWING_MIN_PULSE) time.sleep(SWING_DELAY) pi.set_servo_pulsewidth(HUMIDITY_SERVO_PIN, SWING_MAX_PULSE) time.sleep(SWING_DELAY) pi.set_servo_pulsewidth(HUMIDITY_SERVO_PIN, 0) # モーターを停止 while True: data = bme280.sample(bus, BME280_ADDR, calibration_params) temp = data.temperature humidity = data.humidity target_servo_temp = int(delta_temp * temp + inter_temp) target_servo_humidity = int(delta_humidity * humidity + inter_humidity) print(f"Temperature: {temp:.2f}C\t Humidity: {humidity:.2f}%\t Temp Servo pulse: {target_servo_temp}\t Humidity Servo pulse: {target_servo_humidity}") # 温度が35℃以上、かつ湿度が65%以上の場合にモーターを振動させる if temp >= 35 and humidity >= 65: print("Temperature is 35°C or higher and Humidity is 65% or higher. Swinging the motor.") swing_motor() elif temp >= 35: # 温度が35℃以上の場合にモーターを振動させる print("Temperature is 35°C or higher. Swinging the motor.") swing_motor_temp() elif humidity >= 65: # 湿度が65%以上の場合にモーターを振動させる print("Humidity is 65% or higher. Swinging the motor.") swing_motor_humidity() # サーボモーターのパルス幅の範囲チェック(温度用) if target_servo_temp < 500 or target_servo_temp > 2500 or temp > MAX_TEMP or temp < MIN_TEMP: print("温度用サーボパルス幅の範囲外") else: pi.set_servo_pulsewidth(TEMP_SERVO_PIN, target_servo_temp) # サーボモーターのパルス幅の範囲チェック(湿度用) if target_servo_humidity < 500 or target_servo_humidity > 2500 or humidity > MAX_HUMIDITY or humidity < MIN_HUMIDITY: print("湿度用サーボパルス幅の範囲外") else: pi.set_servo_pulsewidth(HUMIDITY_SERVO_PIN, target_servo_humidity) time.sleep(INT_TIME) ``` ![完成したイラスト](https://camo.elchika.com/30d63f4dd7ce379ccfec864f98d850dcabcd9465/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32343932333332642d653061372d343463642d383934622d3431636537306133663539642f36653266616664332d386162332d343665342d386337632d633963393363306436336661/) まとめ --- 今回は温度湿度センサを使ってサーボモータで温度、湿度を示すようにしました。 自身でイラストを作成することで、ものづくりの楽しさをより感じることができました。 参考文献 --- 電子工作初心者がラズパイでサーボモータ1~4個を動かした方法 https://qiita.com/kurukurupapa@github/items/953fcc69c17bf082e76e ラズパイ電子工作の基本① サーボモータを使って指さし温度計を作ってみよう https://deviceplus.jp/raspberrypi/raspberrypi_f01/#servo%20motor%2001 Raspberry Pi 4 の GPIO ピン配置(ピンマッピング)について https://qiita.com/Erytheia/items/f362a3d68e57cd088713 秋月電子通商 https://akizukidenshi.com/catalog/g/g108761/