Arduino と Raspberry Pi のボードは、一見すると似ているように見えます。つまり、多数のIOピンを備えた小型のコンピューターのようなデバイスです。しかし、ご存知のとおり、Raspberry Piボード (この記事では取り上げないArduinoのようなPicoを除く) は、IO機能に加えて、実際のコンピューターとしても機能します。ただし、Arduinoは マイクロコントローラ 開発ボードであるため、入力を受信したり、信号ビットをオン/オフにしたりすることが簡単です。
なぜ両方?ArduinoとRaspberry Piを使用したプロジェクト
プロジェクトにRaspberry Piを使ってそれで終わりにしたいという誘惑にかられるかもしれませんが、両方を併用したい場合も数多くあります。Pico Pi以外のボードは、平均的なArduinoよりもはるかに高い処理能力を備えていますが、オペレーティング システム全体も搭載されています。したがって、Arduinoとは異なり、妥当な時間内にYに応じてXを実行するかどうかは、記述するコードだけに依存するわけではありません。
Arduinoボードにはアナログ入力機能も備わっていますが、これはRaspberry Piシングルボード コンピューターにはない機能です。さらに、 シールドの形で幅広い種類の既製のArduino周辺機器が用意されており、これらのボードを使用してモーター、リレー、ディスプレイなどを制御できます。両方を一緒に使用する場合、モーターなどとのインターフェイス用の低レベルのタスクをArduinoにオフロードして、Raspberry Piの「全体像」コントローラーをより複雑な計算の実行に解放することができます。
この種の設定では、PiではなくArduinoを危険の及ぶ場所の近くに配置できるため、場合によっては有利になることもあります。
ArduinoとRaspberry Piの接続: シリアル インターフェイスとその他のオプション
ここではシリアルを扱いますが、「Pi-duino」制御パッケージ用にボードを相互に接続する方法は他にもいくつかあります。
- I2C
- ノードレッド
- Firmata経由のシリアル
- BluetoothまたはWiFi経由のワイヤレス
- GPIOを介して配線された個別のIO信号
これらの他の方法にも確かに適所はありますが、シリアルは標準的でありながら実装が簡単であるという点で優れた組み合わせであるようです。2つのボードを接続し、各ボードが信号を送受信して適切に応答できるようにコードを記述するだけです。
ここでは、接続を簡素化するためにUSBポートを使用します。ただし、5V Arduinoを使用する場合はレベルシフトを伴う可能性があり、GPIOを直接配線することも可能です。
シリアルインターフェースの基礎: Raspberry PiとArduinoを接続する方法
画像: ジェレミー・クック
Arduino IDEを開き、ボードに「Example > Communication > SerialCallResponse」をロードします。 ここではArduino Unoを使用しますが、他のArduinoボードでも同様に動作します。USB経由でRaspberry Piに接続します。そのようにプログラムしたい場合は、Raspberry PiにArduino IDEをロードすることも可能です。
Raspberry Pi (Python 3を使用) でThonny Python IDEを開き、次のコードを入力します。
シリアルをインポート
Ser = serial.Serial('dev/tty/ACM0', 9600)
真の場合:
入力 = ser.read()
印刷 (input.decode("utf-8"))
この設定により、Arduinoプログラムの62行目のSerial.printステートメントに対応する、シェル内に「A」という繰り返し行が表示されます。適切な信号を受信していることを確認したい場合は、これを変更してください。
ここで起こっていることは、RPiがArduinoの信号に合わせて9600ボーでシリアル モニターを起動することです。の 真の場合 ステートメントは、その下の行を継続的にループさせ、シリアル入力を読み取って出力します。これはこれまでに書かれたプログラムの中で最も興味深いものではありませんし、SerialCallResponseプログラムにはもっと多くの機能がありますが、2つのデバイスが実際に通信していることを証明しています。
「ポートを開けませんでした」というエラーが表示された場合は、ポートの場所を指定する必要があることに注意してください。これを行うには、ターミナルで次のように入力します。 ls /dev/tty*、多数のデバイスがリストされます。デバイスを接続すると、このリストの最後の方に次のようなものが表示されます。 /dev/ttyACM0 「ser」行に入力されます。これも少し異なる可能性があります。 /dev/ttyACM1。Arduinoを取り外し、このコマンドを再度実行して、何が失われるかを確認します。最後に、プラグを差し込んで実行します ls /dev/tty* もう一度デバイスを確認して、それをPythonコードに入力します。
Raspberry Piシリアル接続でArduinoを点滅させる
ArduinoからRaspberry Piにデータを送信できることが証明されました。PiでArduinoのオンボードLEDを、一種のシリアル点滅「hello world」として点滅させるのはいかがでしょうか? はい、これは完全に可能です。
上の ラズベリーパイ/Thonny IDE 側に、次のように入力します。
シリアルをインポート
インポート時間
シリアル1 = serial.Serial('/dev/ttyACM0', 9600)
真の場合:
シリアル1.書き込み(b'0')
時間.睡眠(1)
シリアル1.書き込み(b'9')
時間.睡眠(1)
上の Arduino IDE次のように入力してボードにロードします。
int入力バイト = '0';
voidセットアップ() {
シリアル.begin(9600);
pinMode(LED_BUILTIN、出力);
}
Void loop() {
Serial.available() > 0の場合
inByte = (Serial.read());
Serial.print("inByte "); Serial.println(inByte);
(inByte == '0')の場合{
digitalWrite(LED_BUILTIN、HIGH);
}
(inByte == '9')の場合{
digitalWrite(LED_BUILTIN、LOW);
}
}
}
前述のように「ACM0」の部分が変わる可能性があることに注意しながら、以前と同じようにArduinoを接続し、Pythonスクリプトを実行します。これにより、Raspberry PiはASCII文字0または9をArduinoボードに送信します。応答として、Arduinoのifステートメントは、このシリアル入力が0の場合は内蔵LEDをオン (HIGH) にし、9の場合はオフ (LOW) にします。
結論: PiとArduinoの基本的なシリアル インターフェース
ここでは、シリアル インターフェイスに関する基本的な事項のみを概説していますが、この概念を初めて知る人にとってはわかりやすい入門書となるはずです。特に、ArduinoをArduino IDEシリアル モニターに接続し、 0 と 9 を手動で入力して点滅を確認することもできます。これは、ここで起こっていることに魔法のようなものは何もないことを証明しています。
ツールセットにこのシンプルなシリアル インターフェイスの概念を導入すると、さまざまな文字をArduinoに送信してアクションで応答させることが簡単になります。「ソロ」Arduinoプログラミングと同様に、この点滅するハードウェア「hello world」を構築して、さまざまな素晴らしいタスクを実現できます。