Prak uP&uC : M3 TP2




Tugas Pendahuluan 1 Modul 3
(Percobaan 2 Kondisi 5)

1. Prosedur
[Kembali]

1. Rangkai rangkaian di proteus sesuai dengan kondisi percobaan.
2. Tulis program untuk arduino di software Arduino IDE.
3. Compile program tadi, lalu upload ke dalam arduino.
4. Setelah program selesai di upload, jalankan simulasi rangkaian pada proteus.

2. Hardware dan Diagram Blok [Kembali]

Hardware :

a) Modul Arduino 


b) ESP32 


c) Dipswitch 


d) LED 
e) Seven Segment

Diagram Blok:






3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]

Rangkaian Simulasi :










Prinsip Kerja :
Dalam rangkaian ini, komunikasi SPI dimanfaatkan antara dua Arduino, yang masing-masing bertindak sebagai master dan slave. Prinsipnya adalah untuk mentransfer informasi mengenai jumlah switch yang aktif dari master ke slave melalui jalur SPI, yang kemudian ditampilkan oleh slave pada seven segment display.

Pada sisi master, pembacaan nilai dari dip switch dilakukan secara berkala untuk mengidentifikasi jumlah switch yang aktif. Setelah itu, nilai tersebut dikirim ke slave melalui jalur SPI untuk ditampilkan pada seven segment display. Di sisi slave, data yang diterima dari master diproses untuk menentukan tata letak tampilan pada seven segment display. Dengan menggunakan protokol SPI, komunikasi antara master dan slave berlangsung dengan efisien, memfasilitasi pertukaran informasi yang akurat dalam waktu singkat.

Rangkaian ini memungkinkan pengendalian yang akurat antara dua Arduino, di mana informasi mengenai jumlah switch yang aktif dapat dengan mudah dipindahkan dan ditampilkan. Oleh karena itu, prinsip operasi rangkaian ini sangat bergantung pada komunikasi SPI yang efisien dan kemampuan masing-masing Arduino untuk membaca dan mengolah informasi dengan tepat.

4. Flowchart dan Listing Program [Kembali]

Flowchart :







Listing Program :

MASTER:
// Master Arduino
#include <SPI.h> // Library for SPI

int switchPins[] = {2, 3, 4, 5, 6, 7, 8, 9};
int switchStates[] = {}; // Array to store switch states
int activeSwitchesCount = 0; // Counter for active switches

void setup() {
    Serial.begin(9600); // Starts serial communication at 9600 baud
    for (int i = 0; i < 8; i++) {
        pinMode(switchPins[i], INPUT_PULLUP); // Set pins as input with pull-up
    }
    SPI.begin(); // Initialize SPI communication
    SPI.setClockDivider(SPI_CLOCK_DIV8); // Set SPI clock divider to 8 (2MHz)
    digitalWrite(SS, HIGH); // Set Slave Select (SS) pin as HIGH
}

void loop() {
    byte masterData;
    activeSwitchesCount = 0; // Reset active switches counter

    // Check the status of each switch
    for (int i = 0; i < 8; i++) {
        switchStates[i] = digitalRead(switchPins[i]);
        if (switchStates[i] == LOW) {
            activeSwitchesCount++; // Increment counter for each active switch
        }
    }

    // Begin SPI communication with the slave
    digitalWrite(SS, LOW);
    masterData = activeSwitchesCount; // Prepare data to send

    // Send the count of active switches and print it to the serial monitor
    Serial.println(masterData);
    SPI.transfer(masterData); // Transmit data to slave

    // Add a delay to control the loop timing
    delay(1000);

    // End SPI communication with the slave
    digitalWrite(SS, HIGH);
}

SLAVE:

// Arduino Slave
#include <SPI.h>

const int pinSegmen[] = {9, 8, 7, 6, 5, 4, 3, 2}; // Daftar pin untuk segmen
volatile bool dataDiterima = false; // Flag untuk menunjukkan data diterima
volatile byte dataDariMaster; // Variabel untuk menyimpan data dari master

void setup() {
    Serial.begin(9600);
    // Mengatur pin sebagai output
    for (int i = 0; i < 8; i++) {
        pinMode(pinSegmen[i], OUTPUT);
    }
    // Mengaktifkan SPI dalam mode slave
    SPCR |= _BV(SPE);
    // Mengatur interupsi SPI
    SPI.attachInterrupt();
}

// Fungsi interupsi untuk SPI
ISR(SPI_STC_vect) {
    // Simpan data yang diterima dari master
    dataDariMaster = SPDR;
    // Set flag untuk menunjukkan data telah diterima
    dataDiterima = true;
}

void loop() {
    // Print data yang diterima ke Serial Monitor
    Serial.println(dataDariMaster);
    // Jika data telah diterima, tampilkan karakter di segmen
    if (dataDiterima) {
        tampilkanKarakter(dataDariMaster);
        delay(1000);
        // Reset flag setelah menampilkan karakter
        dataDiterima = false;
    }
}

// Fungsi untuk menampilkan karakter pada display 7-segmen
void tampilkanKarakter(int angka) {
    // Pola untuk setiap angka (0-9)
    byte pola[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
    };

    // Pastikan input adalah angka 0-9
    if (angka >= 0 && angka <= 9) {
        // Dapatkan pola untuk angka yang diberikan
        int indeks = angka;
        // Tampilkan pola di pin segmen
        for (int i = 0; i < 7; i++) {
            digitalWrite(pinSegmen[i], pola[indeks][i]);
        }
    }
}


5. Kondisi [Kembali]

Percobaan 2  Kondisi 5 (SPI-DIP Switch dan Seven Segment) :
 Setiap 1 Switch aktif muncul angka sesuai jumlah switch yang aktif pada digit 1



6. Video Simulasi [Kembali]





7. Download File [Kembali]

File Rangkaian klik disini
Video Percobaan klik disini
Listing Program klik disini
Datasheet Arduino klik disini
Datasheet Button klik disini

Tidak ada komentar:

Posting Komentar

Among Us - Crewmates

  BAHAN PRESENTASI MATA KULIAH SISTEM DIGITAL 2023 OLEH : Raras Yulia Rosandi 2110951012 DOSEN PENGAMPU : Dr. Ir. Darwison, ST, MT JURUSAN T...