*

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

関連記事

raspberry-pi

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

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

記事を読む

no image

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

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

記事を読む

raspberry-pi

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

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

記事を読む

eclipse_oxygen

Linux/EclipseでRaspberryPiのクロス環境を構築してみた…がっ!

どもです。 前回のエントリでは、WindowsにRaspberryPi3のクロスコンパイル環境の構

記事を読む

eclipse_oxygen

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

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

記事を読む

raspberry-pi

libpigpioでのRaspberryPi3とArduinoのSPI通信

どもです。 今回は、libpigpioを使用してRaspberryPi3とArduinoでSPI通

記事を読む

eclipse-juno-logo

C言語でEV3開発(1)

どもです。 2回目の投稿。 本格的な投稿としては、初めての投稿になります。 内容は、LEG

記事を読む

no image

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

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

記事を読む

eclipse_4.3_kepler

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

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

記事を読む

Arduino_Logo

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

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

記事を読む

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
Arduino nano(中華版)をセットアップしてみた

どもです。 突然ですが、「Arduino nano」互換(なのか?)

raspberry-pi
libpigpioでのRaspberryPi3とArduinoのSPI通信

どもです。 今回は、libpigpioを使用してRaspberryP

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は

→もっと見る

PAGE TOP ↑