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

Kamis, 24 Oktober 2013

KOMUNIKASI SERIAL

KOMUNIKASI SERIAL
TUJUAN:
1.        Memahami cara mengirimkan dan menerima data melalui periperal UART Arduino.
2.        Mampu membuat program untuk mengirimkan data berbasis teks dan berbasis byte.
3.        Mampu membuat program untuk menerima data secara pooling dan secara interupsi.
PERALATAN:
1.        Komputer                         : 1 set
2.        Arduino Uno                    : 1 pcs
3.        Project board                    : 1 pcs
4.        Kabel jumper                    : secukupnya
5.        LCD                                 : 1 pcs
6.        Potensiometer 10K          : 1 pcs
PERCOBAAN:
5.1 Mengirim Data Teks
            Pada percobaan kali ini akan dibuat program untuk mengirimkan data teks ke komputer melalui komunikasi serial. Pada percobaan ini contoh teks yang akan dikirimkan adalah “Hello World”. Pengiriman data akan menggunakan baudrate 9600.
Prosedur:
1.        Tuliskan sintaks program di bawah ini, kemudian lakukan kompilasi dan upload program ke sistem minimum Arduino.
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println("hello world");
delay(2000);
}

2.        Buka Serial Monitor pada Arduino IDE.

3.        Pastikan konfigurasi baudrate adalah 9600 seperti pada gambar dibawah ini.



4.        Pastikan data teks “Hello World” yang dikirimkan Arduino diterima oleh Serial Monitor.
Tugas dan Pertanyaan:
1.        Gantilah parameter input pada fungsi Serial print sesuai dengan tabel dibawah ini. Amati data yang diterima pada Hterm, 

2.        Gantilah fungsi Serial.print menjadi Serial.println, kemudian tuliskan amati data yang diterima oleh komputer. Jelaskan perbedaan penggunaan fungsi Serial.print dan Serial.println !

3.        Tambahkan karakter \r\n pada akhir baris teks pada Tabel. Amati data yang ditampilkan pada komputer. Jelaskan fungsi karakter \r\n pada komunikasi serial !

4.        Jelaskan fungsi tiap baris dari sintaks progra pada Percobaan 5.1 !
void setup() {
Serial.begin(9600); //mengatur konfigurasi baudrate yaitu 9600
}
void loop() {
Serial.println("hello world");// Mengirim data dalam bentuk text “Hello World”

delay(2000); // jeda waktu 2 sekon
}

5.2 Mengirim Data Byte
            Pada percobaan kali ini akan dibuat program untuk mengirimkan data byte ke komputer melalui komunikasi serial. Pengiriman data akan menggunakan baudrate 115200.
Prosedur:
1.        Tuliskan sintaks program dibawah ini, kemudian lakukan kompilasi dan upload program ke sistem minimum Arduino,
void setup() {
Serial.begin(115200);
}
void loop() {
Serial.write(0x41);
Serial.write(0x42);
Serial.write(0x43);
Serial.write(0x44);
Serial.write(0x45);
delay(2000);
}
2.        Buka aplikasi Hterm pada komputer, pastikan konfigurasi pada Hterm seperti gambar di bawah ini.

3.        Klik tombol Connect, kemudian perhatikan data yang ditampilkan pada bagian Receive Data. Pastikan data tersebut sama dengan data yang dikirimkan oleh Arduino.

Tugas dan Pertanyaan :
1.        Gantilah parameter input untuk fungsi Serial.write dengan data pada Tabel 5.2 Amati data yang diterima pada HTerm,  
2.        Gantilah konfigurasi dari HTerm menjadi seperti di bawah ini, perhatikan data yang diterima. Kenapa data yang diterima berubah menjadi huruf ? Jelaskan!


3.        Jelaskan perbedaan penggunaan fungsi Serial.print dan fungsi Serial.write !
4.        Jelaskan fungsi tiap baris dari sintaks program pada Percobaan 5.2 !
void setup() {
Serial.begin(115200);//mengatur konfigurasi baudrate yaitu 9600
}
void loop() {
Serial.write(0x41);//mengirim data dalam byte yaitu 41
Serial.write(0x42);//mengirim data dalam byte yaitu 42
Serial.write(0x43);//mengirim data dalam byte yaitu 43
Serial.write(0x44);//mengirim data dalam byte yaitu 44
Serial.write(0x45);//mengirim data dalam byte yaitu 45
delay(2000);// jeda selama 2 sekon
}




5.3 Menerima Data dari UART dengan Sistem Pooling
            Pada percobaan kali ini akan dibuat program untuk menerima data teks dari komputer melalui komunikasi serial. Proses penerimaan data akan menggunakan sistem pooling (menunggu). Data yang diterima oleh Arduino akan ditampilkan pada LCD. Penerimaan data akan menggunakan baudrate 9600.
1.      Buatlah rangkaian seperti gambar

2.      Tuliskan sintaks program berikut ini, kemudian lakukan kompilasi dan upload program,
#include <LiquidCrystal.h>
LiquidCrystal lcd(2,3,4,5,6,7);
String textFromSerial ="";
void setup() {
lcd.begin(16,2);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Data From Serial");
Serial.begin(9600);
}
void loop() {
while(Serial.available()>0) {
char data = Serial.read();
if(data == '\n') {
lcd.setCursor(0,1);
lcd.print(textFromSerial);
textFromSerial="";
}
else{
if(data!='\r') {
textFromSerial += data;
}
}
}
}
Tugas dan Pertanyaan :
1.      Buka Serial Monitor pada Arduino pastikan konfigurasi Serial Monitor sama seperti pada Gambar

Ketikkan sembarang kata untuk dikirimkan (kurang dari 16 karakter), kemudian tekan Send. 

2.     
Jelaskan fungsi tiap baris dari sintaks program pada Percobaan 5.3 
#include <LiquidCrystal.h>
LiquidCrystal lcd(2,3,4,5,6,7);// setting  pin 2 hingga 7 output ke LCD
String textFromSerial ="";
void setup() {
lcd.begin(16,2);// setting ukuran LCD yaitu 16X2
lcd.clear();//reset tampuilan LCD
lcd.setCursor(0,0);//setting posisi teks LCD
lcd.print("Data From Serial");//cetak teks pada LCD
Serial.begin(9600);// mengatur konfigurasi baudrate yaitu 9600
}
void loop() {
while(Serial.available()>0) {
char data = Serial.read();
if(data == '\n') {
lcd.setCursor(0,1);
lcd.print(textFromSerial);
textFromSerial="";
}
else{
if(data!='\r') {
textFromSerial += data;
}
}
}
}

5.4 Menerima Data dari UART dengan Interupsi.
Pada percobaan kali ini akan dibuat program untuk menerima data teks sama seperti Percobaan 5.3 Pada percobaan kali ini proses penerimaan data kan menggunakan interupsi serial. Data yang diterima oleh Arduino akan ditampilkan pada LCD. Penerimaan data akan menggunakan baudrate 115200.
Prosedur :
1.      Tuliskan sintaks program di bawah ini lakukan kompilasi dan upload program.
#include <LiquidCrystal.h>
#define FOSC 16000000
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
String dataSerial;
void initSerial(int baudrate) {
int ubrr = FOSC/16/baudrate-1;
// Mengisi register UBRR0H dan UBRR0L untuk menentukan baudrate
UBRR0H |= ubrr>>8;
UBRR0L|= ubrr;
// Mengaktifkan saluran transmitter dan receiver
UCSR0B|= (1<<RXEN0)|(1<<TXEN0);
// Menggunakan format data 8 bit
UCSR0C|= (0<<UCSZ02)|(1<<UCSZ01)|(1<<UCSZ00);
// Menggunakan 1 stop bit
UCSR0C|= (0<<USBS0);
// No Parity
UCSR0C|= (0<<UPM01)|(0<<UPM00);
// Mengaktifkan RX interrupt
UCSR0B|= (1<<RXCIE0);
}
// Rutin yang akan dijalankan jika terjadi interupsi
ISR(USART_RX_vect){
char data = UDR0;
if(data=='\n') {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Incoming Data");
lcd.setCursor(0,1);
lcd.print(dataSerial);
dataSerial = "";
}
else{
if(data!='\r') {
dataSerial += data;
}
}
}
void setup() {
initSerial(9600);
lcd.begin(16,2);
lcd.clear();
sei();
}
void loop() {
}

Tugas dan Pertanyaan :
1.      Buka Serial Monitor pada Arduino IDE, sesuaikan konfigurasi Serial Monitor sesuai dengan Gambar

Ketikkan sembarang teks untuk dikirimkan, tekan Send. Lengkapilah Tabel 5.4 !



Twitter Delicious Facebook Digg Stumbleupon Favorites More