*

libpigpioでのRaspberryPi3とArduinoのSPI通信

公開日: : C言語, pigpio, RaspberryPi, 開発

どもです。
今回は、libpigpioを使用してRaspberryPi3とArduinoでSPI通信をしてみたので、それについて記載します。

調べてみると、libpigpioを使用してRaspberryPi3とArduinoでSPI通信を実施している「C言語の」情報が見つからなかったので、同じようなことに挑戦している、うまくいかないと悩んでいる方の参考になればよいです。

1.通信の構成
今回のエントリではRaspberryPi3をマスタに、ArduinoをスレーブにしたSPI通信に設定して通信します。
具体的な構成は、下記の通りです。

RaspberryPi3マスタ
Arduino UNOスレーブ
SPIのシステムクロック125kHz

また、RaspberryPi3とArduinoのピンの対応も示します。
RaspberryPi3-Arduino
SCLKDigital_13
MISODigital_12
MOSIDigital_11
SPI0_CE0Digital_10

2.開発環境とかデバイスのスペックとか

(HW)
CPU:Intel(R) Core(TM) i7-3770L 3.5GHz
メモリ:16.0(GB))

(SW)
OS:Windows7 Professional SP1 (64bit)
Eclipse:
Version:Oxygen.3a Release (4.7.3a)
Build id:20180405-1200

HW:Raspberry Pi 3 model B
OS:Stretch – [2018-04-18-raspbian-stretch]
Lib:libpigpio(※Stretchに予めインストールされていたライブラリ)

HW:Arduino UNO

4.何を通信する?
まずはシンプルに、「1バイトずつ送受信する」というものにしてみました。

3.Arduino側の実装
今回は、Arduinoをスレーブに設定しています。
スレーブ側では、受信した値に+1した値を返します。
マスター側からの送信については、割込みで検知します。
また、ArduinoのSPIクロックは、ビシッと値を指定できません。
「何分周にするか」という形式で指定します。
指摘できる値(分周値)は、2、4、8、16、32、64、128のいずれかで、デフォルトでは、4分周です。
対応する値として、SPI_CLOCK_DIV2~SPI_CLOCK_DIV128というマクロが定義されています。
各マクロの値と、SPIシステムクロックの値を、下記に示します。

SPIクロックのマクロ SPIクロックの値
SPI_CLOCK_DIV28MHz
SPI_CLOCK_DIV44MHz
SPI_CLOCK_DIV82MHz
SPI_CLOCK_DIV161MHz
SPI_CLOCK_DIV32500kHz
SPI_CLOCK_DIV64250kHz
SPI_CLOCK_DIV128125kHz

今回は、最遅速で「SPI_CLOCK_DIV128」を適用します。

では、コードです。

個人的に「肝(鬼門?)」だったのは、

の部分です。
実は、コレに気がつくまでに結構な時間をかけてしまいました。
Arduino UNOのSPIは、SPCR(SPI Control Register)に設定します。
特に、マスタ/スレーブの設定は、このレジスタ上のMSTR(Master/Slave Select:4bit目)で行います。
スレーブに設定するためには、このレジスタ/bitをLOWに設定します。
この設定を行わない場合、Arduinoはマスタ設定になります。

4.RaspberryPi3側の実装
RaspberryPi3に至っては、実にシンプル。
データの送信と受信は、pigpioのspiXfer()で実施します。

で、実際のコードは下記。

先頭の方で、色々defineしていますが、これらのほとんどは実は使用していません。
でも、このコードをコピーした人が色々いじってみる際に少しでもやりやすくなれば、と思い残したままにしています。
「ツカワネーヨ」って方は…ま、気にせず無視して下さい。

5.通信した結果
上記プログラムを、RaspberryPi3で実行、通信をした結果が、下記です。

1回目の受信した値が「0x33」となっているのは、2回目の実行だからです。
今回のSPI通信は、全二重で行われています。
最初に書きましたが、この方式では送信と受信が同時に行われます。
そのため、マスタであるRaspberryPi3からデータを送信すると、同時にArduinoからもデータが送信されます。
このときArduinoから送信される値というのは、SPIのデータレジスタ(SPDR)が保持している値です。
即ち、「前回の通信の際にSPDRに設定された値」ということになります。
そのため、前回の最後の通信でSPDRに設定された[0x33」が、次回実行実行時の一番最初にArduinoから送信、RaspberryPi3が受信します。

この仕組み、データの流れを詳しく説明した図がこちら(http://avrbeginners.net/architecture/spi/spi.html)にあったので、参考にしていただければと思います。

以上、今回は、C言語/libpigpioでのRaspberryPi3/Arduino間でのSPI通信について記載しました。
これで、Arduinoでセンサーのアナログ値を取得、物理値に変換して、その結果をRaspberryPi3で表示する、ということができるようになりました。

できることが、また1つ増えたぞ!

ではっ!!

関連記事

RasPi_Qt

QtでRaspberryPi/GUI開発(8):pigpioを使用したチャタリング対策の問題の対策

どもです。 だいぶ、間が空いてしまいました。 久しぶりの更新です。 前回のエントリーで、「

記事を読む

eclipse-juno-logo

C言語でEV3開発(1)

どもです。 2回目の投稿。 本格的な投稿としては、初めての投稿になります。 内容は、LEG

記事を読む

no image

C言語でEV3開発(7)

どもです。 今回のエントリーでは、いよいよEV3を動かしていきます。 新しい環境に対して、最もよ

記事を読む

toppers

C言語でEV3開発(16)-TOPPERS/HRP2 EV3 で Bluetooth割込み

どもです。 今回は、EV3 の環境をTOPPERS/HRP2 EV3RT で作成したアプリをPC上

記事を読む

raspberry-pi

RaspberryPiで物体検出(2)-白線検出への挑戦(2):輪郭検出による白線検出(実機編)

どもです。 今回は、前回に引き続きOpenCvを用いて道路の白線検出について、です。 1.今

記事を読む

toppers

C言語でEV3開発(26)-EV3で機械学習(1)-QLearningをC#に委譲してみた

どもです。 前回の投稿では、Q-LearningをEV3本体に実装してみたら、メモリが足りなくて動

記事を読む

toppers

C言語でEV3開発(24)-APIの実行時間を測定してみた。

どもです。 今回、以前から気になっていた、開発環境/プラットフォームであるTOPPERS HRP2

記事を読む

raspberry-pi

RaspberryPi3を購入しました

どもです。 突然ですが、「Raspberry Pi3 model B」を購入しました。 今回のエ

記事を読む

no image

C言語でEV3開発(14)-opOUTPUT_TIME_SPEEDコマンド

どもです。 今回のエントリーは、モーターを動かすコマンドである「opOUTPUT_TIME_SPE

記事を読む

no image

C言語でEV3開発(8)-opOUTPUT_POWERコマンド

どもです。 今回のエントリーでは、EV3でモーターを動かします。 なお、今回のエントリーでも

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Arduino_Logo
Arduino nano(中華版)をセットアップしてみた

どもです。 突然ですが、「Arduino nano」互換(なのか?)

raspberry-pi
libpigpioでのRaspberryPi3とArduinoのSPI通信

どもです。 今回は、libpigpioを使用してRaspberryP

RasPi_Qt
QtでRaspberryPi/GUI開発(10)-SPI通信をしてみた(その3)

どもです。 えー。 「Qtで…」とか書いておきながら、今回もやっぱ

RasPi_Qt
QtでRaspberryPi/GUI開発(10)-SPI通信をしてみた(その2)

どもです。 えー。 「Qtで…」とか書いておきながら、今回もやっぱ

raspberry-pi
QtでRaspberryPi/GUI開発(9)-SPI通信をしてみた

どもです。 えー。 「Qtで…」とか書いておきながら、今回はQtは

→もっと見る

PAGE TOP ↑