MochiuWiki : SUSE, EC, PCB
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
Arduinoの基礎 - 74HC595のソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
Arduinoの基礎 - 74HC595
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == シフトレジスタを使用すると、少ない出力ピンで多くの出力を制御することが可能になる。<br> ここでは、シフトレジスタ(74HC595))とArduino UNOを使用して、8個のLEDを制御する方法を記載する。<br> <br> 以下のように、8個のLEDを順番に点灯させる。<br> LEDをシフトレジスタに接続して、シフトレジスタの制御用に3本のGPIOを使用する。<br> <br><br> == シフトレジスタ(74HC595)のピン配置 == シフトレジスタ(74HC595)のピン配置は次の通りである。<br> [[ファイル:Arduino 74HC595 1.png|フレームなし|中央]] <br> V<sub>CC</sub>は16番ピン、GNDは8番ピンである。<br> <br> デジタル出力は、Q<sub>A</sub>からQ<sub>H</sub>の8本、ピン番号はQ<sub>A</sub>から順に、15、1、2、...、7である。ここに、8個のLEDと電流制限用の抵抗を接続する。<br> <br> 9番ピンのQ<sub>H'</sub>は、カスケード用のシリアル出力である。(ここでは使用しない)<br> カスケード接続については、後述のセクション"シフトレジスタ(74HC595)のカスケード接続"を参照すること。<br> 74HC595を2個カスケード接続(数珠つなぎ)にして、16個のLEDを制御する方法を記載している。<br> <br> 14番ピンのSERは、シリアルデータ入力である。このピンを使用して、Arduinoから8ビットのデータを入力する。<br> 後述のセクションに記載しているが、Arduinoのプログラムにおいて、shiftOut()関数に1バイトのデータを渡すだけである。<br> <br> 12番ピンのRCLK(ストレージ・レジスタ・クロック)は、ラッチ制御用である。データのセット前にLowにして、変更を有効化する時にHighにする。<br> <br> 11番ピンのSRCLK(シフト・レジスタ・クロック)は、74HC595内部のDタイプストレージレジスタにデータをセットするためのクロックである。<br> なお、SRCLKとRCLKは、両方ともポジティブエッジトリガである。(クロックの立ち上がりでレジスタに値がセットされる)<br> <br> 13番ピンは、OE(Output Enable)ピンである。Lowの時に出力が有効になる。<br> ここでは、常に有効するのでGNDに接続する。<br> <br> 10番ピンはSRCLR(シリアルクリア)である。このピンをLowにセットすると直ちに出力をクリアできる。<br> ここでは、5[V]に接続して常にHighにする。<br> <br> <u>'''※備考'''</u><br> '''ピン名の上にバーが記述されている時は、アクティブ・ローを意味する。'''<br> '''これは、Lowの時にそのピンの機能が有効になるということである。'''<br> <br><br> == シフトレジスタ(74HC595)の使用 == このセクションでは、Arduinoからシフトレジスタ(74HC595)を使用して、8個のLEDを点灯・消灯させる。<br> <br> ===== 回路図 ===== Arduinoからシフトレジスタ(74HC595)を介して8個のLEDを制御するためには、74HC595の出力ピンQ<sub>A</sub>からQ<sub>H</sub>にLEDを接続する。<br> [[ファイル:Arduino 74HC595 2.png|フレームなし|中央]] <br> 電流を制限するために、ここでは、470[Ω]の抵抗を接続している。<br> <br> Arduinoとの接続では、3つのGPIOを使用する。(ここでは、 8番ピン〜10番ピンを使用する)<br> Arduinoの8番ピン(D8)は、74HC595のSER(14番)と接続する。(SERはシリアルデータ入力ピン)<br> Arduinoの9番ピン(D9)は、74HC595のRCLK(12番)を接続する。(RCLKはラッチ)<br> Arduinoの10番ピン(D10)は、74HC595のSRCLK(11番)を接続する。(SRCLKはクロック)<br> <br> その他は、電源、OE、SRCLR、GND等を5[V]およびGNDに接続する。<br> <br> ===== シフトレジスタ(74HC595)に8ビットデータの入力 ===== 74HC595の8個の出力を制御するためには、1バイト(8ビット)のデータをSERピンに入力する。<br> この8ビットがそれぞれQ<sub>A</sub>からQ<sub>H</sub>までの8個の出力のオン / オフを決める。<br> <br> シフトレジスタにデータをセットするためには、shiftOut()関数を使用する。<br> この時、shiftOut()関数を呼ぶ前に、ラッチ(RCLK)をLowにセットする。<br> shiftOut()関数の呼び出し後にラッチ(RCLK)をHighにセットすることで出力が有効になる。<br> <syntaxhighlight lang="c++"> const int PIN_SER = 8; const int PIN_LATCH = 9; const int PIN_CLK = 10; void setup() { pinMode( PIN_SER, OUTPUT ); pinMode( PIN_LATCH, OUTPUT ); pinMode( PIN_CLK, OUTPUT ); byte b = B11000000; digitalWrite(PIN_LATCH, LOW); shiftOut(PIN_SER, PIN_CLK, LSBFIRST, b); digitalWrite(PIN_LATCH, HIGH); } void loop() { } </syntaxhighlight> <br> 上記の例では、セットするデータとしてB11000000としている。(以下のように、10進数で初期化しても同様)<br> <syntaxhighlight lang="c++"> byte b = (byte)192; // B11000000 or 0xC0 と同じ </syntaxhighlight> <br><br> == シフトレジスタにおけるデータの並び(MSBFIRSTとLSBFIRST) == <code>B11000000</code>をセットする場合、出力Q<sub>A</sub>からQ<sub>H</sub>のどこがHighになり、どこがLowになるのだろうか。<br> これは、shiftOut()関数を呼ぶ時に渡すフラグで変わる。<br> <br> <code>B11000000</code>と記述する時、左端のビットをMSB、右端のビットをLSBという。<br> shiftOut()関数の引数は、第1引数から順に、シリアルデータ入力ピン番号、シフトレジスタクロックピン番号、ビット順、値である。<br> ビット順は、<code>MSBFIRST</code>または<code>LSBFIRST</code>のいずれかを指定する。<br> <br> 例えば、値が<code>B11000000</code>、ビット順が<code>LSBFIRST</code>である場合、LSBの0から入力されて、最初にQ<sub>A</sub>にセットされる。<br> 次のクロック(の立ち上がり)において、Q<sub>A</sub>にセットされていた出力がQ<sub>B</sub>にシフトし、新しく入力された最下位ビットから数えて2番目の0がQ<sub>A</sub>にセットされる。<br> 次のクロックで、Q<sub>B</sub>の値はQ<sub>C</sub>へ、Q<sub>A</sub>の値はQ<sub>B</sub>へ、と1つずつシフトしていく。<br> こうして最終的に、Q<sub>A</sub>、Q<sub>B</sub>、...、Q<sub>H</sub>それぞれに、1、1、0、0、0、0、0、0が順番にセットされることになる。<br> [[ファイル:Arduino 74HC595 3.png|フレームなし|中央]] <br> ビット順に<code>MSBFIRST</code>を指定する場合は、MSBからデータが入力されるので、<code>LSBFIRST</code>の場合と逆の順番になる。<br> [[ファイル:Arduino 74HC595 4.png|フレームなし|中央]] <br> このように、シリアルで入力してパラレルで出力を取り出せるタイプを、SIPO(Serial-In Parallel-Out)シフトレジスタという。<br> [[ファイル:Arduino 74HC595 5.png|フレームなし|中央]] <br><br> == 8個のLEDを順番に点灯させるサンプルコード == このセクションでは、左から右へLEDが流れるように光るサンプルコードを記述する。<br> 以下の例では、点灯するLEDのパターンをbyte型配列で設定して、その配列の要素の値を順番に<code>shiftOut()</code>関数でシフトレジスタにセットしている。<br> <syntaxhighlight lang="c++"> const int PIN_SER = 8; const int PIN_LATCH = 9; const int PIN_CLK = 10; byte patterns[] = { B00000000, B10000000, B11000000, B11100000, B11110000, B11111000, B01111100, B00111110, B00011111, B00001111, B00000111, B00000011, B00000001, B00000000 }; void setup() { pinMode( PIN_SER, OUTPUT ); pinMode( PIN_LATCH, OUTPUT ); pinMode( PIN_CLK, OUTPUT ); } void loop() { for ( int i=0; i<sizeof(patterns)/sizeof(byte); i++ ) { digitalWrite( PIN_LATCH, LOW ); shiftOut( PIN_SER, PIN_CLK, LSBFIRST, patterns[i] ); digitalWrite( PIN_LATCH, HIGH ); delay(200); } } </syntaxhighlight> <br><br> == シフトレジスタ(74HC595)のカスケード接続 == このセクションでは、2個の74HC595をカスケード接続することにより、16個のLEDをオン / オフする方法を記載する。<br> <br> 74HC595のカスケード接続には、9番ピン(カスケード用シリアル出力)を使用する。<br> 前段の74HC595の9番ピン(カスケード用シリアル出力)を、後段の74HC595の14番ピン(シリアルデータ入力)に接続する。<br> これにより、前段の74HC595のSER(シリアル入力)から入力されたデータが、カスケード接続された後段の74HC595に次々と伝達される。<br> <br><br> == 2個のシフトレジスタ(74HC595)をカスケード接続して、16個のLEDを制御する == 2個の74HC595を使用して、16個のLEDをオン / オフする場合、下図のように接続する。<br> [[ファイル:Arduino 74HC595 6.png|フレームなし|中央]] <br> その他の接続は、上記セクションの場合と同様である。<br> この場合も、Arduinoからの出力で必要になるのは、データ、ラッチ、クロックの3つの出力だけである。<br> <br> Arduinoのプログラムを以下のように記述する。<br> <syntaxhighlight lang="c++"> const int PIN_SER = 8; const int PIN_LATCH = 9; const int PIN_CLK = 10; void setup() { pinMode( PIN_SER, OUTPUT ); pinMode( PIN_LATCH, OUTPUT ); pinMode( PIN_CLK, OUTPUT ); byte b1 = B11010001; byte b2 = B00110011; digitalWrite(PIN_LATCH, LOW); shiftOut(PIN_SER, PIN_CLK, LSBFIRST, b2); shiftOut(PIN_SER, PIN_CLK, LSBFIRST, b1); digitalWrite(PIN_LATCH, HIGH); } void loop() { } </syntaxhighlight> <br> 下図左が前段のシフトレジスタ(74HC595)で、下図右が後段のシフトレジスタ(74HC595)である。<br> 前段のシフトレジスタ(74HC595)はArduinoからシリアルデータ入力されて、後段のシフトレジスタ(74HC595)の入力は前段のシフトレジスタのカスケード用シリアル出力に接続している。<br> また、LEDの配置はQ<sub>A</sub>からQ<sub>H</sub>が左から右に並ぶように配線している。<br> [[ファイル:Arduino 74HC595 7.png|フレームなし|中央]] <br> プログラムのデータ書き込み部分を見ると、最初に1バイトのデータ変数<code>b2</code>を<code>LSBFIRST</code>のビット順で入力している。<br> 続いて、1バイトのデータ変数<code>b1</code>を入力している。<br> このため、先に入力された変数<code>b2</code>のデータ<code>B00110011</code>が、後段のシフトレジスタにセットされる。<br> また、後に入力した変数<code>b1</code>のデータ<code>B11010001</code>が前段のシフトレジスタにセットされる。<br> <br> LSBFIRSTのビット順なので、プログラムに記載したB11010001とB00110011がそのままLEDのオン(1がON)、オフ(0がOFF)となる。<br> <syntaxhighlight lang="c++"> byte b1 = B11010001; byte b2 = B00110011; digitalWrite(PIN_LATCH, LOW); shiftOut(PIN_SER, PIN_CLK, LSBFIRST, b2); shiftOut(PIN_SER, PIN_CLK, LSBFIRST, b1); digitalWrite(PIN_LATCH, HIGH); </syntaxhighlight> <br><br> __FORCETOC__ [[カテゴリ:Arduino]]
Arduinoの基礎 - 74HC595
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse