*

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

ではっ!!

関連記事

no image

Windows-QtCreatorでのデバッグ

どもです。 更新の間隔が空いてしまいました。 久しぶりの更新です。 最近、Qtを触り始めま

記事を読む

no image

C言語でEV3開発(9)-opOUTPUT_SPEEDコマンド

どもです。 今回のエントリーでは、前回に引き続きEV3のモーターを動かしていきます。 ただし、単

記事を読む

RasPi_Qt

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

どもです。 えー。 「Qtで…」とか書いておきながら、今回もやっぱりQtは出てきません。 そろ

記事を読む

eclipse_oxygen

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

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

記事を読む

no image

Windows/EclipseでRaspberryPiのクロス環境を構築してみた

どもです。 今回は、Windows/EclipseでRaspberry Piのクロス環境を構築した

記事を読む

no image

C言語でEV3開発(17)-コマンドによるTOPPERS/HRP2 EV3RT アプリケーションの制御(コントロール)

どもです。 今回は、TOPPERS/HRP2 EV3RT で作成したアプリをPC上から操作するため

記事を読む

eclipse_cdt_top_100

C言語でEV3開発(3)

どもです。 今回のエントリーの内容は、前回まででセットアップした環境で、実際にEV3上で動く実行フ

記事を読む

raspberry-pi

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

どもです。 前回のエントリーで、pigpioを使用したチャタリング対策について記載しました。 今

記事を読む

Splash

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

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

記事を読む

no image

C言語でEV3開発(21)-モーター出力の制御

どもです。 前回は、超音波センサから前方障害物との距離を取得し、それを元に安全状態を判断する、とい

記事を読む

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="">

MY_MFC_LOGO
MFCプログラミング(4):Enter(ESC)キーでダイアログが閉じないようにするための設定

どもです。 前回、Enterキー/ESCキーでダイアログが閉じられる

MY_MFC_LOGO
MFCプログラミング(4):Enter(ESC)キーでダイアログが閉じないようにする

どもです。 今回は、キーボード入力の処理、特にEnterキー/ESC

MY_MFC_LOGO
MFCプログラミング(3):クリップボードへのデータ形式の登録

どもです。 今回も、クリップボードネタです。 1.背景(簡単に

MY_MFC_LOGO
MFCプログラミング(2):コピー機能の実装

どもです。 前回に引き続き、今回もMFCネタです。 内容は、MFC

MY_MFC_LOGO
MFCプログラミング(1):CFileまたはCStdioFileクラスを使用してファイル出力

どもです。 突然ですが、仕事でMFCを使用することになりました。

→もっと見る

PAGE TOP ↑