📈
Ween's Lab
UdemyYouTubeTikTok
  • Welcome
  • 📻FPGA Tutorials
    • FPGA Boards: Getting Started
      • Getting Started with PYNQ on Kria KV260 Vision AI Starter Kit
      • Getting Started with PYNQ on Red Pitaya STEMlab 125-14
      • Getting Started with PYNQ on ZYBO
    • FPGA Ethernet Tutorial
      • FPGA Tutorial Ethernet 1: Simple TCP Server
    • PYNQ FPGA Tutorial 101
      • Part 0: Introduction
      • Part 1: GPIO
      • Part 2: Custom IP
      • Part 3: Memory
      • Part 4: ANN Processor
    • PYNQ FPGA Tutorial 102
      • Part 0: Introduction
      • Part 1: Memory Mapped
      • Part 2: Direct Memory Access
      • Part 3: AXI-Lite Multiplier
      • Part 4: AXI-Stream Multiplier with DMA
      • Part 5: AXI-Lite GCD
      • Part 6: AXI-Stream GCD with DMA
      • Part 7: Access to DDR from PL
    • ZYNQ FPGA Tutorial
      • Part 1: Gate-Level Combinational Circuit
      • Part 2: RT-Level Combinational Circuit
      • Part 3: Regular Sequential Circuit
      • Part 4: FSM Sequential Circuit
      • Part 5: ZYNQ Architecture
      • Part 6: ARM CPU and FPGA Module
      • Part 7: FPGA Memory
      • Part 8: Hardware Accelerator for Neural Networks
    • ZYNQ FPGA Linux Kernel Module
      • Cross Compiling Kernel, Kernel Module, and User Program for PYNQ
      • Configure PL to PS Interrupt in Kernel Module
      • Configure AXI DMA in Kernel Module
  • 📟Proyek Arduino
    • Kumpulan Proyek
      • Rangkaian LED
      • LED Berkedip Nyala Api
      • LED Chaser
      • LED Binary Counter
      • OLED 128x4 Bitcoin Ticker
      • Rangkaian Button
      • Button Multifungsi
      • Button Interrupt
      • Button Debouncing
    • Pelatihan Mikrokontroler Arduino ESP32
      • Bab 1 Pengenalan Mikrokontroler
      • Bab 2 Pengenalan Arduino
      • Bab 3 Pengenalan Bahasa C
      • Bab 4 Digital Output
      • Bab 5 Digital Input
      • Bab 6 Serial Communication
      • Bab 7 Analog-to-Digital Conversion
      • Bab 8 Interrupt
      • Bab 9 Timer
      • Bab 10 Pulse-Width Modulation
      • Bab 11 SPI Communication
      • Bab 12 I2C Communication
  • 💰Finance
    • Coding for Finance
      • Build a Bitcoin Price Alert with Google Cloud and Telegram
      • Build a Bitcoin Ticker with ESP32 and Arduino
      • Stock Price Forecasting with LSTM
    • Trading dan Investasi
      • Istilah Ekonomi, Keuangan, Bisnis, Trading, dan Investasi
      • Jalan Menuju Financial Abundance
      • Memahami Korelasi Emas, Oil, Dollar, BTC, Bonds, dan Saham
      • Mindset Trading dan Investasi
      • Rangkuman Buku: Rahasia Analisis Fundamental Saham
      • Rangkuman Buku: The Psychology of Money
      • Rangkuman Kuliah: Introduction to Adaptive Markets
      • Rumus Menjadi Orang Kaya
  • 📝Life
    • Life Quotes
Powered by GitBook
On this page
  • 1. SPI
  • 2. RFID RC522
  • 3. Contoh Program
  • 3.1. Program RC522 Serial Monitor
  • 3.2. Program RC522 LED
  • 4. Repository Kode Program
  1. Proyek Arduino
  2. Pelatihan Mikrokontroler Arduino ESP32

Bab 11 SPI Communication

PreviousBab 10 Pulse-Width ModulationNextBab 12 I2C Communication

Last updated 1 year ago

1. SPI

Serial Peripheral Interface (SPI) merupakan komunikasi serial synchronous yang biasa digunakan untuk jarak dekat. SPI banyak digunakan untuk menghubungkan mikrokontroler dengan sensor ataupun IC lainnya. SPI memiliki arsitektur master-slave yang terdiri dari biasanya satu master dan beberapa slave seperti pada Gambar 1.

  • SCK: Serial Clock (output dari master)

  • MISO: Master In Slave Out (data output dari slave ke master)

  • MOSI: Master Out Slave In (data output dari master ke slave)

  • SS: Slave Select (output dari master sebagai indikasi data sedang di-transfer)

Protocol SPI cukup berbeda dengan protocol serial yang lain, karena pada SPI tidak ada konsep seperti transmit dan receive data. Konsep yang digunakan yaitu pertukaran data antara master dan slave secara bersamaan. Baik master maupun slave memiliki shift register untuk menyimpan data yang akan dipertukarkan seperti pada Gambar 2.

Shift register tersebut dihubungkan melalui jalur MOSI dan MISO sehingga membentuk ring untuk pertukaran data. Ketika pertukaran data terjadi, data bit di shift register master akan berpindah ke shift register slave dan juga sebaliknya. Perpindahan data bit tersebut terjadi setiap clock SCK.

Walaupun SPI menggunakan konsep pertukaran data, tetapi pada praktiknya tidak semua data yang dikirim atau diterima dari slave berguna. Dengan kata lain data tersebut bisa saja dummy atau 0 atau 1. Hal ini bisa terjadi karena slave belum menerima perintah apapun dari master sehingga belum ada data yang harus dikirim ke master.

Gambar 3 menampilkan contoh protocol SPI. Ketika komunikasi terjadi, SS bernilai LOW karena biasanya sinyal ini bersifat active-low. Master mengirim data byte 0×53 ke slave, kemudian slave mengirim data byte 0×46 ke master. Data bit dikirim setiap ada rising edge dari clock SCK, tetapi bisa juga setiap ada falling edge tergantung konfigurasi yang dimiliki oleh masing-masing mikrokontroler. Urutan data yang di-transfer adalah LSB first, tetapi bisa juga MSB first tergantung konfigurasi yang dimiliki oleh masing-masing mikrokontroler.

2. RFID RC522

RFID RC522 merupakan modul untuk membaca atau menulis tag RFID. Tag RFID yang kompatibel dengan modul ini yaitu tag dengan frekuensi 13.56MHz standar ISO 14443A. Modul ini dapat berkomunikasi dengan mikrokontroler menggunakan interface SPI. Selain itu, modul ini juga support komunikasi yang lain yaitu I2C dan UART.

3. Contoh Program

Pada contoh program ini, kita akan mempelajari dua contoh program yang menggunakan SPI untuk berkomunikasi dengan RFID RC522. Pada contoh pertama, kita akan membaca UID dari tag RFID, kemudian ditampilkan pada serial monitor. Pada contoh kedua, kita akan membaca UID dari tag RFID, kemudian membandingkan UID tersebut dengan UID yang tersimpan di program. Jika UID sesuai ataupun tidak sesuai, maka akan ada indikator LED yang berkedip.

3.1. Program RC522 Serial Monitor

Pada contoh program ini, kita akan membaca UID dari tag RFID, kemudian ditampilkan pada serial monitor.

Untuk dapat menjalankan contoh program ini diperlukan beberapa komponen:

  • Development board ESP32

  • RFID RC522

  • Breadboard

  • Kabel jumper

Ilustrasi koneksi dari komponen-komponen ke ESP32 ditampilkan pada Gambar 5. Pin yang digunakan untuk menghubungkan komponen-komponen ke ESP32 ditampilkan pada tabel berikut ini.

RC522 Pin
ESP32 Pin

SDA

D21

SCK

D18

MOSI

D23

MISO

D19

RST

D22

3.3V

3.3V

GND

GND

Kode berikut ini menampilkan contoh program RC522 dengan serial monitor. Berikut ini penjelasan cara kerja program tersebut:

  • Pada line 5-6, kita mendefinisikan pin untuk RST dan SS dari modul RC522.

  • Pada line 9, kita melakukan deklarasi objek untuk RC522 dengan dua argumen input yaitu pin RST dan SS.

  • Pada line 14-18, kita melakukan inisialisasi serial, SPI, dan RC522.

  • Pada line 25-26, kita melakukan pendeteksian apakah ada tag RFID baru. Jika tidak ada tag RFID baru yang terdeteksi, maka akan keluar dari loop (skip kode di bawahnya) dengan perintah return. Hal ini dilakukan agar tidak terjadi pembacaan berulang-ulang jika user menempelkan tag RFID (yang sama) cukup lama pada reader.

  • Pada line 29-30, kita melakukan pembacaan isi tag RFID yang terdeteksi. Jika pembacaan gagal, maka akan keluar dari loop.

  • Pada line 33-37, kita hanya mengambil informasi UID-nya saja dari hasil pembacaan RFID, kemudian disimpan pada variable uid.

  • Pada line 39, kita stop pembacaan tag RFID tersebut.

  • Pada line 42-43, kita kirim UID yang terbaca ke serial monitor.

spi-rfid-rc522.ino
#include <spi.h>
#include <mfrc522.h>

// Pin untuk MFRC522
#define RST_PIN 22
#define SS_PIN  21

// Deklarasi object untuk MFRC522
MFRC522 mfrc522(SS_PIN, RST_PIN);

void setup()
{
  // Inisialisasi serial
  Serial.begin(9600);
  // Inisialisasi SPI
  SPI.begin();
  // Inisialisasi MFRC522
  mfrc522.PCD_Init();
}

void loop()
{
  // Reset loop jika tidak ada kartu RFID baru yang terdeteksi
  // Hal ini dilakukan agar proses di dalam loop ini tidak berjalan terus menerus
  if (!mfrc522.PICC_IsNewCardPresent())
    return;

  // Melakukan pembacaan kartu RFID
  if (!mfrc522.PICC_ReadCardSerial())
    return;

  // Membaca UID dari kartu RFID
  unsigned long uid = 0;
  uid |= mfrc522.uid.uidByte[0] << 24;
  uid |= mfrc522.uid.uidByte[1] << 16;
  uid |= mfrc522.uid.uidByte[2] << 8;
  uid |= mfrc522.uid.uidByte[3];
  // Stop pembacaan kartu RFID
  mfrc522.PICC_HaltA();

  // Print UID ke serial monitor
  Serial.print("Card detected, UID: ");
  Serial.println(uid, HEX);
}

Gambar 6 menampilkan hasil program RC522 dengan serial monitor. Setiap ada tag RFID yang terbaca, maka UID dari tag tersebut akan ditampilkan pada serial monitor.

3.2. Program RC522 LED

Pada contoh program ini, kita akan membaca UID dari tag RFID, kemudian membandingkan UID tersebut dengan UID yang tersimpan di program. Jika UID sesuai, maka LED hijau akan berkedip. Jika UID tidak sesuai, maka LED merah akan berkedip.

Untuk dapat menjalankan contoh program ini diperlukan beberapa komponen:

  • Development board ESP32

  • RFID RC522

  • 1 buah LED

  • 1 buah resistor 100Ω

  • Breadboard

  • Kabel jumper

Ilustrasi koneksi dari komponen-komponen ke ESP32 ditampilkan pada Gambar 7. Pin yang digunakan untuk menghubungkan komponen-komponen ke ESP32 ditampilkan pada tabel sebelumnya dan tabel berikut ini.

Sensor/Actuator Pin
ESP32 Pin

LED merah

D25

LED hijau

D26

Kode berikut ini menampilkan contoh program RC522 dengan LED. Cara kerja program tersebut sama dengan program RC522 dengan serial monitor terutama pada bagian RC522. Perbedaannya yaitu pada perbandingan UID yang terbaca dengan UID yang didaftarkan, kemudian penambahan kode untuk LED.

  • Pada line 9-10, kita mendefinisikan pin untuk LED.

  • Pada line 23-28, kita mengkonfigurasi GPIO untuk LED, kemudian menulis nilai awal ke GPIO untuk mematikan LED tersebut.

  • Pada line 52-73, kita membandingkan UID dengan nilai UID yang diinginkan. Ketika tag RFID dengan UID tersebut terbaca, maka LED hijau akan berkedip 3 kali. Sebaliknya, jika UID lain yang terbaca, maka LED merah akan berkedip 3 kali.

rfid-rc522-led.ino
#include <spi.h>
#include <mfrc522.h>

// Pin untuk MFRC522
#define RST_PIN 22
#define SS_PIN  21

// LED pin
#define RED_LED_PIN     25
#define GREEN_LED_PIN   26

// Deklarasi object untuk MFRC522
MFRC522 mfrc522(SS_PIN, RST_PIN);

void setup()
{
  // Inisialisasi SPI
  SPI.begin();
  // Inisialisasi MFRC522
  mfrc522.PCD_Init();

  // Konfigurasi GPIO pin sebagai output untuk LED
  pinMode(RED_LED_PIN, OUTPUT);
  pinMode(GREEN_LED_PIN, OUTPUT);

  // Set nilai LED ke kondisi off
  digitalWrite(RED_LED_PIN, HIGH);
  digitalWrite(GREEN_LED_PIN, HIGH);
}

void loop()
{
  // Reset loop jika tidak ada kartu RFID baru yang terdeteksi
  // Hal ini dilakukan agar proses di dalam loop ini tidak berjalan terus menerus
  if (!mfrc522.PICC_IsNewCardPresent())
    return;

  // Melakukan pembacaan kartu RFID
  if (!mfrc522.PICC_ReadCardSerial())
    return;

  // Membaca UID dari kartu RFID
  unsigned long uid = 0;
  uid |= mfrc522.uid.uidByte[0] << 24;
  uid |= mfrc522.uid.uidByte[1] << 16;
  uid |= mfrc522.uid.uidByte[2] << 8;
  uid |= mfrc522.uid.uidByte[3];
  // Stop pembacaan kartu RFID
  mfrc522.PICC_HaltA();

  // Pengecekan UID
  if (uid == 0xD265ADBB)
  {
    // Jika UID benar, maka kedipkan green LED
    for (int i = 0; i < 3; i++)
    {
      digitalWrite(GREEN_LED_PIN, LOW);
      delay(100);
      digitalWrite(GREEN_LED_PIN, HIGH);
      delay(100);
    }
  }
  else
  {
    // Jika UID salah, maka kedipkan red LED
    for (int i = 0; i < 3; i++)
    {
      digitalWrite(RED_LED_PIN, LOW);
      delay(100);
      digitalWrite(RED_LED_PIN, HIGH);
      delay(100);
    }
  }
}

Gambar 8 menampilkan contoh program RC522 dengan LED. Ketika tag RFID yang sudah terdaftar dibaca oleh reader tersebut, maka LED hijau akan berkedip 3 kali. Sebaliknya, ketika tag RFID yang tidak dikenal dibaca oleh reader tersebut, maka LED merah akan berkedip 3 kali. Aplikasi dari contoh sederhana ini dapat diterapkan pada door access ataupun sistem parkir berbasis RFID.

4. Repository Kode Program

SPI merupakan komunikasi . Setiap slave memiliki jalur SS-nya masing-masing, jadi jika ada 3 slave, maka diperlukan 3 pin SS. SPI memiliki 4 sinyal yaitu:

Untuk menggunakan modul ini sudah terdapat library Arduino yang mudah digunakan. Library yang akan digunakan pada tutorial ini dapat di-download dari . Dengan menggunakan library, maka akan sangat mudah sekali untuk menggunakan modul ini. Kita tidak perlu mempelajari pertintah-perintah SPI dari datasheet, dan tidak perlu membuat sendiri fungsi-fungsi untuk kontrol modul ini.

Pada line 1-2, kita meng-import library untuk SPI dan RC522. Library RC522 dapat di-download dari

Kode program untuk RC522 dengan serial monitor dan RC522 dengan LED dapat didapatkan di repository ini: dan .

📟
full duplex
sini
sini
spi-rfid-rc522
rfid-rc522-led
Gambar 1. Arsitektur bus SPI
Gambar 2. Register pada device SPI
Gambar 4. Modul RFID RC522
Gambar 5. Rangkaian breadboard untuk program RC522 dengan serial monitor
Gambar 6. Hasil program RC522 dengan serial monitor
Gambar 7. Rangkaian breadboard untuk program RC522 dengan LED
Gambar 8. Hasil program RC522 dengan LED
Gambar 3. Protocol SPI. Sumber:
https://learn.sparkfun.com/tutorials/serial-peripheral-interface-spi/all