2019年10月27日 | 公開。 |
hc595型の変数が宣言できたら、次は、init関数により、最初に一度だけ初期化処理を行う必要があります。一度だけ実行する処理なので、通常init関数はsetup関数の中で呼び出します。
init関数の書式は次の通りです。
変数名には、hc595型の変数の宣言の際に使った変数名を書きます。
また、init関数には引数がありません。
例えばhc595型の変数名がmy595の場合は、次の様にinit関数を呼び出します。
my595.init();
前のページのリスト21のスケッチでも、setup関数の中でinit関数を呼び出しています。
init関数を呼び出すと、次の3つの初期化処理を行います。
参考:74HC595の電源投入直後のQA~QHピンの出力は不定(LになるかHになるか予測できない状態)です。
init関数内で、74HC595の制御に使うArduinoのI/Oピン(hc595型の変数の宣言の際に指定したSER信号ピンとSRCLK信号ピンとRCLK信号ピン)を出力モードに設定するので、pinMode関数を使って、明示的にこれらのピンを出力モードに設定する必要はありません。
init関数により初期化が終わったら、shiftOut関数で74HC595にデータを出力できる様になります。このshiftOut関数はFASTIOライブラリ内の(もっと細かく言えばhc595クラス内の)shiftOut関数で、Arduinoの標準関数のshiftOut関数の事ではありません。
shiftOut関数の書式は次の通りです。
変数名には、hc595型の変数の宣言の際に使った変数名を書きます。
shiftOut関数の引数の出力するデータには、74HC595のQA~QHのピンから出力したいデータを渡します。
出力するデータは32ビット符号なし整数型(uint32_t型)ですが、Arduinoに接続している74HC595が1個の場合は、指定したデータの下位8ビットが有効で、上位24ビットは無視されます。
今はArduinoに74HC595を1個接続する場合の話をしているのですが、複数の74HC595を接続した場合のshiftOut関数の振る舞いについては、表7を参照してください。
Arduinoに接続した 74HC595の数 |
出力するデータの取り扱い方 |
---|---|
1 | 下位8ビットが有効なデータになります。上位24ビットは無視します。 |
2 | 下位16ビットが有効なデータになります。上位16ビットは無視します。 |
3 | 下位24ビットが有効なデータになります。上位8ビットは無視します。 |
4 | 32ビット全てが有効なデータになります。 |
5以上 | 指定された32ビットのデータが有効で、ビット0~ビット31に割り当てられます。ビット32以上の上位ビットは強制的に0になります。74HC595を5個以上接続した場合は、shiftOut関数では74HC595の一部のパラレル出力ピンを制御できませんので、後述するdigitalWrite関数を使うなど、別の方法を使う必要があります。 |
前のページのリスト21では、loop関数内で、次の様にshiftOut関数を呼び出しています。
my595.shiftOut(cnt++);
ただし、cntは、static uint8_t型の変数です。
前のページのリスト21のスケッチのloop関数内で、どのような処理が行われているか説明します。
リスト21のloop関数を抜き出して、リスト22に示します。
void loop()
{
static uint8_t cnt=0;
my595.shiftOut(cnt++); // 74HC595にcntの内容を送信してから、cntをカウントアップする。
delay(100); // 0.1秒休む
} // loop
まず、次の様に、変数cntを宣言しています。
static uint8_t cnt=0;
変数cntは、uint8_t型なので、符号なし8ビット整数型です。
また、変数cntはstatic宣言されているので、loop関数を抜けても、もう一度loop関数を呼ばれた時には、前の値を保持しています。
さらに変数cntは0に初期化されているので、最初にloop関数が呼ばれる前に0が代入されています。
次の行で変数cntの内容をshiftOut関数の引数として渡して、74HC595のQA~QHのピンに、cntの内容に応じた電圧を出力した後に、cntの値を1増やします。
my595.shiftOut(cnt++);
最後にdelay関数で0.1秒間処理を中断しています。
delay(100);
cntが255(2進数で11111111)の時にcnt++を実行するとcntの内容が0に戻るので、前のページの図13で示した様なLEDの点灯パターンになります。
shiftOut関数で74HC595のパラレル出力ピン(QAピン~QHピン)にデータを出力する時は、8ピン分のデータ全部(8ビット)を引数に渡す必要がありました。しかしながら、各パラレル出力ピンを個別に制御したいこともあります。そんな時に便利なのがdigitalWrite関数です。
ここで説明するdigitalWrite関数は、Arduinoの標準関数のdigitalWrite関数とは異なり、FASTIOライブラリ内の(もっと細かく言えばhc595クラス内の)digitalWrite関数です。
digitalWrite関数の書式は次の通りです。
ビット番号が定数や定数式(コンパイル時に値が確定している式)の場合は、次の書式も使えます。
2番目の書式の方が、表現の自由度が低い(ビット番号に変数を含む式を使えない)分だけ、速いコードにコンパイルされる可能性が高いです。(必ずしも速いコードになるとは保証されていません)
変数名には、hc595型の変数の宣言の際に使った変数名を書きます。
ビット番号には、データを出力したいピンのビット番号を指定します。(前のページの表5参照)
出力電圧には0(あるいはLOW)または1(あるいはHIGH)を指定します。
参考:定数LOWと定数HIGHは、Arduinoの標準の定義済み定数です。LOWは0、HIGHは1と定義されています。
例えば、変数名がmy595で、ビット番号が3のピンにHIGHを出力したいなら、
my595.digitalWrite(3,HIGH);
または
my595.digitalWrite<3>(HIGH);
と記述します。
digitalWrite関数の使用例として、ビット番号が0のピンに接続されたLEDを1秒周期で点滅させるスケッチを、リスト23に示します。
// HC595blink.ino
#include <fastio.h> // FASTIOライブラリのヘッダファイルをインクルード
hc595<2,3,4> my595;
// Arduinoに接続したシフトレジスタに、my595という名前をつける。
// 1番目のパラメータは、74HC595のSER端子と接続するArduinoのピンの番号。
// 2番目のパラメータは、74HC595のSRCLK端子と接続するArduinoのピンの番号。
// 3番目のパラメータは 74HC595のRCLK端子と接続するArduinoのピン番号。
// 接続する74HC595の数は、暗黙的に1個に指定されている。
// ビットの送信順は、暗黙的にLSBFIRSTに指定されている。
void setup()
{
my595.init(); // 74HC595とそのドライバの初期化
} // setup
void loop()
{
my595.digitalWrite(0,HIGH); // ビット番号0のピン(QHピン)にHIGHを出力する。LSBFIRSTなので、ビット番号0はQHピンに対応する。
delay(500); // 0.5秒休む
my595.digitalWrite(0,LOW); // ビット番号0のピン(QHピン)にLOWを出力する。
delay(500); // 0.5秒休む
} // loop
hc595クラスのdigitalWrite関数は、Arduino標準のdigitalWrite関数と書式が似ているので、FASTIOライブラリを使わずにスケッチを作っていて、途中でArduinoの出力ピンが足りなくなり、74HC595で出力ピンを増設した場合などに、便利です。
なお、digitalWrite関数を使うと、スケッチの表記上は74HC595のパラレル出力の特定のピンだけを操作している形になりますが、ハードウェア的にはパラレル出力ピン全部の信号(74HC595が1個接続されている場合なら8ビットの信号)を転送しますので、shiftOut関数を使った場合とほぼ同じ実行時間がかかります。
参考:74HC595は、その構造上、パラレル出力の特定のビットの出力電圧を変更する事はできません。出力電圧を変更するピンが1つでも、出力電圧を変更しないピンの情報も併せて、74HC595が1個あたり8ビットの情報を送信する必要があります。hc595クラスは、最後に74HC595に送信したデータを記録していますので、digitalWrite関数を呼び出した時に、出力電圧を変更しないピンの情報も自動的に補って74HC595に送信します。
説明が長くなってきたので、74HC595の制御用スケッチの作り方の説明は次回に続きます。続きを書くのはぼちぼちと。