LA M2 P2





Modul 2
Percobaan 2

1. Prosedur [Kembali]
1. Susunlah komponen sesuai dengan eksperimen dan opsi yang telah dipilih.
2. Sintesiskan kode menggunakan Arduino IDE.
3. Pindahkan program yang telah disusun ke dalam Arduino Uno.
4. Lakukan pengujian program pada rangkaian eksperimen sesuai dengan preferensi yang diinginkan.
5. Langkah penyelesaian dilakukan setelah berhasil menguji program secara efektif pada rangkaian yang dipilih.

2. Hardware dan Diagram Blok [Kembali]
a. Hardware
1. arduino uno
2. Push Button

3. LCD

4.  Buzzer


5.  LED


6. Resistor



Diagram Blok:

3. Rangkaian Percobaan dan Prinsip Kerja [Kembali]
a. Rangkaian Percobaan




   Pada rangkaian diatas push button sebagai input dan LCD, LED, Buzzer sebagai output. Ketika tidak ada interupsi, LED terus menyala, dan layar LCD menampilkan nilai hitungan yang terus bertambah. Nilai hitungan ini ditambah +1 setiap kali melalui lingkaran loop. Namun, ketika terjadi perubahan posisi switch maka akan dijalankan interupt dimana LED dimatikan, buzzer dinyalakan, dan nilai hitungan direset menjadi nol untuk digit pertama. Ini terjadi karena interupsi hanya terjadi ketika sinyal pada pin 2 berubah dari logika 1 ke logika 0 (falling) atau sebaliknya. Setelah itu, program menunggu selama 100 detik sebelum melanjutkan eksekusi lagi.

4. Flowcharth dan Listing program[Kembali]
Flowchart:



b. Listing Program
#include<LiquidCrystal_I2C.h>
#define LED 13 //pin 13 bernama LED
#define tombol 2 //pin 2 (pin interrupt) bernama tombol
#define buzzer 11
volatile byte led_nyala = LOW; //kondisi mula-mula LED mati
static int count = 0;
volatile byte buzzer_nyala = LOW;
LiquidCrystal_I2C lcd(0x27, 20, 4);
void setup() {
 lcd.init();
 lcd.backlight();
 pinMode(LED,OUTPUT);
 pinMode(tombol,INPUT);
 attachInterrupt(digitalPinToInterrupt(2),tombol_ditekan, FALLING); //pin 2 (interrupt 0) digunakan sebagai interrupt eksternal
}

void loop() { //Main Program
 digitalWrite(LED,HIGH);
 digitalWrite(buzzer,LOW);
 lcd.setCursor(0,0);
 lcd.print("Count:");
 lcd.setCursor(6,1);
 lcd.print(count);
 count += 1; // menambahkan integer count dengan angka 1
 delay(1000);
}
//membuat fungsi bernama tombol_ditekan, fungsi ini (ISR) dieksekusi secara otomatis setelah arduino memperoleh sinyal interrupt di pin 2
void tombol_ditekan()
{
 digitalWrite(LED,LOW);
 digitalWrite(buzzer,HIGH);
 count = 0;
 delay(100000);
}

5. Kondisi [Kembali]

Percobaan 2

6. Video Demo [Kembali]

1. Bagaimana switch pada percobaan dapat mengaktifkan suatu instruksi baru? Bandingkan rangkaian tugas pendahuluan dengan rangkaian saat praktikum!

Jawab:

Switch terhubung ke pin 2 Arduino sebagai sumber interrupt eksternal. Ketika switch tersebut ditekan atau perubahan posisi atau kaki interrupt pada Arduino aktif (pin 2), fungsi tombol_ditekan() akan dieksekusi sebagai interrupt service routine (ISR) melalui fungsi attachInterrupt(digitalPinToInterrupt(2), tombol_ditekan, FALLING), di mana interrupt akan dieksekusi setiap terjadi perubahan pada switch (hal ini diatur oleh fungsi FALLING). Ketika interrupt terjadi, Arduino akan menjalankan void interupt-nya, yaitu tombol_ditekan(), di mana dalam program, LED akan menyala dan buzzer akan diaktifkan, sementara variabel count akan direset menjadi 0, namun dikarena tidak ada lcd.clear() sehingga hanya digit pertama yang terreset ke nol.


2. Jelaskan proses diagram dari Interrupt!

Jawab:


ketika void loop dilaksanakan, Posis switch berubah maka interrupt dieksekusi yaitu void tombol_ditekan setelah selesai interupt dijalankan, program kembali melanjutkan program sebelumnya di void loop


8. Download File [Kembali]
Download HMTL Klik disini
Download Simulasi Rangkaian Klik disini
Download Video Demo Klik disini
Download Datasheet ARDUINO UNO klik disini
Download Datasheet LCD 2X16 klik disini











LA M2 P3


Percobaan III

1. Prosedur [Kembali]

1. Rangkai rangkaian di proteus sesuai dengan modul
2. Buatlah program untuk arduino di software Arduino IDE.
3. Compile program tadi, lalu upload ke dalam arduino.
4. Jalankan simulasi rangkaian pada proteus.

2. Hardware dan Diagram Blok [Kembali]

Hardware:

1. Arduino Uno




2. Dip Switch




3. 7 Segment 2 Digit




4. Resistor




Block Diagram:


3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]


Pada rangkaian diatas Dipswitch sebagai input dan sevensegment sebagai output. Ketika salah satu dipswitch aktif maka arduino akan memberi output untuk sevensgemnet melakukan counting dari 0-9. Pada program ini juga digunakan fungsi milis, millis digunakan untuk melakukan debouncing pada pembacaan Dip Switch dengan memberikan jeda waktu tertentu sebelum membaca input tombol lagi. Ini memungkinkan pengguna untuk menekan Dip Switch dengan cepat tanpa menghasilkan bacaan ganda yang tidak diinginkan. 



Flowchart :



Listing Program:
#define a 9
#define b 10
#define c 4
#define d 7
#define e 6
#define f 13
#define g 8
#define dp 5
#define D1 12
#define D2 11
#define Dsw1 A0
#define Dsw2 A1
#define Dsw3 A2
#define Dsw4 A3
bool sw1,sw2,sw3,sw4;

int segments[] = {a,b,c,d,e,f,g};
byte digitPatterns[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
};

void setup() {
  for (int i = 0; i < 7; i++) {
    pinMode(segments[i], OUTPUT);
  }
  pinMode(dp, OUTPUT);
  pinMode(D1, OUTPUT);
  pinMode(D2, OUTPUT);
  pinMode(Dsw1, INPUT_PULLUP);
  pinMode(Dsw2, INPUT_PULLUP);
  pinMode(Dsw3, INPUT_PULLUP);
  pinMode(Dsw4, INPUT_PULLUP);
  Serial.begin(9600);
}

void number(int display) {
  if (display >= 0 && display <= 9) {
    for (int i = 0; i < 7; i++) {
      digitalWrite(segments[i], digitPatterns[display][i]);
    }
  }
}

void loop() {
  int sw1 = digitalRead(Dsw1);
  int sw2 = digitalRead(Dsw2);
  int sw3 = digitalRead(Dsw3);
  int sw4 = digitalRead(Dsw4);
  static int digit = 1; // Digit yang sedang ditampilkan (1 atau 2)
  static int count = 0; // Counter untuk digit
  static unsigned long lastTime = 0; // Waktu terakhir pembacaan tombol

if (sw1 == LOW) {
    if (millis() - lastTime > 1000) { // Debouncing
        lastTime = millis();
        count++;
        if (count > 9) {
            count = 0;
        }
        if (digit == 1) {
            digitalWrite(D1, HIGH);
            digitalWrite(D2, LOW);
            number(count);
            digit = 2;
        } else {
            digitalWrite(D1, LOW);
            digitalWrite(D2, HIGH);
            number(count);
            digit = 1;
        }
    }
}

else if (sw2 == LOW) {
    if (millis() - lastTime > 1000) { // Debouncing
        lastTime = millis();
        digitalWrite(D1, HIGH);
        digitalWrite(D2, LOW);
        for (int i = 9; i >= 0; i--) {
            number(i);
            delay(1000); // Delay agar Anda bisa melihat perubahan digit
        }
    }
}
if (sw3 == LOW) {
    if (millis() - lastTime > 2000) { // Debouncing
        lastTime = millis();
        count++;
        if (count > 9) {
            count = 0;
        }
        if (digit == 1) {
            digitalWrite(D2, HIGH);
            digitalWrite(D1, LOW);
            number(count);
            digit = 2;
        } else {
            digitalWrite(D2, LOW);
            digitalWrite(D1, HIGH);
            number(count);
            digit = 1;
        }
    }
}
else if (sw4 == LOW) {
    if (millis() - lastTime > 2000) { // Debouncing
        lastTime = millis();
        digitalWrite(D2, HIGH);
        digitalWrite(D1, LOW);
        for (int i = 9; i >= 0; i--) {
            number(i);
            delay(200); // Delay agar Anda bisa melihat perubahan digit
        }
    }
}
}


Percobaan 3




1. Apa itu timer arduino, apa itu millis dan delay, apa perbedaannya dan kenapa dibedakan

Timer Arduino adalah sebuah fungsi atau fitur yang digunakan untuk mengatur waktu atau interval tertentu dalam program. `millis()` adalah fungsi pada Arduino yang mengembalikan jumlah milidetik (1/1000 detik) sejak program dimulai. Fungsi ini sering digunakan untuk mengukur waktu antara dua kejadian atau untuk membuat tugas yang tidak menghentikan eksekusi program utama.`delay()` adalah fungsi pada Arduino yang menghentikan eksekusi program selama jumlah waktu tertentu yang ditentukan dalam milidetik sebelum melanjutkan eksekusi berikutnya. Fungsi ini digunakan untuk membuat penundaan dalam program.

Millis digunakan untuk tugas-tugas yang tidak menghentikan program utama, memungkinkan eksekusi program tetap berjalan, cocok untuk tugas bersamaan atau periodik. Sedangkan, Delay menghentikan eksekusi program langsung selama waktu tertentu, menyebabkan berhenti instruksi sampai penundaan selesai, bisa mengganggu tugas lain. Millis digunakan untuk responsivitas dan menjaga program tetap aktif, sedangkan delay untuk penundaan, namun bisa mengakibatkan program tidak responsif jika terlalu lama, disarankan untuk menghindari delay dalam program kompleks atau yang membutuhkan responsivitas tinggi.

2. Analisa pengaruh penggunaan millis dan delay pada program yg di gunakan

Pada percobaan 3, millis digunakan untuk melakukan debouncing pada pembacaan Dip Switch dengan memberikan jeda waktu tertentu sebelum membaca input tombol lagi. Ini memungkinkan pengguna untuk menekan Dip Switch dengan cepat tanpa menghasilkan bacaan ganda yang tidak diinginkan. Delay, di sisi lain, digunakan untuk membuat jeda waktu sebelum menampilkan perubahan digit pada tujuan tertentu, seperti saat Dip Switch ditekan. Penggunaan delay bisa membuat program terlihat tidak responsif karena program akan berhenti sejenak selama penundaan tersebut. Meskipun delay dapat memberikan efek visual yang diinginkan, penggunaan yang berlebihan bisa menghambat eksekusi program dan merugikan responsifitas keseluruhan sistem.





TP M2 P6 K7




PERCOBAAN 6 
Kontrol Putaran Motor Stepper

1. Prosedur [Kembali]

1. Susun semua perangkat sesuai dengan kondisi yang dipilih.
2. Tulis kode di Arduino IDE.
3. Setelah selesai, input program ke papan Arduino dalam aplikasi Proteus.
4. Mulai jalankan program dalam simulasi dan uji sesuai dengan modul dan kondisinya.
5. Selesaikan proses tersebut.


2. Hardware dan diagram blok [Kembali]

A. Hardware

1. Button




2. Arduino Uno

3. ULN2003A

4. Motor Stepper

B. Digram Blok




3. Rangkaian Simulasi dan Prinsip kerja [Kembali]



 Prinsip Kerja 

    Pada rangkaian diatas, push button sebagai input yang akan mengatur sudut perpindahan dan touch sensor sebagai input yang mengatur arah putarnya. Output dari kedua input tersebut adalah motor stepper. Motor stepper dibantu oleh sebuah driver yaitu ULN2003A. Kode arduino diatur sesuai dengan datasheet ULN2003A sehingga ketika sensor touch berlogika low maka arduino akan memerintah bahwa motor akan bergerak searah jarum, sedangkan ketika sensor touch berlogika HIGH maka arduino akan menjalankan motor berlawanan jarum jam. Untuk perubahan sudut dipengaruhi input push button, misalnya push button pertama ditekan maka pin 2 arduino akan berlogika low yang akan membuat motor bergerak ke nol derajat, kemudian ketika kita tekan push button 2 maka pin 3 arduino akan berlogika LOW yang akan menggerakan motor 90 ketika touch berlogika low dan bergerak -90 derajat ketika touch berlogika HIGH, begitu juga pushbutoon 3 yang bergerak 180/-180 dan push button 4 bergerak 270/-270 derajat.


4. FlowChart [Kembali]

A. Listing Program 

#define A 8
#define B 9
#define C 10
#define D 11
#define PB1 2
#define PB2 3
#define PB3 4
#define PB4 5
#define TOUCH_SENSOR_PIN 6 // Contoh pin untuk touch sensor

void setup() {
    Serial.begin(9600);
    pinMode(A, OUTPUT);
    pinMode(B, OUTPUT);
    pinMode(C, OUTPUT);
    pinMode(D, OUTPUT);
    pinMode(PB1, INPUT_PULLUP);
    pinMode(PB2, INPUT_PULLUP);
    pinMode(PB3, INPUT_PULLUP);
    pinMode(PB4, INPUT_PULLUP);
    pinMode(TOUCH_SENSOR_PIN, INPUT); // Konfigurasi pin untuk touch sensor
}

void pergerakan_1() {
    digitalWrite(A, 0);
    digitalWrite(D, 1);
    digitalWrite(B, 0);
    digitalWrite(C, 1);
}

void kebalikan_pergerakan_1() {
    digitalWrite(A, 0);
    digitalWrite(D, 1);
    digitalWrite(B, 0);
    digitalWrite(C, 1);
}

void pergerakan_2() {
    digitalWrite(A, 1);
    digitalWrite(D, 1);
    digitalWrite(B, 0);
    digitalWrite(C, 0);
}

void kebalikan_pergerakan_2() {
    digitalWrite(A, 0);
    digitalWrite(D, 0);
    digitalWrite(B, 1);
    digitalWrite(C, 1);
}

void pergerakan_3() {
    digitalWrite(A, 1);
    digitalWrite(D, 0);
    digitalWrite(B, 1);
    digitalWrite(C, 0);
}

void kebalikan_pergerakan_3() {
    digitalWrite(A, 1);
    digitalWrite(D, 0);
    digitalWrite(B, 1);
    digitalWrite(C, 0);
}

void pergerakan_4() {
    digitalWrite(A, 0);
    digitalWrite(D, 0);
    digitalWrite(B, 1);
    digitalWrite(C, 1);
}

void kebalikan_pergerakan_4() {
    digitalWrite(A, 1);
    digitalWrite(D, 1);
    digitalWrite(B, 0);
    digitalWrite(C, 0);
}

void nonpergerakan() {
    digitalWrite(A, 0);
    digitalWrite(D, 0);
    digitalWrite(B, 0);
    digitalWrite(C, 0);
}

void loop() {
    int b4 = digitalRead(PB4);
    int b3 = digitalRead(PB3);
    int b2 = digitalRead(PB2);
    int b1 = digitalRead(PB1);
    int touchSensorState = digitalRead(TOUCH_SENSOR_PIN); // Baca status touch sensor

    if (touchSensorState == LOW) {

        if (b4 == LOW) {
            pergerakan_4(); // Pindahkan motor ke pergerakan 4
        } else if (b3 == LOW) {
            pergerakan_3(); // Pindahkan motor ke pergerakan 3
        } else if (b2 == LOW) {
            pergerakan_2(); // Pindahkan motor ke pergerakan 2
        } else if (b1 == LOW) {
            pergerakan_1(); // Pindahkan motor ke pergerakan 1  
        } else {
            nonpergerakan();
            delay(100);
        }
    }
    else { // motor berputar berlawanan jarum jam
   
        if (b4 == LOW) {
            kebalikan_pergerakan_4(); // Pindahkan motor ke arah sebaliknya
        } else if (b3 == LOW) {
            kebalikan_pergerakan_3(); // Pindahkan motor ke arah sebaliknya
        } else if (b2 == LOW) {
            kebalikan_pergerakan_2(); // Pindahkan motor ke arah sebaliknya
        } else if (b1 == LOW) {
            kebalikan_pergerakan_1(); // Pindahkan motor ke arah sebaliknya
        } else {
            nonpergerakan();
            delay(100);
        }
    }
}

B. Flowchart



5. Kondisi [Kembali]

Kondisi Percobaan 6 Kondisi 7 : Sertakan touch sensor, ketika berlogika HIGH putaran motor berlawanan jarum jam


6. Video Simulasi [Kembali]




7. Download File [Kembali]

Download HMTL Klik disini
Download Simulasi Rangkaian Klik disini
Download Video Simulasi Klik disini
Download Datasheet ARDUINO UNO klik disini
Download Datasheet TOUCH SENSOR  klik disini