*

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

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

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

記事を読む

eclipse_cdt_top_100

C言語でEV3開発(3)

どもです。 今回のエントリーの内容は、前回まででセットアップした環境で、実際にEV3上で動く実行フ

記事を読む

eclipse-juno-logo

C言語でEV3開発(2)

どもです。 今回のエントリーの内容は、前回に引き続き「EV3の開発環境の構築」の追記です。

記事を読む

eclipse-juno-logo

C言語でEV3開発(1)

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

記事を読む

no image

C言語でEV3開発(4)

どもです。 今回のエントリーは、前回のエントリー内容/EclipseでEV3の実行ファイルをビルド

記事を読む

RasPi_Qt

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

どもです。 前回のエントリーで、pigpioを使用したボタンを使用したLEDの点灯/消灯について書

記事を読む

toppers

C言語でEV3開発(19)-コマンド通信処理でEchoBackしてみた

どもです。 前回は、Bluetoothの接続状態の変化に伴う、状態遷移について書きました。 今回

記事を読む

google_test_top

C言語でEV3開発(5)

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

記事を読む

toppers

C言語でEV3開発(22)-ロギング機能

どもです。 前回は、モーターの出力を制御する方法について記載しました。その際に、モータ/車体が期待

記事を読む

no image

自宅で電子工作(1):ブレッドボードでの配線を省略する

どもです。 突然ですが、電子工作を始めてみました。 1.背景 これまで、Raspber

記事を読む

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

GitHub
C/C++のスタブを自動生成するツールを公開しました

(テーマ) C/C++のスタブを自動生成するツールを公開しました

Arduino_Logo
フォトレジスタを使ってみた-Arduinoで光検出

どもです。 今回は、タイトル通り「フォトレジスタの使い方」です。

no image
PC自作2019 – Windows10への移行

どもです。 突然ですが、PCを交換しました。 1. 何があ

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

どもです。 今回は、gpioピンの状態(HIGH/LOW)の変化を画

raspberry-pi
RaspberryPi起動時にpigpiodがスタートしないようにする

どもです。 これまでpigpioを使用してRaspberryPiから

→もっと見る

PAGE TOP ↑