Minggu, 05 Januari 2014

PENGGUNAAN FUNGSI MATEMATIKA Arduino Uno

PERCOBAAN :

Penggunaan Fungsi pada Library Math.h

Pada percobaan kali ini akan dijelaskan penggunaan fungsi matematika pada pemrograman mikrokontroler menggunakan Arduino IDE. Fungsi-fungsi yang digunakan telah tersedia pada file library math.h.

Prosedur :

1. Tuliskan sintaks program berikut ini, lakukan kompilasi dan upload program.
void setup() {
  Serial.begin(9600);
  Serial.println("=============  Fungsi Matematika ===========");
  Serial.print("cos(90)=");       Serial.println(cos(90));
  Serial.print("sin(45)=");       Serial.println(sin(45));
  Serial.print("tan(90)=");       Serial.println(tan(90));
  Serial.print("atan(90)=");      Serial.println(atan(90));
  Serial.print("atan2(90,10)=");  Serial.println(atan2(90,10));
  Serial.print("aqrt(9)=");       Serial.println(sqrt(9));
  Serial.print("exp(9)=");        Serial.println(exp(9));
  Serial.print("log(100)=");      Serial.println(log(100));
  Serial.print("log10(100)=");    Serial.println(log10(100));
  Serial.print("pow(9,2)=");      Serial.println(pow(9,2));
  Serial.print("square(9)=");     Serial.println(square(9));
  Serial.print("fabs(-1.5)=");    Serial.println(fabs(-1.5));
  Serial.print("fmod(1.2334,2)="); Serial.println(fmod(1.2334,2));
}
void loop(){
}

Tugas dan Pertanyaan :

1.      Buka aplikasi Serial Monitor, kemudian amati data yang ditampilkan pada Serial Monitor. Periksalah hasil perhitungan pada program secara manual. Apakah ada yang salah dari perhitungan program ? Jika ada sebutkan pada fungsi apa !
Data yang ditampilkan sesuai dengan perhitungan hanya saja data yang ditampilkan menggunakan kalkulator dengan satuan radian pada fungsi trigonometri.

2.      Pada fungsi trigonometri, parameter input fungsi dalam bentuk apa ? radian atau degree ?

Parameter input dalam bentuk Radian tetapi kita dapat mengubahnya menjadi bentuk Degree dengan mengalikan dengan  (0.0174532925199433) pada program berikut :
Serial.print("cos(90)=");       Serial.println(cos(90*0.0174532925199433));
            Serial.print("sin(45)=");       Serial.println(sin(45*0.0174532925199433));
            Serial.print("tan(90)=");       Serial.println(tan(90*0.0174532925199433));
Serial.print("atan(90)=");      Serial.println(atan(90*0.0174532925199433));

3.      Buatlah kalkulator sederhana dengan antarmuka serial port, dimana kalkulator tersebut mampu melakukan perhitungan besar sudut pada salah satu sudut segitiga. Gunakan fungsi trigonometri untuk melakukan perhitungan !
Jb

float ti=4;
float ba=3;
float mi=5;
void setup() {

  Serial.begin(9600);
  Serial.println("===  Contoh Fungsi Trigonometri Pada Segitiga Siku-Siku ===");
  Serial.println("Terdapat segitiga dengan tinggi 4 cm");
  Serial.println("panjang sisi bawah 3 cm");
  Serial.println("dan sisi miring 5 cm");
  Serial.println("Berapakah besar sudut sin a , cos a , dan tan a ?");
  Serial.println("++++++++++Jawab++++++++++");
  Serial.print("Panjang sisi tegak segitiga = "); Serial.println (ti);
  Serial.print("Panjang sisi miring segitiga = "); Serial.println (mi);
  Serial.print("Panjang sisi bawah segitiga = "); Serial.println (ba);
  Serial.print("Sin a ="); Serial.println(ti/mi);
  Serial.print("cos a ="); Serial.println(ba/mi);
  Serial.print("tan a ="); Serial.println(ti/ba);
 
}
void loop()
{

}

SLEEP MODE DAN WATCHDOG TIMER Arduino Uno

PERALATAN :
1. Komputer                            : 1 set
2. Arduino Uno                       : 1 pcs
3. Kabel USB tipe B               : 1 pcs
4. Project board                       : 1 pcs
5. Kabel jumper                       : 1 pcs
6. LED                                    : 1 pcs
7. Resistor 330 Ohm               : 1 pcs
9.1 Sleep Mode Selama 4 detik dan Wake up saat terjadi Timer Overflow
            Pada percobaan kali ini akan dibuat program untuk mengakses mode sleep pada mikrokontroller. Mode sleep akan terjadi selama 4 detik, kemudian mikrokontroller akan aktif kembali (wake up). Pada saat wake up, mikrokontroller aka melakukan perubahan terhadap kondisi LED yang terhubung pada pin 12. Sehingga jika program dijalankan, seakan-akan LED akan berkedip dengan selang waktu 4 detik. Namun, sebenarnya 4 detk tersebut mikrokontroller sedang sleep mode (tidak melakukan apa-apa).
Prosedur:
1.      Rangkailah rangkaian pada Gambar 9.1 berikut ini.

2.      Tuliskan sintaks program berikut ini pada Arduino IDE, kemudian lakukan kompilasi dan upload program.
#include <avr/sleep.h>
#include <avr/power.h>
#define LED_PIN (12)
volatile int f_timer=0;
ISR(TIMER1_OVF_vect) {
if(f_timer == 0) {
f_timer = 1;
}
}
void enterSleep(void) {
set_sleep_mode(SLEEP_MODE_IDLE); sleep_enable();
power_adc_disable();             power_spi_disable();
power_timer0_disable();          power_timer2_disable();
power_twi_disable();             sleep_mode();
sleep_disable();                 power_all_enable();
}
void setup() {
pinMode(LED_PIN, OUTPUT);
TCCR1A = 0x00; TCNT1=0x0000;
TCCR1B = 0x05; TIMSK1=0x01;
}
void loop() {
if(f_timer==1) {
f_timer = 0;
digitalWrite(LED_PIN, !digitalRead(LED_PIN));
enterSleep();
}

}

Kamis, 05 Desember 2013

EEPROM MEMORY Pada Arduino

Baca dan Tulis Memori EEPROM
            Pada percobaan kali ini akan dibuat program yang berfungsi sebagai antarmuka penanganan memori EEPROM. Antarmuka program menggunakan komunikasi serial. Melalui Serial Terminal atau aplikasi lainnya, user dapat melakukan perintah baca can tulis dari atau memori EEPROM.
Prosedur :
1.      Tuliskan sintaks program berikut ini pada Arduino IDE, kemudian lakukan kompilasi dan upload program ke mikrokontroller,
#include <EEPROM.h>
boolean exitProgram = 0;
void setup() {
Serial.begin(9600);
Serial.println("========= EEPROM Access Via Serial ========");
Serial.println("Type this command to execute EEPROM operation");
Serial.println("write : For write data to EEPROM");
Serial.println("read : For read data from EEPROM");
Serial.println("clear : For clear all data in EEPROM");
Serial.println("exit : For exit from program");
}
void loop() {
int command;
while(!exitProgram) {
do {
Serial.print("Type Command >> ");
while(Serial.available()==0);
command = readCommandFromSerial();
switch(command) {
case 1 : Serial.println("Write EEPROM Selected");
         writeEEPROM();
         break;
case 2 : Serial.println("Read EEPROM Selected");
         readEEPROM();
         break;
case 3 : Serial.println("Clear EEPROM Selected");
         clearEEPROM();
         Serial.println("Clear EEPROM Finished");
         break;
case 4 : Serial.println("Exit From Program");
         exitProgram = 1;
         break;
default : Serial.println("Wrong Command, Please Type Again !");
          break;
}
}
while(command == 0);
}
}
int readCommandFromSerial() {
char stringFromSerial[10];
char data;
int command;
int countData = 0;
for(int i=0;i<10;i++) {
stringFromSerial[i]=0;
}
while(true) {
if(Serial.available()) {
data = Serial.read();
Serial.write(data);
if(data=='\n') {
break;
}
else{
if(data!='\r') {
stringFromSerial[countData] = data;
countData++;
}
}
}
}
if(strcmp(stringFromSerial,"write")==0){
command = 1;
}
else if(strcmp(stringFromSerial,"read")==0){
command = 2;
}
else if(strcmp(stringFromSerial,"clear")==0){
command = 3;
}
else if(strcmp(stringFromSerial,"exit")==0) {
command = 4;
}
else{
command = 0;
}

return command;
}
int readValFromSerial() {
char stringFromSerial[10];
char data;
int val;
int countData = 0;
for(int i=0;i<10;i++) {
stringFromSerial[i]=0;
}
while(true) {
if(Serial.available()) {
data = Serial.read();
Serial.write(data);
if(data=='\n') {
break;
}
else{
if(data!='\r') {
stringFromSerial[countData] = data;
countData++;
}
}
}
}
sscanf(stringFromSerial,"%d",&val);
return val;
}
void clearEEPROM() {
for(int i=0;i<512;i++) {
EEPROM.write(i,0);
}
}
void writeEEPROM() {
int address;
do {
Serial.print("Address : ");
address = readValFromSerial();
if(address>512) {
Serial.println("Addres maximal is 512 !, Please type again !");
}
}
while(address>512);
int data;
do {
Serial.print("Data : ");
data = readValFromSerial();
if(data>512) {
Serial.println("Data maximal is 512 !, Please type again !");
}
}
while(data>512);
EEPROM.write(address,data);
Serial.println("EEPROM Write Success !");
}
void readEEPROM() {

int address;
do{
Serial.print("Address : ");
address = readValFromSerial();
if(address>512) {
Serial.println("Addres maximal is 512 !, Please type again !");
}
}
while(address>512);
int data = EEPROM.read(address);
Serial.print("Data in Address ");
Serial.print(address,DEC);
Serial.print(" : ");
Serial.println(data,DEC);
}

Tugas dan Pertanyaan:
1.      Jalankan aplikasi Serial Monitor pada Arduino, pastikan Serial Monitor menggunakan baudrate 9600 dan pada akhir pengiriman data disertakan karakter CR+LF. Lakukan penulisan data pada memori alamat 100, dengan data bernilai 10. Kemudian keluar dari program dan matikan power Arduino dan nyalakan kembali. Lakukan pembacaan data pada alamat 100, berapakah nilai pada alamat 100? Apakah data yang dituliskan sebelumnya hilang?
#Tidak. Karena masih tersimpan pada memori mikrokontroller Arduino.
2.      Kenapa pada program penulisan data hanya dibatasi sampai 512? Jelaskan !
# Sebenarnya maksimal 1023. Itu tergantung dari kita yang ingin membatasinya.
3.      Kenapa pada program alamat memori yang dapat ditulisi data hanya sampai 512?
# Karena pada sintaks telah dibatasi hanya sampai <512 dan artinya kita hanya memiliki 511 address data yang dapat kita isi dengan data-data tertentu.
4.      Buatlah kesimpulan dari praktikum ini !
ü  Data yang kita tulis tidak akan hilang walaupun setelah kita menulis data kita mematikan sumber tegangan pada arduino karena data tersebut masih tersimpan pada memori Arduino.
ü  Jumlah alamat yang dapat kita buat adalah 1023 address. Namun pada sintaks nya kita dapat membatasi nya lebih kecil.

ü  Jumlah data yang dapat kita tulis pada masing-masing address adalah 256 data.

TIMER SEBAGAI GENERATOR GELOMBANG (Arduino)

Percobaan:
7.1 Generator Gelombang dengan Adjustable Duty Cycle
            Pada percobaan kali ini akan dibuat program untuk mengeluarkan gelombang kotak
pada pada pin 9 (OC1A) . Gelombang yang akan dikeluarkan pada pin 9 adalah gelombang berbentuk kotak dengan duty cycle dapat diatur lebarnya. Lebar duty cycle akan diatur oleh potensiometer yang terhubung pada pin A0. Pada percobaan kali ini akan digunakan fungsi analogWrite yang berfungsi untuk mengeluarkan sinyal gelombang pada pin Pulse Width Modulation (PWM).

Gambar Rangkaian



Syntax program

int val = 0;
void setup() {
Serial.begin(9600);
pinMode(9, OUTPUT);
}
void loop() {
val = analogRead(A0);
analogWrite(9, val/4);
Serial.print("PWM Value = ");
Serial.println(val,DEC);
delay(500);
}

7.2 Generator Gelombang dengan Adjustable Frekuensi
Pada percobaan kali ini gelombang yang akan dikeluarkan pada pin 9 adalah  gelombang berbentuk kotak dengan duty cycle yang besarnya tetap yaitu 50%, namun besarnya frekuensi dapat berubah-ubah. Perubahan frekuensi akan diatur oleh potensiometer yang terhubung pada pin A0. Program pada percobaan kali ini akan menggunakan konfigurasi register untuk mengeluarkan sinyal gelombang pada pin PWM.

Gambar Rangkaian


Syntax Program

int setCycles;
void set(int cycles) {
char oldSREG;
int dutyCycle = cycles * 0.5;


if (dutyCycle < 6) {
dutyCycle = 6;
}
if (dutyCycle >1015) {
dutyCycle = 1015;
}
if (cycles < 50) {
cycles = 50;
}
oldSREG = SREG;
cli();
ICR1 = cycles;
OCR1A = dutyCycle; SREG = oldSREG;
}


void setup() { TCCR1A = 0;
TCCR1B = _BV(WGM13);
TCCR1B &= ~(_BV(CS10) | _BV(CS11) | _BV(CS12)); TCCR1B |= _BV(CS10);
DDRB |= _BV(PORTB1); TCCR1A |= _BV(COM1A1);
}
void loop() {
int temp_cycles= analogRead(A0);


if (temp_cycles!= setCycles ) {
setCycles = temp_cycles;
set(setCycles);
}
}
PWM dengan Adjustable Frekuensi dan Duty cycle (7 KHz sampai 300 KHz)
Pada percobaan kali ini gelombang yang akan dikeluarkan pada pin 9 adalah gelombang berbentuk kotak dengan duty cycle dan frekuensi yang dapat berubah-ubah. Perubahan frekuensi akan diatur oleh potensiometer yang terhubung pada pin A0. Perubahan duty cycle akan diatur oleh potensiometer yang terhubung pada pin A1. Program pada percobaan kali ini akan menggunakan konfigurasi register untuk mengeluarkan sinyal gelombang pada pin PWM.

Gambar Rangkaian


Syntak Program
int setCycles;
int setDuty;
void set(int cycles, float duty) {
char oldSREG;
int dutyCycle =
if (dutyCycle <
cycles * duty;
6) {
dutyCycle = 6;
}
if (dutyCycle >
1015) {
dutyCycle = 1015;
}
if (cycles < 50) {
cycles = 50;
}
oldSREG = SREG;
cli();
ICR1 = cycles; OCR1A = dutyCycle;
SREG = oldSREG;
}
void setup() { TCCR1A = 0;
TCCR1B = _BV(WGM13);
TCCR1B &= ~(_BV(CS10) | _BV(CS11) | _BV(CS12));
TCCR1B |= _BV(CS10); DDRB |= _BV(PORTB1); TCCR1A |= _BV(COM1A1);
}
void loop() {
int temp_cycles
int temp_duty =
if (temp_cycles
= analogRead(A0);
analogRead(A1);
!= setCycles || temp_duty != setDuty) {
setCycles = temp_cycles;
setDuty = temp_duty;
set(setCycles, setDuty / 1024.0);
}
}

Kamis, 28 November 2013

TIMER DAN COUNTER

TUJUAN :
1.      Mampu membuat program yang mengunakan fitur timer sebagai pewaktu.
2.      Mampu membuat program yang menggunakan fitur timer sebagai penghitung.
3.      Mampu mempergunakan fitur timer pada mikrokontroler untuk membuat jam digital sederhana.
PERALATAN:
1.      Komputer                                : 1 set
2.      Arduino Uno                           : 1 pcs
3.      Kabel USB tipe B                   : 1 pcs
4.      Project Board                          : 1 pcs
5.      Kabel Jumper                          : 1 pcs
6.      LED                                        : 1 pcs
7.      Resistor 330 Ohm                   : 1 pcs
8.      Switch pushbutton                  : 1 pcs
9.      LCD                                        : 1 pcs
10.  Potensiometer                         : 1pcs
PERCOBAAN:
6.1 Penggunaan Times Overflow untuk LED Blinking
            Pada percobaan kali ini akan dibuat program untuk membuat led berkedip per 500 mS. Pada dasarnya LED akan toggle (berubah kondisinya) setiap terjadi interupsi timer overflow. Nilai register timer di set sedemikian rupa sehingga menghasilkan waktu overflow per 500 mS.
Prosedur:
1.      Buatlah rangkaian seperti pada gambar 6.1.

2.      Tuliskan sintaks program berikut ini, kemjudian lakukan kompilasi dan upload program ke sistem minimum Arduino.
boolean dataLed = 0;
unsigned int overflowCount = 0;
void setup() {
Serial.begin(9600);
pinMode(12, OUTPUT);
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 34286;
TCCR1B |= (1 << CS12); //256 prescaler
TIMSK1 |= (1 << TOIE1);
sei();
}
ISR(TIMER1_OVF_vect) {
TCNT1 = 34286;
if(dataLed == 0) {
dataLed = 1;
}
else{
dataLed = 0;
}
digitalWrite(13, dataLed);
overflowCount++;
}
void loop() {
Serial.print("Overflow count = ");
Serial.println(overflowCount,DEC);
delay(100);
}
3.      Buka Serial Monitor pada Arduino IDE, pastikan baudrate pada Serial Monitor adalah 9600. Kemudian amati teks yang ditampilkan pada serial monitor. Amati juga kondisi nyala dan mati LED pada pin 12.
Untuk hasil nya dapat anda lihat di SINI

6.2 Jam Digital Menggunakan Timer
            Pada percobaan kali ini akan dibuat program sederhana yang berfungsi sebagai jam digital dengan memanfaatkan fitur timer mikrokontroller. Timer akan dikonfigurasi sehingga terjadi overflow setiap 1 detik. Tiap timer terjadi overflow, variabel detik, menit, dan jam akan di update nilainya. Nilai variabel tersebut akan ditampilkan pada LCD.

Prosedur:
1.      Buatlah rangkaian seperti gambar 6.2.

2.      Tuliskan sintaks program berikut ini, lakukan kompilasi dan upload program.
#include<LiquidCrystal.h>
LiquidCrystal lcd(2,3,4,5,6,7);
unsigned int jam, menit, detik;
boolean led = 0;
ISR(TIMER1_OVF_vect) {
TCNT1H=0xC2;
TCNT1L=0xF7;
detik++;
if(detik>=60) {
detik = 0;
menit++;
if(menit>=60) {
menit = 0;
jam++;
if(jam>=24) {
jam = 0;
}
}
}
}
void initTimer1() {
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0xC2;
TCNT1L=0xF7;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
TIMSK1=0x01;
sei();
}
void setup() {
lcd.begin(16,2);
lcd.clear();
initTimer1();
}
void loop() {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Jam Digital");
lcd.setCursor(0,1);
lcd.print(jam,DEC);
lcd.print(":");
lcd.print(menit,DEC);
lcd.print(":");
lcd.print(detik,DEC);
delay(500);
}

Hasil nya dapat anda lihat DISINI

6.3 Counter Mode Falling Edge
            Pada percobaan kali ini akan dibuat program yang berfungsi untuk menghitung jumlah penekanan switch pada input counter. Konfigurasi counter menggunakan mode falling edge.
Prosedur:
1.      Buatlah rangkaian seperti pada Gambar 6.3.

2.      Tuliskan sintaks program berikut ini, kemudian lakukan kompilasi dan upload program ke sistem minimum Arduino.
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() {
Serial.print("Nilai TCNT1 = ");
Serial.println(TCNT1,DEC);
delay(500);
}
3.      Buka serial monitor pada Arduino IDE, kemudian tekan switch pushbutton dan amati nilai TCNT1 yang ditampilkan pada serial monitor.

Hasil nya dapat anda lihat DISINI

6.4 Counter Mode Rising Edge
            Pada percobaan kali ini akan dibuat program yang fungsinya sama dengan percobaan 6.3. Namun pada percobaan kali ini konfigurasi counter menggunakan mode rising edge.

Prosedur:
1.      Gantilah sintaks program pada percobaan 6.5 dengan sintaks program berikut ini, kemudian lakukan kompilasi dan upload program ke sistem minimum Arduino.
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() {
Serial.print("Nilai TCNT1 = ");
Serial.println(TCNT1,DEC);
delay(500);
}
2.      Buka serial monitor pada Arduino IDE, kemudian tekan switch pushbutton dan amati nilai TCNT1 yang ditampilkan pada serial monitor.
Hasil nya dapat anda lihat DISINI

Twitter Delicious Facebook Digg Stumbleupon Favorites More