Tugas Pendahuluan 2 M3

 



Percobaan II Kondisi 3

 Komunikasi UART Menggunakan Arduino

1. Foto Hardware dan Diagram Blok [Kembali]

        1. Arduino Uno


        2. LED




      3. DIP Switch
               






        4. Resistor

       5. Power Supply


     6. Ground




Diagram Blok:




2. Prosedur Percobaan  [Kembali]

Rangkai semua komponen 
+ buat program di aplikasi arduino IDE
+ setelah selesai masukkan program ke arduino 
+ jalankan program pada simulasi dan cobakan dengan modul








Prinsip Kerja

    Pada rangkaian ini terdapat 2 arduino yaitu master dan slave.  Master bertindak sebagai pengirim data, sementara slave sebagai penerima data dan pengendali LED.  Keduanya berkomunikasi melalui UART (Universal Asynchronous Receiver Transmitter), antarmuka komunikasi serial yang memungkinkan dua perangkat untuk berkomunikasi satu sama lain.

    Di pihak master, data yang dikirim adalah representasi digital dari keadaan switch.  Jika 3 switch aktif , data yang dikirim adalah karakter 'A', sedangkan jika 4 aktif, data yang dikirim adalah karakter 'B'. Data ini dikirim melalui pin TX (transmit) pada master menuju pin RX (receive) pada slave lewat jalur komunikasi serial.

    Sementara di pihak slave, data yang diterima dari master melalui pin RX diubah menjadi nilai digital 1 atau 0. Nilai inilah yang kemudian menentukan LED mana yang akan menyala. Pada program diatur bahwa jika pesan yang diterima adalah 'A', maka LED akan counting 0-5 pada digit 1 seven segment dan 6-9 pada digit 2 seven segment. Sedangkan jika pesan yang diterima adalah 'B', maka LED akan counting 0-5 pada digit 2 seven segment dan 6-9 pada digit 1 seven segment.

    Dengan demikian, rangkaian ini memungkinkan master untuk mengontrol LED pada slave dari jarak jauh.  Master mengirimkan instruksi digital melalui UART, dan slave menerjemahkan instruksi tersebut untuk menyalakan LED sesuai dengan pola yang telah ditentukan.

4. Flowchart dan Listing Program [Kembali]

Master Arduino:


Slave Arduino: 

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;
  int activeSwitches = 0; // variabel untuk menghitung jumlah saklar yang aktif

  // Membaca status saklar dan menghitung berapa yang aktif
  for (int i = 0; i < 8; i++) {
    dipvalue[i] = digitalRead(dip[i]);
    if (dipvalue[i] == LOW) {
      x = dip[i];
      activeSwitches++;
    }
  }

  // Jika 3 saklar aktif, tampilkan counter 0-5 di digit pertama, kemudian counting 6-9 di digit kedua
  if (activeSwitches == 3) {
    // Tampilkan counter 0-5 di digit pertama
      digitalWrite(SS, LOW);
      Mastersend = 3;
      Serial.println(Mastersend);
      SPI.transfer(Mastersend);
      delay(100);
    // Lanjutkan counting dari 6-9 di digit kedua
    //for (int i = 6; i <= 9; i++) {
     // digitalWrite(SS, LOW);
     // Mastersend = i;
      //Serial.println(Mastersend);
      //SPI.transfer(Mastersend);
      //delay(100);
    }
  //}
  
  // Jika 4 saklar aktif, tampilkan counter 0-5 di digit kedua, kemudian counting 6-9 di digit pertama
  else if (activeSwitches == 4) {
    // Tampilkan counter 0-5 di digit kedua
      digitalWrite(SS, LOW);
      Mastersend = 4; // Shift 4 bit ke kiri untuk menetapkan digit kedua
      Serial.println(Mastersend);
      SPI.transfer(Mastersend);
      delay(100);
    // Lanjutkan counting dari 6-9 di digit pertama
    //for (int i = 6; i <= 9; i++) {
     // digitalWrite(SS, LOW);
     // Mastersend = i << 4; // Shift 4 bit ke kiri untuk menetapkan digit kedua
     // Serial.println(Mastersend);
      //SPI.transfer(Mastersend);
      //delay(100);
    //}
  }
}

Slave

#include <SPI.h>

const int segmentPins[] = {9, 8, 7, 6, 5, 4, 3, 2};
volatile boolean received = false;
volatile byte Slavereceived;
int index;
int dg1 = A1;
int dg2 = A0;

void setup() {
  Serial.begin(9600);
  for (int i = 0; i < 8; i++) {
    pinMode(segmentPins[i], OUTPUT);
  }
  pinMode(dg1, OUTPUT);
  pinMode(dg2, OUTPUT);
  SPCR |= _BV(SPE); // Turn on SPI in Slave Mode
  SPI.attachInterrupt(); // Interrupt ON is set for SPI communication
}

ISR (SPI_STC_vect) { // Interrupt routine function
  Slavereceived = SPDR; // Value received from master is stored in variable Slavereceived
  received = true; // Sets received as True
}

void loop() {
  if (received) { // Logic to SET LED ON OR OFF depending upon the value received from master
    Serial.println(Slavereceived);
    if (Slavereceived == 3) {
      for(int i=0;i<=9;i++){
        if(i <= 5){
          digitalWrite(dg1,HIGH);
          digitalWrite(dg2,LOW);
          displayCharacter(i);
          delay (100);
        }
        else{
          digitalWrite(dg2, HIGH);
          digitalWrite(dg1,LOW);
          displayCharacter(i);
          delay (100);
        }
      }
      
    }
    else if (Slavereceived == 4) {
      for(int i=0;i<=9;i++){
        if(i <= 5){
          digitalWrite(dg1,LOW);
          digitalWrite(dg2,HIGH);
          displayCharacter(i);
          delay (100);
        }
     
        else{
          digitalWrite(dg2, LOW);
          digitalWrite(dg1, HIGH);
          displayCharacter(i);
          delay (100);
        }
      }}

      else {
      for(int i=0;i<=9;i++){
        if(i <= 5){
          digitalWrite(dg1,LOW);
          digitalWrite(dg2,HIGH);
          displayCharacter(i);
          delay (100);
        }
     
        else{
          digitalWrite(dg2, LOW);
          digitalWrite(dg1, HIGH);
          displayCharacter(i);
          delay (100);
        }
         
      }
    }
      
    }
    
    received = false; // Reset received flag
  }

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]);
    }
  }
}

5. Kondisi [Kembali]

    Pada kondisi 3 dari percobaan 2, 3 switch aktif maka counting 0-5 pada digit 1 dan 6-9 pada digit 2. Jika 4 switch aktif maka counting 0-5 pada digit 2 dan 6-9 pada digit 1 











Tidak ada komentar:

Posting Komentar

Cover Sisdig

  Bahan Presentasi Untuk Matakuliah Sistem Digital 2023 OLEH: Marsanda Nabilla 2110953014 Dosen Pengampu: Darwison,MT Referensi: a. Anil K. ...