シフトレジスタライブラリfor Arduino

概要

8bit シフトレジスタ用のライブラリを紹介します。
このライブラリを介してシフトレジスタを操作可能です。

前提条件

このライブラリは C++の STL ライブラリに含まれる map を使用します。
残念なことに Arduino 環境には STL は実装されていません。
そのため maniacbug 氏の作成したライブラリ StandardCplusplus を使用しています。
STL 仕様の map が使用可能であれば、他のライブラリを使用しても動作するはずです。

配線

シフトレジスタを操作する際は主に SER, SRCLK(SCK),RCK(RCK)の3つのピンに信号を送ります
Arduino のデジタルピン3つを使用します。
(*SPI 通信用のピンを使用してより高速にシフトレジスタを操作することもできます。)

サンプルプログラム

#include <ShiftRegister.h>

#define SER_PIN 2
#define SCK_PIN 4
#define RCK_PIN 6

// Arduino Uno SS_PIN (https://www.arduino.cc/en/Reference/SPI)
#define SS_PIN 10

/* Create instance of ShiftRegister for digital pin*/
ShiftRegister sr(SER_PIN, SCK_PIN, RCK_PIN, 3);
/* for SPI */
//ShiftRegister sr(SS_PIN, 3);

void setup() {
}

int num = 0;
int last = 0;
int a = 1;
void loop() {
    delay(100);
    if (num > 23) {num = 23; a = -1;}
    if (num < 0) {num = 0; a = 1;}
    sr.digitalWrite(num, HIGH);
    sr.digitalWrite(last, LOW);
    last = num;
    num += a;
}

インスタンスの生成

ShiftRegister クラスのインスタンス生成を確認してみましょう。
通常のデジタルピンを使用する場合、 次のようにインスタンスを生成します。

ShiftRegister sr(SER_PIN, SCK_PIN, RCK_PIN, 3)

コンストラクタの宣言は次のようになっています。

ShiftRegister(uint8_t ser, uint8_t sck, uint8_t rck, uint8_t byte_num)
// byte_numにはシフトレジスタのバイト数を指定します。

今回の場合 8bit シフトレジスタを合計3つ使用しますので、8*3bit = 3byte となります。
digitalWrite メンバ関数の呼び出しインスタンスを生成したあとは、私たちが慣れ親しんだ digitalWrite 関数のようにシフトレジスタを操作可能です。
実際、次のように読み出せます。

//void ShiftRegister::digitalWrite(uint8_t num, uint8_t value)
sr.digitalWrite(num, HIGH)

この ShiftRegister::digitalWrite 関数は Arduino の digitalWrite 関数と同様に呼び出せます。

基本的な使用方法

基本的に、`ShiftRegister::digitalWrite` により、シフトレジスタをデジタルピンと同等に操作できます。
digitalWrite 関数の実装には多少オーバーヘッドがありますが、高度な処理を行いたい場合、 ShiftRegister クラス内のメンバ関数が利用可能です。
詳しくはこちらをご覧ください。