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

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

http://www.circuitstoday.com/microcontroller-invention-history [マイクロコントローラー]は長い間使用されており、複雑な機械から一般的な家電製品に至るまですべてに使用されています。 ただし、従来は、技術者や電気技術者などの正式な技術トレーニングを受けた人たちと作業することしかできませんでした。 Arduino の登場により、すべての開発者が電子アプリケーションの設計にアクセスしやすくなりました。 このチュートリアルでは、PythonでArduinoを使用して独自の電子プロジェクトを開発する方法を学びます。

  • Arduinoの基本をPythonで説明し、次の方法を学習します。*

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

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

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

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

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

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

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

Arduinoプラットフォーム

Arduinoは、ハードウェアとソフトウェアで構成されるオープンソースのプラットフォームであり、インタラクティブエレクトロニクスプロジェクトの迅速な開発を可能にします。 Arduinoの出現は、さまざまな業界の専門家の注目を集めました。https://readwrite.com/2014/05/12/arduino-massimo-banzi-diy-electronics-hardware -hacking-builders/[貢献] Maker Movementの開始。

Maker Movementの人気の高まりとhttps://en.wikipedia.org/wiki/Internet_of_things[Internet of Things]の概念により、Arduinoは電子プロトタイピングとMVPの開発の主要なプラットフォームの1つになりました。

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

全体として、ArduinoとPythonは、開発者が電子機器設計に取り組むことを奨励する効果的な学習環境を促進できます。 既にhttps://realpython.com/learning-paths/python3-introduction/[Pythonの基本]を知っている場合は、Pythonを使用して制御することでArduinoを使い始めることができます。

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

Arduinoハードウェア

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

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

  2. 任意の色の標準LED

  3. プッシュボタン

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

  5. 470オームの抵抗器

  6. 10 KOhmの抵抗器

  7. ブレッドボード

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

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

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

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

コンポーネント5と6は*抵抗*です。ほとんどの抵抗は、https://en.wikipedia.org/wiki/Electronic_color_code#Resistor_color-coding [color code]に従って色付きのストライプで識別されます。 一般に、最初の3色は抵抗の*値*を表し、4番目の色は*許容値*を表します。 470オームの抵抗の場合、最初の3色は黄色、紫、および茶色です。 10 KOhm抵抗の場合、最初の3色は茶色、黒、オレンジです。

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

Arduinoソフトウェア

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

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

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

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

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

  4. コードを書く

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

Arduino IDEをコンピューターにインストールするには、https://www.arduino.cc/en/Main/Software [Arduino Webサイト]からオペレーティングシステムに適切なバージョンをダウンロードします。 インストール手順については、ドキュメントを確認してください。

  • Windows を使用している場合は、Windowsインストーラーを使用して、WindowsでArduinoを使用するために必要なドライバーをダウンロードしてください。 詳細については、https://www.arduino.cc/en/guide/windows [Arduino documentation]を確認してください。

  • Linux を使用している場合、シリアルポートを使用してArduinoをプログラムするには、ユーザーをいくつかのグループに追加する必要があります。 このプロセスについては、https://www.arduino.cc/en/Guide/Linux [Linux用Arduinoインストールガイド]で説明されています。

  • macOS を使用している場合は、https://www.arduino.cc/en/Guide/MacOSX [OS X用Arduinoインストールガイド]に従ってArduino IDEをインストールできます。

*注:*このチュートリアルではArduino IDEを使用しますが、Arduinoにはhttps://create.arduino.cc/getting-started/plugin[web editor]も用意されており、ブラウザを使用してArduinoボードをプログラムできます。 。

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

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

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

点滅サンプルスケッチのアップロード

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

Arduino IDEのスケッチ例、width = 1125、高さ= 929

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

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

Arduino IDEでボードを選択、width = 1127、height = 931

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

Arduino IDEでポートを選択、width = 1127、height = 931

ポートの名前は、オペレーティングシステムによって異なる場合があります。 Windowsでは、ポートは + COM4 ++ COM5 +、または同様の名前になります。 macOSまたはLinuxでは、 `/dev/ttyACM0 +`または `/dev/ttyUSB0 +`のようなものが表示される場合があります。 ポートの設定に問題がある場合は、https://www.arduino.cc/en/Guide/Troubleshooting [Arduinoトラブルシューティングページ]をご覧ください。

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

Arduino IDEで検証およびアップロードするためのボタン、幅= 1122 、height = 194

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

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

Arduino buit-in LED点滅、幅= 795、高さ= 596

アップロードが完了すると、USBケーブルがArduinoボードに電力を供給し続けます。 プログラムは、Arduinoマイクロコントローラーのフラッシュメモリに保存されます。 バッテリーまたはその他の外部https://www.technobyte.org/2016/07/power-up-the-arduino-uno/[電源]を使用して、USBケーブルなしでアプリケーションを実行することもできます。

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

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

Arduino Uno Ports、width = 795、height = 596

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

  • *オレンジ色の長方形:*これらは、入力または出力として使用できる13個の*デジタルピン*です。 これらは、2つの異なるレベルのデジタル信号でのみ動作することを意図しています。

    1. *レベル0:*電圧0Vで表される

    2. *レベル1:*電圧5Vで表される

  • *緑色の長方形:*これらはアナログ入力として使用できる6つの*アナログピン*です。 それらは、0Vから5Vの間の任意の電圧で動作することを意図しています。

  • *青い長方形:*これらは5つの*電源ピン*です。 主に外部コンポーネントに電力を供給するために使用されます。

外部コンポーネントの使用を開始するには、外部LEDを接続してBlinkサンプルスケッチを実行します。 内蔵LEDは*デジタルピン#13 *に接続されています。 そのため、外部LEDをそのピンに接続して、点滅するかどうかを確認しましょう。 (標準LEDは、https://realpython.com/arduino-python/#arduino-hardware [以前]にリストされているコンポーネントの1つです。)

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

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

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

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

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

Breadboard

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

  • *赤い線*の1つの穴を電源に接続します。

  • *青い線*の1つの穴を地面に接続します。

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

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

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

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

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

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

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

詳細については、https://www.youtube.com/watch?v = 6WReFkfrUIk [ブレッドボードの使用方法]をご覧ください。

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

Arduino内蔵および外部LED点滅、幅= 812 、height = 1172

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

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

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

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

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

  • *ピン13の値は高い:*デジタル入力ピンのステータスをPCに伝えるために使用

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

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

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

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

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

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

Arduino IDEのFirmataサンプルスケッチ、width = 1123、height = 921

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

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

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

  3. _Upload_を押します。

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

$ 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)

このプログラムがhttps://github.com/tino/pyFirmata#usage[works]の方法です。 `+ pyfirmata `をインポートし、それを使用してArduinoボードとのシリアル接続を確立します。これは4行目の ` board `オブジェクトで表されます。 また、引数を ` pyfirmata.Arduino()+`に渡すことにより、この行でポートを設定します。 Arduino IDEを使用してポートを見つけることができます。

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

  • * 7行目で、*デジタルピン13がオンになり、LEDが1秒間オンになります。

  • * 9行目*では、このピンはオフになり、LEDが1秒間オフになります。

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

デジタル入力の読み取り

*デジタル入力*には、2つの可能な値しかありません。 回路では、これらの値はそれぞれ異なる電圧で表されます。 次の表は、標準のArduino Unoボードのデジタル入力表現を示しています。

Value Level Voltage

0

Low

0V

1

High

5V

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

以前と同様に、LEDがデジタルピン13でArduinoに接続されていることに気付くかもしれません。 デジタルピン10はデジタル入力として使用されます。 プッシュボタンを接続するには、この回路でhttps://playground.arduino.cc/CommonTopics/PullUpDownResistor/[pull down]として機能する10 KOhm抵抗を使用する必要があります。 *プルダウン*抵抗により、ボタンが放されたときにデジタル入力が0Vになります。

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

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

回路を組み立てたら、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)

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

  • * 1行目と2行目は `+ pyfirmata `と ` time +`をインポートします。

  • *行4 *は、 `+ pyfirmata.Arduino()+`を使用してArduinoボードとの接続を設定します。

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

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

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

  • *行11 *は無限の `+ while `ループを開始します。 このループは入力ピンのステータスを読み取り、それを「 sw +」に保存し、この値を使用してピン13の値を変更することでLEDをオンまたはオフにします。

  • *行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. ピンのタイプ(アナログの場合は「+ a 」、デジタルの場合は「 d +」)

  2. ピンの番号 * . ピンのモード*(入力の場合は「+ i 」、出力の場合は「 o +」)

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

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

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

アナログ入力の読み取り

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

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

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

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

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

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

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 」が「 analog_value + 0.01+」として計算され、「+ delay 」がゼロにならないようにします。 それ以外の場合、最初の数回の反復中に「 None 」の「 analog_value 」を取得するのが一般的です。 プログラムの実行時にエラーが発生しないようにするには、13行目の条件を使用して、「 analog_value 」が「 None +」であるかどうかをテストします。 次に、点滅するLEDの周期を制御します。

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

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

アナログ出力を使用する

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

PWMは、デジタル出力を使用して可変電力の信号を生成する変調技術です。 これを行うには、一定の周波数のデジタル信号を使用します。この信号では、https://en.wikipedia.org/wiki/Duty_cycle [ duty cycle ]が必要な電力に応じて変更されます。 デューティサイクルは、信号が high に設定されている期間の一部を表します。

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

Arduino Uno PWM ports、width = 795、height = 596

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

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

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

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

回路を組み立てると、次のプログラムで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. *10行目では、引数 `+ 'd:11:p' `を渡すことにより、 ` led `をPWMモードに設定します。 .* 15行目では、 ` analog_value `を引数として ` led.write()+`を呼び出します。 これは、アナログ入力から読み取られる0〜1の値です。

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

oscilloscopeでのPWM出力、width = 350、height = 373

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

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

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

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

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

PCに通知を表示するには、標準のPython GUIであるhttps://wiki.python.org/moin/TkInter[Tkinter]を使用します。ツールキット。 ボタンを押すと、メッセージボックスが表示されます。 Tkinterの詳細なイントロについては、ライブラリのhttps://wiki.python.org/moin/TkInter[documentation]をご覧ください。

link:#reading-digital-inputs [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)

このプログラムはlink:#reading-digital-inputs [digital input]の例で使用されているものに似ていますが、いくつかの変更があります。

  • * 3行目と4行目* Tkinterのセットアップに必要なライブラリーのインポート。

  • * 6行目:Tkinterのメインウィンドウを作成します。

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

  • *行17 *は `+ while +`ループを開始します:

    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 = "<your email address>"
10     receiver_email = "<destination email address>"
11     password = "<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)

`+ send_email()+`の詳細については、https://realpython.com/python-send-email/[Pythonでメールを送信]をご覧ください。 ここでは、電子メールを送信するために使用される電子メールサーバーの資格情報で機能を構成します。

注意: Gmailアカウントを使用してメールを送信する場合は、[安全性の低いアプリを許可する]オプションを有効にする必要があります。 これを行う方法の詳細については、https://realpython.com/python-send-email/[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 API:*これらは、さまざまなアプリケーションを統合するために広く使用されています。 RESTをArduinoで使用して、センサーから情報を取得し、アクチュエータにコマンドを送信するAPIを構築できます。 REST APIについて学ぶには、https://realpython.com/flask-connexion-rest-api/[Flask、Connexion、およびSQLAlchemyを使用したPython REST API]をご覧ください。

  • *代替GUI:*このチュートリアルでは、Tkinterを使用してグラフィカルアプリケーションを構築しました。 ただし、デスクトップアプリケーション用のグラフィカルライブラリは他にもあります。 別の方法を確認するには、https://realpython.com/python-gui-with-wxpython/[wxPythonを使用してPython GUIアプリケーションを構築する方法]を確認してください。

  • *スレッド:*このチュートリアルで使用した無限の「+ while +」ループは、Arduinoアプリケーションの非常に一般的な機能です。 ただし、スレッドを使用してメインループを実行すると、他のタスクを同時に実行できます。 スレッドの使用方法については、https://realpython.com/intro-to-python-threading/[Pythonのスレッドの紹介]をご覧ください。

  • 顔検出: IoTアプリでは、機械学習とコンピュータービジョンアルゴリズムを統合するのが一般的です。 これらを使用すると、たとえばカメラで顔を検出したときに通知をトリガーするアラームを作成できます。 顔認識システムの詳細については、https://realpython.com/traditional-face-detection-python/[Pythonを使用した従来の顔検出]をご覧ください。

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

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

  • * MicroPython:* Pythonをマイクロコントローラーで直接実行することに興味がある場合は、https://micropython.org/[MicroPython]プロジェクトをご覧ください。 ESP8266やhttps://en.wikipedia.org/wiki/ESP32[ESP32]などの一部のマイクロコントローラーで実行されるPythonの効率的な実装を提供します。

  • * SBC:*別のオプションは、https://www.raspberrypi.org/[Raspberry Pi]などのhttps://en.wikipedia.org/wiki/Single-board_computer [シングルボードコンピューター(SBC)]を使用することです。 Pythonを実行します。 SBCは、Linuxベースのオペレーティングシステムを実行できる完全なArduinoサイズのコンピューターであり、バニラPythonを使用できます。 ほとんどのSBCはhttps://en.wikipedia.org/wiki/General-purpose_input/output [汎用入力および出力ピン]を提供するため、ほとんどのアプリケーションでArduinoを置き換えるために使用できます。