*

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

ではっ!!

関連記事

MY_MFC_LOGO

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

どもです。 前回、Enterキー/ESCキーでダイアログが閉じられることを回避する方法を記載しまし

記事を読む

think_about_utest

VisualStudioで実行した単体テストの結果の出力(3)-テスト実行からレポート生成までをツールで自動化

どもです。 前々回、前回と、VisualStudio/C#での単体テストの効率化について書いて

記事を読む

no image

RaspberryPiのOS:RaspbianをNOOBSでセットアップしてみた

どもです。 今回の内容は、「今更!?」ですがNOOBSでRaspbianをセットアップしたとい

記事を読む

Arduino_Logo

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

どもです。 突然ですが、「Arduino nano」互換(なのか?)の中華ボードを手に入れました。

記事を読む

eclipse_4.3_kepler

eclipse/CDTにおけるgdbでのデバッグ中に発生するpythonのエラー

どもです。 今回のエントリーは、Eclipse上でのデバッグの際に「pythonのエンコードエラー

記事を読む

image027

気圧センサを使ってみた-RaspberryPi/pigpioでMPL115A1

どもです。 前回は、DHT11をRaspberryPi/pigpioで使用、温度を測定してみました

記事を読む

SEN0193_0114_eye_catch

土壌湿度センサーの出力値の比較:SEN0114とSEN0193

どもです。 今回も、センサーの性能、測定結果を比較してみた結果について書きます。 1.比較し

記事を読む

iot_at_home_eye_catch

IoT開発(2)-ESP-WROOM-02で気温測定

どもです。 この記事は、IoT開発(1)-ESP-WROOM-02のセットアップからの続きです

記事を読む

google_test_top

C言語でEV3開発(5)

どもです。 今回のエントリーは、前回のエントリーでちくっと触れた、「単体テスト」について、です。

記事を読む

think_about_utest

middle_unit
最小…よりも(ほんの)少し大きいテストフレームワーク

どもです。 今回は、単体テストのフレームワークについて書きます。 1.最小のフレームワーク

記事を読む

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

c_sharp_eye_catch
セルに「取り消し線」が設定されているかを判定してみた

どもです。 前回、前々回と、エクセルのセル内の文字列から、「取り

c_sharp_eye_catch
セル内の「取り消し線で消された文字列」の削除を簡単にしてみた

どもです。 前回、C#/OpenXmlを用いて、エクセルのセル内

c_sharp_eye_catch
セル内の「取り消し線で消された文字列」を削除してみた

どもです。 今回は、C#/OpenXmlの組み合わせで、エクセル

c_sharp_eye_catch
C#でバッファの内容を表示する処理を実装してみた-
データ型に従って動的に書式を設定する

どもです。 最近、C#でバッファ/配列の値をコンソールに表示した

arduino_relay_switch_003_self_preservation_circuit_eye_catch
Arduinoでリレースイッチ(3)-自己保存回路

どもです。 前回の記事で、リレースイッチ「AE-G5V-DRV」

→もっと見る

PAGE TOP ↑