.. note:: こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ!Facebook上でRaspberry Pi、Arduino、ESP32についてもっと深く掘り下げ、他の愛好家と交流しましょう。 **参加する理由は?** - **エキスパートサポート**:コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。 - **学び&共有**:ヒントやチュートリアルを交換してスキルを向上させましょう。 - **独占的なプレビュー**:新製品の発表や先行プレビューに早期アクセスしましょう。 - **特別割引**:最新製品の独占割引をお楽しみください。 - **祭りのプロモーションとギフト**:ギフトや祝日のプロモーションに参加しましょう。 👉 私たちと一緒に探索し、創造する準備はできていますか?[|link_sf_facebook|]をクリックして今すぐ参加しましょう! .. _4.1.10_py: 4.1.10 スマートファン ========================= .. note:: .. image:: ../img/mcp3008_and_adc0834.jpg :width: 25% :align: left キットのバージョンによって、 **ADC0834** または **MCP3008** が含まれています。 該当するセクションを選択してください。 はじめに ----------------- このプロジェクトでは、モーター、ボタン、サーミスターを使用して、風速を調整可能な手動+自動スマートファンを製作します。 必要な部品 ------------------------------ このプロジェクトで必要な部品は以下の通りです。 .. image:: ../img/list_Smart_Fan.png :align: center キット全体を購入する方が確実に便利です。リンクはこちら: .. list-table:: :widths: 20 20 20 :header-rows: 1 * - 名前 - このキットのアイテム - リンク * - Raphael Kit - 337 - |link_Raphael_kit| 以下のリンクから別々に購入することもできます。 .. list-table:: :widths: 30 20 :header-rows: 1 * - コンポーネントの紹介 - 購入リンク * - :ref:`cpn_gpio_board` - |link_gpio_board_buy| * - :ref:`cpn_breadboard` - |link_breadboard_buy| * - :ref:`cpn_wires` - |link_wires_buy| * - :ref:`cpn_resistor` - |link_resistor_buy| * - :ref:`cpn_power_module` - \- * - :ref:`cpn_thermistor` - |link_thermistor_buy| * - :ref:`cpn_l293d` - \- * - :ref:`cpn_adc0834` - \- * - :ref:`cpn_button` - |link_button_buy| * - :ref:`cpn_motor` - |link_motor_buy| 回路図 ------------------------ ============ ======== ======== === T-Board Name physical wiringPi BCM GPIO17 Pin 11 0 17 GPIO18 Pin 12 1 18 GPIO27 Pin 13 2 27 GPIO22 Pin 15 3 22 GPIO5 Pin 29 21 5 GPIO6 Pin 31 22 6 GPIO13 Pin 33 23 13 ============ ======== ======== === .. image:: ../img/Schematic_three_one4.png :align: center 実験手順 ----------------------------- **ステップ1:** 回路を作成します。 .. image:: ../img/image245.png .. note:: キットの9Vバッテリーバックルを使って、電源モジュールに9Vのバッテリーを適用できます。電源モジュールのジャンパーキャップをブレッドボードの5Vバスストリップに挿入します。 .. image:: ../img/image118.jpeg :align: center **ステップ2**: コードのフォルダに移動します。 .. raw:: html .. code-block:: cd ~/raphael-kit/python **ステップ3**: 実行します。 .. raw:: html .. code-block:: sudo python3 4.1.10_SmartFan.py コードを実行しながら、ボタンを押してファンを始動させる。押すたびに1段階スピードが上下します。スピードグレードは **5** 種類あります。 速度等級があります: **0~4**. 速度等級を4 :sup:`th` に設定してボタンを押すと、ファンは停止します。を押すと風速 **0** で停止します。 温度が2℃以上上がるか下がると、速度は自動的に1段階速くなったり遅くなったりします。 コード -------- .. note:: 下記のコードを **修正/リセット/コピー/実行/停止** することができます。しかし、その前にソースコードのパス ``raphael-kit/python`` に移動する必要があります。コードを修正した後、その効果を直接確認するために実行することができます。 .. raw:: html .. code-block:: python import RPi.GPIO as GPIO import time import ADC0834 import math # Set up pins MotorPin1 = 5 MotorPin2 = 6 MotorEnable = 13 BtnPin = 22 def setup(): global p_M1,p_M2 ADC0834.setup() GPIO.setmode(GPIO.BCM) GPIO.setup(MotorPin1, GPIO.OUT) GPIO.setup(MotorPin2, GPIO.OUT) p_M1=GPIO.PWM(MotorPin1,2000) p_M2=GPIO.PWM(MotorPin2,2000) p_M1.start(0) p_M2.start(0) GPIO.setup(MotorEnable, GPIO.OUT, initial=GPIO.LOW) GPIO.setup(BtnPin, GPIO.IN) def temperature(): analogVal = ADC0834.getResult() Vr = 5 * float(analogVal) / 255 Rt = 10000 * Vr / (5 - Vr) temp = 1/(((math.log(Rt / 10000)) / 3950) + (1 / (273.15+25))) Cel = temp - 273.15 Fah = Cel * 1.8 + 32 return Cel def motor(level): if level == 0: GPIO.output(MotorEnable, GPIO.LOW) return 0 if level>=4: level = 4 GPIO.output(MotorEnable, GPIO.HIGH) p_M1.ChangeDutyCycle(level*25) return level def main(): lastState=0 level=0 markTemp = temperature() while True: currentState =GPIO.input(BtnPin) currentTemp=temperature() if currentState == 1 and lastState == 0: level=(level+1)%5 markTemp = currentTemp time.sleep(0.5) lastState=currentState if level!=0: if currentTemp-markTemp <= -2: level = level -1 markTemp=currentTemp if currentTemp-markTemp >= 2: level = level +1 markTemp=currentTemp level = motor(level) def destroy(): GPIO.output(MotorEnable, GPIO.LOW) p_M1.stop() p_M2.stop() GPIO.cleanup() if __name__ == '__main__': setup() try: main() except KeyboardInterrupt: destroy() コード説明 --------------------- .. code-block:: python def temperature():     analogVal = ADC0834.getResult()     Vr = 5 * float(analogVal) / 255     Rt = 10000 * Vr / (5 - Vr)     temp = 1/(((math.log(Rt / 10000)) / 3950) + (1 / (273.15+25)))     Cel = temp - 273.15     Fah = Cel * 1.8 + 32     return Cel ``temperture()`` は、 **ADC0834** によって読み取られたサーミスターの値を温度値に変換するためのものです。詳細は :ref:`2.2.2_py` を参照してください。 .. code-block:: python def motor(level):     if level == 0:         GPIO.output(MotorEnable, GPIO.LOW)         return 0     if level>=4:         level = 4     GPIO.output(MotorEnable, GPIO.HIGH)     p_M1.ChangeDutyCycle(level*25)     return level この関数は、モーターの回転速度を制御します。 **Lever** の範囲は **0-4** (レベル **0** はモーターの動作を停止します)。一つのレベルの調整は風速の **25%** の変化を表します。 .. code-block:: python def main():     lastState=0     level=0     markTemp = temperature()     while True:         currentState =GPIO.input(BtnPin)         currentTemp=temperature()         if currentState == 1 and lastState == 0:             level=(level+1)%5             markTemp = currentTemp             time.sleep(0.5)         lastState=currentState         if level!=0:             if currentTemp-markTemp <= -2:                 level = level -1                 markTemp=currentTemp                         if currentTemp-markTemp >= 2:                 level = level +1                 markTemp=currentTemp                      level = motor(level) 関数 **main()** は、以下に示すプログラムの全体的なプロセスを含みます: 1) ボタンの状態と現在の温度を常に読み取ります。 2) ボタンを押すたびにlevelを **+1** し、同時に温度が更新されます。 **Level** の範囲は **1~4** です。 3) ファンが動作しているとき(レベルが **0** でない場合)、温度は検出されます。 **2℃+** の変化でレベルが上下します。 4) モーターは **Level** に合わせて回転速度を変更します。 現象の画像 ------------------------ .. image:: ../img/image246.png :align: center