Laporan Akhir 2 Modul 3
Percobaan 2
1. Rangkai rangkaian sesuai dengan modul praktikum.
2. Tulis program untuk arduino di software Arduino IDE.
2. Tulis program untuk arduino di software Arduino IDE.
3. Sambungkan arduino dengan laptop
4. Upload program tadi ke arduino
5. Setelah program selesai di upload, jalankan simulasi rangkaian
4. Upload program tadi ke arduino
5. Setelah program selesai di upload, jalankan simulasi rangkaian
6. Periksa apakah rangkaian sensuai dengan yang diharapkan, jika tidak, perbaiki rangkaian dan/atau program yang terkait
2. Hardware dan Diagram Blok
[Kembali]
3. Rangkaian Simulasi dan Prinsip Kerja
[Kembali]
Rangkaian Simulasi :
Prinsip Kerja :
Percobaan ini menggunakan komunikasi antara dua Arduino menggunakan protokol SPI (Serial Peripheral Interface). Arduino Master memiliki delapan pin input yang terhubung dengan sakelar DIP. Ketika salah satu sakelar DIP ditekan, program akan membaca nilai digital pada pin tersebut dan mengirimkan nomor pin yang sesuai melalui komunikasi SPI ke Arduino Slave.
Pada Arduino Slave, program akan menerima data yang dikirimkan oleh Arduino Master melalui komunikasi SPI. Data yang diterima kemudian digunakan untuk menentukan pola yang akan ditampilkan pada display seven-segment yang terhubung dengan delapan pin output. Program Slave menggunakan matriks dua dimensi untuk menyimpan pola-pola biner yang merepresentasikan angka 0 hingga 9. Berdasarkan data yang diterima dari Master, program akan mengambil pola biner yang sesuai dari matriks dan menuliskannya ke pin-pin output yang terhubung dengan display seven-segment, sehingga angka yang sesuai akan ditampilkan.
4. Flowchart dan Listing Program
[Kembali]
Flowchart :
Listing Program :
//Master Arduino
#include<SPI.h> //Library untuk SPI
// Mendefinisikan array untuk menyimpan nomor pin untuk sakelar DIP
int dip[] = {2,3,4,5,6,7,8,9};
// Mendefinisikan array untuk menyimpan nilai yang dibaca dari sakelar DIP
int dipvalue[] = {};
void setup (){
Serial.begin(9600); //Memulai Komunikasi Serial pada Baud Rate 115200
// Menginisialisasi pin sakelar DIP sebagai INPUT_PULLUP
for(int i = 0; i < 8; i++){
pinMode(dip[i], INPUT_PULLUP);
}
SPI.begin(); //Memulai komunikasi SPI
SPI.setClockDivider(SPI_CLOCK_DIV8); //Mengatur clock untuk komunikasi SPI pada 8 (16/8=2Mhz)
digitalWrite(SS,HIGH); // Menetapkan SlaveSelect sebagai HIGH (Sehingga master tidak terhubung dengan slave)
}
void loop(void){
byte Mastersend;
int x = 1;
// Membaca status sakelar DIP
for(int i = 0; i < 8; i++){
dipvalue[i] = digitalRead(dip[i]);
if(dipvalue[i] == LOW){
x = dip[i]; // Jika sakelar dalam keadaan LOW, atur x ke nomor pin yang sesuai
}
}
digitalWrite(SS, LOW); //Memulai komunikasi dengan Slave yang terhubung ke master
Mastersend = x; // Mengatur Mastersend ke nomor pin sakelar DIP yang dipilih
Serial.println(Mastersend); // Mencetak nilai Mastersend ke monitor serial
SPI.transfer(Mastersend); //Mengirim nilai Mastersend ke slave dan juga menerima nilai dari slave
delay(1000);
}
//Slave Arduino:
#include<SPI.h>
// Definisikan nomor pin untuk segmen
const int segmentPins[] = {9, 8, 7, 6, 5, 4, 3, 2};
// Flag untuk menandakan apakah data diterima
volatile boolean received = false;
// Variabel untuk menyimpan data yang diterima dari master
volatile byte Slavereceived;
void setup(){
Serial.begin(9600);
// Atur pin segmen sebagai OUTPUT
for (int i = 0; i < 8; i++) {
pinMode(segmentPins[i], OUTPUT);
}
SPCR |= _BV(SPE); // Aktifkan SPI dalam Mode Slave
SPI.attachInterrupt(); // Interrupt ON diatur untuk komunikasi SPI
}
// Fungsi rutin layanan interupsi untuk SPI
ISR (SPI_STC_vect){
Slavereceived = SPDR; // Nilai yang diterima dari master disimpan dalam variabel Slavereceived
received = true; // Menetapkan received sebagai True
}
void loop(){
Serial.println(Slavereceived);
if(received){
// Logika untuk MENYETEL LED ON ATAU OFF tergantung pada nilai yang diterima dari master
displayCharacter(Slavereceived);
delay(1000);
}
}
void displayCharacter(int ch) {
byte patterns[10][7] = {
{0, 0, 0, 0, 0, 0, 1}, // 0
{1, 0, 0, 1, 1, 1, 1}, // 1
{0, 0, 1, 0, 0, 1, 0}, // 2
{0, 0, 0, 0, 1, 1, 0}, // 3
{1, 0, 0, 1, 1, 0, 0}, // 4
{0, 1, 0, 0, 1, 0, 0}, // 5
{0, 1, 0, 0, 0, 0, 0}, // 6
{0, 0, 0, 1, 1, 1, 1}, // 7
{0, 0, 0, 0, 0, 0, 0}, // 8
{0, 0, 0, 0, 1, 0, 0} // 9
};
if ((ch >= 0 && ch <= 9)) {
// Dapatkan indeks digit (0-9) dari karakter
int index = ch;
// Tulis pola ke pin segmen
for (int i = 0; i < 7; i++) {
digitalWrite(segmentPins[i], patterns[index][i]);
}
}
}
Percobaan 2
Komunikasi SPI menggunakan Arduino
6. Video Demo [Kembali]
7. Download File
[Kembali]