- Apa itu SPI?
- Kerja SPI
- Pin SPI di Arduino UNO
- Menggunakan SPI di Arduino
- Komponen Diperlukan untuk komunikasi Arduino SPI
- Diagram Litar Komunikasi Arduino SPI
- Cara Memprogram Arduino untuk Komunikasi SPI:
- Penjelasan Pengaturcaraan Master Arduino SPI
- Penjelasan Pengaturcaraan Arduino SPI Slave
- Bagaimana SPI berfungsi pada Arduino? - Mari mengujinya!
Mikrokontroler menggunakan banyak protokol yang berbeza untuk berkomunikasi dengan pelbagai sensor dan modul. Terdapat banyak jenis protokol komunikasi untuk komunikasi tanpa wayar dan kabel, dan teknik komunikasi yang paling biasa digunakan ialah Komunikasi Bersiri. Komunikasi bersiri adalah proses menghantar data sedikit demi sedikit, secara berurutan, melalui saluran komunikasi atau bas. Terdapat banyak jenis komunikasi bersiri seperti komunikasi UART, CAN, USB, I2C, dan SPI.
Dalam tutorial ini, kita belajar mengenai protokol SPI dan cara menggunakannya di Arduino. Kami akan menggunakan Protokol SPI untuk komunikasi antara dua Arduino. Di sini satu Arduino akan bertindak sebagai Master dan yang lain akan bertindak sebagai Slave, dua LED dan butang tekan akan disambungkan ke kedua Arduino. Untuk menunjukkan komunikasi SPI, kami akan mengendalikan LED sisi induk dengan menekan butang di sisi hamba dan sebaliknya menggunakan protokol komunikasi Serial SPI.
Apa itu SPI?
SPI (Serial Peripheral Interface) adalah protokol komunikasi bersiri. Antaramuka SPI ditemui oleh Motorola pada tahun 1970. SPI mempunyai sambungan dupleks penuh, yang bermaksud bahawa data dihantar dan diterima secara serentak. Iaitu master dapat mengirim data kepada master dan hamba dapat mengirim data ke master secara serentak. SPI adalah komunikasi bersiri segerak yang bermaksud jam diperlukan untuk tujuan komunikasi.
Komunikasi SPI sebelum ini dijelaskan dalam mikrokontroler lain:
- Komunikasi SPI dengan PIC Microcontroller PIC16F877A
- Memadankan TFT LCD Skrin Sentuh 3,5 inci dengan Raspberry Pi
- Pengaturcaraan mikrokontroler AVR dengan pin SPI
- Memadankan Nokia 5110 Grafik LCD dengan Arduino
Kerja SPI
SPI mempunyai komunikasi master / Slave dengan menggunakan empat baris. SPI hanya boleh mempunyai satu tuan dan boleh mempunyai banyak hamba. Master biasanya mikrokontroler dan hamba boleh menjadi mikrokontroler, sensor, ADC, DAC, LCD dll.
Di bawah ini adalah gambarajah blok representasi Master SPI dengan Single Slave.
SPI mempunyai empat baris berikut MISO, MOSI, SS, dan CLK
- MISO (Master in Slave Out) - Garis Slave untuk menghantar data kepada master.
- MOSI (Master Out Slave In) - Talian Master untuk menghantar data ke periferal.
- SCK (Serial Clock) - Denyutan jam yang menyegerakkan penghantaran data yang dihasilkan oleh induk.
- SS (Slave Select) –Master dapat menggunakan pin ini untuk mengaktifkan dan mematikan peranti tertentu.
Master SPI dengan Pelbagai Budak
Untuk memulakan komunikasi antara tuan dan hamba, kita perlu menetapkan pin Slave Select (SS) peranti yang diperlukan ke RENDAH, sehingga dapat berkomunikasi dengan master. Apabila tinggi, ia mengabaikan tuan. Ini membolehkan anda mempunyai banyak peranti SPI yang berkongsi garis induk MISO, MOSI, dan CLK yang sama. Seperti yang anda lihat dalam gambar di atas terdapat empat hamba di mana SCLK, MISO, MOSI biasa dihubungkan ke master dan SS setiap hamba dihubungkan secara berasingan ke pin SS individu (SS1, SS2, SS3) master. Dengan menetapkan pin SS yang diperlukan RENDAH tuan dapat berkomunikasi dengan budak itu.
Pin SPI di Arduino UNO
Gambar di bawah menunjukkan pin SPI yang hadir Arduino UNO (dalam kotak merah).
Talian SPI |
Sematkan di Arduino |
MOSI |
11 atau ICSP-4 |
MISO |
12 atau ICSP-1 |
SCK |
13 atau ICSP-3 |
SS |
10 |
Menggunakan SPI di Arduino
Sebelum memulakan pengaturcaraan untuk komunikasi SPI antara dua Arduino. Kita perlu belajar mengenai perpustakaan Arduino SPI yang digunakan di Arduino IDE.
Perpustakaan
1. SPI. Bermula ()
GUNAKAN: Untuk memulakan bas SPI dengan menetapkan SCK, MOSI, dan SS ke output, menarik SCK dan MOSI rendah, dan tinggi SS.
2. SPI.setClockDivider (pembahagi)
PENGGUNAAN: Untuk Menetapkan pembahagi jam SPI berbanding jam sistem. Pembahagi yang ada ialah 2, 4, 8, 16, 32, 64 atau 128.
Pembahagi:
- SPI_CLOCK_DIV2
- SPI_CLOCK_DIV4
- SPI_CLOCK_DIV8
- SPI_CLOCK_DIV16
- SPI_CLOCK_DIV32
- SPI_CLOCK_DIV64
- SPI_CLOCK_DIV128
3. SPI.attachInterrupt (pengendali)
PENGGUNAAN: Fungsi ini dipanggil apabila peranti hamba menerima data dari induk.
4. SPI. Pemindahan (val)
PENGGUNAAN: Fungsi ini digunakan untuk mengirim dan menerima data secara serentak antara tuan dan hamba.
Jadi sekarang mari kita mulakan dengan demonstrasi praktikal protokol SPI di Arduino. Dalam tutorial ini kita akan menggunakan dua arduino satu sebagai tuan dan yang lain sebagai hamba. Kedua-dua Arduino dilampirkan dengan LED & butang tekan secara berasingan. Master LED dapat dikendalikan dengan menggunakan tombol tekan slave Arduino dan LED slave Arduino dapat dikawal dengan menekan tombol master Arduino menggunakan protokol komunikasi SPI yang terdapat di arduino.
Komponen Diperlukan untuk komunikasi Arduino SPI
- Arduino UNO (2)
- LED (2)
- Butang Tekan (2)
- Perintang 10k (2)
- Perintang 2.2k (2)
- Papan roti
- Wayar Penyambung
Diagram Litar Komunikasi Arduino SPI
Gambarajah litar di bawah menunjukkan cara menggunakan SPI pada Arduino UNO, tetapi anda boleh mengikuti prosedur yang sama untuk komunikasi Arduino Mega SPI atau komunikasi Arduino nano SPI. Hampir semuanya tetap sama kecuali nombor pin. Anda mesti menyemak pin Arduino nano atau mega untuk mencari pin Arduino nano SPI dan pin Arduino Mega, setelah anda selesai bahawa semua yang lain akan sama.
Saya telah membina litar yang ditunjukkan di atas di atas papan roti, anda dapat melihat susunan litar yang saya gunakan untuk ujian di bawah.
Cara Memprogram Arduino untuk Komunikasi SPI:
Tutorial ini mempunyai dua program satu untuk master Arduino dan satu lagi untuk hamba Arduino. Program lengkap untuk kedua-dua belah pihak diberikan pada akhir projek ini.
Penjelasan Pengaturcaraan Master Arduino SPI
1. Pertama sekali kita perlu memasukkan perpustakaan SPI untuk menggunakan fungsi komunikasi SPI.
#sertakan
2. Dalam persediaan tidak sah ()
- Kami Memulakan Komunikasi Bersiri dengan Baud Rate 115200.
Serial.begin (115200);
- Pasang LED ke pin 7 dan butang Tekan ke pin 2 dan tetapkan pin tersebut masing-masing OUTPUT dan INPUT.
pinMode (ipbutton, INPUT); pinMode (LED, OUTPUT);
- Seterusnya kita memulakan komunikasi SPI
SPI.begin ();
- Seterusnya kami menetapkan Clockdivider untuk komunikasi SPI. Di sini kita telah menetapkan pembahagi 8.
SPI.setClockDivider (SPI_CLOCK_DIV8);
- Kemudian tetapkan pin SS TINGGI kerana kami tidak memulakan pemindahan ke slave arduino.
digitalWrite (SS, TINGGI);
3. Dalam gelung kosong ():
- Kami membaca status pin butang yang disambungkan ke pin2 (Master Arduino) kerana menghantar nilai tersebut kepada hamba Arduino.
buttonvalue = digitalRead (ipbutton);
- Tetapkan Logik untuk Menetapkan nilai x (Akan dihantar ke hamba) bergantung pada input dari pin 2
jika (buttonvalue == TINGGI) { x = 1; } lain { x = 0; }
- Sebelum menghantar nilai, kita perlu menurunkan nilai pilih hamba untuk memulakan pemindahan ke hamba dari tuan.
digitalWrite (SS, RENDAH);
- Di sinilah langkah penting, dalam pernyataan berikut kami mengirimkan nilai butang tekan yang disimpan dalam pemboleh ubah Mastersend kepada budak arduino dan juga menerima nilai dari hamba yang akan disimpan dalam pemboleh ubah Mastereceive .
Mastereceive = SPI.transfer (Mastersend);
- Selepas itu bergantung pada nilai Mastereceive kita akan menghidupkan atau mematikan LED Master Arduino.
jika (Mastereceive == 1) { digitalWrite (LED, TINGGI); // Set pin 7 HIGH Serial.println ("Master LED ON"); } lain { digitalWrite (LED, RENDAH); // Set pin 7 LOW Serial.println ("Master LED OFF"); }
Catatan: Kami menggunakan serial.println () untuk melihat hasilnya di Serial Motor dari Arduino IDE. Lihat Video di akhir.
Penjelasan Pengaturcaraan Arduino SPI Slave
1. Pertama sekali kita perlu memasukkan perpustakaan SPI untuk menggunakan fungsi komunikasi SPI.
#sertakan
2. Dalam persediaan tidak sah ()
- Kami Memulakan Komunikasi Bersiri dengan Baud Rate 115200.
Serial.begin (115200);
- Pasang LED ke pin 7 dan butang Tekan ke pin2 dan tetapkan pin OUTPUT dan INPUT masing-masing.
pinMode (ipbutton, INPUT); pinMode (LED, OUTPUT);
- Langkah penting di sini adalah penyataan berikut
pinMode (MISO, OUTPUT);
Pernyataan di atas menetapkan MISO sebagai OUTPUT (Harus Menghantar data kepada Master IN). Oleh itu data dihantar melalui MISO Slave Arduino.
- Sekarang Hidupkan SPI dalam Slave Mode dengan menggunakan SPI Control Register
SPCR - = _BV (SPE);
- Kemudian hidupkan gangguan untuk komunikasi SPI. Sekiranya data diterima dari master, Interrupt Routine dipanggil dan nilai yang diterima diambil dari SPDR (SPI data Register)
SPI.attachInterrupt ();
- Nilai dari master diambil dari SPDR dan disimpan dalam pemboleh ubah Slavereceived . Ini berlaku berikutan fungsi Interrupt Routine.
ISR (SPI_STC_vect) { Slavereceived = SPDR; diterima = benar; }
3. Selanjutnya dalam gelung void () kita menetapkan Slave arduino LED untuk AKTIF atau MATI bergantung pada nilai Slavereceived.
jika (Slavereceived == 1) { digitalWrite (LEDpin, TINGGI); // Tetapkan pin 7 sebagai HIGH LED ON Serial.println ("Slave LED ON"); } lain { digitalWrite (LEDpin, RENDAH); // Tetapkan pin 7 sebagai LOW LED OFF Serial.println ("Slave LED OFF"); }
- Seterusnya kita membaca status butang Slave Arduino Push dan menyimpan nilainya di Slavesend untuk menghantar nilainya ke Master Arduino dengan memberikan nilai ke daftar SPDR.
buttonvalue = digitalRead (butang pin); jika (buttonvalue == TINGGI) {x = 1; } lain {x = 0; } Slavesend = x; SPDR = Slavesend;
Catatan: Kami menggunakan serial.println () untuk melihat hasilnya di Serial Motor dari Arduino IDE. Lihat Video di akhir.
Bagaimana SPI berfungsi pada Arduino? - Mari mengujinya!
Berikut adalah gambar persediaan terakhir untuk komunikasi SPI antara dua Papan Arduino.
Apabila butang tekan di sebelah Master ditekan, LED putih di bahagian hamba akan menyala.
Dan apabila butang tekan di sebelah Slave ditekan, LED Merah di sebelah Master akan menyala.
Anda boleh melihat video di bawah ini untuk melihat demonstrasi komunikasi Arduino SPI. Sekiranya anda mempunyai pertanyaan, sila tinggalkan di ruangan komen, gunakan forum kami.