Anda di halaman 1dari 29

PRAKTIKUM APPL

Judul :ADC & Timer


Percobaan :3
Nama : Zacky Maulana Achmad
NRP : 2210191016
Dosen : M. Mobed Bachtiar
Tanggal : 16 Maret 2021
ADC

Berikut adalah foto rangkaian yang digunakan untuk percobaan ADC :

1. AnalogRead(pin)
Source Code :

Output :
Analisa :
Dimulai dari pendefinisian pin arduino , yaitu pin A0 ddefinisikan sebagai
variable analogPin dan membuat variabel dengan nama ‘val’ dengan nilai didalamnya
0. pada void setup() , didalamnya terdapat fungsi Serial,begin() dengan nilai baudrate
di set 9600 dan berfungsi sebagai pengatur kecepatan komunikasi . berlanjut ke dalam
fungsi void loop(). variabel val disini diberikan sebuah nilai , dimana nilai tersebut
didapatkan dari pembacaan nilai input , dengan perintah analogRead(analogPin) , dan
akan di cetak di serial monitor dengan perintahh Serial.println(val)
Kesimpulan :
- analogRead() adalah perintah untk membaca nilai input analog
- apabila pin yang dijadikan sebagai input analog tidak tersambung apapun , maka
nilai yang akan dikeluarkan analogRead() tak beraturan sesuai dengan kondisi nya ,
semisal apabila wire yang terambung dari komponen ke pin input analog sedikit
mengalami kerusakan atau error , maka nilai yang dikeluarkan akan berubahh ubah
tidak sesuai dengan output komponen tersebut

2. AnalogReadSerial
Source Code :

Output :

Analisa :
pada void setup() , didalamnya terdapat fungsi Serial,begin() dengan nilai
baudrate di set 9600 dan berfungsi sebagai pengatur kecepatan komunikasi. Pada void
loop() terdapat variabel sensorValue dengan tipe data integer , yang digunakan untuk
membaca input analog dari pin A0. lalu terdapat variabel voltage dengan tipe data
float yang digunakan untuk mengconvert nilai yang dikeluarkan dari pin input analog
menjadi nilai tegangan dengan rumus sebagai berikut :
sensorValue * (5.0 / 1023.0)
Dimana nilai 5.0/1023.0 merupakan rumus ADC , dengan 5.0 merupakan
nilaitegangan dan 1023 adalah 10 bit yang digunakan dalam arduino
Kesimpulan :
- analogRead() adalah perintah untuk membaca nilai dari pin input analog
- untuk mengubah nilai analog menjadi nilai digital , dapat menggunakan rumus
seperti berikut : nilai analog * (5.0 / 1023.0)

3. Digital read serial


Source Code :
Output :

Analisa :
Pertama tama , memulai program dengan mendefinisikan variabe dengan
nama pushButton , dengan pin yang didefinisikan adalah pin 7. pada void setup() ,
didalamnya terdapat perintah Serial,begin() dengan nilai baudrate di set 9600 dan
berfungsi sebagai pengatur kecepatan komunikasi. Lalu terdapat perintah selanjutnya
yaitu pinMode (pushButton, INPUT) yang digunakan untuk membuat fungsi pin dari
pushButton sebagai pin input. Lanjut ke fungsi void loop() , terdapat pendefinisian
variabel dengan nama buttonState, dimana variabel ini diisi dengan perintah
digitalRead(pushButton), yang digunakan untuk membaca nilai HIGH dan LOW dari
input pushButton yang dibaca nya . setelah dibaca , akan di cetak hasil outputnya di
serial monitor dengan Serial.println(button), dengan delay waktu 1ms
Kesimpulan :
- digitalRead() digunakan untuk membaca nilai HIGH dan LOW dari nilai analog
yang dibacanya .

4. Smoothing
Source Code :

Output :
Analisa :
Pada percobaan Analog to Digital Converter ini terdapat 3 percobaan yaitu
analogread(pin), Digital read dan smoothing. Seperti yang diketahui bahwa
Arduino mempunyai resolusi 10 bit ini maka data analog yang masuk pada pin
analog arduino dapat di konversi menjadi 2 pangkat 10 atau 1024 nilai yang
berbeda dengan rentang antara 0 sampai 1023. Percobaan analog read ini akan

membaca data analog dari A0 yang merupakan data dari potensio kemudian
ditampilkan di serial monitor, sedangkan untuk Digital Read ini membaca nilai
dari suatu inputan, dan untuk smoothing cara kerjanya adalah dengan meratakan
10 nilai terakhir dari pembacaan sensor, jadi semakin banyak jumlah data untuk
dirata-ratakan maka respon system terhadap perubahan nilai akan semakin lambat
namun akan semakin halus.

Kesimpulan :
- Untuk memperhalus pembacaan sinyal analog dapat digunakan teknik smoothing
ini dengan menggunakan perhitungan rata rata
- Penggunaan smoothing dapat menurunkan nilai akurasi dari pembacaan sinyal
analog

Interrupt

1. Interrupt Eksternal Mode falling


Source Code :
Output :
Analisa :
Percobaan diatas menerapkan konsep dari interrupt. Pertama mendefinisikan
pin-pin dari lcd yang digunakan. Pada void setup (),pertama mendefinisikan pin 2 dan
3 sebagai input. Pin ini berasal dari push button yang akan menjadi input untuk
interrupt nya. Lalu menggunakan perintah attachInterrupt untuk mengaitkan atau
menciptakan sebuah interrupt pada program .Pada void loop() , pertama
mendeklarasikan program utama yaitu sebuah counter yang menghitung seperti
umumnya dan ditampilkan pada LCD. Berikutnya terdapat 2 fungsi yang digunakan
untuk mendeklarasikan intteruptnya. Untuk rutinInterupsi0 pada LCD akan muncul
pesan sesuai yang tertulis dalam program diatas, begitu pula dengan rutinInterupsi1.
Kedua fungsi tersebut akan terpanggil apabila push button bagiannya ditekan. Kedua
interrupt ini diterapkan menggunakan metode FALLING yang interruptnys akan aktif
apabila terdapat perubahan logika dari HIGH ke LOW.

2. Interrupt Eksternal Mode Rising


Source Code :
Output :

Analisa:
Percobaan diatas sama dengan percobaan sebelumnya. Ketika pushbutton
kanan yang ditekan maka akan menjalankan rutinInterupsi1 selama 2000 ms. Dan jika
kiri yang ditekan maka akan menjalankan rutinInterupsi0 selama 2000 ms. Dan jika
tidak ditekan maka maka main program yang akan berjalan yakni melakukan counter.
Akan tetapi terdapat perbedaan pada tipe interupsinya yakni pada percobaan ini kita
menggunakan RISING bukan FALLING. Konsep Rising sendiri kebalikan dari falling
yakni interrupt akan aktif apabila terdeteksi perubahan nilai logika dari LOW ke
HIGH
3. Contoh lain Interrupt Untuk Input
Source Code :

Output :

Analisa :
percobaan diatas adalah contoh lain interrupt untuk input . pada awal program ,
didefiniskan sebuah variabel dengan nama counts dan previousMillis yang masing
masing bertipe data unsigned long dikarenakan data dari kedua variabel tersebut
panjang. terdapat pula define LOG_PERIOD dengan nilai 1000. pada void loop() ,
mendefinisikan variabel currentMillis dengan tipe data unsigned long , dengan nilai
variabe didalamnya menggunakan fungsi millis(). selanjutnya terdapat statement if
dengan kondisi apabila currentMillis – previousMillis > LOG_PERIOD. bila bernilai
True , maka nilai dari previousMillis akan diisi dengan currentMillis ,yaitu
mengambil waktu dari millis(). program akan terus dilakukan sampai nilai mencapai
kurang dari 1000. dan pada saat tersebut counter akan diberi nilai 0. di program ini
dikaitkan dengan interrupt. Pin yang digunakan yaitu pin 2. ketika interrupt aktif ,
fungsi impulse dipanggil dengan mode FALLING. program yang ada di void impulse()
adalah menambah counter . untuk counter sendiri , bila tidak terdapat interrupt maka
akan bernilai 0.
Kesimpulan :
- LOG_PERIOD berfungsi untuk mengatur interval antar impulse
- Millis() adalah fungsi pada siyntak Arduino yang berguna untuk
menjalankan waktu internal setiap mili seconds pada Arduino secara independent.

4. Penggunaan Timer 1 Overflow Interrupt untuk Led Blink


Source Code :

Output :
Analisa :
Percobaan ini menerapkan konsep dari timer one (timer 1) tanpa menggunakan
librarynya. Pada atmega328 (Arduino uno) timer 1 memiliki 16 bit. Cara kerja dari
program yang pertama yakni meng-set durasi atau periode timer overflow (misal 2
detik). Jadi tiap 2 detik akan terjadi overflow yang akan menimbulkan interupsi. Dan
setiap terjadi interupsi, maka akan mengeksekusi fungsi ISR. Dan pada fungsi ini led
akan diset waktu interupsi nya dan selama waktu itu led akan dimatikan dan Jam
Digital Menggunakan Timer Overflow Interrupt lalu count dijalankan. Maka bisa
dilihat pada serial print counter akan dijalankan. Dan pada rentang waktu tertentu led
akan mati sebagai tanda interrupt dan nyala Kembali. Hal ini sama halnya seperti led
blink.
Kesimpulan :
- Overflow terjadi setiap 100 millisecond membuat LED berkedip sesuai dengan
update tersebut

5. Counter Mode Rising Edge


Source Code :

void setup() {
Serial.begin(9600);
TCCR1A = 0x00;
TCCR1B = 0x07;
TCNT1H = 0x00;
TCNT1L = 0x00;
ICR1H = 0x00;
ICR1L = 0x00;
OCR1AH = 0x00 ;
OCR1AL = 0x00 ;
OCR1BH = 0x00 ;
OCR1BL = 0x00 ;
}
void loop() {
// your program here
Serial.print("Nilai TCNT = ");
Serial.println(TCNT1, DEC);
delay(100);
}

Output :

Analisa :
Pada percobaan kali ini akan dibuat program yang berfungsi untuk
menghitung jumlah penekanan switch pada input counter. Konfigurasi counter
menggunakan mode rising edge. Nilai counter TCN1 akan berubah pada saat push
button dari kondisi di tekan kemudian di lepas. Karena pada program ini yang
digunakan adalah mode rising edge,pada saat ditekan nilai akan tidak tetap atau
berubah sampai nilai maksimalnya. Nilai timer maksimal yang bisa dicapai adalah
34286 (second) , Karena Nilai counter ada pada Register TCNT1. Disini saya tidak
menggunakan triggernya atau pushbutton. Maka dariitu nilai TCNT nya tetap 0.

6. Counter Mode Falling Edge


Source Code :
void setup() {
Serial.begin(9600);
TCCR1A = 0x00;
TCCR1B = 0x06;
TCNT1H = 0x00;
TCNT1L = 0x00;
ICR1H = 0x00;
ICR1L = 0x00;
OCR1AH = 0x00 ;
OCR1AL = 0x00 ;
OCR1BH = 0x00 ;
OCR1BL = 0x00 ;
}
void loop() {
// your program here
Serial.print("Nilai TCNT = ");
Serial.println(TCNT1, DEC);
delay(100);
}
Output :

Analisa :
Pada percobaan ini membuat program yang fungsinya sama dengan
sebelumnya.Percobaan ini konfigurasi counter menggunakan mode falling edge. Nilai
counter TCN1 akan berubah pada saat push button dari kondisi di lepas kemudian di
tekan. Karena yang digunakan adalah mode falling edge,pada saat ditekan nilai akan
tidak tetap atau berubah sampai nilai maksimalnya. Nilai timer maksimal yang bisa
dicapai adalah 34286 (second) , Karena Nilai counter ada pada Register TCNT1.
Disini tidak menggunakan triggernya atau pushbutton. Maka dari itu nilai TCNT nya
tetap 0.
Timer
1. Timer-master.zip
Source Code:
#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; }
Output :

Analisa :
Percobaan ini membuat program timer dengan library timer. Pertama
mendefinisikan variabel timer dengan nama myTimer dan mendefiniskan variabel
digital dengan nilai awalnya 0. pada void setup() , pertama pendefinisian pin 9
sebagai output , dan perintah untuk digunakan untuk mengeksekusi fungsi toggleLed
setiap 500ms. pada fungsi void loop() terdapat perintah myTimer.update() untuk
mengupdate timer. dan pada fungsi tiggleLed , terdapat perintah untuk mengubah led
dari nilai kebalikan (jika nyala maka mati dan jika mati akan nyala). Dengan ini
seiring timer berjalan, pada setiap 500 ms led akan berubah.
2. TimerOne.zip
Source Code:
#include <TimerOne.h>
int digital = 0 ;
void setup() {
pinMode(9,OUTPUT);
Timer1.initialize(500000); // in microsecond
Timer1.attachInterrupt(toggleLed);
}
void loop() {
// your program here
}
void toggleLed(){
digitalWrite(9,digital);
digital = !digital; }
Output :
Analisa :
Percobaan ini membuat program timer dengan library TimerOne. pertama
mendefinisikan variabel digital dengan nilai awalnya 0. pada void setup()
pendefinisan in 9 sebagai output untuk led , Lalu menginisialisasi dan menambahkan
interrupt dengan cara menjalankan fungsi toogleLed. Fungsi ini berisi perintah untuk
mengubah kondisi led menjadi kondisi kebalikannya (jika nyala maka mati, jika mati
akan nyala). Dengan ini konsep penerapannya akan sama seperti percobaan
sebelumnya yakni led akan blink dalam rentang waktu yang ditentukan.
Counter

Source Code :
#include <TimerOne.h>
int counter = 0;
void setup() {
Serial.begin(9600);
Timer1.initialize(500000); // in microsecond
Timer1.attachInterrupt(eventCounter);
}
void loop() {
// your program here
Serial.print("nilai Counter : ");
Serial.println(counter);
delay(500);
}
void eventCounter(){
counter++; //increment counter variable
}
Output:
Analisa :
Percobaan ini merupakan percobaan counter atau percobaan program
penghitungan , hampir sama dengan percobaan sebelumnya yang menggunakan
llibrary timerone. pertama mendefinisikan variabel counter dengan nilai didalamnya 0.
lalu menginisialisasikan timer dan menambah interrupt. Selanjutnya fungsi
eventCounter dieksekusi dari interrupt,dimana fungsi tersebut berisi perintah untuk
meng-increment-kan counter dengan kondisi awal 0. output hasilnya akan menghitung
dari 0, 1, 2, 3 dan seterusnya, dan aandicetak pada serial monitor dengan delay 500
ms.
Encoder
1. Encoder
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);
}
Output :

Analisa :
Pada percobaan ini adalah percobaan untuk mengontrol keluaran rotary
encoder dengan arduino uno. pertama mendefinisikan pin 3 arduino untuk variabel
chA dan pin 4 untuk variabel chB. Pada void setup() pertama kita menginisialisasi
baud rate dengan serial.begin dengan nilai 9600. Lalu membuat sebuah interrupt yang
mana diinisialisasikan pada pin ketiga dan akan mengeksekusi fungsi bernama
encoder dengan mode RISING. Lalu juga menginisialisasi chB sebagai pin input.
Pada fungsi encoder, dideklarasikan perintah bahwa ketika pin 3 terdeteksi sebuah
inputan yang masuk sedangkan pin 4 tidak maka value akan diincrementkan jadi nilai
nya bertambah. Akan tetapi jika kedua pin terdeteksi inputan yang masuk maka value
akan di decrement kan yang membuat nilainya akan berkurang. Nilai nilai ini akan
dicetak pada serial monitor. Pengaturan ini akan berhubungan dengan kondisi Ketika
encoder diputar kearah tertentu dimana encoder tersebut bisa menambah atau
mengurangi value.

2. Contoh
Source COde :
#define outputA 3
#define outputB 4
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
}
Output :

Analisa :
Percobaan diatas adalah percobaan dengan rotary encoder . pin didefinisikan 3
dan 4. Perbedaan dari percobaan sebelumnya adalah untuk menjalankan main
programnya , program sebelumnya menggunakan interrupt sebagai pengeksekusinya.
Untuk percobaan ini langsung memasukkan main program pada void loop(). jadi void
setup mendifinisikan pin inputnya. Pada void loop dilakukan pengecekan dimana
Ketika nilai dari sebelumnya (aLastState) tidak sama dengan yang baru didapatkan
(aState) maka melakukan pengecekan Kembali apakah input yang didapatkan pada
pin 4 tidak sama dengan pin3, jika true maka counter akan di incerement dan jika
tidak maka counter didecrement kan lalu nilai aState akan diberikan pada aLastState
untuk memproses nilai selanjutnya. Dengan ini pada serial monitor nanti tidak aka
nada nilai position yang sama secara berurutan karena dianggap satu nilai. Nilai ini
juga akan berubah seiring dengan diputarnya encoder.

Motor Servo

1. Motor Servo
Source Code :
#include <Servo.h>

Servo myservo;

int pos = 0;

void setup(){
myservo.attach(2);
}
void loop(){
for(pos = 0; pos <= 180; pos+=1){
myservo.write(pos);
delay(15);
}
for(pos = 180; pos >= 0; pos-=1){
myservo.write(pos);
delay(15);
}
}
Output :

Analisa :
Percobaan diatas adalah percobaan untuk mengatur gerakan motor servo
dengan arduino . pertama menggunakan library Servo.h . Selanjutnya memberikan
nama object , perintah yang digunakan diawali dengan Servo diikuti dengan nama
object , misal myservo . selanjutnya mendefinisikan variabel pos dnegan nilai 0.
Dimana variabel ini digunakan untuk menentukan nilai posisi servo. di fungsi void
setup() mendefinisikan pin 2 untuk output data servo dengan perintah myservo.attach.
di fungsi void loop() terdapat 2 perulangan for , dimana perulangan pertama ini
digunakan untuk memberikan nilai pos , mulai dari 0 yang diincrementkan sampai
180 , dan perulangan kedua melakukan decrement dari nilai 180 sampai ke 0 ,dengan
masing masing perulangan menggunakan perintah myservo.write(pos) untuk
mengarahkan servo untuk mengarahkan posisi servo dengan nilai dari pos , dan delay
sebesar 15ms.
2. Contoh
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);
}
Output :
Analisa :
Percobaan diatas adalah percobaan contoh 2 untuk mengatur gerakan motor
servo dengan arduino. Langkah awal hampir sama dengan pertama ,hanya disini pada
fungsi void loop() pemberitahuan dan pemosisian servo langsung dengan perintah
motorservo.write() dengan diberikan nilai dari 0 sampai 180. Di percobaan ini
memberikan nilai 45 , 0 , 90 , 135, 180, dan kembali lagi ke 90 dengan masing masing

Motor DC
1. Motor DC
Source Code :

void setup() {
Serial.begin(9600);
}
void loop() {
motorMaju(200);
delay(2000);
motorMundur(100);
delay(1500);
}

void motorMaju(int kec){


analogWrite(6, kec);
analogWrite(5,0);
Serial.println("maju");
}

void motorMundur(int kec){


analogWrite(6,0);
analogWrite(5, kec);
Serial.println("mundur");
}
Output :
Analisa :
Percobaan diatas adalah percobaan untuk mengatur motor DC dengan IC
L293D dan Arduino uno. pada void setup yang digunakan untuk menyambungkan
komunikasi serial senilai 9600 baud ke serial monitor untuk menampilkan pesan
kondisi pergerakan motor DC dan mempermudah pengamatan kondisi motor DC.
Pada void loop() membuat dan mengeksekusi 2 fungsi . pertama fungsi motorMaju()
dengan parameter int kec yang diberikan nilai 200 dengan delay 2000. motorMaju()
ini didalamnya terdapat pemberian nilai , untuk pin 6 diberikan nilai 200 , dan pin 5
diberikan nilai 0 , dan mencetak di serial monitor "maju". 200 disini artinnya
kecepatan motor . Kedua fungsi motorMundur() dengan nilai parameter 100 , didalam
fungsi tersebut terdapat pengaturan nilai , di pin 6 diberikan nilai 0 , di pin 5 diberikan
nilai 100 esuai dengan nilai variabel kec /nilai parameter dan mencetak "mundur"

2. Contoh
Source Code:
// Motor A connections
int enA = 9;
int in1 = 8;
int in2 = 7;
// Motor B connections
int enB = 3;
int in3 = 5;
int in4 = 4;
void setup() {
Serial.begin(9600);
// Set all the motor control pins to outputs
pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
// Turn off motors - Initial state
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}

void loop() {
directionControl();
delay(1000);
speedControl();
delay(1000);
}

void directionControl() {
analogWrite(enA, 255);
analogWrite(enB, 255);

digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
Serial.println("on");
delay(2000);

digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
Serial.println("Mundur");
delay(2000);

digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
Serial.println("Off");
}

void speedControl() {
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
Serial.println("On");

for (int i = 0; i < 256; i++) {


analogWrite(enA, i);
analogWrite(enB, i);
delay(20);
}
Serial.println("Kecepatan Ditingkatkan");
for (int i = 255; i >= 0; --i) {
analogWrite(enA, i);
analogWrite(enB, i);
delay(20);
}
Serial.println("Kecepatan Diturunkan");

digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
Serial.println("off");
}
Output :

Analisa :
Percobaan diatas adalah percobaan untuk mengatur 2 motor DC . Pertama
mendefinisikan pin yang digunakan .Pada void terdapat 2 fungsi yang masing masing
dieksekusi dengan delay . Fungsi yang pertama yaitu directionControl.Didalamnya
terdapat nilai 255 pada enA dan enB lalu nilai HIGH kepada in1 dan in3, menandakan
bahwa motor dc akan menyala bergerak maju dengan kecepatan 255 (maks). Setelah
delay beberapa saat ,nilai akan high kepada in2 dan in4 yang mana akan membuat
motor dc bergerak mundur lalu memberikan nilai LOW kepada seluruhnya maka
motor dc akan mati. Untuk fungsi kedua yakni speedControl, untuk meningkatkan
kecepatan menggunakan perulangan yang mengincrementkan nilai enA dan enB dari
0 hingga 255. Dan untuk menurunkan kecepatannya tinggal membuat perulangan
untuk mengurangi nilai enA dan enB yang mana tadi bernilai 255 sampai dengan 0.
Untuk mempermudah pengamatan kondisi motorDC ditambahkan pesan pada serial
monitor.
PWM

1. Contoh 1
Source Code :
int ledpin = 13;
void setup(){
}
void loop(){
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);
}
}
Output :

Analisa :
Percobaan diatas adalah percobaan PMW. Yang pertama kita mendefinisikan
variabel ledpin dengan nilai 13. Pada fungsi void loop terdapat perulangan for ,dengan
kondisi didalamnya terdapat variabel fadeValue dengan nilai awal 0 , yang
perulangannya dibatasi sampai kurang dari sama dengan 255 dan increment 5 .
perulangan tersebut untuk memberikan nilai ke ledpin sesuai dengan nilai fadeValue
dan melakukan delay selama 30 ms . selanjutnya perulangan kedua , dengan nilai
awal fadeValue 255 dan dibatasi sanpai lebih dari sama dengan 0 dan melakukan
decrement 5 . didalam perulangan tersebut nilai ledpin diisi dengan nilai fadeValue
dan melakukan delay selama 200 ms. dari nilai ledpin tersebut menjadi indikator
seberapa terang dan redup LED

2. Contoh 2
Source Code :
int value =0;
void setup() {
// put your setup code here, to run once:
setPwmFrequency(9,8); // Set pin 9's PWM frequency to 3906 Hz (31250/8 = 3906)
}
void loop() {
// put your main code here, to run repeatedly:
analogWrite(9,value);
value++;
if(value>=255)value=0;
delay(50);
}
void setPwmFrequency(int pin, int divisor) {
byte mode;
if(pin == 5 || pin == 6 || pin == 9 || pin == 10) {
switch(divisor) {
case 1: mode = 0x01; break;
case 8: mode = 0x02; break;
case 64: mode = 0x03; break;
case 256: mode = 0x04; break;
case 1024: mode = 0x05; break;
default: return; }
if(pin == 5 || pin == 6) {
TCCR0B = TCCR0B & 0b11111000 | mode; } else {
TCCR1B = TCCR1B & 0b11111000 | mode; }} else if(pin == 3 || pin == 11) {
switch(divisor) {
case 1: mode = 0x01; break;
case 8: mode = 0x02; break;
case 32: mode = 0x03; break;
case 64: mode = 0x04; break;
case 128: mode = 0x05; break;
case 256: mode = 0x06; break;
case 1024: mode = 0x7; break;
default: return; }
TCCR2B = TCCR2B & 0b11111000 | mode; }}

Output :

Analisa :
Pada percobaan PWM Contoh 2 adalah bisa mengaktifkan maupun mengatur
keterangan led. Untuk nilai dari keterangan dimulai dari 0 sampai dengan 255 yanng
selanjutnya akan dikembalikan Kembali dari 255 sampai 0. Program diatas terdapat
case-case untuk mengatur duty cycle yang akan bisa mengatur kecerahan dari LED itu
sendiri. Hasil yang didapat adalah led akan menyala perlahan-lahan dari keadaan mati
hingga keadaan terang maksimalnya(nilai 255) lalu akan mati perlahan lahan ,
kemudian akan menyala kembali dan begitu seterusnya.
Kesimpulan
- Perintah penggunaan PWM adalah " analogWrite(pin,0-255); " maksud dari PWM
kita dapat mengatur tegangan yang keluar dari arduino antara 0-5 V. bila sebelumnya
digitalWrite hanya mengatur 0 atau 5V, tapi penggunaan PWM memungkinkan untuk
mengatur 0-5 V. Misal kita memberi nilai PWM 128 maka pin yang digunakan akan
mengeluarkan tegangan 2,5V
- Pengaplikasian PWM antara lain salah satunya menggunakan motor servo dan motor
DC
- Encoder dipengaruhi 2 masukan dimana masukan ini dapat mengatur penambahan
atau pengurangan nilai ataupun posisi yang dihasilkan. 2 masukan itu sendiri dapat
diaplikasikan dengan perputaran kekanan dan kekiri
- Salah satu penerapan Timer pada arduino adalah counter . pengaplikasian timer ini
dapat dilakukan secara manual mapun dengan menggunakan library seperti timer.h
dan timerOne.h
- Motor servo dapat berfungsi berdasarkan lebar sinyal modulasi (Pulse Wide
Modulation – PWM) yang menggunakan sistem kontrol. Lebar sinyal yang diberikan
ini akan menentukan posisi sudut putaran pada poros motor servo.

Anda mungkin juga menyukai