今回はラズパイ3とArduinoを使って、簡単なSPI通信テストをやってみます。
とは言え、ネットに落ちてる情報を組み合わせてやってるだけなので、詳しくは探した方が解説付きでええかも。
これは自分の備忘録も兼ねてますので、ざっくりと手順を記載しています。
で、早速ラズパイ3とArduinoの接続からなんですが、ラズパイ3の入力って3.3VでAruduinoの出力は5Vなんですね。
なので、レベル変換する必要があります。
とは言え、難しい話ではなく、ただ単に1kΩ抵抗2本で分圧するだけで大丈夫です。
こんな感じ。
多分、図を書かなくても判って貰えるとは思ったのですが、一応書いてみました。
で、それぞれのピン配ですが、
ラズパイ3
Arduino
つう事で、
信号 | ラズパイ3 | Arduino |
MOSI | 19 | 11 |
MISO | 21 | 12 |
CLK | 23 | 13 |
CS | 24 | 10 |
GND | 39 | GND |
※MISOは分圧回路を経由して接続
※2018/05/04追記
fritzingなるソフトを見つけて、配線図を書いて見ました!
見づらいかなー?なんとなく判って貰えると嬉しいんだけどw
ソフトの話はこちらで
※追記ここまで
Arduinoのプログラム
新規スケッチに下記を記載
/* SPI Slave Masterから受信した数字を、+1してシリアル出力&送り返す (注)Master側がCSをDisableにしてくれないとSlaveが送信レジスタにデータを書けないよ CS - to digital pin 10 (SS pin) SDI - to digital pin 11 (MOSI pin) SDO - to digital pin 12 (MISO pin) CLK - to digital pin 13 (SCK pin) */ #include SPI.h void setup (void) { pinMode(MISO, OUTPUT); //送信ポートを出力にする Serial.begin(9600); //シリアル SPI.setBitOrder(MSBFIRST); //LSBFIRST / MSBFIRST SPI.setDataMode(SPI_MODE0 ); //立ち上がりでラッチ SPCR |= _BV(SPE); //SPI Enable SPI.attachInterrupt(); //SPI割り込み開始 } // SPI割り込み処理 ISR (SPI_STC_vect) { byte cc = SPDR; //SPIの受信バッファから取得 cc++; SPDR = cc; //送信データ格納 Serial.println(cc); //シリアル出力 } //メインループは何もしてないよ void loop (void) { }
※パクリ参照元:Raspi と ArduinoでSPI通信
受信データをそのまま送信するシンプルなプログラムです。
ついで、ラズパイ3ですが、ラズビアン上でコンパイルします。
#include bcm2835.h #include stdio.h int main(int argc, char **argv) { if (!bcm2835_init()) return 1; bcm2835_spi_begin(); bcm2835_spi_setBitOrder(BCM2835_SPI_BIT_ORDER_MSBFIRST); // The default bcm2835_spi_setDataMode(BCM2835_SPI_MODE0); // The default bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_65536); // The default bcm2835_spi_chipSelect(BCM2835_SPI_CS0); // The default bcm2835_spi_setChipSelectPolarity(BCM2835_SPI_CS0, LOW); // the default uint8_t send_data = 0x23; uint8_t read_data = bcm2835_spi_transfer(send_data); printf("Sent to SPI: 0x%02X. Read back from SPI: 0x%02X.\n", send_data, read_data); if (send_data != read_data) printf("Do you have the loopback from MOSI to MISO connected?\n"); bcm2835_spi_end(); bcm2835_close(); return 0; }
※パクリ参照元:Raspberry PiのSPI通信
上記ソースをコンパイルします。
$ gcc -o spi spi.c -l bcm2835
実行する前に、ラズパイのMOSIとMISOを短絡しておきます。
ループバックテストですので、自分で送信し、受信出来るかの確認になります。
で、実行!
$ sudo ./spi Sent to SPI: 0x23. Read back from SPI: 0x23.
上記はループバック成功のメッセージ。
短絡を外して実行すると、
$ sudo ./spi Sent to SPI: 0x23. Read back from SPI: 0x00. Do you have the loopback from MOSI to MISO connected?
接続されてませんよー!ってメッセージが出ます。
では、続いてラズパイ3とArduinoを接続。(写真の右上のが分圧してる所。)
次にArduinoのシリアルモニタを起動し、9600bpsに合わせます。
ラズパイ3から送信したデータを受信するとここに表示されます。
では、早速ラズパイで先ほどのプログラムを実行
ポチッ!
おおおおおおーーーーー!
シリアルモニタに受信データが表示されました!
では、オシロスコープで波形を確認。
しっかりと波形も取れております。
大成功です!(* ‘д’ノノ゙☆パチパチパチ
パクり先参考元の情報が良いので簡単に確認できました。
後は、FRAMが届いた時に色々弄って見たいと思います。
因みに、GNDはノイズの影響を受ける可能性があるので、接続しています。
管理人の場合、HDMIでモニター接続時には正常動作し、外すと正常に動作しない現象が発生し、モロGNDが弱いと気付き付けました。
環境によっては無くでも動作するかもしれませんが、元々ラズパイ自体GNDが弱いので、付けてた方が安心かも。
GND有り、無しの波形
同じ通信をしてるのに、この差です。
2018/6/30まで、オプション無料キャンペーンしてるよー。
凄いお得ですよー。