*

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つ増えたぞ!

ではっ!!

関連記事

toppers

C言語でEV3開発(19)-コマンド通信処理でEchoBackしてみた

どもです。 前回は、Bluetoothの接続状態の変化に伴う、状態遷移について書きました。 今回

記事を読む

no image

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

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

記事を読む

MindStormControl_SprachScreen

EV3開発サポートツール(1)-C#のユーザーコントロール開発

どもです。 突然ですが、今回はC#に関するエントリになります。 具体的には、C#/WPFで、独自

記事を読む

Splash

EV3開発サポートツール(3)-Ev3Controller

どもです。 今回は、以前ちらりと紹介した、Ev3のモーターの出力を調整するアプリケーションについて

記事を読む

toppers

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

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

記事を読む

RasPi_Qt

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

どもです。 前回のエントリーで、pigpioを使用したボタンを使用したLEDの点灯/消灯について書

記事を読む

eclipse_oxygen

Eclipse/CrossCompile環境でプロジェクトをクリーンできない

どもです。 今回は、Eclipseでクロスコンパイル環境を作成した場合、を実行すると「指定されたフ

記事を読む

toppers

C言語でEV3開発(25)-Q_Learningを実装してみた…が!?

どもです。 今回の内容は、「失敗しました」という内容です。 最近、流行になっている深層学習/

記事を読む

toppers

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

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

記事を読む

no image

C言語でEV3開発(4)

どもです。 今回のエントリーは、前回のエントリー内容/Eclipseで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="">

GitHub
C/C++のスタブを自動生成するツールを公開しました

(テーマ) C/C++のスタブを自動生成するツールを公開しました

Arduino_Logo
フォトレジスタを使ってみた-Arduinoで光検出

どもです。 今回は、タイトル通り「フォトレジスタの使い方」です。

no image
PC自作2019 – Windows10への移行

どもです。 突然ですが、PCを交換しました。 1. 何があ

RasPi_Qt
QtでRaspberryPi/GUI開発(12)-gpioの状態をGUIに反映する

どもです。 今回は、gpioピンの状態(HIGH/LOW)の変化を画

raspberry-pi
RaspberryPi起動時にpigpiodがスタートしないようにする

どもです。 これまでpigpioを使用してRaspberryPiから

→もっと見る

PAGE TOP ↑