※ 当ページには【広告/PR】を含む場合があります。
2021/06/11
【ラズパイでもDocker!】Dockerコンテナ越しにシリアル通信を叩くNode.jsアプリの作成方法
ラズパイとArduinoをシリアル通信させるときにもっとも手っ取り早く使えるようにする方法はUSB接続
です。今回はラズパイをホストとして、USB接続させたAruduinoとサクッと通信させる方法を解説します。
ラズベリーパイ4B 4GB 技適対応品 ベーシックUSB2.0ケーブル 1.8m (タイプAオス - タイプBオス) Outtag 5V 3A ACDCアダプター充電器 8種変換プラグ付き ラズベリーパイ カメラモジュールV2 LABISTS Raspberry4 4B-32GB オールインワンセット Arduino Uno Rev3 ATmega328 マイコンボード A000066 NORSMIC 10インチRaspberry Pi用モニター Raspberry Pi Zero W (ヘッダーハンダ付け済) 事前準備〜Arduino Unoをラズパイに認識させる
まず以下のような構成を考えてみます。構成もなにもただUSB接続しただけですが、ラズパイとArduinoのUSBポートの規格上、使用するUSBケーブルはTypeA-Bの異型コネクタ変換(「 ベーシックUSB2.0ケーブル 1.8m (タイプAオス - タイプBオス) 」など)を使うことになります。ラズパイ側のUSBポートは通常4つ程度ありますが、どこのポートに指してもらっても動作します。これだけで準備はOKです。ラズパイ側に電源を投入すると、Arduino側にもUSBから電源が供給されて便利です。またラズパイ側からUSB接続されたペリフェラルへ電源供給しながら使うことを考えると、5V3Aを供給するケーブルもあったほうが良いかも知れません。5V3Aになると専用のACDCアダプターを購入することになりますが、色々とコンパチで使えるようにUSBを含め変換プラグが付属するタイプである「 Outtag 5V 3A ACDCアダプター充電器 8種変換プラグ付き 」のようなものがおすすめです。まずはラズパイ側でログインしターミナルからデバイス一覧を見てArduinoを認識しているか確認してみます。ここでいうttyACM0が現在接続中のArduino Unoになります。ちなみにラズパイの仕組みからいうとシリアル通信用のUARTデバイスは2つ(ラズパイ4からは6つ)あり、ここではttyAMA0
とttyS0
がそれに割り当てられています。シリアルデバイスも見てみると、Arduino Unoを接続することで現れるserial
という名前のデバイスが増えています。これでラズパイとArduino間のシリアル通信が可能になっていることが分かります。
ラズベリーパイ4B 4GB 技適対応品 ベーシックUSB2.0ケーブル 1.8m (タイプAオス - タイプBオス) Outtag 5V 3A ACDCアダプター充電器 8種変換プラグ付き ラズベリーパイ カメラモジュールV2 LABISTS Raspberry4 4B-32GB オールインワンセット Arduino Uno Rev3 ATmega328 マイコンボード A000066 NORSMIC 10インチRaspberry Pi用モニター Raspberry Pi Zero W (ヘッダーハンダ付け済) ラズパイから送信した信号でArduinoを操作する
ここからは簡単な実装例を見ていきます。まずはじめにラズパイからArduinoへ信号を送り、その信号を読み取った値からArduinoのビルドインLEDを点灯消灯させてみましょう。Arduino側の実装
以下のコードで、ビルドインLEDが0を受け取った時に消灯、1を受け取った時に点灯するだけのプログラムを別のPCからArduino IDEから書き込んでおきます。
ラズベリーパイ4B 4GB 技適対応品 ベーシックUSB2.0ケーブル 1.8m (タイプAオス - タイプBオス) Outtag 5V 3A ACDCアダプター充電器 8種変換プラグ付き ラズベリーパイ カメラモジュールV2 LABISTS Raspberry4 4B-32GB オールインワンセット Arduino Uno Rev3 ATmega328 マイコンボード A000066 NORSMIC 10インチRaspberry Pi用モニター Raspberry Pi Zero W (ヘッダーハンダ付け済) ラズパイからの送信
では先程プログラムを書き込んだArduino UnoをラズパイにUSB接続させます。シェルコマンドによるシリアル通信からの送信は以下のようにします。これでArduinoが無事点灯すればいいのですが、そのままechoだと通信が上手くいかない場合があります。そんなときはsttyコマンドで設定を確認します。まぁボーレート位しか設定が無かったですが、これでは動かなそう...。これはシリアル通信の設定というかArduino側の通信方式の問題で、こちら|Bash to send command to Arduinoでも書いてあるようにシリアル通信で利用されるDTR
の信号をホスト側からArduinoへ送らないといけないようです。フォーラムに書かれているDTRを無効にする対処法はいくらかあるようですが、手っ取り早く初期化に以下の方法をとります。ただし、この-hupcl
は通信のプロセス最後にリセットを繰り返す最終手段的なものらしいので、実用性はなくなります。これで晴れて通信がArduinoとの通信が確立し、が使えるようになります。余談〜ハード的にDTR無効化を試す
こちら紹介されているように、ちょうどいい感じの抵抗かコンデンサが手元にある方はより確実にDTR無効化ができます。以下の写真のように5V電源-RST間に仕込むだけで済みます。ですが抵抗でやる場合には110〜124[Ω]
の間に取らないといけないという選択幅の狭さがあり、コンデンサのほうがまだ無難かも知れません。写真は0.1μFのセラミックコンデンサを挿入しました。コンデンサの場合にはRST-GND間に挟むのが正しい
と書いてあります。後で気づきましたが上の写真は誤ってセラコンを5V-RST間に差し込んでしまった時の写真ですが、たまたまなのかこれでも動作しておりました。試される場合には自己責任において、お試しください。なお、ArduinoIDEでプログラムを書き込む際には、挿しっぱなしだと書き込みに支障が出ますので、抜いておかないといけません。
ラズベリーパイ4B 4GB 技適対応品 ベーシックUSB2.0ケーブル 1.8m (タイプAオス - タイプBオス) Outtag 5V 3A ACDCアダプター充電器 8種変換プラグ付き ラズベリーパイ カメラモジュールV2 LABISTS Raspberry4 4B-32GB オールインワンセット Arduino Uno Rev3 ATmega328 マイコンボード A000066 NORSMIC 10インチRaspberry Pi用モニター Raspberry Pi Zero W (ヘッダーハンダ付け済) Arduinoから送信された信号をラズパイで受け取る
次にArduinoから定期発信した信号をラズパイで受ける方も試します。Arduino側から信号を送信
今回のケースは以下のコードをまずArduinoに書き込みます。ビルドインLEDが1秒間隔で点灯・消灯を繰り返すたびにメッセージをラズパイ側に送り出します。ラズパイ側のモニタリング
ラズパイ側で送信を受け取るためには、screenコマンドを使うのが手っ取り早いです。以下のようにコンソールからscreenプロセスを呼び出します。Arduino側からラズパイで信号を受け取る際には、DTRを考慮せずとも読み取れていると思います。
ラズベリーパイ4B 4GB 技適対応品 ベーシックUSB2.0ケーブル 1.8m (タイプAオス - タイプBオス) Outtag 5V 3A ACDCアダプター充電器 8種変換プラグ付き ラズベリーパイ カメラモジュールV2 LABISTS Raspberry4 4B-32GB オールインワンセット Arduino Uno Rev3 ATmega328 マイコンボード A000066 NORSMIC 10インチRaspberry Pi用モニター Raspberry Pi Zero W (ヘッダーハンダ付け済) まとめ
今回はUSB接続を利用したArduino Unoとラズパイ間のシリアル通信のやり方をまとめてみました。USB接続のシリアル通信がもっとも簡単で確実な方法でしたが、もっと汎用性の高いGPIOピンによるシリアル通信の方法も後日まとめていきたいと思います。GPIOピンでのシリアル通信にも興味がございましたら、また当ブログを覗いてみてください。参考サイト
Raspberry Pi と Arduino をUSBシリアル通信(第一弾)screenを使ったserial接続と終了の方法メモ