2019年10月22日 | 公開。 |
2019年10月27日 | カスケード接続する74HC595の個数の上限を明記しました。また、スマホで読む場合の利便性を考え、表5を縦長の表に書き直しました。 |
この節では、74HC595を使って、Arduinoの出力ピンを増設する方法について説明します。
74HC595はシリアル入力・パラレル出力のシフトレジスタICで、シリアル-パラレル変換を行うための物です。(図1参照)
この74HC595を使うと、3本の制御線で8本の出力ピンを増設する事ができます。つまり、差し引き8-3=5本だけ、実質的なArduinoの出力ピンを増やす事ができます。小型のArduinoで多くの出力を制御するのに使えます。
さらに74HC595を複数使うと、74HC595が2個の場合には増設される出力ピンが16本になり、74HC595が3個の場合には増設される出力ピンが24本になり…という具合に、74HC595が1個増えるごとに、拡張される出力ピンが8本ずつ増えます。
一方で、74HC595の個数が何個であろうと、制御線は3本のままです。(つまり、74HC595が2個の場合にはArduinoの出力ピンが実質16-3=13本増え、74HC595が3個の場合にはArduinoの出力ピンが実質24-3=21本増えます)
この様に、Arduino(を含むマイコン一般)の出力ピンの数を増やすのに便利な74HC595ですが、マイコン本体のI/Oピン(GPIO)から信号を出力する場合よりも、スケッチ(プログラム)が複雑になる点と、動作速度が遅くなる点が欠点です。
FASTIOライブラリを使うと、比較的簡単にスケッチを記述でき、また動作も、shiftOut関数を使う一般的な制御法より高速だというメリットがあります。
参考:shiftOut関数は、8ビットのデータをシリアルバスに出力するための、Arduinoの標準関数です。
これ以降、FASTIOライブラリを使って74HC595を制御し、Arduinoの出力ピンを拡張するためのスケッチの作り方を説明します。74HC595の動作原理などについては、ここでは詳しく説明しませんので、次に示す参考リンクの記事をご覧ください。
まず、Arduinoと1個の74HC595を3本の制御線で結び、74HC595上に拡張出力ピン8本を追加する方法について説明します。
図10に、DIPパッケージの74HC595のピン名称とピン配置を示します。
ここに示したピン名称は、Texas Instruments製のSN74HC595のデータシートに従っています。
ピン名称は、74HC595のメーカーにより異なる事があります。詳しくは、74HC595を使ってArduinoの出力ピンを拡張する方法(2)をご覧ください。
図11に、Arduinoと1個の74HC595の接続方法を示します。
74HC595の各ピンには、青色でピン番号を書き込んであります。
74HC595のQH'ピン(9番ピン)の×印は、どこにも接続しない事を示しています。
この図では、Arduinoの5V端子を74HC595のVCCピンに接続していますが、これはArduino Uno等の5V系Arduinoを使う場合だけです。Arduino Due等の3.3V系Arduinoを使う場合は、Arduionoの3.3V端子を74HC595のVCC端子に接続します。
74HC595のVCC端子とGND端子の間には、電源電圧を安定させて74HC595が誤作動しない様にするためのパスコンを接続してください。この図では0.1μFのパスコンを使っていますが、おおむね0.01μF~0.1μFの範囲内ならOKです。パスコンには高周波特性の良い積層セラミックコンデンサまたはディスクセラミックコンデンサを使ってください。電解コンデンサ等の高周波特性の悪いコンデンサでは、パスコンの役割を果たせません。
ArduinoのデジタルI/Oピンを3つ選び、それらを74HC595のSER信号、SRCLK信号、およびRCLK信号の制御に使います。どのデジタルI/Oピンを使ってもいいので、例えばArduino Unoの場合なら0番ピン~13番ピン、およびA0ピン~A5ピンの合計20ピンのなかから、都合の良い(他の用途に使わない)3つのピンを選んで、74HC595の制御用に使います。
以下の説明では、SER信号の制御用にArduinoの2番ピン、SRCLR信号の制御用にArduinoの3番ピン、RCLK信号の制御用にArduinoの4番ピンを使う事を前提として、スケッチの作り方を説明します。
図11を見ると分かる様に、ArduinoのデジタルI/Oピンを3つ消費する代わりに、74HC595のQA~QHのピンにデジタル出力ピンを8つ増設できます。
ただ、図11の配線のままでは、QA~QHのピンに出ている電圧を確認するのに、いちいちテスターのリード棒を当てて確認する必要があるので不便です。
そこで、74HC595の動作試験をする際には、図12の様に、QA~QHの各端子とGNDの間にLEDと電流制限抵抗の直列回路を接続し、Hを出力している端子は、対応するLEDが光る様にして、LEDの点灯状態で、一目で出力電圧の状態を把握しておくと便利です。
図11あるいは図12に示す様に、Arduinoに74HC595を1個接続した場合の、74HC595上の出力ピンを制御するスケッチの作り方について説明します。
まず、74HC595上の出力ピンを制御するスケッチのサンプルをリスト21に示します。
// oneByteFastio.no
#include <fastio.h> // FASTIOライブラリのヘッダファイルをインクルード
hc595<2,3,4,1,LSBFIRST> my595;
// Arduinoに接続したシフトレジスタに、my595という名前をつける。
// 1番目のパラメータは、74HC595のSER端子と接続するArduinoのピンの番号。
// 2番目のパラメータは、74HC595のSRCLK端子と接続するArduinoのピンの番号。
// 3番目のパラメータは 74HC595のRCLK端子と接続するArduinoのピン番号。
// 4番目のパラメータは、カスケード接続する74HC595の個数。
// 5番目のパラメータは、1バイト内のLSBから送出するか、MSBから送出するかの区別。
void setup()
{
my595.init(); // 74HC595とそのドライバの初期化
} // setup
void loop()
{
static uint8_t cnt=0;
my595.shiftOut(cnt++); // 74HC595にcntの内容を送信してから、cntをカウントアップする。
delay(100); // 0.1秒休む
} // loop
このスケッチを図12の回路で実行すると、8個のLEDで0~255の数字を2進数で順に0.1秒間隔で表示し、255の次はまた0に戻って処理を続けます。74HC595のQAピンに接続したLEDがMSBで、QHピンに接続したLEDがLSBになります。(図13参照)
以下、このスケッチの動作を解説しながら、Arduinoに1個接続した74HC595をFASTIOライブラリで制御する方法について説明します。
Arduino本体に接続したI/Oピンを制御する場合と同じく、スケッチの最初には、fastio.hというファイル名のヘッダファイルを、スケッチの先頭部分でインクルードする必要があります。具体的には次の様に記述します。
#include <fastio.h>
74HC595をFASTIOライブラリで制御するためには、hc595という型の変数(hc595というクラスのインスタンス変数)をグローバル変数として宣言します。
hc595という型は、山括弧でくくって最大6個のパラメータを取ります。これは、テンプレートという手法を使っているからです。(テンプレートが理解できなくても、FASTIOライブラリは使用できますのでご安心ください)
具体的には次の書式に従って、hc595型の変数を宣言します。
SER信号ピンには、74HC595のSER信号の制御に使うArduinoのI/Oピンを指定します。リスト21の例では、2番ピンを指定しています。
SRCLK信号ピンには、74HC595のSRCLK信号の制御に使うArduinoのI/Oピンを指定します。リスト21の例では、3番ピンを指定しています。
RLCLK信号ピンには、74HC595のRCLK信号ピンの制御に使うArduinoのI/Oピンを指定します。リスト21の例では、4番ピンを指定しています。
カスケード接続する74HC595の個数には、Arduinoに接続する74HC595の個数を指定します。指定できる数は、1~32の範囲です。リスト21の例では、1を指定しています。
参考:この項では、74HC595を1個接続する場合の話をしているので、カスケード接続する74HC595の個数には1を指定します。
ビットの送信順には、LSBからMSBの順にデータを送信するか、MSBからLSBの順にデータを送信するかの区別をする定数である、LSBFIRSTとMSBFIRSTのいずれかを指定します。LSBFIRSTを指定すると、LSBからMSBの順にデータを送信します。MSBFIRSTを指定すると、MSBからLSBの順にデータを送信します。(表4参照)
ビットの送信順に 指定する定数 |
定数の意味 |
---|---|
LSBFIRST | LSBからMSBの順にデータを送信します。 |
MSBFIRST | MSBからLSBの順にデータを送信します。 |
参考:74HC595にデータを送信する時の波形(タイミングチャート)については、74HC595を使ってArduinoの出力ピンを拡張する方法(3)の図16と図18を参照してください。また、タイミングチャートの事が良く分からなくても、後述の表4の内容を理解していれば、とりあえず74HC595を制御するスケッチは作れます。
リスト21の例では、ビットの送信順にLSBFIRSTを指定しているので、LSBからMSBの順にデータを送信します。
なお、ビットの送信順にLSBFIRSTを指定するか、MSBFIRSTを指定するかで、74HC595のQA~QHの各ピンに割り当てられるビット番号が変わるので注意が必要です。表5に、ビットの送信順に指定する定数と、A~QHの各ピンに割り当てられるビット番号との関係を示します。
注:ここでいうビット番号とは、送信した8ビットの中のどのビットかを表す番号の事です。ビット番号が0の場合、LSBを表します。次に大きな桁のビットがビット番号1で、その次がビット番号2で、…という具合に、ビット番号が1つ大きくなるごとに大きな桁を表すビットを表します。MSBはビット番号7です。
ビットの送信順に 指定する定数 |
LSBFIRST | MSBFIRST |
---|---|---|
QAピンのビット番号 | 7(MSB) | 0(LSB) |
QBピンのビット番号 | 6 | 1 |
QCピンのビット番号 | 5 | 2 |
QDピンのビット番号 | 4 | 3 |
QEピンのビット番号 | 3 | 4 |
QFピンのビット番号 | 2 | 5 |
QGピンのビット番号 | 1 | 6 |
QHピンのビット番号 | 0(LSB) | 7(MSB) |
バイトの送信順には、カスケード接続する74HC595の個数で2以上の数を指定した場合に、74HC595に下位バイトを先に送信するか、上位バイトを先に送信するかを指定します。定数LOWBYTEFIRSTを指定すると下位バイトを先に送信し、定数HIGHBYTEFIRSTを指定すると上位バイトを先に送信します。(表6参照)
バイトの送信順に 指定する定数 |
定数の意味 |
---|---|
LOWBITEFIRST | 下位のバイトを先に送信します。 |
HIGHBITEFIRST | 上位のバイトを先に送信します。 |
カスケード接続する74HC595の個数に1を指定した場合は、バイトの送信順にLOWBYTEFIRSTを指定しても、HIGHBYTEFIRSTを指定しても、同じ動作になります。また後述する様に、バイトの送信順の指定を省略する事もできます。
参考:カスケード接続する74HC595の個数に1を指定した場合は、バイトの送信順の指定を省略する事を推奨します。
リスト21の例では、バイトの送信順の指定を省略しています。
変数名には、他の変数の名前と重ならない、自分の好きな名前を指定します。リスト21を含め、この記事では原則としてmy595という変数名を使います。
hc595型変数を宣言する際に、パラメータ(山括弧で囲まれた部分に記述する指定)の内、最後の3つ(カスケード接続する74HC595の個数、ビットの送信順、およびバイトの送信順)は省略する事ができます。
最後のパラメータであるバイトの送信順を省略すると、バイトの送信順にLOWBYTEFIRSTが指定されたものと解釈されます。
例えば
hc595<2,3,4,1,LSBFIRST> my595;
は、
hc595<2,3,4,1,LSBFIRST,LOWBYTEFIRST> my595;
と解釈されます。
最後から2番目のパラメータであるビットの送信順を省略すると、ビットの送信順にLSBFIRSTが指定されたものと解釈されます。なお、ビットの送信順を省略する場合は、バイトの送信順の指定も省略しなければなりません。
例えば
hc595<2,3,4,1> my595;
は、
hc595<2,3,4,1,LSBFIRST,LOWBYTEFIRST> my595;
と解釈されます。
最後から3番目のパラメータであるカスケード接続する74HC595の個数を省略すると、カスケード接続する74HC595の個数に1が指定されたものと解釈されます。なお、カスケード接続する74HC595の個数を省略する場合は、ビットの送信順とバイトの送信順の指定も省略しなければなりません。
例えば
hc595<2,3,4> my595;
は、
hc595<2,3,4,1,LSBFIRST,LOWBYTEFIRST> my595;
と解釈されます。
次のページでは、init関数、shiftOut関数、digitalWrite関数について説明します。