注意:すべてのOSOYOO ARDUINO用製品はサードパーティー製品であり、ARDUINOと完全に互換性があります

認可されたオンライン小売業者:

AMAZON
amzuk

内容

  1. 紹介
  2. 準備
  3. 74HC595について

紹介

ある時点で、ボードのピンが足りなくなり、シフトレジスターで拡張する必要があるかもしれません。この例では、74HC595を使用します。74HC595は、「出力ラッチを持つ8ビットシリアルイン、シリアルまたはパラレルアウトシフトレジスター、3状態」としてデータシートで言及されています。つまり、マイクロコントローラーのわずかな数のピンを占有しながら、8つの出力を同時に制御するために使用できます。複数のレジスターをリンクさせて、より多くの出力を拡張できます。

このレッスンでは、74HC595 8ビットシフトレジスターをOsoyoo Basicボードで使用する方法を説明します。

準備

ハードウェア

ソフトウェア

74HC595について

回路を説明する前に、コードが何をする必要があるかを理解するために、チップが何をしているかを簡単に見てみましょう。

まず、2進数に慣れていない人たちにとって、「ビット」とは何かを説明します。私たちが「ビット」と言うとき、2進値を構成する数字の1つを指しています。ただし、通常の数値とは異なり、最初のビットは通常、最右にあるものと見なします。つまり、2進値10100010を取る場合、最初のビットは実際には0であり、8番目のビットは1です。また、各ビットは0または1のいずれかであることに注意してください。

チップには、出力に使用できる8つのピンが含まれており、それぞれのピンはレジスターのビットに関連付けられています。74HC595 ICの場合、QAからQHまでこれらを参照します。Arduinoを介してこれらの出力に書き込むためには、シフトレジスターにバイナリ値を送信し、その数値からシフトレジスターがどの出力を使用するかを決定します。

これは、指定した最も右のビットがQHにマップされ、最も左のビットがQAにマップされることを意味しています。ビットに対応する出力が1に設定されている場合、出力はアクティブと見なされます。これを覚えておくことは重要です。そうしないと、どのピンを使用しているかを知るのが非常に困難になります!

チップにはOE(出力イネーブル)ピンもあり、これは出力を一度に有効または無効にするために使用されます。これをPWM対応のArduinピンに接続し、「analogWrite」を使用してLEDの明るさを制御することができます。このピンはアクティブローなので、GNDに接続します。

どのピンを使用するかを指定するためにビットシフトを使用する方法を基本的に理解したので、それをArduinに接続することから始めることができます!

LEDとシフトレジスター

Arduinには、シフトレジスターにデータを送信するために特別に設計された「shiftOut」という特別な関数があります。以下は完全なスケッチであり、それがどのように動作するかについての議論はそれに続きます。

接続

以下のように回路を構築します:

ほぼすべてのものがそれに接続されるため、74HC595チップを最初に置くのが最も簡単です。U字型の刻み目が上部に向かっているように配置します。チップのピン1は、この刻み目の左側にあります。

「595」の出力のうち、1つを除いてすべてがチップの左側にあります。そのため、接続のために、LEDも左側にあります。

チップの後に抵抗を取り付けます。抵抗のリード同士が触れていないように注意する必要があります。ボードに電源を接続する前に、再度確認する必要があります。リード同士が触れずに抵抗を配置することが難しい場合は、リードを短くして基板の表面に近づけると役立ちます。次に、LEDをボードに配置します。

長い正極のLEDリードは、基板のどちら側にあってもチップ側に向ける必要があります。それでは、上記のようにジャンパーリードを接続するだけです。ICのピン8から基板のGND列に行くリードを忘れないでください。

リードを取り付けたら、後でリストアップされるスケッチを読み込んで試してみてください。各LEDが順番に点灯し、すべてのLEDが点灯するとすべてが消灯し、サイクルが繰り返されるはずです。

スケッチをアップロードする

上記の操作が完了したら、USBケーブルを使用してボードをコンピュータに接続します。緑色の電源LED(PWRとラベルされています)が点灯するはずです。次に、以下のスケッチ をボードに読み込みます。

int latchPin = 5;
int clockPin = 6;
int dataPin = 4;
 
byte leds = 0;
 
void setup() 
{
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);  
  pinMode(clockPin, OUTPUT);
}
 
void loop() 
{
  leds = 0;
  updateShiftRegister();
  delay(500);
  for (int i = 0; i < 8; i++)
  {
    bitSet(leds, i);
    updateShiftRegister();
    delay(500);
  }
}
 
void updateShiftRegister()
{
   digitalWrite(latchPin, LOW);
   shiftOut(dataPin, clockPin, LSBFIRST, leds);
   digitalWrite(latchPin, HIGH);
}

まず、使用する3つのピンを定義します。これらは、74HC595のラッチ、クロック、およびデータピンに接続されるArduinデジタル出力です。

int latchPin = 5;
int clockPin = 6;
int dataPin = 4;

次に、「leds」という変数が定義されます。これは、現在オンまたはオフになっているLEDのパターンを保持するために使用されます。データ型「byte」は、8ビットを使用して数字を表します。各ビットはオンまたはオフになることができるため、8つのLEDのオン/オフ状態を追跡するのに最適です。

byte leds = 0;

「setup」関数は、使用する3つのピンをデジタル出力に設定するだけです。

void setup() 
{
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);  
  pinMode(clockPin, OUTPUT);
}

「loop」関数は、最初に変数「leds」に値0を与えてすべてのLEDをオフにします。次に、「updateShiftRegister」を呼び出して「leds」パターンをシフトレジスタに送信し、すべてのLEDをオフにします。後で「updateShiftRegister」がどのように動作するかを説明します。

このループ関数は、半秒間一時停止した後、’for’ループと変数’i’を使用して0から7までカウントします。毎回、Arduin関数 ‘bitSet’を使用して変数’leds’でそのLEDを制御するビットを設定します。次に、 ‘updateShiftRegister’を呼び出して、変数 ‘leds’にある内容を反映するようにLEDを更新します。

次のLEDが点灯する前に、 ‘i’が増分されるまで半秒の遅延があります。

void loop() 
{
  leds = 0;
  updateShiftRegister();
  delay(500);
  for (int i = 0; i < 8; i++)
  {
    bitSet(leds, i);
    updateShiftRegister();
    delay(500);
  }
}

‘updateShiftRegister’関数は、まずlatchPinを低に設定し、次にArduin関数 ‘shiftOut’を呼び出してから’latchPin’を再度高に設定します。これには4つのパラメータが必要で、最初の2つはそれぞれDataとClockに使用するピンです。

3番目のパラメータは、どちらのデータの端から開始するかを指定します。最も右側のビットで始めることにします。

これは ‘Least Significant Bit’(LSB)と呼ばれます。最後のパラメータは、シフトレジスタにシフトする実際のデータであり、この場合は ‘leds’です。

void updateShiftRegister()
{
   digitalWrite(latchPin, LOW);
   shiftOut(dataPin, clockPin, LSBFIRST, leds);
   digitalWrite(latchPin, HIGH);
}

LEDをオンにする代わりにオフにする場合は、 ‘leds’変数に対して同様のArduin関数(bitClear)を呼び出します。これにより、 ‘leds’のそのビットが0に設定され、その後、 ‘updateShiftRegister’を呼び出して実際のLEDを更新するだけです。

実行結果

アップロードが終了してから数秒後、すべてのLEDが点灯するまで各LEDが順番に点灯し、すべてが消灯し、サイクルが繰り返されます。

LEDの明るさの制御

74HC595のピンのうち、言及していないものに「Output Enable」というピンがあります。このピンは13番で、ブレッドボード上では常にグラウンドに接続されています。このピンはスイッチのように機能し、出力を有効または無効にすることができます。ただし、注意することは「アクティブロー」(有効にするために接地する)であることです。つまり、5Vに接続されている場合、すべての出力がオフになります。一方、グラウンドに接続されている場合、オンにする必要がある出力はオンになり、オフにする必要がある出力はオフになります。

接続方法

以下のように回路を構築します。

このピンを「analogWrite」関数と一緒に使用して、PWMを使ってLEDの明るさを制御することができます。

これを行うには、74HC595のピン13の接続を、グラウンドに接続する代わりに、ボードのピン3に接続するだけです。

スケッチのアップロード

以下のスケッチを読み込むと、すべてのLEDが徐々に消えていきます。

int latchPin = 5;
int clockPin = 6;
int dataPin = 4;
int outputEnablePin = 3;
 
byte leds = 0;
 
void setup() 
{
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);  
  pinMode(clockPin, OUTPUT);
  pinMode(outputEnablePin, OUTPUT); 
}
 
void loop() 
{
  setBrightness(255);
  leds = 0;
  updateShiftRegister();
  delay(500);
  for (int i = 0; i < 8; i++)
  {
    bitSet(leds, i);
    updateShiftRegister();
    delay(500);
  }
  for (byte b = 255; b > 0; b--)
  {
    setBrightness(b);
    delay(50);
  }
}
 
void updateShiftRegister()
{
   digitalWrite(latchPin, LOW);
   shiftOut(dataPin, clockPin, LSBFIRST, leds);
   digitalWrite(latchPin, HIGH);
}
 
void setBrightness(byte brightness) // 0 to 255
{
  analogWrite(outputEnablePin, 255-brightness);
}

実行結果

すべてのステップを正しく完了した場合、以下のGIFのようなものが得られます。