Pythonを使用したArduino:開始方法

Pythonを使用したArduino:開始方法

Microcontrollersは長い間存在しており、複雑な機械から一般的な家電製品まで、あらゆるものに使用されています。 ただし、従来は、技術者や電気技術者などの正式な技術トレーニングを受けた人たちと作業することしかできませんでした。 Arduinoの出現により、すべての開発者が電子アプリケーションの設計にアクセスしやすくなりました。 このチュートリアルでは、PythonでArduinoを使用して独自の電子プロジェクトを開発する方法を学びます。

PythonでArduinoの基本をカバーし、次の方法を学びます。

  • 電子回路をセットアップする

  • ArduinoでFirmataプロトコルをセットアップする

  • PythonでArduinoの基本的なアプリケーションを作成する

  • アナログおよびデジタルの入出力を制御

  • Arduinoセンサーとスイッチを高レベルアプリと統合する

  • PCで通知をトリガーし、Arduinoを使用してメールを送信します

Free Bonus:5 Thoughts On Python Masteryは、Python開発者向けの無料コースで、Pythonスキルを次のレベルに引き上げるために必要なロードマップと考え方を示しています。

Arduinoプラットフォーム

Arduinoは、ハードウェアとソフトウェアで構成されるオープンソースのプラットフォームであり、インタラクティブエレクトロニクスプロジェクトの迅速な開発を可能にします。 emergence of Arduinoは、さまざまな業界の専門家の注目を集めました。contributingは、Maker Movementの始まりになりました。

Maker Movementの人気の高まりとInternet of Thingsの概念により、Arduinoは電子プロトタイピングとMVPの開発のための主要なプラットフォームの1つになりました。

Arduinoは、C ++に似た独自のプログラミング言語を使用します。 ただし、ArduinoをPythonまたは別の高レベルプログラミング言語で使用することは可能です。 実際、Arduinoのようなプラットフォームは、特にセンサーやその他の物理デバイスとの統合を必要とするアプリケーションの場合、Pythonとうまく機能します。

全体として、ArduinoとPythonは、開発者が電子機器設計に取り組むことを奨励する効果的な学習環境を促進できます。 the basics of Pythonを既に知っている場合は、Pythonを使用してArduinoを制御することでArduinoの使用を開始できます。

Arduinoプラットフォームには、hardwareとソフトウェア製品の両方が含まれています。 このチュートリアルでは、ArduinoハードウェアとPythonソフトウェアを使用して、基本的な回路だけでなく、デジタルおよびアナログの入出力について学習します。

Arduinoハードウェア

例を実行するには、electronic componentsを接続して回路を組み立てる必要があります。 これらのアイテムは通常、電子部品店または優れたArduinoスターターキットで見つけることができます。 あなたは必要になるでしょう:

  1. Arduino Unoまたは他の互換性のあるボード

  2. 任意の色の標準LED

  3. プッシュボタン

  4. 10 KOhmポテンショメーター

  5. 470オームの抵抗器

  6. 10 KOhmの抵抗器

  7. ブレッドボード

  8. さまざまな色とサイズのジャンパー線

これらのコンポーネントのいくつかを詳しく見てみましょう。

コンポーネント1は、Arduino Unoまたはその他の互換性のあるボードです。 Arduinoは、さまざまな目的のために多くのboardsとモジュールを含むプロジェクトであり、ArduinoUnoはこれらの中で最も基本的なものです。 また、Arduinoファミリ全体の中で最も使用され、最も文書化されているボードです。したがって、エレクトロニクスを始めたばかりの開発者にとって最適な選択肢です。

Note: Arduinoはオープンハードウェアプラットフォームであるため、ここに表示されている例を実行するために使用できる互換性のあるボードを販売しているベンダーは他にもたくさんあります。 このチュートリアルでは、Arduino Unoの使用方法を学習します。

コンポーネント5と6はresistors.です。ほとんどの抵抗器は、color codeに従って色付きのストライプで識別されます。 一般に、最初の3色は抵抗のvalueを表し、4番目の色は抵抗のtoleranceを表します。 470オームの抵抗の場合、最初の3色は黄色、紫、および茶色です。 10 KOhm抵抗の場合、最初の3色は茶色、黒、オレンジです。

コンポーネント7はbreadboardであり、他のすべてのコンポーネントを接続して回路を組み立てるために使用します。 ブレッドボードは必須ではありませんが、Arduinoでの作業を開始する場合は、ブレッドボードを入手することをお勧めします。

Arduinoソフトウェア

これらのハードウェアコンポーネントに加えて、いくつかのソフトウェアをインストールする必要があります。 プラットフォームには、他のオンラインツールの中でも特にArduinoデバイスをプログラミングするための統合開発環境であるArduino IDEが含まれています。

Arduinoは、ボードをほとんど難なくプログラムできるように設計されています。 一般に、次の手順に従います。

  1. ボードをPCに接続します

  2. Arduino IDEをインストールして開きます

  3. ボード設定を構成する

  4. コードを書く

  5. IDEのボタンを押して、プログラムをボードにアップロードします

コンピューターにArduinoIDEをインストールするには、オペレーティングシステムに適したバージョンをArduino websiteからダウンロードします。 インストール手順については、ドキュメントを確認してください。

  • If you’re using Windowsを選択し、Windowsインストーラーを使用して、WindowsでArduinoを使用するために必要なドライバーをダウンロードします。 詳細については、Arduino documentationを確認してください。

  • If you’re using Linuxの場合、シリアルポートを使用してArduinoをプログラムするために、ユーザーをいくつかのグループに追加する必要がある場合があります。 このプロセスはArduino install guide for Linuxで説明されています。

  • If you’re using macOSの場合、Arduino install guide for OS Xに従ってArduinoIDEをインストールできます。

Note:このチュートリアルではArduino IDEを使用しますが、Arduinoにはブラウザを使用してArduinoボードをプログラムできるweb editorも用意されています。

Arduino IDEをインストールし、必要なすべてのコンポーネントを収集したので、Arduinoを使い始める準備ができました! 次に、「Hello、World!」をアップロードしますボードにプログラムします。

"こんにちは世界!" Arduinoを使用

Arduino IDEには、Arduinoの基本を学ぶために使用できるsketchesの例がいくつか付属しています。 sketchは、ボードにアップロードできるプログラムに使用する用語です。 Arduino Unoにはディスプレイが接続されていないため、プログラムの物理的な出力を確認する方法が必要です。 Blinkのスケッチ例を使用して、Arduinoボードの組み込みLEDを点滅させます。

開始するには、USBケーブルを使用してArduinoボードをPCに接続し、Arduino IDEを起動します。 Blinkサンプルスケッチを開くには、Fileメニューにアクセスし、Examples01.Basics、最後にBlinkを選択します。

Blink example sketch on Arduino IDE

点滅のサンプルコードが新しいIDEウィンドウにロードされます。 ただし、スケッチをボードにアップロードする前に、ボードとその接続ポートを選択してIDEを構成する必要があります。

ボードを構成するには、Toolsメニューにアクセスしてから、Boardにアクセスします。 Arduino Unoの場合、Arduino/Genuino Unoを選択する必要があります。

Selecting board on Arduino IDE

ボードを選択したら、適切なポートを設定する必要があります。 Toolsメニューに再度アクセスし、今度はPortを選択します。

Selecting port on Arduino IDE

ポートの名前は、オペレーティングシステムによって異なる場合があります。 Windowsでは、ポートの名前はCOM4COM5などになります。 macOSまたはLinuxでは、/dev/ttyACM0または/dev/ttyUSB0のようなものが表示される場合があります。 ポートの設定に問題がある場合は、Arduino Troubleshooting Pageを確認してください。

ボードとポートを構成したら、Arduinoにスケッチをアップロードする準備が整いました。 これを行うには、IDEツールバーのUploadボタンを押すだけです。

Buttons for verify and upload on Arduino IDE

Uploadを押すと、IDEはスケッチをコンパイルし、ボードにアップロードします。 エラーをチェックしたい場合は、Uploadの前にVerifyを押すと、スケッチのみがコンパイルされます。

USBケーブルは、プログラムのアップロードとArduinoボードの電源供給の両方にシリアル接続を提供します。 アップロード中、ボード上のLEDが点滅します。 数秒後、アップロードされたプログラムが実行され、1秒ごとにLEDライトが点滅します:

Arduino buit-in LED blinking

アップロードが完了すると、USBケーブルがArduinoボードに電力を供給し続けます。 プログラムは、Arduinoマイクロコントローラーのフラッシュメモリに保存されます。 バッテリーまたはその他の外部power supplyを使用して、USBケーブルなしでアプリケーションを実行することもできます。

外部コンポーネントの接続

前のセクションでは、Arduinoボードに既に存在するLEDを使用しました。 ただし、ほとんどの実用的なプロジェクトでは、外部コンポーネントをボードに接続する必要があります。 これらの接続を確立するために、Arduinoにはさまざまなタイプのpinsがいくつかあります。

Arduino Uno Ports

これらの接続は一般にpinsと呼ばれますが、正確には物理的なピンではないことがわかります。 むしろ、ピンは、ジャンパー線を接続できるソケットの穴です。 上の図では、ピンのさまざまなグループを見ることができます。

  • Orange rectangle:これらは、入力または出力として使用できる13のdigital pinsです。 これらは、2つの異なるレベルのデジタル信号でのみ動作することを意図しています。

    1. Level 0:は電圧0Vで表されます

    2. Level 1:は電圧5Vで表されます

  • Green rectangle:これらは、アナログ入力として使用できる6つのanalog pinsです。 それらは、0Vから5Vの間の任意の電圧で動作することを意図しています。

  • Blue rectangle:これらは5power pinsです。 主に外部コンポーネントに電力を供給するために使用されます。

外部コンポーネントの使用を開始するには、外部LEDを接続してBlinkサンプルスケッチを実行します。 内蔵LEDはdigital pin #13に接続されています。 そのため、外部LEDをそのピンに接続して、点滅するかどうかを確認しましょう。 (標準のLEDは、earlierにリストされているコンポーネントの1つです。)

Arduinoボードに何かを接続する前に、コンピューターから切断することをお勧めします。 USBケーブルを外すと、LEDをボードに接続できます。

Circuit for blink sketch

この図は、デジタルピンが現在あなたに向いているボードを示していることに注意してください。

ブレッドボードを使用する

電子回路プロジェクトでは通常、いくつかのアイデアをテストし、新しいコンポーネントを追加して調整を行います。 ただし、特に回路が大きい場合は、コンポーネントを直接接続するのは難しい場合があります。

プロトタイピングを容易にするために、breadboardを使用してコンポーネントを接続できます。 これは、ジャンパー線を使用してコンポーネントを簡単に接続できるように、特定の方法で接続されたいくつかの穴があるデバイスです。

Breadboard

色付きの線を見ると、どの穴が相互接続されているかがわかります。 ブレッドボードの側面にある穴を使用して、回路に電力を供給します。

  • red lineの1つの穴を電源に接続します。

  • blue lineの1つの穴を地面に接続します。

次に、赤線と青線の他の穴を使用するだけで、コンポーネントを電源またはグランドに簡単に接続できます。 ブレッドボードの中央の穴は、色で示されているようにつながっています。 これらを使用して、回路のコンポーネント間を接続します。 これらの2つの内部セクションは小さなくぼみによって分離されており、その上に集積回路(IC)を接続できます。

ブレッドボードを使用して、Blinkのサンプルスケッチで使用する回路を組み立てることができます。

Circuit for blink sketch on breadboard

この回路では、LEDは極性に応じて接続する必要があります。接続しないと機能しません。 LEDのプラス端子はanodeと呼ばれ、通常は長い方の端子です。 負の端子はcathodeと呼ばれ、短いです。 復元されたコンポーネントを使用している場合は、LED自体の平らな面を探して端子を特定することもできます。 これは、マイナス端子の位置を示します。

LEDをArduinoピンに接続する場合、その電流を制限し、LEDの早すぎる焼損を防ぐために、常に抵抗器が必要です。 ここでは、470オームの抵抗を使用してこれを行います。 接続をたどって、回路が同じであることを確認できます。

  • 抵抗器は、Arduinoボードのデジタルピン13に接続されています。

  • LEDのアノードは、抵抗のもう一方の端子に接続されています。

  • LEDカソードは、青い線の穴を介してグランド(GND)に接続されています。

詳細な説明については、How to Use a Breadboardを確認してください。

接続が完了したら、ArduinoをPCに接続し直してBlinkスケッチを再実行します。

Arduino built-in and external LEDs blinking

両方のLEDはデジタルピン13に接続されているため、スケッチの実行中は点滅します。

"こんにちは世界!" ArduinoとPythonを使用

前のセクションで、BlinkスケッチをArduinoボードにアップロードしました。 ArduinoスケッチはC ++と同様の言語で記述されており、Uploadを押すと、コンパイルされてマイクロコントローラーのフラッシュメモリに記録されます。 another languageを使用してArduinoマイクロコントローラーを直接プログラムすることはできますが、それは簡単な作業ではありません。

ただし、ArduinoをPythonまたは他の言語で使用するには、いくつかのアプローチがあります。 1つのアイデアは、PCでメインプログラムを実行し、シリアル接続を使用してUSBケーブルを介してArduinoと通信することです。 スケッチは、入力を読み取り、PCに情報を送信し、PCから更新を取得してArduino出力を更新する役割を果たします。

PCからArduinoを制御するには、PCとArduinoの間の通信用のプロトコルを設計する必要があります。 たとえば、次のようなメッセージを含むプロトコルを検討できます。

  • VALUE OF PIN 13 IS HIGH:は、デジタル入力ピンのステータスをPCに通知するために使用されます

  • SET PIN 11 LOW:は、出力ピンの状態を設定するようにArduinoに指示するために使用されます

プロトコルを定義したら、Arduinoスケッチを作成してメッセージをPCに送信し、プロトコルに従ってピンの状態を更新できます。 PCでは、設計したプロトコルに基づいて、シリアル接続を介してArduinoを制御するプログラムを作成できます。 このために、PythonやPySerialライブラリなど、任意の言語とライブラリを使用できます。

幸いなことに、これをすべて行う標準プロトコルがあります! Firmataはその1つです。 このプロトコルは、デジタルおよびアナログ入力を読み取り、デジタルおよびアナログ出力に情報を送信できるようにするシリアル通信形式を確立します。

Arduino IDEには、Firmataプロトコルを使用してPythonでArduinoを駆動する既製のスケッチが含まれています。 PC側では、Pythonを含むいくつかの言語でのプロトコルの実装があります。 Firmataの使用を開始するには、Firmataを使用して「Hello、World!」を実装しましょうプログラム。

Firmataスケッチのアップロード

Pythonプログラムを記述してArduinoを駆動する前に、Firmataスケッチをアップロードして、そのプロトコルを使用してボードを制御できるようにする必要があります。 スケッチは、Arduino IDEの組み込みサンプルで利用できます。 これを開くには、Fileメニュー、ExamplesFirmata、最後にStandardFirmataの順にアクセスします。

Firmata example sketch on Arduino IDE

スケッチが新しいIDEウィンドウにロードされます。 Arduinoにアップロードするには、以前と同じ手順を実行できます。

  1. USBケーブルをPCに差し込みます。

  2. IDEの適切なボードとポートを選択します。

  3. Uploadを押します。

アップロードが完了すると、Arduinoでのアクティビティに気付かないでしょう。 それを制御するには、シリアル接続を介してボードと通信できるプログラムが必要です。 PythonでFirmataプロトコルを使用するには、pipでインストールできるpyFirmataパッケージが必要です。

$ pip install pyfirmata

インストールが完了したら、PythonとFirmataを使用して同等のBlinkアプリケーションを実行できます。

 1 import pyfirmata
 2 import time
 3
 4 board = pyfirmata.Arduino('/dev/ttyACM0')
 5
 6 while True:
 7     board.digital[13].write(1)
 8     time.sleep(1)
 9     board.digital[13].write(0)
10     time.sleep(1)

このプログラムがworksする方法は次のとおりです。 pyfirmataをインポートし、それを使用してArduinoボードとのシリアル接続を確立します。これは4行目のboardオブジェクトで表されます。 また、pyfirmata.Arduino()に引数を渡すことにより、この行でポートを構成します。 Arduino IDEを使用してポートを見つけることができます。

board.digitalは、その要素がArduinoのデジタルピンを表すリストです。 これらの要素には、ピンの状態を読み書きするメソッドread()およびwrite()があります。 ほとんどの組み込みデバイスプログラムと同様に、このプログラムは主に無限ループで構成されています。

  • In line 7,デジタルピン13がオンになり、LEDが1秒間オンになります。

  • In line 9,このピンはオフになり、LEDが1秒間オフになります。

PythonでArduinoを制御する方法の基本がわかったので、いくつかのアプリケーションを使用して、入力と出力を操作します。

デジタル入力の読み取り

Digital inputsは、2つの可能な値のみを持つことができます。 回路では、これらの値はそれぞれ異なる電圧で表されます。 次の表は、標準のArduino Unoボードのデジタル入力表現を示しています。

レベル 電圧

0

Low

0V

1

High

5V

LEDを制御するには、push buttonを使用してデジタル入力値をArduinoに送信します。 ボタンは、リリースされたときにボードに0Vを、押されたときにボードに5Vを送信する必要があります。 以下の図は、ボタンをArduinoボードに接続する方法を示しています。

Circuit for digital input

以前と同様に、LEDがデジタルピン13でArduinoに接続されていることに気付くかもしれません。 デジタルピン10はデジタル入力として使用されます。 押しボタンを接続するには、この回路でpull downとして機能する10KOhmの抵抗を使用する必要があります。 pull down抵抗は、ボタンが離されたときにデジタル入力が0Vになることを保証します。

ボタンを放すと、ボタン上の2本のワイヤ間の接続が開きます。 抵抗には電流が流れないため、ピン10は単にグランド(GND)に接続します。 デジタル入力は0Vを取得します。これは、0(またはlow)状態を表します。 ボタンを押すと、抵抗とデジタル入力の両方に5Vが印加されます。 抵抗に電流が流れ、デジタル入力は5Vになります。これは、1(またはhigh)状態を表します。

ブレッドボードを使用して、上記の回路を組み立てることもできます。

Circuit for digital input on breadboard

回路を組み立てたら、PC上でプログラムを実行して、Firmataを使用して制御する必要があります。 このプログラムは、プッシュボタンの状態に基づいてLEDをオンにします。

 1 import pyfirmata
 2 import time
 3
 4 board = pyfirmata.Arduino('/dev/ttyACM0')
 5
 6 it = pyfirmata.util.Iterator(board)
 7 it.start()
 8
 9 board.digital[10].mode = pyfirmata.INPUT
10
11 while True:
12     sw = board.digital[10].read()
13     if sw is True:
14         board.digital[13].write(1)
15     else:
16         board.digital[13].write(0)
17     time.sleep(0.1)

このプログラムを見ていきましょう。

  • Lines 1 and 2pyfirmatatimeをインポートします。

  • Line 4pyfirmata.Arduino()を使用してArduinoボードとの接続を設定します。

  • Line 6は、回路の入力のステータスを読み取るために使用されるイテレータを割り当てます。

  • Line 7はイテレータを開始し、メインコードと並行してループを実行し続けます。 ループはboard.iterate()を実行して、Arduinoボードから取得した入力値を更新します。

  • Line 9は、ピン10をpyfirmata.INPUTのデジタル入力として設定します。 デフォルトの構成ではデジタルピンを出力として使用するため、これが必要です。

  • Line 11は、無限のwhileループを開始します。 このループは、入力ピンのステータスを読み取り、それをswに格納し、この値を使用して、ピン13の値を変更することによってLEDをオンまたはオフにします。

  • Line 17は、whileループの反復の間に0.1秒待機します。 これは厳密に必要というわけではありませんが、CPUの過負荷を回避するための良い方法です。CPUの過負荷は、ループに待機コマンドがないときに100%の負荷に達します。

pyfirmataは、入力ピンと出力ピンを操作するためのよりコンパクトな構文も提供します。 これは、複数のピンを使用している場合に適したオプションです。 以前のプログラムを書き換えて、よりコンパクトな構文にすることができます。

 1 import pyfirmata
 2 import time
 3
 4 board = pyfirmata.Arduino('/dev/ttyACM0')
 5
 6 it = pyfirmata.util.Iterator(board)
 7 it.start()
 8
 9 digital_input = board.get_pin('d:10:i')
10 led = board.get_pin('d:13:o')
11
12 while True:
13     sw = digital_input.read()
14     if sw is True:
15         led.write(1)
16     else:
17         led.write(0)
18     time.sleep(0.1)

このバージョンでは、board.get_pin()を使用して2つのオブジェクトを作成します。 digital_inputはデジタル入力状態を表し、ledはLED状態を表します。 このメソッドを実行するときは、コロンで区切られた3つの要素で構成される文字列引数を渡す必要があります。

  1. ピンのThe type(アナログの場合はa、デジタルの場合はd

  2. ピンのThe number

  3. ピンのThe mode(入力の場合はi、出力の場合はo

digital_inputはピン10を使用するデジタル入力であるため、引数'd:10:i'を渡します。 LEDの状態はピン13を使用してデジタル出力に設定されるため、led引数は'd:13:o'です。

board.get_pin()を使用する場合、以前にpyfirmata.INPUTで行ったように、ピン10を入力として明示的に設定する必要はありません。 ピンを設定した後、read()を使用してデジタル入力ピンのステータスにアクセスし、write()を使用してデジタル出力ピンのステータスを設定できます。

デジタル入力は、エレクトロニクスプロジェクトで広く使用されています。 プレゼンスセンサーやドアセンサーなどのデジタル信号を提供するいくつかのセンサーは、回路への入力として使用できます。 ただし、距離や物理量などのアナログ値を測定する必要がある場合があります。 次のセクションでは、PythonでArduinoを使用してアナログ入力を読み取る方法について説明します。

アナログ入力の読み取り

オンまたはオフのみが可能なデジタル入力とは対照的に、analog inputsはある範囲の値を読み取るために使用されます。 Arduino Unoでは、アナログ入力への電圧の範囲は0V〜5Vです。 適切なセンサーを使用して、距離などの物理量を測定します。 これらのセンサーは、これらの物理量を適切な電圧範囲でエンコードし、Arduinoで読み取れるようにします。

アナログ電圧を読み取るために、Arduinoはanalog-to-digital converter (ADC)を使用します。これは、入力電圧を固定ビット数のデジタル数値に変換します。 これにより、変換の解像度が決まります。 Arduino Unoは10ビットADCを使用し、1024個の異なる電圧レベルを決定できます。

アナログ入力の電圧範囲は、0〜1023の範囲の数値にエンコードされます。 0Vが適用されると、Arduinoはそれを数値0にエンコードします。 5Vを印加した場合、エンコードされる数値は1023です。 すべての中間電圧値は比例的にエンコードされます。

potentiometerは、Arduinoアナログ入力に印加される電圧を設定するために使用できる可変抵抗器です。 アナログ入力に接続して、点滅するLEDの周波数を制御します。

Circuit for analog input

この回路では、LEDは以前と同様に設定されています。 ポテンショメータの終端端子は、グランド(GND)と5Vピンに接続されています。 このように、中央端子(カーソル)は、その位置に応じて0Vから5Vの範囲の任意の電圧を持つことができ、アナログピンA0でArduinoに接続されます。

ブレッドボードを使用すると、この回路を次のように組み立てることができます。

Circuit for analog input on breadboard

LEDを制御する前に、回路を使用して、ポテンショメーターの位置に基づいてArduinoが読み取るさまざまな値を確認できます。 これを行うには、PCで次のプログラムを実行します。

 1 import pyfirmata
 2 import time
 3
 4 board = pyfirmata.Arduino('/dev/ttyACM0')
 5 it = pyfirmata.util.Iterator(board)
 6 it.start()
 7
 8 analog_input = board.get_pin('a:0:i')
 9
10 while True:
11     analog_value = analog_input.read()
12     print(analog_value)
13     time.sleep(0.1)

8行目では、引数'a:0:i'を使用してanalog_inputをアナログA0入力ピンとして設定します。 無限のwhileループ内で、この値を読み取り、analog_valueに格納し、出力をprint()とともにコンソールに表示します。 プログラムの実行中にポテンショメーターを移動すると、次のような出力が表示されます。

0.0
0.0293
0.1056
0.1838
0.2717
0.3705
0.4428
0.5064
0.5797
0.6315
0.6764
0.7243
0.7859
0.8446
0.9042
0.9677
1.0
1.0

印刷される値は、ポテンショメーターの位置が一方の端にあるときの0からもう一方の端にあるときの1までの範囲で変化します。 これらは浮動小数点値であり、アプリケーションによっては変換が必要な場合があることに注意してください。

点滅するLEDの頻度を変更するには、analog_valueを使用して、LEDをオンまたはオフに保つ時間を制御できます。

 1 import pyfirmata
 2 import time
 3
 4 board = pyfirmata.Arduino('/dev/ttyACM0')
 5 it = pyfirmata.util.Iterator(board)
 6 it.start()
 7
 8 analog_input = board.get_pin('a:0:i')
 9 led = board.get_pin('d:13:o')
10
11 while True:
12     analog_value = analog_input.read()
13     if analog_value is not None:
14         delay = analog_value + 0.01
15         led.write(1)
16         time.sleep(delay)
17         led.write(0)
18         time.sleep(delay)
19     else:
20         time.sleep(0.1)

ここでは、delayがゼロに等しくならないように、delayanalog_value + 0.01として計算します。 それ以外の場合は、最初の数回の反復でanalog_valueNoneを取得するのが一般的です。 プログラムの実行時にエラーが発生しないようにするには、13行目の条件を使用してanalog_valueNoneであるかどうかをテストします。 次に、点滅するLEDの周期を制御します。

プログラムを実行し、ポテンショメーターの位置を変更してみてください。 LEDが点滅する頻度が変わることに気付くでしょう。

Led controlled by an analog input

これまで、回路でデジタル入力、デジタル出力、アナログ入力を使用する方法を見てきました。 次のセクションでは、アナログ出力の使用方法について説明します。

アナログ出力を使用する

場合によっては、アナログ信号を必要とするデバイスを駆動するためにanalog outputが必要です。 Arduinoには、電圧を特定の範囲の任意の値に設定できる実際のアナログ出力は含まれていません。 ただし、ArduinoにはいくつかのPulse Width Modulation(PWM)出力が含まれています。

PWMは、デジタル出力を使用して可変電力の信号を生成する変調技術です。 これを行うために、一定周波数のデジタル信号を使用します。この信号では、duty cycleが目的の電力に応じて変更されます。 デューティサイクルは、信号がhighに設定されている期間の割合を表します。

すべてのArduinoデジタルピンをPWM出力として使用できるわけではありません。 チルダ(~)で識別できるもの:

Arduino Uno PWM ports

いくつかのモーターを含むいくつかのデバイスは、PWM信号によって駆動されるように設計されています。 アナログフィルターを使用すると、PWM信号から実際のアナログ信号を取得することもできます。 前の例では、デジタル出力を使用してLEDライトをオンまたはオフにしました。 このセクションでは、ポテンショメーターによって与えられたアナログ入力の値に従って、PWMを使用してLEDの輝度を制御します。

PWM信号がLEDに適用されると、その輝度はPWM信号のデューティサイクルに従って変化します。 次の回路を使用します。

Circuit for analog output

この回路は、1つの違いを除いて、アナログ入力をテストするために前のセクションで使用したものと同じです。 ピン13でPWMを使用することはできないため、LEDに使用されるデジタル出力ピンはピン11です。

ブレッドボードを使用して、次のように回路を組み立てることができます。

Circuit for analog output on breadboard

回路を組み立てると、次のプログラムでPWMを使用してLEDを制御できます。

 1 import pyfirmata
 2 import time
 3
 4 board = pyfirmata.Arduino('/dev/ttyACM0')
 5
 6 it = pyfirmata.util.Iterator(board)
 7 it.start()
 8
 9 analog_input = board.get_pin('a:0:i')
10 led = board.get_pin('d:11:p')
11
12 while True:
13     analog_value = analog_input.read()
14     if analog_value is not None:
15         led.write(analog_value)
16     time.sleep(0.1)

以前に使用したプログラムとはいくつかの違いがあります。

  1. In line 10の場合、引数'd:11:p'を渡すことにより、ledをPWMモードに設定します。

  2. In line 15の場合、引数としてanalog_valueを使用してled.write()を呼び出します。 これは、アナログ入力から読み取られる0〜1の値です。

ここでは、ポテンショメーターを動かしたときのLEDの動作を見ることができます。

PWM output on oscilloscope

デューティサイクルの変化を示すために、オシロスコープをピン11に差し込みます。 ポテンショメータがゼロ位置にあるとき、ピン11の出力が0Vであるため、LEDがオフになっていることがわかります。 ポテンショメータを回すと、PWMデューティサイクルが増加するにつれてLEDが明るくなります。 ポテンショメータを最後まで回すと、デューティサイクルは100%に達します。 LEDは最大輝度で連続的に点灯します。

この例では、Arduinoとそのデジタルおよびアナログ入出力の使用の基本について説明しました。 次のセクションでは、PythonでArduinoを使用してPCでイベントを駆動するためのアプリケーションが表示されます。

センサーを使用して通知をトリガーする

FirmataはPythonでArduinoを使い始めるには良い方法ですが、アプリケーションを実行するためのPCまたはその他のデバイスの必要性は高くつく可能性があり、このアプローチは場合によっては実用的ではないかもしれません。 ただし、外部センサーを使用してデータを収集してPCに送信する必要がある場合、ArduinoとFirmataは適切な組み合わせを作成します。

このセクションでは、Arduinoに接続されたプッシュボタンを使用してdigital sensorを模倣し、マシンで通知をトリガーします。 より実用的なアプリケーションの場合、プッシュボタンは、たとえばアラーム通知をトリガーするドアセンサーと考えることができます。

PCに通知を表示するには、標準のPythonGUIツールキットであるTkinterを使用します。 ボタンを押すと、メッセージボックスが表示されます。 Tkinterの詳細については、ライブラリのdocumentationを確認してください。

digital inputの例で使用したのと同じ回路を組み立てる必要があります。

Circuit for digital input

回線を組み立てた後、次のプログラムを使用して通知をトリガーします。

 1 import pyfirmata
 2 import time
 3 import tkinter
 4 from tkinter import messagebox
 5
 6 root = tkinter.Tk()
 7 root.withdraw()
 8
 9 board = pyfirmata.Arduino('/dev/ttyACM0')
10
11 it = pyfirmata.util.Iterator(board)
12 it.start()
13
14 digital_input = board.get_pin('d:10:i')
15 led = board.get_pin('d:13:o')
16
17 while True:
18     sw = digital_input.read()
19     if sw is True:
20         led.write(1)
21         messagebox.showinfo("Notification", "Button was pressed")
22         root.update()
23         led.write(0)
24     time.sleep(0.1)

このプログラムは、digital inputの例で使用されているものと似ていますが、いくつかの変更があります。

  • Tkinterのセットアップに必要なLines 3 and 4インポートライブラリ。

  • Line 6はTkinterのメインウィンドウを作成します。

  • Line 7は、画面にメインウィンドウを表示しないようにTkinterに指示します。 この例では、メッセージボックスを表示するだけで済みます。

  • Line 17whileループを開始します。

    1. ボタンを押すと、LEDが点灯し、messagebox.showinfo()にメッセージボックスが表示されます。

    2. ユーザーがOKを押すまで、ループは一時停止します。 これにより、メッセージが画面に表示されている限り、LEDは点灯したままになります。

    3. ユーザーがOKを押すと、root.update()は画面からメッセージボックスをクリアし、LEDがオフになります。

通知の例を拡張するには、プッシュボタンを使用して、押されたときに電子メールを送信することもできます。

 1 import pyfirmata
 2 import time
 3 import smtplib
 4 import ssl
 5
 6 def send_email():
 7     port = 465  # For SSL
 8     smtp_server = "smtp.gmail.com"
 9     sender_email = ""
10     receiver_email = ""
11     password = ""
12     message = """Subject: Arduino Notification\n The switch was turned on."""
13
14     context = ssl.create_default_context()
15     with smtplib.SMTP_SSL(smtp_server, port, context=context) as server:
16         print("Sending email")
17         server.login(sender_email, password)
18         server.sendmail(sender_email, receiver_email, message)
19
20 board = pyfirmata.Arduino('/dev/ttyACM0')
21
22 it = pyfirmata.util.Iterator(board)
23 it.start()
24
25 digital_input = board.get_pin('d:10:i')
26
27 while True:
28     sw = digital_input.read()
29     if sw is True:
30         send_email()
31         time.sleep(0.1)

Sending Emails With Pythonsend_email()の詳細を学ぶことができます。 ここでは、電子メールを送信するために使用される電子メールサーバーの資格情報で機能を構成します。

Note: Gmailアカウントを使用してメールを送信する場合は、Allow less secure appsオプションを有効にする必要があります。 これを行う方法の詳細については、Sending Emails With Pythonを確認してください。

これらのサンプルアプリケーションでは、Firmataを使用して、より複雑なPythonアプリケーションと対話する方法を見てきました。 Firmataでは、Arduinoに接続されているセンサーを使用して、アプリケーションのデータを取得できます。 その後、データを処理し、メインアプリケーション内で決定を下すことができます。 Firmataを使用してArduino出力にデータを送信し、スイッチまたはPWMデバイスを制御することもできます。

Firmataを使用してより複雑なアプリケーションとやり取りすることに興味がある場合は、次のプロジェクトを試してください。

  • 温度が高すぎたり低すぎたりしたときに警告する温度モニター

  • 電球が切れたことを検知できるアナログ光センサー

  • 地面が乾燥しすぎたときにスプリンクラーを自動的にオンにできる水センサー

結論

Maker MovementとInternet of Thingsの人気の高まりにより、マイクロコントローラープラットフォームが増加しています。 Arduinoのようなプラットフォームは、あなたと同じように開発者が自分のスキルを使用して電子プロジェクトに飛び込むことができるため、特に大きな注目を集めています。

次の方法を学びました。

  • ArduinoとPythonを使用してアプリケーションを開発する

  • Firmataプロトコルを使用する

  • アナログおよびデジタルの入出力を制御

  • センサーを高レベルのPythonアプリケーションと統合する

また、PCを必要とし、センサーデータに依存するプロジェクトにとって、Firmataが非常に興味深い代替品になる可能性があることも確認しました。 さらに、既にPythonを知っている場合は、Arduinoを使い始める簡単な方法です!

参考文献

PythonでArduinoを制御する基本を理解したので、より複雑なアプリケーションで作業を開始できます。 統合プロジェクトの開発に役立つチュートリアルがいくつかあります。 ここにいくつかのアイデアがあります:

  • REST APIs:これらは、さまざまなアプリケーションを統合するために広く使用されています。 RESTをArduinoで使用して、センサーから情報を取得し、アクチュエータにコマンドを送信するAPIを構築できます。 REST APIについては、Python REST APIs With Flask, Connexion, and SQLAlchemyを確認してください。

  • Alternate GUIs:このチュートリアルでは、Tkinterを使用してグラフィカルアプリケーションを構築しました。 ただし、デスクトップアプリケーション用のグラフィカルライブラリは他にもあります。 別の方法を確認するには、How to Build a Python GUI Application With wxPythonを確認してください。

  • Threading:このチュートリアルで使用した無限のwhileループは、Arduinoアプリケーションの非常に一般的な機能です。 ただし、スレッドを使用してメインループを実行すると、他のタスクを同時に実行できます。 スレッドの使用方法については、An Intro to Threading in Pythonを確認してください。

  • Face Detection: IoTアプリでは、機械学習とコンピュータービジョンアルゴリズムを統合するのが一般的です。 これらを使用すると、たとえばカメラで顔を検出したときに通知をトリガーするアラームを作成できます。 顔認識システムの詳細については、Traditional Face Detection With Pythonを確認してください。

最後に、FirmataとArduino以外に、マイクロコントローラーでPythonを使用する他の方法があります。

  • pySerial: Arduino UnoはPythonを直接実行できませんが、独自のArduinoスケッチを設計し、pySerialを使用してシリアル接続を確立することができます。 その後、独自のプロトコルを使用してPythonでArduinoを制御できます。

  • MicroPython:マイクロコントローラー上でPythonを直接実行することに興味がある場合は、MicroPythonプロジェクトを確認してください。 これは、ESP8266ESP32などの一部のマイクロコントローラーで実行されるPythonの効率的な実装を提供します。

  • SBCs:もう1つのオプションは、Raspberry Piなどのsingle board computer (SBC)を使用してPythonを実行することです。 SBCは、Linuxベースのオペレーティングシステムを実行できる完全なArduinoサイズのコンピューターであり、バニラPythonを使用できます。 ほとんどのSBCはGeneral-purpose input and output pinsを提供するため、ほとんどのアプリケーションでArduinoの代わりに使用できます。