NOBのArduino日記!

NOBのArduino日記!

趣味は車・バイク・自転車・ラジコン・電子工作です。

Arduino IDE(shiftOut関数の使い方)

■shiftOut関数
 shiftOut関数は、一度に1ビットのデータを1ビットシフトします。
 最大(最左端)または最小(最右端)のいずれかの有効ビットから開始します。
 各ビットはデータピンに順番に書き込まれ、その後、クロックピンがパルスが与えられて(ハイになってからローになる)、ビットが使用可能であることが示されます。

■使用例
 ArduinoIDEで使用するshiftOut関数の使い方は以下の通りです。
 試しにこのプログラムをArduinoUNOで実行すると、8ビットシフトレジスタ(74HC595)のラッチ、クロック、データピンに接続されたにArduinoUNOの8,11,12ピンからshiftOut関数によって信号が送信され、そのデータは0~256へとカウントアップして行きます。

//**************************************************************//
//   Name       : shiftOutCode, Hello World                                                 //
//   Author   : Carlyn Maw,Tom Igoe                                                             //
//   Date       : 25 Oct, 2006                                                                           //
//   Version : 1.0                                                                                             //
//   Notes     : 74HC595シフトレジスタを使用するためのコード                     //
//                   : 0から255までカウント                                                       //
//****************************************************************

//74HC595のST_CPに接続されたピン
int latchPin = 8;
//74HC595のSH_CPに接続されたピン
int clockPin = 12;
//74HC595のDSに接続されたピン
int dataPin = 11;

void setup() {
   //メインループ内でアドレス指定されているため、ピンを出力に設定する
   pinMode(latchPin, OUTPUT);
   pinMode(clockPin, OUTPUT);
   pinMode(dataPin, OUTPUT);
}

void loop() {
   //カウントアップルーチン
   for (int j = 0; j < 256; j++) {
       //送信している間は、ラッチピンをグランドに短絡してください
       digitalWrite(latchPin, LOW);
       shiftOut(dataPin, clockPin, LSBFIRST, j);
       //ラッチピンをハイに戻してチップに信号を送ります
       digitalWrite(latchPin, HIGH);
       delay(1000);
   }
}
イメージ 1
図1:プログラム例

■構文
 shiftOut(dataPin、clockPin、bitOrder、value)

■パラメータ
  dataPin:各ビットを出力するピン(int)
  clockPin:dataPinが正しい値に設定されるとトグルするピン(int)
  bitOrder:ビットをシフトアウトする順序。 
       MSBFIRSTまたはLSBFIRSTのいずれかです。
       ※Most Significant Bit First、またはMost Significant Bit First
  value:シフトアウトするデータ。(byte)

■戻り値
 有りません

■補足
 ①dataPinとclockPinは、すでにpinMode関数の呼び出しによって出力として設定されている必要があります。

 ②shiftOut関数は現在1バイト(8ビット)を出力するように書き込まれているので、255より大きい値を出力するには2ステップの操作が必要です。

// MSBFIRSTシリアルでこれを行う
int data = 500;
// 高いバイトからシフトアウト
shiftOut(dataPin, clock, MSBFIRST, (data >> 8));  
// 低いバイトからシフトアウト
shiftOut(dataPin, clock, MSBFIRST, data);

// LSBFIRSTシリアルでこれを行う
data = 500;
// 低いバイトからシフトアウト
shiftOut(dataPin, clock, LSBFIRST, data);  
// 高いバイトからシフトアウト
shiftOut(dataPin, clock, LSBFIRST, (data >> 8)); 
図2:コード例 
 ③立ち上がりエッジでクロックされるデバイスと接続する場合は、shiftOut関数の呼び出し前にクロックピンがローであることを確認する必要があります。 
 digitalWrite(clockPin、LOW)を呼び出します。
 
 ④この関数はソフトウェア実装です。より速いが特定のピンのみで動作するハードウェア実装を提供するSPIライブラリが有ります。

イメージ 1 イメージ 3
励みになりますのでよければクリック下さい(^o^)/

↩【ArduinoIDE reference】目次に戻る