今回はシフトレジスタIC:74HC595を使って7セグLEDに数字や文字を表示させてみたいと思います。シフトレジスタの基本的な知識についてはこちらの記事をご覧ください。シフトレジスタとは?わかりやすく解説シフトレジスタとは、入力されたデータがレジスタ(記憶装置)内をシフト(移動)していくように作られた回路です。回路図Pythonコード7セグLEDに0~Fを順番に表示させるshiftOut関数を作る0~Fまでを表示させるプログラム実行結果74HC595の概要74HC595は出力ラッチを持った8bitのシフトレジスタICです。ICの端子配置図と内部の概略図はこのようになっています。入力されたデータは8段のシフトレジスタに保存され、RCKによってストレージレジスタに転送されます。ストレージレジスタの値は3ステートバッファによってQA~QHからパラレル出力されます。各端子の機能をまとめます。別の74HC595のSI端子に接続してシフトレジスタの段数を増やす事ができる(カスケード接続)。シフトレジスタクリア端子。LOWにすると全ビットがLOWにセットされる。立ち上がりエッジでデータがシフトレジスタにセットされる。立ち上がりエッジでシフトレジスタのデータがストレージレジスタへ転送される。LOWで全出力をHi-Z状態にする。シリアルデータ入力端子。電源端子シフトレジスタの使い方それでは、ラズパイとシフトレジスタICを使って7セグディスプレイに数字を表示してみましょう。7セグLEDについてはこちらの記事をご覧ください。ラズパイで7セグメントLEDに数字やアルファベットを表示させる方法7セグメントLEDとは、7つのセグメント(区分)の点灯・消灯を切り替えることで好きな数字を表示させることができる電子部品です。今回使った7セグLEDディスプレイはアノードコモンなので、シフトレジスタの出力はカソード側へ接続しています。したがって、シフトレジスタの出力がLOWの時にLEDが点灯することになります。Pythonコード7セグディスプレイに数字の2を表示させるプログラムです。latchPinをHIGHにGPIO.cleanup()2を表示するためには、7セグLEDの[A,B,D,E,G]を点灯させる、つまりLOWにする必要があります。したがって、SIに入力するデータは00100101となります。16進数にすると0x25です。このプログラムの一番のポイントは下記の部分です。クロックをHIGHにこの関数はシフトレジスタにデータをセットするためのものです。SCK(cPin)をLOWにします。次にSI(dPin)にデータをセットします。ビット演算子:<<は左シフトを示し、0x01、つまり0b00000001の最下位ビットをi個左にシフトします。i=0の場合は、0個シフトなのでそのまま、i=1の場合は1個シフトするので0b00000010となります。まとめると、次のようになります。10000000このシフトされた値とvalの&を取ります。&演算子は各ビットの掛け算となるので、i=0の場合は、0b001001010b000000010b00000001となり、SI(dPin)に1(HIGH)が入力されます。この後、SCK(cPin)がHIGHとなりシフトレジスタに1がセットされます。i=1の場合は1つシフトされるので、0b001001010b000000100b00000000となり、0(LOW)がセットされることになります。この動きをi=0~7まで繰り返すので、シフトレジスタには00100101がセットされることになります。シフトレジスタにデータがセットされると、RCK(latchPin)をLOWからHIGHに切り替えるので、シフトレジスタの値はストレージレジスタへ転送され、パラレル出力が更新されます。このプログラムを走らせると2が表示されることが確認できました。オシロでSCKとSIの波形を確認するとこのようになっていて、想定通りの動きが確認できました。7セグLEDに0~Fを順番に表示させる少しレベルアップさせて、7セグLEDに0~9、A~Fを順番に表示させてみます。Pythonのコードは次のようにしました。destroy()shiftOut関数を作る下記の部分でshiftOut関数を定義しています。GPIO.output(cPin,GPIO.HIGH);引数のorderはLSBFIRSTかMSBFIRSTかを指定します。Bitの略で、最下位ビットのことです。0b10110000の場合なら一番右の0がLSBです。Bitの略で、最上位ビットのことです。0b10110000の場合なら一番左の1がMSBです。LSBFIRSTは最下位ビットから順にセットしていくことを示し、MSBFIRSTは最上位ビットから順にセットしていくことを示します。よって、orderにLSBFIRSTを指定した場合は、0x01のLSBからシフト演算子で左へシフトしてvalとの&を取るようになっています。逆にMSBFIRSTを指定した場合は、0x01のMSBからシフト演算子で右へシフトしてvalとの&を取るようになっています。今回はMSBFIRSTでセットしていきます。MSBFIRSTで3を表示させる場合の動きは以下のようなイメージになります。0~Fまでを表示させる次のコードで0~9とA~Fまでの16文字を順番に表示させます。time.sleep(0.5)RCKをLOWにしてからshiftOut関数を実行し、numに格納している数字、文字を表示させます。これを16回繰り返し、numに格納した配列を左から順番に表示していきます。True:なので無限ループとなっており、0~Fの表示をずっと繰り返します。狙い通り0~Fの表示を繰り返していることを確認できました。プロフィールりょうのすけアナログ回路設計者です。現在はベンチャーに所属して生体センシングをやってます。ハードでもソフトでも、何かしら作ることが好きです。