工作好きな情報系の雑記

Raspberry Pi 3とArduino間の通信方法まとめ

Raspberry Pi 3とArduino間の通信方法としては、SPI、I2C、UARTの3種類がある。
(1-Wireもあるけどここでは割愛)

3種類の接続方法をまとめておく。

SPI

spidevというライブラリを使う方法を紹介。

接続方法

Arduino Raspberry Pi
MISO SPI_MISO(GPIO9)
MOSI SPI_MOSI(GPIO10)
CS SPI_CLK(GPIO11)
SS SPI_CE0_N(GPIO8)
GND GND

事前準備

spidevをインストール

pipでインストール。

コード例

Arduino側のスケッチ

Raspberry Pi側のPythonスクリプト

Raspberry PI ZeroをSPI Master Arduiono UNO をSPI Sleveとして…
Raspi と ArduinoでSPI通信 - 半田付け日記

I2C

smbusというライブラリを使う。
ただし、smbusのインストール方法は、システムのPythonを使うかpyenv上のpythonを使うかで変わってくる。
システムのPythonにただインストールするだけならapt-getで十分だが、その場合pyenv上のPythonからはsmbusが使えない。
かといってこのライブラリはpipでは見つからない。
そこでpyenvを使う場合はsmbus-cffiというライブラリを使う。

自分はpyenv上でPythonを動かしているので、pyenvを使っている前提で説明する。 (とはいえシステムのpythonだとしても、こっちの方法で動くとは思う)

接続方法

Arduino Raspberry Pi
SDA SDA1(GPIO2)
SCL SCL1(GPIO3)
GND GND

事前準備

sudoersにパスを追記

開いたら、次のように修正する。

Before
Default secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
After
Default secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/pi/.pyenv/shims:/home/pi/.pyenv/bin"

色々とインストール

さっきの記事「RasPiで室温を計測する」の最後に書きましたが、通常pyenvを使っている人の環境ではシステム側のpythonと、pyenv側のpythonが入っていると思います。 このとき何もせずpyenvをインストールしているとsudo python hoge.pyしたとき、勝手にシステム側のpythonが呼ばれてしまいます。 sudoしたときにどうやってpyenv側のpythonを呼び出すかですが、/etc/sudoersのDefaultにpyenvディレクトリのパスを追加してやることで可能になります。 su -してrootにログインしてから以下の操作を行ってください。 $ vim /e…
sudoとpyenv - ぽよメモ - ぽよメモ

modulesの修正

末尾に下記を追記。

i2c-bcm2708
i2c-dev

raspi-blacklist.confの修正

もしこのファイルに「blacklist i2c-bcm2708」をいう記述があったら、行頭に#をつけてコメントアウトする。

コード例

Arduino側のスケッチ

Raspberry Pi側のPythonスクリプト

ArduinoをADコンバータやサーボドライバとして働いてもらうには、I2C接続がよいと考えた。実際やってみると、いろいろと下準備が必要だったので、整理してみる。下準備Arduinoのプログラミング回路Raspberry PiのI2CセットアップRaspberry PiのパッケージのインストールRaspb
Raspberry PiとArduinoをI2Cで接続する : 電子工作と3DCAD - 電子工作と3DCAD

UART

PySerialというライブラリを使う方法を紹介。

接続方法

Arduino Raspberry Pi
TX RXD0(GPIO15)
RX TXD0(GPIO14)
GND GND

事前準備

cmdline.txtの編集

開いたら、「console=ttyAMA0,115200」とか「kgdboc=ttyAMA0,115200」という文字列を消す。115200とか書いてある奴は消す。

ttyサービスの無効化

次のコマンドを実行。
RPi3の場合はttyS0に割り当てられてるとか海外のサイトにしか書いてなかったぞ・・・
もちっとみんなバージョンの差異に目を向けようよ・・・
困ってる人がいるんだよ・・・

config.txtの編集

ファイルの一番最後に以下を追記する。

再起動

再起動すると、今までの変更が有効になる。

PySerialをインストール

pipでインストール。

Adding GPS tracking to your Pi-based projects
Adafruit Ultimate GPS on the Raspberry Pi - 

コード例

Arduino側のスケッチ(簡易版)

Arduino側のスケッチ(serialEvent対応版)

Arduino側でUARTの割り込み受信用のメソッドを探しているのなら、serialEvent()という関数が使える。
しかし見つけた時はびっくりした。まさか存在しているとは…
日本語リファレンスは全部を網羅しているわけじゃなかったんだね。

Raspberry Pi側のPythonスクリプト

Raspberry PiとArduinoのシリアル通信 いろんな事情でRaspberry PiとArduinoをUSB経由で通信させる必要が出てしまったので、ちょっと試してみました。ネットで検索すると腐るほど情報出てきますが、これまた自分へのメモに残しておきます。 今回は、プログラム(通称宇宙語)ばかりなので、必要な人だけ続きを読むをクリックください。
Raspberry PiとArduino間でUSB経由のシリアル通信 - karaage. [からあげ] - karaage. [からあげ]
モバイルバージョンを終了