- SPIとは何ですか?
- SPIの動作
- ArduinoUNOのSPIピン
- ArduinoでSPIを使用する
- ArduinoSPI通信に必要なコンポーネント
- ArduinoSPI通信回路図
- SPI通信用にArduinoをプログラムする方法:
- ArduinoSPIマスタープログラミングの説明
- ArduinoSPIスレーブプログラミングの説明
- SPIはArduinoでどのように機能しますか?-テストしてみましょう!
マイクロコントローラーは、さまざまなセンサーやモジュールと通信するために多くの異なるプロトコルを使用します。無線および有線通信にはさまざまな種類の通信プロトコルがあり、最も一般的に使用される通信技術はシリアル通信です。シリアル通信は、通信チャネルまたはバスを介して、一度に1ビットずつ順番にデータを送信するプロセスです。UART、CAN、USB、I2C、SPI通信などのシリアル通信には多くの種類があります。
このチュートリアルでは、SPIプロトコルとArduinoでの使用方法について学習 します。2つのArduino間の通信にはSPIプロトコルを使用します。ここでは、1つのArduinoがマスターとして機能し、もう1つがスレーブとして機能し、2つのLEDとプッシュボタンが両方のArduinoに接続されます。SPI通信を実証するために、SPIシリアル通信プロトコルを使用してスレーブ側のプッシュボタンでマスター側LEDを制御し、その逆も行います。
SPIとは何ですか?
SPI(Serial Peripheral Interface)は、シリアル通信プロトコルです。SPIインターフェイスは1970年にモトローラによって発見されました。SPIには全二重接続があります。つまり、データは同時に送受信されます。つまり、マスターはスレーブにデータを送信でき、スレーブは同時にマスターにデータを送信できます。SPIは同期シリアル通信であり、通信の目的でクロックが必要であることを意味します。
SPI通信は、他のマイクロコントローラーで以前に説明されています。
- PICマイクロコントローラPIC16F877AとのSPI通信
- 3.5インチタッチスクリーンTFTLCDとRaspberryPiのインターフェース
- SPIピンを使用したAVRマイクロコントローラーのプログラミング
- Nokia5110グラフィカルLCDとArduinoのインターフェース
SPIの動作
SPIは、4本の回線を使用してマスター/スレーブ通信を行います。SPIは、マスターを1つだけ持つことができ、複数のスレーブを持つことができます。マスターは通常マイクロコントローラーであり、スレーブはマイクロコントローラー、センサー、ADC、DAC、LCDなどです。
以下は、シングルスレーブを備えたSPIマスターのブロック図表現です。
SPIには次の4つのラインがありますMISO、MOSI、SS、およびCLK
- MISO(マスターインスレーブアウト) -マスターにデータを送信するためのスレーブライン。
- MOSI(Master Out Slave In) -周辺機器にデータを送信するためのマスターライン。
- SCK(シリアルクロック) -マスターによって生成されたデータ送信を同期するクロックパルス。
- SS(スレーブ選択)–マスターはこのピンを使用して特定のデバイスを有効または無効にできます。
複数のスレーブを備えたSPIマスター
マスターとスレーブ間の通信を開始するには、必要なデバイスのスレーブ選択(SS)ピンをLOWに設定して、マスターと通信できるようにする必要があります。高い場合、マスターを無視します。これにより、マスターの同じMISO、MOSI、およびCLKラインを共有する複数のSPIデバイスを使用できます。上の画像でわかるように、SCLK、MISO、MOSIが共通にマスターに接続され、各スレーブのSSがマスターの個々のSSピン(SS1、SS2、SS3)に個別に接続されている4つのスレーブがあります。必要なSSピンをLOWに設定することにより、マスターはそのスレーブと通信できます。
ArduinoUNOのSPIピン
下の画像は、Arduino UNO(赤いボックス内)に存在するSPIピンを示しています。
SPIライン |
Arduinoでピン留め |
MOSI |
11またはICSP-4 |
味噌 |
12またはICSP-1 |
SCK |
13またはICSP-3 |
SS |
10 |
ArduinoでSPIを使用する
2つのArduino間のSPI通信のプログラミングを開始する前。ArduinoIDEで使用されるArduinoSPIライブラリについて学ぶ必要があります。
図書館
1. SPI.begin()
使用法: SCK、MOSI、およびSSを出力に設定し、SCKおよびMOSIをローに、SSをハイに設定して、SPIバスを初期化します。
2. SPI.setClockDivider(divider)
使用法:システムクロックを基準にしてSPIクロック分周器を設定します。使用可能な仕切りは、2、4、8、16、32、64、または128です。
仕切り:
- SPI_CLOCK_DIV2
- SPI_CLOCK_DIV4
- SPI_CLOCK_DIV8
- SPI_CLOCK_DIV16
- SPI_CLOCK_DIV32
- SPI_CLOCK_DIV64
- SPI_CLOCK_DIV128
3. SPI.attachInterrupt(ハンドラー)
使用:この関数は、スレーブデバイスがマスターからデータを受信したときに呼び出されます。
4. SPI.transfer(val )
使用:この機能は、マスターとスレーブ間でデータを同時に送受信するために使用されます。
それでは、ArduinoでのSPIプロトコルの実際的なデモンストレーションから始めましょう。このチュートリアルでは、2つのarduinoをマスターとして使用し、もう1つをスレーブとして使用します。両方のArduinoには、LEDとプッシュボタンが別々に取り付けられています。マスターLEDはスレーブArduinoのプッシュボタンを使用して制御でき、スレーブArduinoのLEDはarduinoに存在するSPI通信プロトコルを使用してマスターArduinoのプッシュボタンで制御できます。
ArduinoSPI通信に必要なコンポーネント
- Arduino UNO(2)
- LED(2)
- 押しボタン(2)
- 抵抗器10k(2)
- 抵抗2.2k(2)
- ブレッドボード
- 接続線
ArduinoSPI通信回路図
以下の回路図は、Arduino UNOでSPIを使用する方法を示していますが、Arduino MegaSPI通信またはArduinonanoSPI通信でも同じ手順に従うことができます。ピン番号を除いて、ほとんどすべてが同じままです。Arduino nanoまたはmegaのピン配置をチェックして、Arduino nanoSPIピンとArduinoMegaピンを見つける必要があります。そうしたら、他のすべてが同じになります。
上記の回路をブレッドボード上に構築しました。テストに使用した回路設定を以下に示します。
SPI通信用にArduinoをプログラムする方法:
このチュートリアルには、マスターArduino用とスレーブArduino用の2つのプログラムがあります。このプロジェクトの最後に、双方の完全なプログラムが提供されます。
ArduinoSPIマスタープログラミングの説明
1.まず、SPI通信機能を使用するためのSPIライブラリを含める必要があります。
#include
2. void setup()で
- ボーレート115200でシリアル通信を開始します。
Serial.begin(115200);
- LEDをピン7に接続し、プッシュボタンをピン2に接続して、これらのピンをそれぞれOUTPUTとINPUTに設定します。
pinMode(ipbutton、INPUT); pinMode(LED、OUTPUT);
- 次に、SPI通信を開始します
SPI.begin();
- 次に、SPI通信用にClockdividerを設定します。ここでは、仕切り8を設定しました。
SPI.setClockDivider(SPI_CLOCK_DIV8);
- 次に、スレーブarduinoへの転送を開始しなかったため、SSピンをHIGHに設定します。
digitalWrite(SS、HIGH);
3. void loop()の場合:
- これらの値をスレーブArduinoに送信するために、ピン2(マスターArduino)に接続されている押しボタンピンのステータスを読み取ります。
buttonvalue = digitalRead(ipbutton);
- ピン2からの入力に応じて、x値(スレーブに送信される)を設定するためのロジックを設定します。
if(buttonvalue == HIGH) { x = 1; } else { x = 0; }
- 値を送信する前に、スレーブ選択値をLOWにして、マスターからスレーブへの転送を開始する必要があります。
digitalWrite(SS、LOW);
- ここでは、に保存されたプッシュボタンの値お送り次の文の重要なステップ、来る Mastersendの スレーブアルドゥイーノに変数をともに格納されますスレーブから値を受け取る Mastereceiveの 変数が。
Mastereceive = SPI.transfer(Mastersend);
- その後、 Mastereceiveの 値に応じて、 Master ArduinoLED をオンまたはオフにします。
if(Mastereceive == 1) { digitalWrite(LED、HIGH); //ピン7をHIGHに設定 Serial.println( "Master LED ON"); } else { digitalWrite(LED、LOW); //ピン7をLOWに設定 Serial.println( "Master LED OFF"); }
注: ArduinoIDEの シリアルモーターで結果を表示するには、 serial.println() を使用します。最後にビデオを確認してください。
ArduinoSPIスレーブプログラミングの説明
1.まず、SPI通信機能を使用するためのSPIライブラリを含める必要があります。
#include
2. void setup()で
- ボーレート115200でシリアル通信を開始します。
Serial.begin(115200);
- LEDをピン7に接続し、プッシュボタンをピン2に接続して、これらのピンをそれぞれOUTPUTとINPUTに設定します。
pinMode(ipbutton、INPUT); pinMode(LED、OUTPUT);
- ここでの重要なステップは次のステートメントです
pinMode(MISO、OUTPUT);
上記のステートメントは、MISOをOUTPUT(マスターINにデータを送信する必要がある)として設定します。そのため、データはスレーブArduinoのMISOを介して送信されます。
- 次に、SPI制御レジスタを使用してスレーブモードでSPIをオンにします。
SPCR- = _BV(SPE);
- 次に、SPI通信の割り込みをオンにします。マスターからデータを受信すると、割り込みルーチンが呼び出され、受信した値がSPDR(SPIデータレジスタ)から取得されます。
SPI.attachInterrupt();
- マスターからの値はSPDRから取得され、 Slavereceived 変数に格納されます。これは、次の割り込みルーチン機能で行われます。
ISR(SPI_STC_vect) { Slavereceived = SPDR; 受信= true; }
3.次にボイドループ()で、Slavereceived値に応じてSlave arduinoLEDをオンまたはオフに設定します。
if(Slavereceived == 1) { digitalWrite(LEDpin、HIGH); //ピン7を HIGHLED ONに設定Serial.println( "Slave LED ON"); } else { digitalWrite(LEDpin、LOW); //ピン7を LOWLED OFFに設定しますSerial.println( "Slave LED OFF"); }
- 次に、スレーブArduinoプッシュボタンのステータスを読み取り、値を Slavesend に格納して、SPDRレジスタに値を与えることによって値をマスターArduinoに送信します。
buttonvalue = digitalRead(buttonpin); if(buttonvalue == HIGH){x = 1; } else {x = 0; } Slavesend = x; SPDR = Slavesend;
注: ArduinoIDEの シリアルモーターで結果を表示するには、 serial.println() を使用します。最後にビデオを確認してください。
SPIはArduinoでどのように機能しますか?-テストしてみましょう!
以下は、2つのArduinoボード間のSPI通信の最終セットアップの写真です。
マスター側の押しボタンを押すと、スレーブ側の白色LEDが点灯します。
また、スレーブ側の押しボタンを押すと、マスター側の赤色LEDが点灯します。
以下のビデオをチェックして、ArduinoSPI通信のデモンストレーションを見ることができます。ご不明な点がございましたら、コメントセクションに残してください。フォーラムをご利用ください。