Percobaan 2
Komunikasi SPI Menggunakan Arduino
1. Foto Hardware dan Diagram Blok [Kembali]
2. Prosedur Percobaan [Kembali]
- Rangkai semua komponen
- Buka Arduino IDE dan masukan listing Program
- Upload program ke arduino
- jalankan program pada simulasi dan cobakan dengan modul
Prinsip Kerja
Pada rangkaian percobaan kali ini Master Arduino memiliki berperan sebagai penerima data misalnya dari pin 9. pada saat pin 9 mempunyai logika 1 (bernilai tinggi), maka pada master Arduino akan mengirimkan data "9" ke slave Arduino. Slave Arduino kemudian akan menerima data "9" tersebut dan menampilkannya pada seven segment.
Pada saat kondisi tidak terdapat dipswitch on maka angka yang ditampilkan ialah 1 ketika terdapat yang nyala akan disesuaikan dengan kondisi pada pin berapa yang menyala atau memiliki nilai logika 1, pada pin 2 maka akan menampilkan angka 2.
pada rangkaian ini sangat mungkin arduino master untuk mengontrol seven segment pada slave dari jarak jauh. arduino Master ini akan mengirimkan instruksi digital melalui SPI, dan slave menerjemahkan instruksi tersebut untuk menyalakan seven segment sesuai dengan pola yang telah ditetapkan.
4. Flowchart dan Listing Program [Kembali]
Listing Program:
Master
//Master Arduino
#include<SPI.h> //Library for SPI
int dip[] = {2,3,4,5,6,7,8,9};
int dipvalue[] = {};
void setup (){
Serial.begin(9600); //Starts Serial Communication at Baud Rate 115200
for(int i = 0; i < 8; i++){
pinMode(dip[i], INPUT_PULLUP);
}
SPI.begin(); //Begins the SPI commnuication
SPI.setClockDivider(SPI_CLOCK_DIV8); //Sets clock for SPI communication at 8 (16/8=2Mhz)
digitalWrite(SS,HIGH); // Setting SlaveSelect as HIGH (So master doesnt connnect with
slave)
}
void loop(void){
byte Mastersend;
int x = 1;
for(int i = 0; i < 8; i++){
dipvalue[i] = digitalRead(dip[i]);
if(dipvalue[i] == LOW){
x = dip[i];
}
}
digitalWrite(SS, LOW); //Starts communication with Slave connected to master
Mastersend = x;
Serial.println(Mastersend);
SPI.transfer(Mastersend); //Send the mastersend value to slave also receives value from slave
delay(1000);
}
Slave
//Slave Arduino:
#include<SPI.h>
const int segmentPins[] = {9, 8, 7, 6, 5, 4, 3, 2};
volatile boolean received = false;
volatile byte Slavereceived;
int index;
void setup(){
Serial.begin(9600);
for (int i = 0; i < 8; i++) {
pinMode(segmentPins[i], OUTPUT);
}
SPCR |= _BV(SPE); //Turn on SPI in Slave Mode
SPI.attachInterrupt(); //Interuupt ON is set for SPI commnucation
}
ISR (SPI_STC_vect){ //Inerrrput routine function
Slavereceived = SPDR; // Value received from master if store in variable slavereceived
received = true; //Sets received as True
}
void loop(){
Serial.println(Slavereceived);
if(received){//Logic to SET LED ON OR OFF depending upon the value recerived from 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)) {
// Get the digit index (0-9) from the character
int index = ch;
// Write the pattern to the segment pins
for (int i = 0; i < 7; i++) {
digitalWrite(segmentPins[i], patterns[index][i]);
}
}
}
Ketika tidak terdapat dipswitch on maka angka yang ditampilkan ialah 1 ketika terdapat yang nyala akan disesuaikan dengan pada pin berapa yang menyala atau berlogika 1, jika pada pin 2 maka akan menampilkan angka 2.
- HTML↠ klik disini
- Video Percobaan↠ klik disini
Tidak ada komentar:
Posting Komentar