ATmega328PでHC595シフトレジスタを使った128リレー制御プログラムの作り方

C言語関連

ATmega328PマイコンとHC595ラッチ付きシフトレジスタを使って、128個のリレーをタクトスイッチで個別にオンオフするプログラムは、シフトレジスタのシリアル制御とラッチ制御を組み合わせることがポイントです。本記事ではC言語での実装例と考え方を解説します。

回路とピン接続の基本

ATmega328Pでは、ポートBをタクトスイッチ入力に使用し、ポートDからHC595にデータを送信します。HC595のDS(データ)、SH_CP(シフトクロック)、ST_CP(ラッチクロック)の3本をマイコンのポートDに接続します。

複数のHC595をチェイン接続することで128個の出力を制御可能です。各HC595は8ビット出力なので、16個直列につなぐことで128リレーを制御できます。

リレー状態を保持する変数の準備

128個のリレー状態を格納するため、uint8_t型の配列を用意します。例として、uint8_t relayState[16]; として16バイトで128ビットを管理します。

タクトスイッチが押されると対応するビットを反転させ、HC595にシリアル送信します。

シフトレジスタへのデータ送信関数

HC595にデータを送るには、1ビットずつシフトクロックを使って送信し、最後にラッチクロックで出力を更新します。

例:
void sendShiftRegister(uint8_t *data, int length) {
for(int i=length-1; i>=0; i–) {
for(int b=7; b>=0; b–) {
// データ出力
if(data[i] & (1< pulseShiftClock();
}
}
pulseLatchClock();
}

タクトスイッチ入力とビット反転

ポートBに接続したタクトスイッチをスキャンし、押されたスイッチに対応するリレーのビットを反転します。デバウンス処理も入れることで誤動作を防ぎます。

例:
if(buttonPressed(i)) { relayState[i/8] ^= (1 << (i%8)); sendShiftRegister(relayState,16); }

まとめ

ATmega328PとHC595を使った128個リレー制御では、リレー状態を配列で保持し、タクトスイッチ入力に応じてビットを反転させ、シフトレジスタにシリアル送信するのが基本です。デバウンス処理やラッチ制御を組み合わせることで、個別のリレーを安定してオンオフできます。

コメント

タイトルとURLをコピーしました