*

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

公開日: : 最終更新日:2019/01/30 C言語, pigpio, RaspberryPi, 開発

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

今回のエントリでは、RaspberryPi3とpigpio(ライブラリ)を使用してSPI通信をしてみました。
SPI通信に触るのが久しぶり、pigpioを使ってのSPI通信については初めてになります。
また、調べた範囲ではpigpioを使用したRaspberryPi3のSPI通信についての情報は、あまり見つかりません。
なので、同じように困ってる(?)方の助けになればと思い、エントリを書いてみます。

最初は「ループバック」から挑戦です。

1.SPI通信って?
はい。
そもそも、という話です。
「Serial Peripheral Interface」の略称で、同期式シリアル通信の1つです。
細かい説明は、ネットや書籍の情報に任せることにして、ここでは詳細な説明はしません。
今回のエントリでは、「同期式の通信方法」くらいに覚えておけばよいかと考えます。

2.RaspberryPi3でのピン配置は?
SPI通信で使用するピンについて、RaspberryPi3では下記のように配置されています。

  • SCLK → 23番(GPIO-11)
  • MOSI → 21番(GPIO-9)
  • MISO → 19番(GPIO-10)
  • CE0 → 24番(GPIO-8)
  • CE1 → 26番(GPIO-7)

各ピンの配置についてSCLK、MOSI、およびMISOについては、「ALT0」モードでの動作になります。

なお、これらのピン配置については、RaspberryPi3のコマンドライン上で

と入力することで、確認できます。
分かりやすい表が、コマンドライン上に表示されます。

3.pigpioの設定
前の段で、RaspberryPi3のピン配置が分かりました。
次は、pigpioを用いてピンの設定をする必要があります。
と思ったら、pigpioでは「spiOpen()」を実行することで、必要なピン設定は行われるようです。
ただし、この関数では別の設定が必要なようです。
即ち、「通信速度」と「モード」です。

「通信速度」については[bits per second]単位の値を、「モード」については極性とかフェーズとかによって、「0」から「3」まで選択されます。
このモードの設定に従って、信号の出力と読込みのタイミングが変化します。
この「モード」とデータの振る舞いについてはココの内容が詳しくて、分かりやすいかと思います。

少し具体的にすると、以下の手順で設定します。
①:gpioInitialise() – ライブラリを初期化する。
②:spiOpen() – SPI通信の設定を行いつつ、通信ハンドラを取得する。

なお、終了時は
①:spiClose() – SPI通信の設定を解除する。
②:gpioTerminate() – ライブラリを終了する。

の順番で関数を呼び出す必要があります。

4.pigpioでの送受信
pigpioを使用して実際にデータの送受信を行う場合、を使用します。
この関数では、指定されたバッファの規定されたサイズ(バイト)のデータを送信し、また受信したデータを指定されたバッファに格納します。
即ち、データの送受信を一気に実施してくれます。
pigpioには、送信/受信それぞれのためにspiReadspiWriteが用意されています。
spiXferという関数も用意されています。
この関数は、データの送受信を1つの関数の中で実施してくれます。
今回は、この「spiXfer」を使用します。

5.実装してみた
今回のループバックの実験では、下記のコードを実装しています。

このコードは、下記のようにビルドします。

H/W的には、19番(GPIO-10)と21番(GPIO-9)のピンを短絡しておいて下さい。

ピンを短絡した状態でビルドしたファイルを実行すると、送信したデータをそのまま受信する、という動作になります。

今回のエントリでは、ループバックテストになりますが、RaspberryPi3でのSPI通信の手順および方法について記載しました。
次回は、SPI通信で実際に他のデバイス/センサーなんかと通信をしてみようと思います。

またQtを使わない…可能性が大いにあります。

ではっ!

参考にしたサイト

・pigpio – http://abyz.me.uk/rpi/pigpio/index.html
・ArduinoでSPI通信を行う方法 – http://stupiddog.jp/note/archives/976

2019/01/30 更新
文言を色々修正しました。

関連記事

python

VisualStudioCommunityでのPython開発環境構築

どもです。 最近、VisualStudioでのPython開発を始めました。 その際の環境構築に

記事を読む

google_test_top

C言語でEV3開発(5)

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

記事を読む

Qt_logo_2016

QtでRaspberryPi/GUI開発(2):ためしに時計を作ってみた(其の弐)

どもです。 前回のエントリーでは、ラジオボタンのグループ化と、選択されたボタンの特定方法まで記載し

記事を読む

raspberry-pi

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

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

記事を読む

raspberry-pi

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

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

記事を読む

eclipse_4.3_kepler

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

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

記事を読む

no image

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

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

記事を読む

no image

C言語でEV3開発(11)-opOUTPUT_STEP_POWERコマンド

どもです。 今回のエントリーでは、再びモーターを動かすためのコマンドについて書きます。 コマンド

記事を読む

toppers

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

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

記事を読む

toppers

C言語でEV3開発(27)-EV3にヒステリシス処理を実装してみた

どもです。 今回は、モーターから読み出した値に対するヒステリシス・フィルター処理です。 0.

記事を読む

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

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は

GitHub
GitHubのFreeプランでのPrivate Repository数が無制限になったので試してみた

どもです。 年明けに、「おっ♪」と思うようなニュースがありました。

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

どもです。 だいぶ、間が空いてしまいました。 久しぶりの更新です。

→もっと見る

PAGE TOP ↑