(第3回)拡張ICについて(その2)

入力と同様に出力側も拡張します。
出力用の拡張ICは74HC595というICを使用します。出力側は全てモータードライバーへ接続していきます。マイコンの3カ所のピンを16個の出力に拡張します。 モーターは正転・後転があるので、実際は半分の8個のモータードライバーを操作できるようになります。
そして、モータードライバーには、もう1つ速度入力があります。その速度入力端子は、マイコンに直接接続する必要があるため、
入力用拡張IC: 3ピン
出力用拡張IC: 3ピン
モーター速度用: 8ピン
------------
(合計)    14ピン
のピンを使って制御することになります。16ピンあるので、2ピンは使用していません。

マイコンの3つのピンで16個の出力にする

マイコンの3つのピンを16個の出力につかえるようにします。

<必要な物>

a.Arduino Pro Mini 328 3.3V 8MHz

b.74HC595

1.接続

(74HC-595)

74HC-595は複数個使えるようになっています。まずは12番はOFF状態にしておきます。14番に出力したいピンの状態をONかOFFにします。その時に11番のクロックをON-OFFすると1個目の状態がセットされます。
14番にピンの状態→クロックのON-OFFを16回繰り返すします。最後に12番をONにすると実際にICのピンがマイコンから設定した状態に固定されます。

(接続図)

aとbを2個接続します。ちょっと複雑ですが、マイコンの方は、電源以外3ピンを使用しているだけで、出力点(紫色の□)が全部で16個になっています。
出力部分にモータードライバーを接続することで、モーターの正転、後転の制御をすることが可能です。 (モータードライバーへ速度入力をするとモーターが動作)

2.プログラムの準備

①以下がサンプルプログラムです。コピーして使います。
出力したいところのプログラムの行の//を外すとONになります。Hが128なのは、2の7乗で、1ケタ目=0乗、2ケタ目1条・・・・8ケタ目7乗というような計算になるためです。
出力をプログラムで切り替えたい場合は、全体をコピーすると切り替えられるようになります。

----(プログラム)----

//初期化
int IC_OUT_1 = 0;
int IC_OUT_2 = 0;

int IC_OUT_1A = 0; int IC_OUT_1B = 0; int IC_OUT_1C = 0; int IC_OUT_1D = 0;
int IC_OUT_1E = 0; int IC_OUT_1F = 0; int IC_OUT_1G = 0; int IC_OUT_1H = 0;
int IC_OUT_2A = 0; int IC_OUT_2B = 0; int IC_OUT_2C = 0; int IC_OUT_2D = 0;
int IC_OUT_2E = 0; int IC_OUT_2F = 0; int IC_OUT_2G = 0; int IC_OUT_2H = 0;

void setup() {
//I/O_OUT_PIN
pinMode(12, OUTPUT) ; // 制御するピンは全て出力に設定する
pinMode(13, OUTPUT) ;
pinMode(14, OUTPUT) ;

}
void loop() {
//CopyStart
//ここの部分でONにしたいと所を有効にする[//]を消す
//74HC595-1の状態を設定する値
//IC_OUT_1A = 1;
IC_OUT_1B = 2;
//IC_OUT_1C = 4;
IC_OUT_1D = 8;
//IC_OUT_1E = 16;
IC_OUT_1F = 32;
//IC_OUT_1G = 64;
IC_OUT_1H = 128;
//74HC595-2の状態を設定する値
//IC_OUT_2A = 1;
IC_OUT_2B = 2;
//IC_OUT_2C = 4;
IC_OUT_2D = 8;
//IC_OUT_2E = 16;
IC_OUT_2F = 32;
//IC_OUT_2G = 64;
IC_OUT_2H = 128;

//ここで数値を並べる
IC_OUT_1 = IC_OUT_1A + IC_OUT_1B + IC_OUT_1C + IC_OUT_1D + IC_OUT_1E + IC_OUT_1F + IC_OUT_1G + IC_OUT_1H;
IC_OUT_2 = IC_OUT_2A + IC_OUT_2B + IC_OUT_2C + IC_OUT_2D + IC_OUT_2E + IC_OUT_2F + IC_OUT_2G + IC_OUT_2H;

//IC_OUTへの指令
digitalWrite(12, LOW) ;//送信準備
shiftOut(13, 14, MSBFIRST, IC_OUT_2) ;//74HC595-2の状態をICへ設定
shiftOut(13, 14, MSBFIRST, IC_OUT_1) ;//74HC595-1の状態をICへ設定
digitalWrite(12, HIGH);// ラッチ信号を出すと、出力ピンが設定のとおりの出力に変化
delay(1000);
//初期化
int IC_OUT_1A = 0; int IC_OUT_1B = 0; int IC_OUT_1C = 0; int IC_OUT_1D = 0;
int IC_OUT_1E = 0; int IC_OUT_1F = 0; int IC_OUT_1G = 0; int IC_OUT_1H = 0;
int IC_OUT_2A = 0; int IC_OUT_2B = 0; int IC_OUT_2C = 0; int IC_OUT_2D = 0;
int IC_OUT_2E = 0; int IC_OUT_2F = 0; int IC_OUT_2G = 0; int IC_OUT_2H = 0;
//CopyEND
//このあとに「//CopyStart」~「//CopyEND」をコピペすると違う状態になります。

}

②プログラムを書き込んだら、好きな端子から3.3Vが出力されます。小さいLEDなら光らせることができます。その場合は、拡張ICの入力の時と同じように書き込みをした状態のままで動作します。

実験の様子
写真のLEDは抵抗なしで実験していますが、10kΩ程度の抵抗を入れた方が良いです。(LEDやICが故障する可能性があります)

設定したとおりにICがON-OFFできましたか?これでモータードライバーと接続すると8個のモーターを制御することが可能です。

-------------