Python-Arduinoプロトタイピング

こんにちは、Habr! 複雑なものを作成する最も簡単な方法について例を挙げて説明したいと思います。 「プロトタイピング」という恐ろしい言葉の本質は、Arduinoプロジェクトでの類推やパターンの使用にあります。



Python-Arduinoユーザーの初心者を長い言葉で怖がらせたくないので、すぐに例を挙げて説明します。



ブザー-可聴アラームを生成します



ズーマー[1]。 デジタルHIGH値(つまり、+ 5 V)が装備されている場合に音を発します。これは、Arduinoデジタルピンを使用して提供できます[2]。



ただし、モーションセンサーで行われたような単純なデジタル出力を実行する代わりに、Pythonプログラミングトリックを実装して、さまざまなサウンドパターンを生成し、さまざまな効果音を作成します。



接続









Pythonコード



これらの手順を完了するために、ピン番号、繰り返し時間、およびサンプル番号を入力として受け取る特別なPython関数を実装します。



コードの説明に進む前に、コードフォルダーからプログラムファイルbuzzerPattern.pyを開く必要があります。 コードの最初に、Python関数buzzerPattern()があります。これは、適切なパラメーターを使用してメインプログラムから呼び出されます。 この機能はプログラム全体の中核です。



この関数には、パターン1とパターン2のハードコード配列の2つの配列が含まれています。 それらのそれぞれには、テンプレートの動作サイクルであるブザーのオンとオフの時間が1秒間含まれています。



たとえば、パターン1では、0.8はブザーをオンにする時間を表し、0.2はその逆を表します。



関数は、関数の引数で指定された繰り返し期間の間、このブザーパターンを繰り返します。 繰り返し値でforループを開始した後、関数は関数引数からパターン番号をチェックし、パターンを実行します。



繰り返しサイクル全体が完了したら、ブザーが有効になっている場合はブザーを完全に無効にし、exit()メソッドを使用してボードを安全に無効にします。



def buzzerPattern(pin, recurrence, pattern): pattern1 = [0.8, 0.2] pattern2 = [0.2, 0.8] flag = True for i in range(recurrence): if pattern == 1: p = pattern1 elif pattern == 2: p = pattern2 else: print "Please enter valid pattern. 1 or 2." exit for delay in p: if flag is True: board.digital[pin].write(1) flag = False sleep(delay) else: board.digital[pin].write(0) flag = True sleep(delay) board.digital[pin].write(0) board.exit()
      
      





プログラムの残りの部分は、ライブラリをインポートしてArduinoボードを初期化するためのコードが含まれているため、比較的単純です。 ボードが初期化されたら、入力引数(2、10、1)を指定して関数buzzerPattern()を実行します。 この引数は、ピン番号2でpattern1を10回再生するように関数に要求します。



 from pyfirmata import Arduino from time import sleep port = '/dev/cu.usbmodemfa1331' board = Arduino(port) sleep(5) buzzerPattern(2, 10, 1)
      
      





DCモーター-PWMモーターを使用したモーター速度制御



DC [3]は、ロボットアプリケーションで広く使用されています。 これらは、アプリケーションに応じて、幅広い電圧特性で利用できます。



この例では、Arduinoボード自体を使用して電力を供給したいため、5 V DCモーターを使用します。 Arduinoデジタル出力には、HIGH(+ 5V)またはLOW(0V)の2つの状態しか設定できないため、OUTPUTモードのみを使用してモーター速度を制御することはできません。



ソリューションとして、PWMをサポートできるデジタルピンを使用してPWMモードを実装します。 pyFirmataを使用する場合、PWMモードで構成されたピンは、0〜1.0の浮動小数点入力値を受け入れます。これはそれぞれ0および5 Vを表します。



接続



大きなランダム電流損失によってArduinoボードを損傷しないように、トランジスタをスイッチとして使用します。このトランジスタは、DCモーターの大電流を制御するために少量の電流のみを使用します。



次の図に示すように、回路接続を完了するには、NPNトランジスタ(TIP120、N2222など)、1つのダイオード(1N4001など)、およびDCモーターを備えた220オームの抵抗器が必要です。



トランジスタのベースをデジタルピン3に接続します。これはPWMモードもサポートします。 図に示すように、残りのコンポーネントを接続します。







Pythonコード



ユーザー定義関数dcMotorControl()は、次のコードフラグメントで説明するように、エンジンの速度と持続時間を入力パラメーターとして使用します。



 def dcMotorControl(r, deltaT): pwmPin.write(r/100.00) sleep(deltaT) pwmPin.write(0)
      
      





同じコードを使用して必要なライブラリをインポートし、Arduinoボードを初期化します。



初期化後、get_pin( 'd:3:p')メソッドの使用からわかるように、デジタル出力モード3をPWMとして割り当てます。 このコードは、前のセクションで学習した間接ピンモード割り当てモードを反映しています。



 # Set mode of pin 3 as PWM pwmPin = board.get_pin('d:3:p')
      
      





ユーザーから手動データを収集するプロセスでは、try / except演算子(終了時にボードを解放するため)とwhileステートメント(ユーザーから連続データを受信するため)の組み合わせを実行します。



コードテンプレートは、Pythonインタラクティブターミナルからカスタム値(エンジン速度とエンジン開始時間)を取得するinput()メソッドを導入します。 これらの値がユーザーから受信されるとすぐに、プログラムはdcMotorControl()関数を呼び出してモーターアクションを実行します:try:



試してください:



  while True: r = input("Enter value to set motor speed: ") if (r > 100) or (r <= 0): print "Enter appropriate value." board.exit() break t = input("How long? (seconds)") dcMotorControl(r, t) except KeyboardInterrupt: board.exit() os._exit
      
      





LED-PWMを使用してLEDの輝度を制御する



前のテンプレートでは、PWMを使用してDCモーターの速度を制御しました。 同様に、LEDの輝度を制御できます。 ユーザーに明るさを入力するよう求める代わりに、このテンプレートではPythonモジュールをランダムに使用します。



このモジュールを使用して、1〜100の乱数を生成します。これは、後でこの値を出力に書き込み、LEDの輝度をランダムに変更するために使用されます。



このrandint()関数は、ランダムモジュールによって提供される非常に便利な関数であり、ランダム信号をすばやく送信してプロトタイプをテストするときに広く使用されます。



接続



LEDをArduinoピンに接続するには、プルアップ抵抗が必要です。 220オームの抵抗を持つ1つの抵抗を介して、LED(長いナイフ)のアノードをデジタル出力11に接続し、カソード(短い脚)をグランドに接続する必要があります。







Arduino Unoのデジタルピン11は、デジタルピン3、5、6、9、および10とともにPWMも実行できることに注意することが重要です。



Pythonコード



ledBrightnessPWM.pyというPythonコードを使用します。0〜1.0の浮動小数点値は、PWM出力に渡す前にランダムに選択されます。

コードの最初の数行で必要なライブラリをインポートし、ボードを初期化します。



 from pyfirmata import Arduino, INPUT, PWM from time import sleep import random port = '/dev/cu.usbmodemfa1311' board = Arduino(port) sleep(5)
      
      





この例では、直接ピン割り当て方法を使用します。 次のコードスニペットでは、デジタルピン11がPWMモードに割り当てられています。



 pin = 11 Board.digital [pin] .mode = PW
      
      





サイクルの終了後、最後にLEDをオフにした後、Arduinoボードを安全に切断する必要があります。



 board.digital[pin] .write(0) board.exit()
      
      





結論



この出版物では、センサーのプログラミング、センサーへの制御デバイスへの最も一般的なアプローチを簡単な例を使用して説明します。 Arduino自身のプロジェクトで簡単に使用できるPythonコードが提示されています。 説明のために、さまざまなセンサーとコードテンプレートを使用しました。



参照資料



  1. ブザー(トレマモジュール)。
  2. 本:Arduino Basic Connections。
  3. Arduinoとエンジン。



All Articles