2019年09月17日 | 公開。 |
この章では、Arduinoに接続した74HC595を制御して、74HC595のパラレル出力端子に思い通りの電圧パターンを出力するスケッチの作成法について説明します。
この節ではまず、基本となる、1つの74HC595をArduinoに接続する場合の接続法と制御時のタイミングチャートについて復習した上で、1つの74HC595を制御するスケッチの作り方について説明します。
スケッチの作成法は、(1)74HC595の制御法が一番理解しやすいdigitalWrite関数を使う方法と、(2)少しプログラミングの手間が省けるshiftOut関数を使う方法と、(3)プログラミングの手間がかなり省けて動作も高速化する代わりに動作機種が制限されるFASTIOライブラリを使う方法の3種類の方法について順に説明します。
74HC595の制御用スケッチを作るからには、実際にArduinoに74HC595を接続してみてテストしなければなりません。
ここで、Arduinoと1つの74HC595を接続する方法について再確認してみましょう。図12に従って配線すれば良かったのでした。
この回路をそのままブレッドボードに組んでもいいのですが、出力ピンの電圧をテスタ等でいちいち確認するのは面倒そうです。スケッチのテストをするには、簡単に出力電圧が確認できるように、LED(と電流制限抵抗の直列回路)を各出力ピンに付ける方が良さそうです。
図12の回路の74HC595の各出力ピンにLEDを付けると、図14の回路になります。
図14の回路をブレッドボードで組んだ時の写真が、写真5です。
ほとんどの人は、この様にブレッドボードに回路を組むのが、手っ取り早いと思います。
ただ私の場合、ロジックアナライザ用のヘッダを付けたかったので、図15の回路図の基板をユニバーサル基板で組みました。ブレッドボードでもロジックアナライザを使って波形観察できますが、ロジックアナライザのプローブを取り付けたり取り外したりする時に、配線が外れたりするのが嫌だったのです。
U1は動作テストしたい74HC595です。LED1~LED8は、それぞれ74HC595のQA端子~QH端子の電圧を表示するLEDです。CN1はこの基板をArduinoと接続するための配線を接続するためのピンソケットで、CN2とCN3は、ロジックアナライザで信号波形を観察する時に使うピンヘッダです。
図15の基板を組み上げ、Arduinoに接続して動作させた様子を、写真6に示します。
なお、この基板で使ったユニバーサル基板は、おそらく秋月電子の片面ガラス・ユニバーサル基板 Bタイプ(95×72mm) めっき仕上げです。
この基板の表の面の写真を写真7に、裏の面の写真を写真8に示します。
この基板のおおまかな部品配置を写真9に示します。
74HC595を制御するスケッチを作る前に、どの様な波形をArduinoから出せば、74HC595のパラレル出力に思った通りのデータを出力できるかを確認しておきます。
74HC595を制御するための波形は基本的に1ページの図10でいいのですが、図10は4段のシフトレジスタの場合の波形でした。74HC595は8段のシフトレジスタですので、4ビットではなく8ビット分のデータをSERピンに入力する必要があります。
実際に74HC595を制御するのに必要な波形を図16に示します。
参考:SRCLK信号とRCLK信号は、立ち上がりのタイミングにのみ意味があり、立下りのタイミングには意味がないので、SRCLK信号とRCLK信号の極性を反転した(LとHを入れ替えた)図17のタイミングチャートでも、正常に74HC595の制御ができます。(どちらのタイミングチャートでも、SER信号が1ビット送信している間にSRCLK信号が1回立ち上がり、最後にSRCLK信号が立ち上がった後に、RCLK信号が1回立ち上がるという点では共通している事を確認してください) 図16のタイミングチャートの場合は、データを送信しないアイドル状態ではSRCLK信号およびRCLK信号はLになりますが、図17のタイミングチャートの場合は、アイドル状態ではSRCLK信号およびRCLK信号はHになります。この記事では、図17ではなく、図16のタイミングチャートに従って制御スケッチを作る事にします。なお、図16や図17は、74HC595の制御のタイミングチャートの例であり、74HC595を制御するためのタイミングチャートは、これら以外にも考えられます。
図16(や図17)のSER信号でXと書いてある部分(背景が水色の部分)は、Don't care、すなわち、LでもHでも構わない事を示しています。SER信号のXの部分がLであれHであれ、74HC595の動作に影響がありません。
また、QA~QHの各信号でUと書いてある部分(背景がオレンジ色の部分)は不定、すなわち、LかHか分からない事を示しています。QA~QHの各信号のXの部分がLになるかHになるかは、タイミングチャートに書かれている範囲より前の部分の波形によって決まります。(タイミングチャートに書かれている範囲の直前に電源が投入された場合は、予測不能です)
74HC595の制御をするスケッチを作る場合、8ビットのデータを74HC595に送信する関数を作ると便利だと考えられますが、その際に、各ビットをLにするかHにするかを指定する引数を8個渡すのは、スケッチが冗長になったり、メモリの使用効率が悪かったり、動作速度が遅かったりという意味において、好ましくありません。送信するデータは、符号なし8ビット整数(uint8_t型、byte型、あるいはunsigned char型)の引数1つで渡すのが合理的です。
符号なし8ビット整数で送信するデータを表現する場合、SER信号にLSB(最下位ビット)からMSB(最上位ビット)の順で送るべきか、MSBからLSBの順に送るべきかという問題が発生します。
図16(や図17)のタイミングチャートでは、LSBからMSBの順にデータを送信しています。これをLSBファーストと呼ぶ事にします。
LSBファーストでデータを送信すると、QA端子にビット7(MSB)が出力され、QB端子にビット6が出力され、・・・、QH端子にビット0(LSB)が出力されという具合に、QA端子にMSBが出力されます。
図16(や図17)とは逆に、MSBからLSBの順にデータを送信する事をMSBファーストと呼ぶ事にします。MSBファーストの場合のタイミングチャートを図18に示します。
LSBファースト(図16)の場合はQA端子にMSBが出力されるのに対し、MSBファースト(図18)の場合はQA端子にLSBが出力される事に注意が必要です。
図12の回路図の様にQA端子を左に、QH端子を右に書く場合や、写真9の様に基板上でQA端子が左に、QH端子が右になる様に部品を実装する場合は、LSBファーストでデータを送信すると、LSBを右端に書く2進数の表記法と整合性が出るため、直感的に理解できる様になります。
逆に回路図上でQA端子を右に、QH端子を左に書く場合や、基板上でQA端子が右に、QH端子が右になる様に部品を実装する場合は、MSBファーストでデータを送信すると、2進数の表記法と整合性が出て、直感的に理解できる様になります。
あるいは2ページの表1に載っている一部のメーカーの様に、QAをQ0、QBをQ1、…、QHをQ7と表記する流儀の場合も、MSBファーストでデータを送信すると、Q0端子にビット0が出力され、Q1端子にビット1が出力され、…、Q7端子にビット7が出力されるので、直感的に理解できる様になります。
LSBファーストにするかMSBファーストにするかという問題は、回路の動作の本質にはかかわりがなく、どちらを採用する方が処理が速いという事もないのですが、回路動作を直感的に把握できるという事は、余計なバグを生まないという意味で重要です。例えば「回路図上でQA端子を左側に書いたら、基板上でもQA端子やQA端子の状態を表示するLEDを左側に実装し、LSBファーストでデータ送信するスケッチを書く」という具合に、「MSBが左側でLSBが右側」という表記を一貫すれば、MSBとLSBの方向が分からなくなって余計なバグを生む事がなくなるでしょう。
次のページから、実際に74HC595を制御するスケッチの作り方を説明します。