*

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通信を使用して他のデバイスから値を読み出すことに挑戦しようと考えています。

関連記事

python

VisualStudioCommunityでのPython開発環境構築

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

記事を読む

eclipse_4.3_kepler

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

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

記事を読む

MY_MFC_LOGO

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

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

記事を読む

raspberry-pi

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

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

記事を読む

no image

QtでRaspberryPi/GUI開発(3):ためしに時計を作ってみた(其の参)-StyleSheetの適用

どもです。 前回のエントリーでは、グループ化されたボタンに対するイベントハンドラについて書きました

記事を読む

OpenCvLogo

OpenCvによる画像サイズ変更

どもです。 最近、カメラの動画をOpenCvで加工する、ということに挑戦し始めました。 しか

記事を読む

MY_MFC_LOGO

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

どもです。 今回は、キーボード入力の処理、特にEnterキー/ESCキーでダイアログが閉じられるこ

記事を読む

no image

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

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

記事を読む

toppers

C言語でEV3開発(28)-EV3の移動距離を計算できるようにしてみた

どもです。 今回は、Ev3の移動距離の算出についてです。 1.算出方法について 移動距離は

記事を読む

RasPi_Qt

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

どもです。 今回は、gpioピンの状態(HIGH/LOW)の変化を画面上に即座に反映する方法につい

記事を読む

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

Arduino_Logo
温度(湿度)センサを使ってみた(1)-ArduinoでDHT11

どもです。 今回は、久しぶりにセンサーを購入して使ってみたので、それ

GitHub
Windowsでのカバレッジ測定-OpenCppCoverageを使ってみた(2)

どもです。 前回のエントリーで、OpenCppCoverageという

GitHub
Windowsでのカバレッジ測定-OpenCppCoverageを使ってみた(1)

どもです。 ここ最近、Windows上で開発を行っています。 その

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

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

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

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

→もっと見る

PAGE TOP ↑