*

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

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

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

前回のエントリでは、pigpio(ライブラリ)を使用して、RaspberryPi3でSPI通信/ループバックを行いました。
今回のエントリではコレを少し発展させて、他のデバイス(今回はシフトレジスタ)と通信を行います。

1.「他のデバイス」の選択とその理由
選択したデバイスは、「74HC595」というシフトレジスタです。
NXP製のもので、データシートはココにあります。
また、このシフトレジスタを選んだ理由は、「コレしか手元になかった」からです。
えぇ。
哀しい理由です。

2.シフトレジスタって?
そもそも「レジスタ」とは、「数値や計算指令を表す一連の2進数字の記憶装置」のことです。
そして、「シフトレジスタ」とは「フリップフロップを並べたレジスタに、適当な論理回路を付加して、桁折信号(シフトパルス)が入力されるたびに記憶した内容が右、または左に1ビットシフトしていくようにしたもの」です。

今回使用したシフトレジスタは、8ビット出力となっています。
入力した8ビット(1バイト)データを、2進数で各出力ピンから出力します。

3.RaspberryPi3でシフトレジスタを使用するために
SPI通信でシフトレジスタを使用するためには、シフトレジスタの信号(CLK、MISO、MOSI)に加えて、STCP、OE、MRの信号が必要になります。
そのため、GPIOを用いてこれらの値を入力します。
今回は、下記のようにGPIOピンとシフトレジスタの信号を対応させています。

Index74HC595RaspberryPi3
1OEGPIO_14
2STCPGPIO_15
3MRGPIO_18

上記のGPIOピンについては、初期化の際に「出力モード」に設定を行います。
特にSTCは、入力したデータをストレージレジスタに入力する、あるいはストレージレジスタの内容をクリアするために、一番操作する信号です。
即ち、SPI通信でデータをシフトレジスタに送信した後にSTCPを立ち上がらせることで、初めてストレージレジスタにデータが入力/蓄積、各ピンから出力されます。

4.やってみよう
今回RaspberryPi3でのSPI通信で試してみることは、「0~255(0xFF)までの値をLEDで2進数表示する」ことにします。
まずは、回路設定を下記に示します。
先に示しましたシフトレジスタのピンのGPIOの対応表に合わせて、配線を行います。

SPIgpioCommSample_001_bread_board

試してみたコードは、下記の通り。

このコードでは、前回同様SPIのピンは特に設定をしていません。
(SPI設定として使用するチャンネルには「0」、モードは「0」、クロックは1MHzという設定だけは必要です。)
しかし、シフトレジスタ操作のために必要なGPIOピンについては、設定が必要です。
コレを行っているのが、116~127行目です。

また、LEDでの2進数表記したい値については、gpioライブラリのspiXfer()を使用して送信しています(158行目)。
送信した値をシフトレジスタから出力するためのSTCPの立ち上がりは、gpioWrite()を使用して実現しています。
なお、STCPについては立ち上げた直後にLOWに戻しています。
これは、次回の立ち上げのための準備です。
このタイミングで戻す必要はないのですが、立ち上げたままにしておく必要はないので、LOWに戻しています。
そして、送信したデータが正しく出力されているかの確認のために、シフトレジスタからの出力をspiRead()で読み出しています(179行目)。

シフトレジスタの振る舞いとして、STCPの立ち上げが検知されるたびに、シフトレジスタに設定された値が1ビット(上位ビット方向に)シフトされます。
従って、シフトレジスタからデータを出力する前に、一度シフトレジスタに設定された値をクリアする必要があります。
このための手続きは、シフトレジスタごとに異なっている可能性があります。
(他のレジスタは調べていません…)
今回使用しているシフトレジスタでは、OEおよびMRがLOWの状態でSTCPをLOWからHIGHに変化させることで、シフトレジスタの値をクリアできます(152~156行目)。

5.やってみた
やってみましたが、今回写真や動画はありません。
すみません。

以上、今回のエントリでは、RaspberryPi3からSPI通信を使用して他のデバイスへデータを送信する、ということをしてみました。
次回は、SPI通信を使用して他のデバイスから値を読み出すことに挑戦しようと考えています。

関連記事

toppers

C言語でEV3開発(20)-超音波センサと安全状態

どもです。 前回は、BluetoothでPCとEv3を接続してコマンドの送受信について書きました。

記事を読む

iot_raspberrypi_gateway_001_eye_catch

IoT開発(9)
RaspberryPiをIoTゲートウェイにする(III)
MariaDBのセットアップ

どもです。今回のエントリは、以下のエントリの続きです。 IoT開発(7)RaspberryPiをI

記事を読む

Arduino_Logo

1台のarduinno nanoで割込みとSPIの同時使用

どもです。 先日手に入れたArduino nano(中華)で遊んでいます。 今回、この1台のAr

記事を読む

EF_GRY-OR_png

Eclipseで単体テストするときの注意点(?)

どもです。 今回のエントリは、Eclipse/cygwinで単体テストを行う際にハマってしまっ

記事を読む

iot_raspberrypi_gateway_001_eye_catch

IoT開発(7)
RaspberryPiをIoTゲートウェイにする(II)
VM上の開発環境にWEBサーバーをインストール

どもです。 このエントリは、前回の続きです。 今回は、前回のエントリで作成したVM上のRaspb

記事を読む

RasPi_Qt

QtでRaspberryPi/GUI開発(4):イベントハンドラの設定

どもです。 前回のエントリーで、「タッチスクリーンを買った」と書きました。 今回からは、このタッ

記事を読む

RasPi_Qt

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

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

記事を読む

c_sharp_eye_catch

Windowsでのカバレッジ測定-OpenCoverageを使ってみた

どもです。 以前、OpenCppCoverageを使用してWindows上でカバレッジ測定する方法

記事を読む

MY_MFC_LOGO

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

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

記事を読む

MY_MFC_LOGO

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

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

記事を読む

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 ↑