編集履歴一覧に戻る
Yossyのアイコン画像

Yossy が 2024年10月07日18時02分56秒 に編集

コメント無し

メイン画像の変更

メイン画像が設定されました

本文の変更

概要 --- 近年、熱中症警戒アラートの発令によって気温上昇に注意を向ける場面が増加している。そこで私は、指さし温度・湿度計を制作し、より自分自身の体調管理に気を付けて行動したいと考えた。また、今回温度・湿度計を作成するにあたって皆さんに熱中症の警戒を呼びかける啓発活動に少しでも貢献できるのではないかと感じた。 概要を示す図

+

---

--- ![イメージ図](https://camo.elchika.com/29bfdb49b4a0d5e88765ad757f9a48ad0652de24/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32343932333332642d653061372d343463642d383934622d3431636537306133663539642f31633635333661362d623861612d346132382d393636322d353565333530313835626261/) アイデアの詳細 --- - イラスト作成を行う。 - サーボモータを使用して温度と湿度を示す。 - 一定温度になると何かしらのアクションを出力する。(例、緊急性のある音を出す、指を素早くふるなど) - Pythonを使用して気温や湿度を取得するプログラムを作成。 - 気温や湿度の目盛りの間隔とサーボモータの動作範囲を明確にする。 - サーボモータの使い方を理解する。 GPIOのピン配置について -- ![ピン配置](https://camo.elchika.com/3d4be857525ffd6b340b438b6406c04c7f331861/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32343932333332642d653061372d343463642d383934622d3431636537306133663539642f31346463643164392d366130642d343935622d616530612d336563386138333432623463/)

+

![キャプションを入力できます](https://camo.elchika.com/608cf4b646686ec4a7de6d67c96b0c2779ab4cf7/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32343932333332642d653061372d343463642d383934622d3431636537306133663539642f65353566396533332d343162642d343963382d623461642d656163626162383730333636/)

**温度用サーボモータ部分** -- ++制御信号用の配線は、Raspberry PiのGPIO13(端子番号33)に接続して制御した。 電源用配線は、Raspberry Piの端子番号2に接続して制御した。

-

GND用配線Raspberry Piの端子番号39に接続して制御した。++

+

GND用配線Raspberry Piの端子番号6に接続して制御した。++

**湿度用サーボモータ部分** -- ++制御信号用の配線は、Raspberry PiのGPIO12(端子番号32)に接続して制御した。 電源用配線は、Raspberry Piの端子番号4に接続して制御した。 GND用配線Raspberry Piの端子番号30に接続して制御した。++ 必要となる物品 --- |部品名称|型名|数量| |---|---|---| |Raspberry pi 4|| 1| |サーボモータ|SG90|2| |温度湿度センサ| BME280|1| |イラスト作成の道具|(板や紙、段ボールなど)| |~~ブレッドボード~~||~~1~~| |~~電池ボックス~~||~~1~~| |~~単三電池~~||~~4~~|

+

ソースコード -- ```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