SPI (Serial Peripheral Interface) とはどんな通信方式なのかを勉強して、Arduino からシフトレジスタ 74HC595 (SIPO) へ SPI でデータを送る実験をしてみました。
この記事は「meyon's STUDY」に投稿した記事の抜粋です。
なお、Arduino 公式サイトのアナウンスに従い、用語の言い換えをしています。新しい用語については Arduino & Serial Peripheral Interface (SPI) を参照してください。
Arduino から 74HC595 へデータを送る方法
Arduino では、SPI のコマンドである SPI.transfer(value) で内部のシフトレジスタへデータ value が渡され、 をとおして送信が始まります。74HC595 は、Arduino から送られてくるシリアルクロック に同期してデータを受け取ります。すべてのデータが送信されたら Arduino から 信号が送られてきますので、ストレージレジスタへデータを渡します。
コントローラ (Arduino) 側では、チップセレクト を LOW にすることで通信を開始し、終了したら HIGH にもどす。SPI.transfer() を実行すると、 にデータ D7 がセットされ、シリアルクロック が送出される。 は 8クロック出力され、それにともなって送信データがシフトする。
ペリフェラル (74HC595) 側。 は レジスタクロック につながっていて、LOW になっても何も起こらない。 は シフトクロック につながるが、クロックが入ってこなければ何も起こらない。つまり、待機状態。
は シリアル入力 につながっているので、Arduino 側でデータ D7 が にセットされると、それが に入力される。 が入るたびにデータを受けとり、シフトして、8ビットのデータがシフトレジスタから出力される。送信が終了し が HIGH になると、それがレジスタクロック となり、データがストレージレジスタから出力される。
回路図
Arduino は Nano Every です。使用するピンは、 が D13、 が D11で UNO や NANO と同じですが、 は D8 です。UNO、NANO では D10 ですので、間違えないように。
は入力端子ですので、GND もしくは +5V につないでおきます。うっかり出力ポートにしちゃったりすると悲惨な目にあいますので、1kΩ の抵抗を保護のためにつけておきましょう。
スケッチ
Arduino Nano Every では のピンモードを設定してやらないとうまく動きません。UNO や NANO では必要ないです。
Arduino で生成された 8ビットのカウントデータ 0x00~0xFF が、LEDに表示されます。
spi_transmission_test.ino
// Sketch for Arduino to 74HC595 SPI-Test 2023.9.8 meyon
#include <SPI.h>
SPISettings mySettings(8000000, MSBFIRST, SPI_MODE0);
void setup() {
// In Nano Every,SS is pin-D8, Mode setting required
pinMode(SS, OUTPUT);
SPI.begin();
}
void loop() {
for (int value=0x00; value<=0xFF; value++) {
SPI.beginTransaction(mySettings);
digitalWrite(SS, LOW);
SPI.transfer(value);
digitalWrite(SS, HIGH);
SPI.endTransaction();
delay(50);
}
}
投稿者の人気記事
-
meyon230
さんが
2023/09/21
に
編集
をしました。
(メッセージ: 初版)
-
meyon230
さんが
2023/09/21
に
編集
をしました。
(メッセージ: 一般公開)
-
meyon230
さんが
2023/11/01
に
編集
をしました。
(メッセージ: リンク先URL変更)
ログインしてコメントを投稿する