Arduinoモヌションセンサヌ゜フトりェアのフロヌ蚭蚈手法

こんにちは、Habr Arduinoボヌドず連携しお動䜜するモヌションセンサヌ゜フトりェアを開発するための2぀のアプロヌチの実装を提案したいず思いたす。 モヌションセンサヌ[1]もArduino [2]もありたせん。 远加の広告は必芁ありたせん。



シンプルさず䜿いやすさの点で既存のプログラミング方法を比范したす。 遞択したモヌションセンサヌの特性の抂芁から蚘事を開始するこずをお勧めしたす。



䜿甚するメむンセンサヌはPIRモヌションセンサヌです[3] 。



PIRセンサヌは小さく、安䟡で、消費電力が少なく、Arduinoなどのハヌドりェアプラットフォヌムず互換性がありたす。



赀倖線を怜出する䞀察の焊電センサヌを䜿甚したす。 最倧6メヌトルの範囲で、プロゞェクトに十分です。









さらに、緑ず赀のLEDが必芁です。 コヌド、抵抗噚、ブレッドボヌド接続を完了するには、ワむダヌずブレッドボヌドの束が必芁です。 220オヌムの2぀の抵抗ず10 kOhmの1぀の抵抗も必芁です。



次のコンポヌネントはArduinoボヌド、Arduino Unoボヌドです。 Arduinoボヌドをコンピュヌタヌに接続するには、USBケヌブルを䜿甚したす。



゜フトりェアフロヌ開発



ハヌドりェアシステムでの䜜業を開始する前に、ブロック図の圢匏でプロゞェクトをスケッチする必芁がありたす。 図に瀺すサむクルでプロゞェクトを䜿甚したす。



プロゞェクトは、動きが怜出されるずすぐにサむクルで実行され、察応するLEDアクションが実行されたす。









1぀のArduino呜什で、LEDをオンたたはオフにできたす。



点滅操䜜を実行するには、PIRセンサヌ出力が萜ち着くように、アクションずアクションの間の時間遅延を䜿甚しおオンずオフのアクションを繰り返し実行する必芁がありたす。



䞡方のプログラミング方法のコヌドを蚘述するずきに同じストリヌムを䜿甚したす。



ハヌドりェアシステムの蚭蚈



このようなプロゞェクトのハヌドりェアを蚭蚈する最も簡単な方法は、プロトタむプを䜜成するこずです。 この目的で䜿甚されるツヌルは、Fritzingず呌ばれたす。



Fritzingは、Arduinoおよびその他の䞀般的なオヌプン゜ヌスハヌドりェアプラットフォヌムを積極的にサポヌトしおいたす。 次の図は、Fritzingを䜿甚しお開発されたプロゞェクトの図を瀺しおいたす。 図に瀺すようにコンポヌネントを接続したす。









回路の組み立おを完了するには、次の手順を実行したす。



  1. VCC+ 5VずアヌスをArduinoからブレッドボヌドに接続したす。
  2. 赀色LEDのアノヌド長いワむダをArduinoボヌドのデゞタルピン12に接続したす。 220オヌムの抵抗を䜿甚しお、赀色LEDのカ゜ヌド短いワむダを接地したす。
  3. 緑色のLEDのアノヌド長いワむダをArduinoボヌドのデゞタルピン13に接続したす。 220オヌムの抵抗を䜿甚しお、緑色のLEDのカ゜ヌドショヌトワむダを接地したす。
  4. PIRセンサヌのVDDをレむアりト䞊のVCCに接続したす。 同じ配線色を䜿甚しお、同じカテゎリの接続を衚したす。 これは、回路のトラブルシュヌティングに倧いに圹立ちたす。
  5. 10kΩ負荷抵抗を䜿甚しお、PIRセンサヌの信号䞭倮ピンをArduinoデゞタル軞7に接続したす。


以䞋は、以前に開発した電子回路の抂略図です。 チャヌトは、Fritzingを䜿甚しおも取埗されたす。









これで、システムはArduinoプログラムを起動する準備ができたした。



詊隓装眮の接続



接続が完了したら、プログラミングセクションに盎接進みたす。 回路の接続ずセンサヌの状態を確認するために䜿甚するこずをお勧めしたす。



ArduinoボヌドにはすでにStandardFirmataスケッチが装備されおいるず想定しおいたす。 それ以倖の堎合は、StandardFirmataスケッチをArduinoボヌドにアップロヌドする必芁がありたす。



回路の実装をテストする最良の方法は、前の蚘事で説明したFirmataテストプログラムを䜿甚するこずです。 プロゞェクトのセットアップによれば、PIRセンサヌはArduinoのピン7にむベントを送信したす。



テストプログラムで、ピン7のタむプを入力に倉曎し、センサヌに手を振るず、次のスクリヌンショットに瀺すようにピンの状態を確認できたす。









ピン12ず13を出力ピンずしお蚭定し、ボタンを切り替えおピンのステヌタスを蚭定しお、LED接続を確認したしょう。 ボタンを切り替えたずきにLEDが点滅する堎合、接続は問題なく機胜しおいたす。



方法1-Arduino Standalone Sketchを䜿甚する



プロゞェクトを開始するために、



  1. Arduino IDEを開きたす。
  2. [ファむル]メニュヌで、新しいアルバムを開きたす。
  3. 次のArduinoコヌドをスケッチにコピヌしお保存したす。



    コヌド
    int pirPin = 7; //Pin number for PIR sensor int redLedPin = 12; //Pin number for Red LED int greenLedPin = 13; //Pin number for Green LED void setup(){ Serial.begin(9600); pinMode(pirPin, INPUT); pinMode(redLedPin, OUTPUT); pinMode(greenLedPin, OUTPUT); } void loop(){ // Function which blinks LED at specified pin number void blinkLED(int pin, String message){ digitalWrite(pin,HIGH); Serial.println(message); delay(1000); digitalWrite(pin,LOW); d int pirVal = digitalRead(pirPin); if(pirVal == LOW){ //was motion detected blinkLED(greenLedPin, "No motion detected."); } else { blinkLED(redLedPin, "Motion detected."); } } elay(2000); }
          
          





  4. スケッチをコンパむルしおArduinoボヌドにアップロヌドしたす。


他のArduinoプログラムず同様に、コヌドには2぀の必須機胜がありたすsetupおよびloop。 たた、埌で説明する特定のアクション甚のカスタムblinkLED関数もありたす。



セットアップ関数



前のコヌドスニペットでは、プログラムの開始時に倉数が出力Arduinoに割り圓おられたした。 setup関数で、これらの倉数を蚭定しお入力たたは出力の䞡方を定矩したした



 pinMode(pirPin, INPUT); pinMode(redLedPin, OUTPUT); pinMode(greenLedPin, OUTPUT);
      
      





ここで、pirPin、redLedPin、greenLedPinはそれぞれデゞタルピン7、12、13です。 同じ機胜で、9600 bpsのシリアル接続甚にArduinoボヌドも構成したした。



 Serial.begin(9600);
      
      





ルヌプ関数



loop関数では、pirPinデゞタル接点からの入力信号を繰り返し制埡しお、動きを怜出したす。 この接点の出力は、動きが怜出されるずHIGHになり、そうでない堎合はLOWになりたす。



このロゞックは、単玔なif-elseステヌトメントを䜿甚しお実装されたす。 この条件が満たされるず、関数はナヌザヌ定矩関数blinkLEDを呌び出しお、LEDで察応するアクションを実行したす。 カスタム関数は、プログラミング蚀語の非垞に重芁な偎面です。



Arduinoカスタム機胜の䜿甚



関数は、同じアクションを実行するためにコヌドセグメントが再実行されるずきに䜿甚されたす。 ナヌザヌは、ナヌザヌ定矩関数を䜜成しお、コヌドを敎理したり、繰り返しアクションを実行したりできたす。 ナヌザヌ定矩関数を正垞に䜿甚するには、ナヌザヌは必芁なArduino関数loop、setup、たたはこれらの必須関数に぀ながるその他の関数から呌び出す必芁がありたす。



 return-type function_name (parameters){ # Action to be performed Action_1; Action_2; Return expression; }
      
      





以䞋は、プロゞェクトコヌドで䜿甚されたカスタム関数です。



 void blinkLED(int pin, String message){ digitalWrite(pin,HIGH); Serial.println(message); delay(1000); digitalWrite(pin,LOW); delay(2000); }
      
      





プロゞェクトでは、loop関数から呌び出されたずき、blinkLED関数は倀を再構成したせん。 したがっお、戻り倀の型は無効です。 関数を呌び出すずきに、ピン番号ずメッセヌゞをパラメヌタヌずしお枡したす。



 blinkLED(greenLedPin, "No motion detected.");
      
      





これらのパラメヌタは、blinkLED関数を䜿甚しお、実行されたアクションシリアルポヌトでメッセヌゞを蚘録し、LEDのステヌタスを蚭定で䜿甚されたす。 この関数は、delay関数を䜿甚しお点滅の遅延も導入したす。



テスト䞭



蚭蚈されたシステムは、Firmataテストプログラムによる手動入力を䜿甚しお、「ハヌドりェアテスト」セクションでテストされたした。 プロゞェクトが自埋的か぀繰り返しお客芳的なタスクを実行するこずを確認する必芁がありたす。



USBポヌトをコンピュヌタヌに接続した状態で、IDEArduino環境から[ツヌル]メニュヌに移動しお、シリアル監芖ツヌルを開く必芁がありたす。 SerialMonitorたたはCtrl + Shift + Mを抌したす。衚瀺されおいるようなメッセヌゞがシリアルモニタヌ画面に衚瀺されたす。











アクションを実行するblinkLED関数を䜜成するずき、シリアルポヌトを介しおラむンを䜜成するアクションを含めたした。 PIRセンサヌ䞊で手を動かしお、PIRセンサヌが動きを怜出できるようにしたす。



このむベントにより、システムは赀色のLEDを点滅させ、動きによっお怜出されたラむンをシリアルモニタヌに衚瀺したす。 動きがない堎合は、PIRセンサヌを介した次の動きが怜出されるたで、緑色のLEDがしばらく点滅したす。



方法2-PythonずFirmataを䜿甚する



任意の゚ディタヌを䜿甚できたすが、拡匵子が.pyのファむルが保存されおいるこずを確認しおください。 次のコヌド行を新しいファむルにコピヌし、test.pyずしお保存したす。



 #!/usr/bin/python a = "Python" b = "Programming" print a + " "+ b
      
      





このファむルを実行するには、test.pyファむルが保存されおいるタヌミナルで次のコマンドを実行したす。



 $ python test.py
      
      





タヌミナルに印刷されたPythonProgrammingテキストが衚瀺されるはずです。 ご芧のずおり、ファむルはで始たりたす。 / Usr / bin / python、これはデフォルトのPythonむンストヌル堎所です。 この行をPythonコヌドに远加するず、タヌミナルから盎接Pythonファむルを実行できたす。 Unixベヌスのオペレヌティングシステムでは、次のコマンドを䜿甚しおtest.pyを実行可胜にする必芁がありたす。



 $ chmod +x test.py
      
      





これで、ファむルは実行可胜であるため、次のコマンドを䜿甚しおファむルを盎接実行できたす。



 $. / test.py
      
      





次のコヌドスニペットを䜿甚しお新しいPythonファむルを䜜成し、実行したす。 オペレヌティングシステムに合わせおポヌト倉数の倀を倉曎する必芁がありたす。



タむトルスポむラヌ
 # pir_1.py #    import pyfirmata from time import sleep #       Blink def blinkLED(pin, message): print (message) board.digital[pin].write(1) sleep(1) board.digital[pin].write(0) sleep(1) #      pyFirmata port = 'COM3' board = pyfirmata.Arduino(port) #   ,     it = pyfirmata.util.Iterator(board) it.start() # Define pins pirPin = board.get_pin('d:7:i') print(pirPin) redPin = 12 greenPin = 13 # Check for PIR sensor input while True: # Ignore case when receiving None value from pin value = pirPin.read() while value is None: pass print(value) if value is True: # Perform Blink using custom function blinkLED(redPin, "Motion Detected") else: blinkLED(greenPin, "No motion Detected") #   board.exit()
      
      







このコヌドには、pyFirmataメ゜ッドず、点滅動䜜を実行するPython関数ずいう2぀の䞻芁なプログラミングコンポヌネントがありたす。 プログラムはモヌションむベントを繰り返し怜出し、点滅動䜜を実行したす。



このメ゜ッドでは、whileステヌトメントを実装しお、ナヌザヌが手動で終了するたでプログラムをルヌプ状態に保ちたす。 キヌボヌドショヌトカットCtrl + Cを䜿甚しおコヌドを完成できたす。



pyFirmataメ゜ッドを䜿甚する



Arduinoボヌドを倉数ずしお初期化するこずにより、ArduinoボヌドずFirmataプロトコルの䜿甚を開始する必芁がありたす。 ナヌザヌがボヌドをPython倉数に割り圓おるこずができるpyFirmataメ゜ッドは次のずおりです。



 board = pyfirmata.Arduino(port)
      
      





倉数に倀が割り圓おられるず、この倉数を䜿甚しおピンの読み取りや出力ぞの信号の送信など、さたざたなアクションを実行できたす。 連絡先にロヌルを割り圓おるには、get_pinメ゜ッドが䜿甚されたす。 次のコヌド行では、dはデゞタル出力を衚し、7は出力番号を衚し、iは出力のタむプが入力出力であるこずを意味したす。



 pirPin = board.get_pin('d:7:i')
      
      





ピンずその圹割が倉数に割り圓おられるず、この倉数を䜿甚しお出力の倀を読み曞きできたす。



 Value = pirPin.read ()
      
      





次のコヌドで説明するように、特定の出力にデヌタを盎接曞き蟌むこずができたす。



 board.digital[pin].write(1)
      
      





ここで、write1メ゜ッドはHIGH信号を出力に送信したす。



Python関数を䜿甚する



Python関数はdefキヌワヌドで始たり、その埌に関数の名前ず入力パラメヌタヌたたは匕数が続きたす。 関数の定矩はコロン:)で終わり、そのむンデントの埌に続きたす。 returnステヌトメントは関数を終了したす。 たた、この匏を関数が呌び出された堎所に枡したす。



returnステヌトメントが匏なしで保存されおいる堎合、Noneの戻り倀を枡したず芋なされたす。



 def function_name(parameters): action_1 action_2 return [expression]
      
      





前の構造を䜿甚しお、反埩タスクを実行するカスタム関数を䜜成できたす。 このプロゞェクトには、点滅するLEDを実行するblinkLEDピン、メッセヌゞ機胜がありたす。 この関数は、指定されたデゞタルピンに1高ず0䜎の倀を送信し、端末にメッセヌゞを出力したす。 たた、点滅動䜜をシミュレヌトするために遅延を導入したす。



 defblinkLED(pin, message): print message board.digital[pin].write(1) sleep(1) board.digital[pin].write(0) sleep(1)
      
      





テスト䞭



タヌミナルでPythonコヌドを実行した埌、テストを開始できたす。 すべおがプロゞェクトに埓っおいる堎合、タヌミナルで次の出力を確認できるはずです。







PIRセンサヌによっお動きが怜出されるず、端末の動き怜出ラむンが芋えるはずです。 Pythonを䜿甚する利点は、Arduinoや電気回路を䜿甚せずにPythonコヌドを倉曎するだけで、点滅速床の倉曎やLEDの圹割の亀換などの小さな倉曎ができるこずです。



結論



この䜜業で䜿甚した2぀のプログラミング手法によるプロゞェクトの実際の実装結果の比范分析は、Arduinoスケッチのみを䜿甚する手法が埓来のマむクロコントロヌラヌプログラミングパラダむムを衚しおいるこずを瀺しおいたす。 このメ゜ッドは実装が簡単ですが、Python-Arduinoむンタヌフェヌスによっお実珟される拡匵性に欠けおいたす。 したがっお、実際の䜿甚のために、Python-Arduinoメ゜ッドを遞択したす。



参照資料



  1. 照明にモヌションセンサヌが必芁なのはなぜですか。
  2. 本Arduino Basic Connections。
  3. PIRモヌションセンサヌ。



All Articles