Anda di halaman 1dari 24

PRAK.

ALAT PENGEMBANGAN PERANGKAT LUNAK

Judul : ADC & Timer


Percobaan : 3
Nama : Hamim Fadli
NRP : 2210191023
Dosen : Mochamad Mobed
Bachtiar
ADC & Timer
1. Analog to digital converter
- Analog Read
a. Gambar rangkaian

b. Source Code

int analogPin = 3;
int val = 0;

void setup() {
// initialize serial communication at 9600 bits per
second:
Serial.begin(9600);
}

// the loop routine runs over and over again forever:


void loop() {
val = analogRead(analogPin);
// print out the value you read:
Serial.println(val);
}

c. Hasil percobaan
- Analog Read Serial

a. Gambar Rangkaian

b. Source Code

void setup() {
// initialize serial communication at 9600 bits per
second:
Serial.begin(9600);
}
// the loop routine runs over and over again forever:
void loop() {
// read the input on analog pin 0:
int sensorValue = analogRead(A0);
// print out the value you read:
Serial.println(sensorValue);
delay(1); // delay in between reads for stability
}

c. Hasil Percobaan
- Digital Read Serial

a. Gambar rangkaian

b. Source Code

int button = 2;

void setup() {
// initialize serial communication at 9600 bits per
second:
Serial.begin(9600);
pinMode(button, INPUT);
}

// the loop routine runs over and over again forever:


void loop() {
int buttonState = digitalRead(button);
// print out the value you read:
Serial.println(buttonState);
delay(1);
}

c. Hasil percobaan
d. Analisa

- Smothing

a. Gambar rangkaian
b. Source Code

const int numReadings = 10;

int readings[numReadings];
int readIndex = 0;
int total = 0;
int average = 0;

int inputPin = A0;

void setup() {
// initialize serial communication at 9600 bits per
second:
Serial.begin(9600);
for (int thisReading = 0; thisReading<numReadings;
thisReading++){
readings[thisReading]=0;
}
}

// the loop routine runs over and over again forever:


void loop() {
total = total - readings[readIndex];
readings[readIndex]=analogRead(inputPin);
total = total + readings[readIndex];
readIndex = readIndex+1;

if (readIndex >= numReadings){


readIndex = 0;
}

average = total/numReadings;
Serial.println(average);
delay(1);
}

c. Hasil percobaan

d. Analisa

Pada percobaan diatas sama-sama menggunakan fitur ADC pada board


Arduino. Pada percobaan pertama akan menguji ADC read pada pin A0. Kemudian
akan menampilkan value input dari A0 yang berasal dari potentiometer. Range nilai
yang akan tampil yaitu 0-1023 dikarenakan ADC pada Arduino UNO bernilai 10
bit. Pada percobaan kedua tak jauh berbeda dengan percobaan pertama, hanya saja
pada percobaan kedua ini mengenai analogreadserial namun outputnya akan
dikonversi dari nilai ADC 10-bit (0-1023) menjadi tegangan (0 – 5V). Sedangkan
pada percobaan ketiga mengenai menyemoothingkan atau menghaluskan data-data
yang diperoleh. Dengan kata lain, beberapa data yang diperoleh akan dirata-rata
sehingga didapatkan data yang lebih stabil/smooth. Percobaab selanjutnya
menggunakan push button sebagai inputnya. Hasil yang didapat adalah sebuah
angak 0 atau 1. Pada bagian hardware hanya merangkai sesuai dengan rangkaian
dan kita hanya meemutar-mutar potentiometer agar terlihat perbedaan nilai pada
serial monitor.

2. Interupt
- Eksternal Mode Falling
a. Source Code

unsigned int countLoop =0;


void setup() {
// put your setup code here, to run once:
pinMode(2,INPUT_PULLUP);
pinMode(3,INPUT_PULLUP);
Serial.begin(9600);
attachInterrupt(0,rutinInterupsi0,FALLING);
attachInterrupt(1,rutinInterupsi1,FALLING);
}
void rutinInterupsi0() {
// put your main code here, to run repeatedly:
Serial.println("Int0 Source Code");
Serial.println("Interrupt INT0");
delay(2000);
}
void rutinInterupsi1(){
Serial.println("Int1 Source Code");
Serial.println("Interrupt INT1");
delay(2000);
}

void loop(){
Serial.println("Main Source Code");
Serial.println("Count Loop: ");
Serial.println(countLoop);
countLoop++;
delay(1000);
}

b. Hasil Percobaan
- Penggunaan Timer1 Overflow Interrupt Untuk Led Blink
a. Source Code

boolean led = false;


unsigned int count = 0;
void setup(){
Serial.begin(9600);
pinMode(13,OUTPUT);
cli();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 34286;
TCCR1B != (1 << CS12);
TIMSK1 != (1 << TOIE1);
sei();
}
ISR(TIMER1_OVF_vect){
TCNT1 = 34286;
led = !led;
digitalWrite(13,led);
count++;
}
void loop(){
Serial.print("Overflow Count : ");
Serial.println(count,DEC);
delay(100);
}

b. Hasil Percobaan
- Interupt untuk Input
a. Source Code

unsigned long counts;


unsigned long previousMillis;

void impulse(){
counts++;
}
#define LOG_PERIOD 1000
void setup(){
counts = 0;
Serial.begin(9600);
pinMode(2, INPUT_PULLUP);
digitalWrite(2, HIGH);
attachInterrupt(digitalPinToInterrupt(2), impulse,
FALLING);
Serial.println("Start Counter");
}
void loop(){
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > LOG_PERIOD){
previousMillis = currentMillis;
Serial.println(counts);
counts = 0;
}
}

b. Hasil percobaan
c. Analisa

Pada percobaan ini, dilakukan percobaan untuk melakukan Interrupt


pada Arduino. Dilakukan Interrupt dengan menggunakan 2 switch pada pin 2
dan 3 Digital Input. Apabila switch tersebut ditekan, maka program main yang
merupakan program counter akan dihentikan, setelah itu program pada fungsi
rutinInterupsi akan dijalankan. Untuk program 1 dijalankan saat Falling Edge
dari switch, untuk program 2 dijalankan saat Rising Edge dari switch,
sedangkan untuk program 3 dijalankan saat ada perubahan dari nilai HIGH ke
LOW atau sebaliknya. Setelah itu digunakan Timer1 untuk menjalankan
interrupt. Interrupt Service Routine (ISR) dapat menggunakan overflow ini
sebagai kondisi, sehingga setiap Timer1 Overflow, kode pada ISR akan
dijalankan.

3. Timer-Library Timer-master.zip
a. Gambar rangkaian

b. Source Code

#include <Event.h>
#include <Timer.h>
Timer myTimer;
int digital=0;
void setup() {
pinMode(9,OUTPUT);
myTimer.every(500,toggleLed);// in millisecond
}
void loop() {
myTimer.update();
}
void toggleLed(){
digitalWrite(9,digital);
digital = !digital;
}

c. Hasil Percobaan

- Timer-Library TimerOne-r11.zip
a. Gambar rangkaian
b. Source Code

#include <TimerOne.h>
int digital = 0 ;
void setup() {
pinMode(9,OUTPUT);
Timer1.initialize(500000); // in microsecond
Timer1.attachInterrupt(toggleLed);
}
void loop() {
// your Source Code here
}
void toggleLed(){
digitalWrite(9,digital);
digital = !digital;
}

c. Hasil Percobaan
d. Analisa

Pada Percobaan timer ini menggunakan library tambahan yaitu library


TimeMaster dan TimerOne dimana kita perlu menambahkannya secara manual.
Pada percobaan ini mengaktifkan interupsi dengan menggunakan Timer1. Cara
kerjanya sama dengan program sebelumnya, dimana Timer1 disetting terlebih
dahulu, setelah itu dilakukan interupsi dengan kondisi Timer1 Overflow lalu kode
dijalankan. Kode yang dieksekusi pada interupsi adalah LED Blink. Perbedaan
dengan percobaan sebelumnya adalah pada percobaan ini digunakan library Timer-
Master dan TimerOne

4. Counter
a. Source Code
#include <TimerOne.h>
int counter = 0;
void setup() {
Serial.begin(9600);
Timer1.initialize(500000); // in microsecond
Timer1.attachInterrupt(eventCounter);
}
void loop() {
// your Source Code here
Serial.print("nilai Counter : ");
Serial.println(counter);
delay(500);
}
void eventCounter(){
counter++; //increment counter variable
}

b. Hasil Percobaan
c. Analisa

Pada percobaan counter ini, terdapat penginisialisasian counter dengan tipe data
int dan dengan nilai sama dengan 0. Lalu pada void setup(), terdapat
penginisialisasian komunikasi serial yang memiliki nilai baudraet 9600 bit
persekon, penginisialisasian Timer1 yang memiliki periode 500000 microsecond
atau 500 milisecond, serta terdapat fungsi untuk mengaktifkan Timer1 interrupt
pada fungsi eventCounter. Kemudian pada void loop() terdapat kode untuk
menampilkan tulisan “Nilai Counter : “ pada serial monitor dengan delay 500ms.
Lalu pada void evenCounter() terdapat kode untuk meng-increment variabel
counter. Dari sisi hardware, dalam melakukan percobaan counter ini, hanya
diperlukan sebuah Arduino Uno Board yang digunakan sebagai tempat sebuah
program itu ditampung sehingga dapat menjalankan program dengan baik.

5. Encoder
a. Gambar Rangkaian

b. Source Code

int chA=3;
int chB=4;
int value;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(3),Encoder, RISING);
pinMode(chB,INPUT);
Serial.println("Modul Encoder");
}
void loop() {
}
void Encoder(){
if (digitalRead(chA) && !digitalRead(chB)){value++;}
else if (digitalRead(chA) && digitalRead(chB)) {value--;}
Serial.print("Data Encoder: ");
Serial.println(value);
}

c. Hasil Percobaan

d. Analisa

- Contoh
a. Gambar Rangkaian
b. Source Code

#define outputA 6
#define outputB 7
int counter = 0;
int aState;
int aLastState;
void setup() {
pinMode (outputA,INPUT);
pinMode (outputB,INPUT);
Serial.begin (9600);
// Reads the initial state of the outputA
aLastState = digitalRead(outputA);
}
void loop() {
aState = digitalRead(outputA); // Reads the "current" state
of the outputA
// If the previous and the current state of the outputA are
different, that means a Pulse has occured
if (aState != aLastState){
// If the outputB state is different to the outputA state,
that means the encoder is rotating clockwise
if (digitalRead(outputB) != aState) {
counter ++;
} else {
counter --;
}
Serial.print("Position: ");
Serial.println(counter);
}
aLastState = aState; // Updates the previous state of the
outputA with the current state
}
c. Hasil Percobaan

d. Analisa

Pada percobaan encoder, melakukan encoder dan juga contoh lainnya. Pada
percobaan encoder, terdapat penginisialisasian chA dengan nilai 3 dan chB dengan
nilai 4, serta value. Pada void setup() terdapat penginisialisasian komunikasi serial
yang memiliki nilai baudrate 9600 bit persekon. Lalu juga ada kode
untukmenghidupkan interupsi eksternal pada pin ke-3 dengan mode rising difungsi
Encoder(). Lalu pada void Encoder() terdapat logika if, serta terdapat pencetakan
“Data Encoder : “ dan pencetakan dari value.
Kemudian terdapat pendefinisian outputA 6 dan outputB 7 serta
penginisialisasian counter sama dengan 0, penginisialisasian aState serta
aLastState. Pada void setup() terdapat penginisialisasian pinMode outputA dan
outputB sebagai input. Lalu juga terdapat penginisialisasian komunikasi serial yang
memiliki nilai baudrate 9600 bit persekon, serta kode untuk membaca status awal
dari outputA. Kemudian pada void loop(), terdapat kode untuk membaca status saat
ini dari outputA. Lalu juga terdapat dua logika if, dimana pada logika if pertama
jika keadaan sebelumnya dan saat ini dari outputA berbeda, itu berarti pulse telah
terjadi. Sedangkan pada logika if kedua, jika status dari outputB berbeda dengan
status outputA, itu berarti encoder berputar searah jarum jam. Lalu juga ada kode
untuk memperbarui keadaan outputA sebelum keadaan saat ini.
6. Motor Servo
a. Gambar Rangkaian

b. Source Code

/* Sweep
by BARRAGAN <http://barraganstudio.com>
This example code is in the public domain.

modified 8 Nov 2013


by Scott Fitzgerald
http://www.arduino.cc/en/Tutorial/Sweep
*/

#include <Servo.h>

Servo myservo; // create servo object to control a servo


// twelve servo objects can be created on most boards

int pos = 0; // variable to store the servo position

void setup() {
myservo.attach(2); // attaches the servo on pin 9 to the
servo object
}

void loop() {
for (pos = 0; pos <= 180; pos += 1) { // goes from 0
degrees to 180 degrees
// in steps of 1 degree
myservo.write(pos); // tell servo to go to
position in variable 'pos'
delay(15); // waits 15ms for the
servo to reach the position
}
for (pos = 180; pos >= 0; pos -= 1) { // goes from 180
degrees to 0 degrees
myservo.write(pos); // tell servo to go to
position in variable 'pos'
delay(15); // waits 15ms for the
servo to reach the position
}
}

c. Hasil Percobaan

- Contoh Pin 10
a. Gambar Rangkaian

b. Source Code

#include <Servo.h>
Servo motorServo;
void setup(){
motorServo.attach(10);
}
void loop()
{
motorServo.write(45);
delay(1000);
motorServo.write(0);
delay(1000);
motorServo.write(90);
delay(1000);
motorServo.write(135);
delay(1000);
motorServo.write(180);
delay(1000);
motorServo.write(90);
delay(1000);

c. Hasil Percobaan

d. Analisa

Pada percobaan motor servo ini, dilakukan dua percobaan yaitu percobaan
motor servo dan juga contohnya. Pada percobaan motor servo pertama terdapat
kode “Servo myservo” yang digunakan untuk membuat objek servo untuk
mengontrol servo. Lalu pada void setup() terdapat kode untuk menambahkan
servon pada pin arduino ke 2. Selanjutnya pada void loop(), terdapat looping for,
untuk menginstruksikan servo berada di posisi dalam variable pos. dimana posisi
servo dimulai dari 0-180 derajat.
Pada percobaan kedua, juga terdapat kode “Servo myservo” yang digunakan
untuk membuat objek servo untuk mengontrol servo. Lalu pada void setup()
terdapat kode untuk menambahkan servon pada pin arduino ke 10. Selanjutnya pada
void loop(), terdapat kode untuk memutar servo kekiri 45 derajat, memutar servo
kekiri 0 derajat, memutar servo ke posisi tengah (90 derajat), memutar servo ke
kanan 135 derajat, memutar servo kekanan 180 derajat, serta memutar servo ke
posisi tengah (90 derajat).

7. PWM
a. Gambar Rangkaian

b. Source Code
int ledPin = 13;

void setup() {
// put your setup code here, to run once:

void loop() {
// put your main code here, to run repeatedly:
for (int fadeValue=0; fadeValue<=255; fadeValue +=5){
analogWrite(ledPin, fadeValue);
delay(30);
}

for(int fadeValue=255; fadeValue>=0;fadeValue-=5){


analogWrite(ledPin, fadeValue);
delay(200);
}
}
c. Hasil Percobaan
d. Analisa

Pada percobaan PWM terdapat penginisialisasian ledPin dengan nilai 13. Lalu
pada void loop() terdapat dua looping for, dimana pada looping for pertama terdapat
fadeValue dikondisikan mulai dari 0 sampai 255 dengan bertambahnya nilai 5.
Setelah itu, akan dilakukan pemprosesan dan terdapat delay selama 30ms.
Selanjutnya, pada looping for kedua dimana fadeValue dikondisikan mulai dari 255
sampai 0 dengan berkurangnya nilai. Setelah itu, akan dilakukan pemrosesan dan
terdapat delay selama 200ms. Pada percobaan kedua, terdapat penginisialisasian
value dengan nilai 0. Pada void setup() terdapat kode untuk mengatur frekuensi
PWM pin 9 ke 3906Hz yang diperoleh dari 31250/8. Lalu pada void loop() terdapat
kode untuk mendeteksi nilai dutycycle yang keluar dari pin. Nilai dutycycle mulai
dari 0 – 255 yang mewakili 0% - 100% dutycycle. Kemudian terdapat void
setPwmFrequency untuk mengatur frekuensi PWM. Dari sisi hardware, untuk
melakukan percobaan ini terdapat LED sebagai indikator. Dari percobaan yang
telah dilakuakn LED akan menyala secara berkedip.

Anda mungkin juga menyukai