【Raspberry Pi Pico入門 – 20】シフトレジスタを使ってみる
概要
今回はロジックICの1種であるシフトレジスタを使ってみます。
ロジックICとは一言で説明するなら論理演算をするためのICです。電気のHigh/Lowを真/偽と考えたときに「AかつB」「AまたはB」のような論理式の演算をしてくれる回路で、乱暴に例えるならこれを大量に集めてプログラムで動かせるようにしたものがマイコンです。
シフトレジスタとはシリアル形式のデータをパラレル形式に変換するICです。マイコンではGPIO出力を増やすために使われることが多いです。どのような仕組みなのかは後ほど解説しますが、使い方としてはモールス信号のように3本の線のHigh/Lowを繰り返すことで、High/Lowの組み合わせによってICのピンのHigh/Lowが切り替わります。ICのピンにLEDやトランジスタを接続しておけばGPIO出力のように使えます。これにより、3個のGPIOで8個のLEDを制御することが出来ます。
実行環境
IDE:Arduino IDE 2.2.1
MCU:Raspberry Pi Pico
シフトレジスタは74HC595を使います。「74HC595」とはロジックICのタイプ名のようなもので、これが同じなら使い方も同じです。実際の型式には最初に会社名に応じたアルファベットが、最後にICの形状等にかんするアルファベットが追加されます。
例えば東芝製でパッケージ(ICの形状)がDIP-16型だと「TC74HC595AP」です。(アルファベットが何を意味するかはメーカーによって異なります)
回路
以下のように配線します。抵抗は1kΩを使用します。
コーディング
新しくスケッチを作成し、以下の内容をコピペしてください。
/* GPIO設定 */ const int DATA_PIN = 16; const int LATCH_PIN = 17; const int CLOCK_PIN = 18; const byte led_pattern[] = { 0b11000000, 0b01100000, 0b00110000, 0b00011000, 0b00001100, 0b00000110, 0b00000011, 0b10000001 }; int pattern_num = 0; void setup() { pinMode(DATA_PIN, OUTPUT); pinMode(LATCH_PIN, OUTPUT); pinMode(CLOCK_PIN, OUTPUT); pattern_num = sizeof(led_pattern) / sizeof(led_pattern[0]); } void loop() { for (int i = 0; i < pattern_num; i++) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, led_pattern[i]); digitalWrite(LATCH_PIN, HIGH); delay(500); } }
動作確認
LEDバーの光2個が流れるように点灯すれば成功です。
解説
シフトレジスタの仕組み
文章での説明が難しいのでシフトレジスタの動きを回路シミュレータでシミュレーションしてみました。
動画のようにDATAのHigh/Lowを切り替えた後にCLOCKをHighにすることで、Q1~Q7のHigh/Lowが一つシフトします。これを繰り返すことでQ1~Q7の電圧を設定することが出来ます。
理解が難しいときは、CLOCKとDATAをいい感じのタイミングでON/OFFするとQ1~Q7のHigh/Lowが切り替わる、と覚えてください。
今回のシミュレーションではLATCH端子は回路が複雑になるのでシミュレート出来ていないので、何のために使うものなのかだけ解説します。
LATCH端子が無い場合、Q1~Q7のHigh/Low設定中にもHigh/Lowが切り替わってしまい、回路によっては誤作動を起こしてしまいます。そのために動画の回路の後に設定内容を仮置きするような回路をもう一段回路を組み、LATCH端子で変更するタイミングを決めることになります。
LATCH端子がLowのときはDATAやCLOCKに信号を送ってもQ1~Q7のHigh/Lowは変化しません。(仮置き部分のデータは変わっています)全ての設定が終わった後にLATCH端子をHighにすると、仮置きしていた設定をQ1~Q7に設定されます。これにより設定中にQ1~Q7のHigh/Lowが変わることを防げます。
回路図
回路図は以下のようになっています。
スターターキットに入っている「SN74HC595N」のスペックは以下です。小さいLEDくらいなら動かせますが、モーターやリレーを動かすことは出来ません。大電流が必要なケースではトランジスタのON/OFFをシフトレジスタで制御する形にします。
使用電圧 | 2~6V |
最大電流 | 20mA(ピン1本辺り) 75mA(ピン8本の合計) |
コード
shiftOut()がシフトレジスタ制御用の関数です。引数の3つ目までが設定用で、4つ目にどのピンをHighにしたいかを2進数で指定します。
shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, led_pattern[i]);
使うときはまずLATCHをLowにしてからshiftOut()を実行することでQ1~Q2のHigh/Lowを設定します。その後LATCHをHighにすると設定が各ピンに反映されます。
digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, led_pattern[i]); digitalWrite(LATCH_PIN, HIGH);
ディスカッション
コメント一覧
まだ、コメントがありません