Arduino for Robotic
Muchamad Malik S.Kom 2011
R2G | Robot Research Group
Arduino adalah single-board microcontroller
yang berbasis open-source, dirancang untuk
memudahkan penggunaan elektronik dalam berbagai bidang. Mikrokontroler yang digunakan dari jenis atmel AVR dengan berbagai jenis turunannya. Kelebihan dari arduino adalah Arduino mempunya bahasa pemroraman sendiri, mirip bahasa C namun memiliki library sendiri. Di dalam mikrokontrolernya sudah terdapat boot loader yang digunakan sebagai penjembatan antara mikrokontroler dengan software compilernya. Arduino membuka semua sourcenya mulai dari diagram rangkain, jalur pcb, software compiler. A. ARDUINO PROGRAMMIN 1. Addition, Subtraction, Multiplication, & Division
Diskripsi Operasi ini memberikan hasil penambahan, pengurangan, pembagian dan perkalian dari dua operan. Operasi adalah pengaturan menggunakan dua tipe data dalam operan seperti 9/4 adalah 2 dimana 9 dan 4 adalah intejer. Selain itu bisa juga diartikan operasi tersebut merupakan dapat menangani hasil yang mempunyai range dalam sebuah tipe data ( 1 intejer mempunyai nilai 32,767 sampai -32,768). Jika beberapa operan mempunyai perbedaa tipe data yang “besar” yang digunakan untuk perhitungan. Salah satu operan yang digunaka adalah tipe float atau tipe double , floating point dapat digunakan untuk penghitungan Contoh y = y + 3; x = x - 7; i = j * 6; r = r / 5;
R2G | Robot Research Group
Page 2
Syntax
result = value1 + value2; result = value1 - value2; result = value1 * value2; result = value1 / value2;
parameter value1 : merupakan variable atau konstan value2 : merupakan variable atau konstan Tips pemrograman :
Ketahui bahwa integer constan default untuk int
sehingga beberapa konstanta
penghitungan bisa overflow (60*1000 akan menghasilkan hasil yang negative)
Pilih besaran variable yang besarnya cukup untuk menangani hasil dari penghitungan Anda
Ketahui bahwa tanda operasi bilangan yang akan Anda gunakan harus langsung sesuai arah matematika contoh 0-1 atau 0 - - 32768
Untuk pemrograman yang memerlukan pecahan, gunakanlah vaiabel float , tapi perlu disadari hal ini mempunyai kelemahan dalam memiliki ukuran yang besar dan kecepatan komputasi yang rendah R2G | Robot Research Group
Gunakanlah operasi penglihan seperti (int)myFloat untu merubah sebuah variable menjadi variable lain yang belum kita ketahui.
1.1 assignment operator (single equal sign)
menyimpan nilai variable sebelah kanan ke dalam variable sebelah kiri. Single equal sign dalam pemrograman C adalah pemanggilan operator tugas (assignment operator). Hal ini berbeda dengan kelas aljabar yang mengindikasikan persamaan atau penyamaan. Operator penugasan ini memberitahu mikrokontroler untuk mengevaluasi nilai apapun atau ekspresi yang berada di sebelah kanan dan menyimpannya ke dalam variable sebelah kiri. Contoh int sensVal;
// mendeklarasikan mendeklarasi kan sensVal sebagai variable intejer
senVal = analogRead(0);
// menyimpan (dijitasi) voltase yang masuk pada
analog pin ke 0 dalam sensVal
tips pemrograman variable yang ada di sebelah kiri dari assignment operation (= sign) dibutuhkan untuk digunakan menjaga nilai yang sudah tersimpan di dalamnya. Jika hal itu tidak cukup besar untuk menangani sebuah nilai, nilai yang sudah tersimpan di variable tersebut akan menjadi salah. Jangan terkecoh dengan assignment operator [=] (sama dengan) dengan operator komparasi [==] (dobel sama dengan) yang mengevaluasi dua ekspresi menjadi hasil.
R2G | Robot Research Group
Page 4
2. TIPE DATA 2.1 Int Intejer merupakan tipe data yang utama dari macam penyimpanan dan terdiri dari 2 nilai byte. Mempunyai range dari -32,768 sampai 32,762 (nilai minimal adalah -2^15 dan nilai maksimal (2615)-1 ). Contoh int ledPin = 13;
Syntax
int var = val;
var – var – nama nama variable intejer Anda val – val – nilai nilai yang diberikan dalam variable Anda. Tips Coding Saat beberapa variable dibuat untuk melebihi kapasitas maksimal, maka nilai tersebut akan membalik ke minimal kapasitas, begitu juga sebaliknya. int x x = -32,768; x = x - 1;
// x sekarang menjadi 32,767 – berbalik ke arah neg.
x = 32,767; x = x + 1;
// x sekarang menjadi -32,768 – berbalik kea rah positif
R2G | Robot Research Group
2.2 Unsigned Int Unsign int sama seperti int, int, namun dalam pemberian angka negative tidak diperkenankan, sebagai gantinya nilai negative digantikan nilai positif sehingga mempunyai range 0 sampai 65,535 (2^16)-1). Contoh unsigned int ledPin = 13;
Syntax
unsigned int var = val;
var – var – nama nama variable unsigned Anda val – val – nilai nilai yang berada dalam variable tersebut. Tips Coding Ketika membuat variable yang melebihi kapasitas, maka akan membalik ke kapasitas minimum unsigned int x x = 0; x = x - 1;
// x sekarang
x = x + 1;
// x sekarang 0
R2G | Robot Research Group
65535
Page 6
2.3
word
sebuah word menyimpan 16 bit angka dari 0 sampai 65535 sama seperti unsigned int
contoh
word w = 10000;
2.4
byte
byte menyimpan sebuah 8-bit dari 0 samapi 255 contoh byte b = B10010;
2.5
// "B" is the binary formatter (B10010 = 18 decimal)
float
tipe data untuk angka floating point, sebuah angka yang mempunyai titik decimal. Floating-point sering dugunakan pada nilai yang mendekati analog dan nilai yang berkesinambungan karena mempunyai resolusi yang lebih tinggi dari pada intejer. Floating-point mempunyai besar 3.4028235E+38 dan -3.4028235E+38. Sehingga dapat menyimpan 32bit (4byte. ) informasi. Float hanya mempunyai kepresisian 6 – 7 dijit decimal. Yang maksudnya total angka dari dijitnya bukan angka dari titik kanan setelah decimal. Tidak seperti platform, dimana Anda dapat mendapatkan akurasi dari penggunaan tipe data double (sampai 15 dijit) dalam arduino, double adalah besarnya sama seperti float.
R2G | Robot Research Group
Angka Floating-point belum tentu tepat, dan bisa menghasilkan hasil yang tidak biasa saat di komparasi. Seperti misalkan 6.0 / 3.0 hasilnya mungkin bukan 2.0 Anda harus mengganti dan mengecek nya karena nilai absolute berbeda dengan angka yang memiliki ketelitian. Contoh float myfloat; float sensorCalbrate = 1.117;
Syntax
float var = val; var – var – nama nama variable Anda val – val – nilai nilai yang diberikan Contoh Kode int x; int y; float z;
x = 1;
2.6
y = x / 2;
// y sekarang 0, ints tidak dapat mengani nya
z = (float)x / 2.0;
// z sekarang .5 (Anda memiliki hasil 2.0, bukan 2)
double
Dalam Arduino, Double sama seperti float namun memiliki kepresisian yang sedikit berbeda.
R2G | Robot Research Group
Page 8
Tips Pengguna yang membawa kode dari source code dari luar yang didalamnya terdapat variable double lebih baik diuji terlebih dahulu untuk mengetahui perbedaan ketepatan yang terdapat pada Arduino. 2.7
Long
Variable long adalah variable yang mempunyai penyimpanan angka yang lebar yaitu 32 bit (4byte) dari -2,147,483,648 sampai 2,147,487,483,647 Contoh long speedOfLight = 186000L;
// see Integer Constants for explanation of
the 'L'
Syntax long var = val;
2.8
Unsigned Long
Undigned Long adalah variable yang mempunyai lebar 32bit dan tidak seperti long, unsigned long tidak dapat menyimpan angka negative, mempunyai range antara 0 sampai 4,294,967,295 (2^32 – (2^32 – 1) 1)
R2G | Robot Research Group
Contoh unsigned long time;
void setup() { Serial.begin(9600); }
void loop() { Serial.print("Time: "); time = millis(); //mencetak waktu saat program dijalankan Serial.println(time); // besaran waktu tunggu saat tidak mengirim sejumlah data delay(1000); }
Syntax
unsigned long var = val;
2.9
Boolean
Boolean menangani dua nilai yaitu true atau false sedangkan variable menempati satu byte dari memori.
Contoh
R2G | Robot Research Group
Page 10
int LEDpin = 5; int switchPin
// LED pada pin 5 =
13;
//
saat
switch
terpasang
pada
pin
13,
yang
terkoneksi pada ground boolean running = false;
void setup() { pinMode(LEDpin, OUTPUT); pinMode(switchPin, INPUT); digitalWrite(switchPin, digitalWrite(switchP in, HIGH);
// menghidupkan pullup resistor
}
void loop() { if (digitalRead(switchPin) == LOW) {
// switch ditekan - pullup membiarkan pin high normally delay(100);
// delay untuk switch
running = !running;
// toggle variable running
digitalWrite(LEDpin, digitalWrite(LEDpi n, running)
// indikasi via LED
} }
R2G | Robot Research Group
lain
2.10
Char
Sebuah tipe data yang mengambil 1 byte memori untuk menyimpan nilai karakter. Karakter huruf tertulis dalam tanda kutip satu seperti „A‟ (untuk karakter yang banyak, menggunakan tanda petik dua : “ABC”). Anda dapat melihat encoding yang lebih spesifik dalan ASCII CHART . Ini dimaksudkan dapat memungkinkan untuk menjalankan aritmatika dalam nilai ASCII yang menggunakan karakter misalkan „A‟ +1 memiliki nilai 66, karena nilai ASCII dari huruf A adalah 65. Tipe dara char adalah angka encoding dari -128 sampi 127 Contoh char myChar = 'A'; char myChar = 65;
2.11
// both are equivalent
Unsigned Char
Tipe data yang membutuhkan 1 byte dari memori. Sepeti pada tipe data byte, unsigned char mempunyai panjang 0 sampai 255. Dalam Arduino, tipe data ini jarang digunakan Contoh unsigned char myChar = 240;
R2G | Robot Research Group
Page 12
2.12
Arrays
Array adalah kumpulan dari beberapa variable yang saling berkaitan dengan sebuah nomer indeks. Membuat (deklarasi) sebuah Array Dibawah ini adalah membuat sebuah metode array yang benar. int myInts[6]; int myPins[] = {2, 4, 8, 3, 6}; int mySensVals[6] = {2, 4, -8, 3, 2}; char message[6] = "hello";
anda dapat mendeklarasikan aray tanpa menginisialisasikan nya seperti dalam myInts. Mengakses sebuah array Array merupakan zero indexed yang menunjuk pada array yang telah diinisialisasi sebelumnya, elemen pertama dari array adalah indeks ke 0 mySensVals[0] == 2, mySensVals[1] == 4, dan sampai ke empat.
Seperti halnya array dengan 10 elemen, indek 9 adalah elemen terahir int myArray[10]={9,3,2,4,3,2,7,8,9,11}; // myArray[9] //
myArray[10]
contains 11 is
invalid
and
contains
random
information
(other
memory address)
Tidak seperti BASIC atau JAVA, dalam compiler C tidak mengecek untuk mengetahui jika akses array sudah sesuai batas besaran array yang Anda deklarasikan sebelumnya.
R2G | Robot Research Group
Sebuah penugasan dalam sebuah array mySensVals[0] = 10;
untuk mendapatkan sebuah nilai dari array x = mySensVals[4];
2.12.1
Array dan perulangan FOR
Array dapat dimanipulasikan dalam perulangan for, dimana penghitungan perulangan digunakan sebagai indeks pada beberapa elemen array. Seperti contoh untuk mencetak beberapa elemen sebuah array pada serial port, Anda dapat melakukan sesuatu seperti berikut : int i; for (i = 0; i < 5; i = i + 1) { Serial.println(myPins[i]); }
2.13
Void
Kata kunci void hanya digunakan dalam mendelarasikan fungsi. Hal ini untuk mendandakan bahwa fungsi itu diharapkan untuk memberi informasi dari fungsi yang telah dipanggil. contoh // actions are performed in the functions "setup" and "loop" // but
no information is reported to the larger program
R2G | Robot Research Group
Page 14
void setup() { // ... }
void loop() { // ... }
2.14
string
text string dapat dituliskan ke dalam dua cara, Anda dapat menggunakan tipe data String yang merupakan bagian dari dasar versi 0019, atau Anda dapat menggunakan sebuah string luar dari sebuah array tipe char dan null-terminate nya. nya.
Contoh char Str1[15]; char Str2[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o'}; char Str3[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o', '\0'}; char Str4[ ] = "arduino"; char Str5[8] = "arduino"; char Str6[15] = "arduino";
kemungkinan
kemungkinan untuk deklarasi srting
deklarasi sebuah array dari chars tanpa inisialisasi seperti dalam Str1
R2G | Robot Research Group
deklarasi sebuah array dari chars (dengan satu extra char) dan compiler akan menambah karakter null seperti dalam Str2
menambahkan karakter null secara lagsung, Str3
inisial dengan sebuah konstanta string dalam tanda kutipan, compiler akan menghitung lebar konstanta array untuk panjang kontanta string dan sebuah pengahiran karakter null, Str4
inisial array dengan menuliskan besar dan konstanta string, Str5
inisial array, memberi ruang ekstra untuk string yang lebih besar, Str6 2.14.1
Ahiran Null
Biasanya, banyak string yang diahiri dengan sebuah karakter null (kode ASCII 0). Hal ini membolehkan fungsi (seperti Serial.print() ) untuk memanggil diahir string. Selain itu, meraka akan melanjutkan pembacaan byte subskuen dari memori yang bukan merupakan bagian dari string. Hal ini dimaksud saat Anda membutuhkan string yang memiliki ruang untuk karakter yang lebih banyak dari teks yang anda inginkan. Ini kenapa Str2 dan Str5 membutuhkan 8 karakter sedangkan “arduino” hanya 7, posisi yang terahir secara otomatis akan ditempai oleh karakter null.Str4 akan otomatis sebesar 8 karakter, satu dari external null. Dalam Str3, kami mempinyai penyertaan karakter null secara explicit (ditulis „ \ 0‟) \ 0‟)
R2G | Robot Research Group
Page 16
2.14.2
Menyatukan string yang panjang
Anda dapat menyatukan string yang panjang seperti berikut : char myString[] = "This is the first line" " this is the second line" " etcetera";
2.14.3
Array dari string
Bagaimana bekerja dengan teks yang berjumah besar, seperti dalam poyek LCD display untuk membentuk array dari string. Karena string merupakan array, hal ini sebenarnya sebuah contoh dari array dua dimensi. Dalam kode ini, tanda bintang setelah tipe data char “char*”, merupakan sebuah array dari “ pointer” . Semua nama array merupakan pointer, jadi ini merupakan array di dalam array. Contoh char* myStrings[]={"This is string 1", "This is string 2", "This is string 3", "This is string 4", "This is string 5","This is string 6"};
void setup(){ Serial.begin(9600); }
void loop(){ for (int i = 0; i < 6; i++){ Serial.println(myStrings[i]); delay(500); }
R2G | Robot Research Group
String Kelas String, bagian dari dasar versi 0019, membolehkan kita memanipulasi string dari teks lebih komplek dari cara array karakter yang digunakan. Anda dapat menggabungkan String, menambahkannya mencari dan megganti substring dan sebagainya. Hal itu lebih banyak mengambil memori dari pada array yang sederhana.
Penghitungan
4.1
abs(x)
menghitung nilai absolute dari sebuah cacah parameter x : cacah perhatian karena tentang abs() berfungsi untuk penerapan, hindari penggunaan fungsi yang terdapat tanda kurang, hal akan menghasilkan hasil yang salah abs(a++);
// avoid this - yields incorrect results
a++;
// use this instead -
abs(a);
// keep other math outside the function
R2G | Robot Research Group
Page 18
constrain (x,a,b) contrain merupakan angka batasan dalam sebuah range parameter x : angka dari contrain ; semua tipe data a : batas bawah dari range ; semua tipe data b : batas atas dari range ; semua tipe data kembalian x : jika x diantara a dan b a : jika x lebih kecil dari a b : jika x lebih dari b contoh sensVal = constrain(sensVal, 10, 150); // batas range dari nilai sensor antara 10 dan 150
4.2
map(value, fromLow, fromHigh, toLow, toHigh)
Memetakan ulang sebuah angka dari sebuah range ke yang lainnya. Ini adalah sebuah nilai dari fromLow yang sudah dipetakan ke toLow, toLow, sebuah nilai dari fromHigh pada toHigh. Contoh
R2G | Robot Research Group
y = map(x, 1, 50, 50, 1); fungsi ini juga menangani angka negative y = map(x, 1, 50, 50, -100); contoh /* Map an analog value to 8 bits (0 to 255) */ void setup() {}
void loop() { int val = analogRead(0); val = map(val, 0, 1023, 0, 255); analogWrite(9, val); }
Catatan tambahan Untuk penghitungan matematika, berikut adalah fungsi nya long map(long x, long in_min, long in_max, long out_min, long out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; }
4.3
min(x,y)
menghitung minimum dari dua angka sensVal = min(sensVal, 100); // assigns sensVal to the smaller of sensVal or 100 // ensuring that it never gets above 100.
R2G | Robot Research Group
Page 20
max() juga ikut digunakan untuk konstrain yang lebih rendag dari variable range, sedangkan min() digunakan untuk konstrain yang mempuyai range lebih tinggi. sensVal = max(senVal, 20); // assigns sensVal to the larger of sensVal or 20
R2G | Robot Research Group
Struktur 5.1
setup()
fungsi setup() untuk memulai sketsa pemrograman, inisilaisasi variable, pin mode, memulai menggunakan library dan lainnya. Fungsi setup akan dijalankan sekali setelah arduino dihidupkan atau di reset. Contoh int buttonPin = 3;
void setup() { Serial.begin(9600); pinMode(buttonPin, INPUT); }
void loop() { // ... }
5.2
loop()
setelah membuat fungsi setup (), yang harus dilakukan adalah menginisialisasi dan mengeset nilai inisial dari fungsi loop() dengan tepat apa nama yang akan diberikan. Gunakan ini untuk mengaktifkan board Arduino
R2G | Robot Research Group
Page 22
contoh int buttonPin = 3;
// setup initializes serial and the button pin void setup() { beginSerial(9600); pinMode(buttonPin, INPUT); }
// loop checks the button pin each time, // and will send serial if it is pressed void loop() { if (digitalRead(buttonPin) == HIGH) serialWrite('H'); else serialWrite('L');
delay(1000); }
Control Sructure 6.1
IF, IF, yang digunaan dalam imbuhan dengan operator pembanding
Format untuk if : if (someVariable > 50) { // bisa digunakan untuk statemen yang lain
R2G | Robot Research Group
} Untuk cara lain, statemen if selalu dalam keadaan true if (x > 120) digitalWrite(LEDpin, HIGH);
if (x > 120) digitalWrite(LEDpin, HIGH);
if (x > 120){ digitalWrite(LEDpin, HIGH); }
if (x > 120){ digitalWrite(LEDpin1, HIGH); digitalWrite(LEDpin2, HIGH); }
6.2
// semua dianggap benar
Comparison Operators:
x == y (x sama dengan y) x != y (x tidak sama dengan y) x<
(x lebih kecil dari y)
x>
(x lebih besar dari y)
x <= y (x lebih kecil sama dengan y) x >= y (x lebih besar sama dengan y)
R2G | Robot Research Group
Page 24
6.3
IF/ELSE
Struktur if/else membeikan kita control yang lebih besar untuk menangani berbagai statement dibandingkan dengan statemen dasar if. Jadi struktur if else merupakan gabungan pernyataan if bersaang yang membolehkan logika ya atau tidak. Untuk contoh, sebuaah input analog dapat mengerjakan sebuah aksi yang mempunyai inputan kurang dari 500 dan yang lain beraksi jika inputan tersebut > 500, maka kodenya dapat dituliskan sebagai berikut if (pinFiveInput < 500) { // action A } else { // action B }
Else juga dapat digunakan secara bertingkat sampai dengan tak terhingga selama proses yang kita inginkan belum menyatakan sebuah kebenaran atau berlogika true, berikut contoh kodenya if (pinFiveInput < 500) { // do Thing A } else if (pinFiveInput >= 1000) { // do Thing B } else { // do Thing C }
R2G | Robot Research Group
6.4
Switch/case
Seperti halnya if statemen, switch…case me megontrol gontrol alir dari program yang membolehkan beberapa parameter yang berbeda untuk dieksekusi dalam kondisi yang bervariasi. Contoh switch (var) { case 1: //do something when var equals 1 break; case 2: //do something when var equals 2 break; default: // if nothing else matches, do the default // default is optional }
Syntax switch (var) { case label: // statements break; case label: // statements break; default: R2G | Robot Research Group
Page 26
// statements } break selalu ada dalam statemen case, dan digunakan untuk ahiran dari bermacam macam case, tanpa statemen break, statemen swich akan terus dijalankan sesuai ekpresi tanpa henti (“falling(“fallingthrough”) sampai menemukan statemen break atau sampai satemen swich ditutup. ditutup. 6.5
For
Pernyataan for digunakan untuk mengulang sebuah blok statemen yang terus berputar. Biasanya, pernyataan for digunakan untuk mengkombinasikan sebuah array dalam menyatakan sebuah pin atau data. Berikut header untuk perulangan for : for (initialization ; condition; condition; increment) increment ) { //statement(s); }
Inisialisasi dilakukan pertama dan sekali saja. Condition adalah berapa kali kita akan melakukan looping, increment adalah menunjukan bahawa looping akan dijalankan secara bertingkat. Contoh : // Dim an LED using a PWM pin int PWMpin = 10; // LED in series with 470 ohm resistor on pin 10
void setup() {
R2G | Robot Research Group
// no setup needed }
void loop() { for (int i=0; i <= 255; i++){ analogWrite(PWMpin, i); delay(10); } }
Tips Dalam C, statemen for sangat fleksibel disbanding dengan for yang ada pada BASIC. Beberapa diantaranya dalah elemen header bisa saja dihilangkan, namun tanda titik koma harus tetap disertakan. for(int x = 2; x < 100; x = x * 1.5){ println(x); }
menghasilkan: menghasilkan: 2,3,4,6,9,13,19,28,42,63,94 2,3,4,6,9,13,19,28,42,63,94 Contoh lain
void loop() { int x = 1; for (int i = 0; i > -1; i = i + x){ analogWrite(PWMpin, i); if (i = 255) x = -1;
// switch direction at peak
delay(10);
R2G | Robot Research Group
Page 28
} }
6.6
while
while akan melakukan perulangan secara kontinyu dan tidak terbatas samapi ekspresi tersebut menemukan kembali parenthesisnya, () menjadi false. Biasanya digunakan untuk mengetes sebuah sensor karena perulangan ini tak akan berahir sampai adanya kondisi eksternal yang meutupnya
Syntax
while(expression){ // statement(s) }
Parameters
expression - (boolean) statemen C mengoreksi true atau false
contoh
var = 0; while(var < 200){
//mengulang sesuatu sampai 200 kali
var++; }
6.7
do-while
R2G | Robot Research Group
perulangan do bekerja seperti cara while melakukan perulangan, perulangan do hanya mengerjakan sekali di ahir statemen.
do { // statement block } while (test condition);
contoh do { delay(50);
// wait for sensors to stabilize
x = readSensors();
// check the sensors
} while (x < 100);
6.8
break
break digunakan untuk mengahiri perulangan dari do, for atau while. Dan juga digunakan untuk mengahiri statemen switch. switch.
Contoh
for (x = 0; x < 255; x ++) { digitalWrite(PWMpin, x); sens = analogRead(sensorPin); if (sens > threshold){
// bail out on sensor detect
x = 0; break; }
R2G | Robot Research Group
Page 30
delay(50); }
6.9
goto
untuk melompati alur program ke program yang sudah kita beri label.
Syntax
label:
goto label; // mengrirm alur ke program yang telah diberi label.
tips Dalam menggunakan goto, goto, adalah tidak lazim dalam pemrograman C. beberapa buku memberikan gambaran bahwa statemen goto justru akan mengganggu jalannya alur program, karena tidak bisa stemen yang ada didalam goto tidak dapat dikenali dan tidak dapat di debug , sehingga hasilnya pun tidak bisa kita ketahui. Berikut contoh programnya :
for(byte r = 0; r < 255; r++){ for(byte g = 255; g > -1; g--){ for(byte b = 0; b < 255; b++){ if (analogRead(0) > 250){ goto bailout;} // more statements ... } } }
R2G | Robot Research Group
6.10
bailout
mengahiri sebuah fungsi dan mengembalikan sebuah nilai dari sebuah fungsi tersebut untuk memanggil fungsi yang lain jika diinginkan.
Syntax:
return; return value; contoh sebuah fungsi untuk membandingkan inputan sebuah sensor kepada sebuah threshold int checkSensor(){ if (analogRead(0) > 400) { return 1; else{ return 0; } }
6.11
continue
statemen countinue membiarkan atau melanjutkan penghentian perulangan ( do, for atau while). while). Digunakan untuk melanjutkan pada pengecekan sebuak ekspresi kondisi dari loop dan memprosesnya dengan beberapa subsequent yang berulang ulang. Contoh
R2G | Robot Research Group
Page 32
for (x = 0; x < 255; x ++) { if (x > 40 && x < 120){
// create jump in values
continue; }
digitalWrite(PWMpin, x); delay(50); }
FUNCTION 7.1
pinMode()
digunakan untuk mengkonfigurasi pin secara spesifik sebagai sebuah intputan atauoutputan.
Syntax
pinMode(pin, mode)
Parameters
pin: set nomer pin mode mode: INPUT or OUTPUT
contoh
int ledPin = 13;
// LED terkoneksi pada digital pin 13
void setup()
R2G | Robot Research Group
{ pinMode(ledPin, OUTPUT);
// set digital pin sebagai output
}
void loop() { digitalWrite(ledPin, HIGH);
// set LED on
delay(1000);
// waktu tunggu dalam second
digitalWrite(ledPin, digitalWrite(ledPin , LOW);
// set LED off
delay(1000);
// waktu tunggu dalam second
}
7.2
digitalWrite()
menulisakan logika HIGH atau LOW pada pin dijital. Jika pin telah dikonfigurasi sebagai OUTPUT dengan pinMode(), itu berarti arus akan diset dengan nilai 5V(atau 3.3V dalam board) untuk HIGH, 0V (ground) untuk LOW. Jika pin dikonfigurasi sebagai INPUT, maka penulisan logika HIGH dengan digitalWrite() akan membutuhkan sebuah resistor pullup internal 20K .penulisan LOW akan mendisable pullup nya. Pullup resistor cukup untuk menyalakan LED dengan redup, jadi jika LED bekerja namun samar, maka harus memperbaiki set pin ke output dengan fungsi pinMode()
Syntax
digitalWrite(pin, value)
R2G | Robot Research Group
Page 34
Parameters
pin: nomer pin value: HIGH or LOW
contoh
int ledPin = 13;
// LED connected to digital pin 13
void setup() { pinMode(ledPin, OUTPUT);
// sets the digital pin as output
}
void loop() { digitalWrite(ledPin, HIGH);
// sets the LED on
delay(1000);
// waits for a second
digitalWrite(ledPin, LOW);
// sets the LED off
delay(1000);
// waits for a second
}
7.3
digitalRead()
membaca nilai dari spesifikasi digital pin yang bernilai HIGH atau LOW
digitalRead(pin)
R2G | Robot Research Group
Parameters
pin: nomer dari digital pin yang ingin dibaca ( int )
contoh
int ledPin = 13; // LED terkoneksi pada digital pin 13 int inPin = 7;
// pushbutton terkoneksi digital pin 7
int val = 0;
// variable to store the read value
void setup() { pinMode(ledPin, OUTPUT); pinMode(inPin, INPUT);
// set digital pin 13 sebagai output // set digital pin 7 sebagai input
}
void loop() { val = digitalRead(inPin digitalRead(inPin); ); digitalWrite(ledPin, digitalWrite(ledPin , val);
// baca input pin // set LED untuk nilai pada button
}
Set pin 13 seperti nilai dari pin 7 yang menjadi inputan. Jika pin tidak terkoneksi pada digitalRead() maka dapat dikembalikan pada HIGH atau LOW dan dapat berganti secara acak. Input pin alanalog dapat digunakan sebagai digital pin, tertunjuk sebagai A0, A1, dsb.
R2G | Robot Research Group
Page 36
ANALOG I/O 8.1
analogReference(type)
Fungsi ini digunakan untuk mengkonfigurasi voltase acuan yang digunakan untuk input analog, sebagai pilihannya : DEFAULT : default acuan analog sebesar 5V (dalam 5V Arduino board) atau 3.3 V (dalam 3.3V board Arduino) INTERNAL : sebuah acuan built-inn sama dengan 1.1V dalam ATmega168 atau ATmega328 dan 2.56V pada ATmefa8 (tidak terdapat pada Arduino Mega) INTERNAL1V1 : acuan built-in 1.1V (hanya Arduino Mega) INTERNAL2V56: acuan built-in 2.56V (hanya Arduino Mega) EXTERNAL : voltase yang digunakan pada pin AREF
Parameters
type: acuan yang digunakan (DEFAULT, INTERNAL, INTERNAL1V1, INTERNAL2V56, atau EXTERNAL). Setelah mengganti acuan analog, pembacaan pertama pada analogRead() mungkin idak bisa akurat. Jika Anda menggunakan acuan voltase external (digunakan untuk pin AREF), Anda harus mennyeting acuan analog pada EXTERNAL sebelum memanggil analogRead(). selain itu, Anda bisa mengaktifkan acuan voltase bersamaan (internally generated) dan pada pin AREF, dapat merukas mikrokontroler pada board Arduino. R2G | Robot Research Group
8.2
analogRead()
membaca nilai dari pin analog. Board arduino menampung 6 chanel (8 chanel pada Mini dan Nano, 16 pada Mega), 10-bit ADC. Ini berarti akan memetakan voltase antara 0 sampai 5 volt dalam nilai integer antara 0 dan 1023. Sehingga menghasilkan resolusi pembacaa dai 5volt/1024 unti atau 0.0049volt (4.9mV) per unit. Panjang input dan resilusi dapat digantkan dengan alalogReference(). Hal ini membutujkan 100milisecond 100miliseco nd (0.0001s) untuk membaca membaca input analog, jadi maksimum rate pembacaan sekitar 10000 kali per detik. Syntax analogRead(pin) parameter pin : nomer dari pin input aalog untuk dibaca dari (0 sampai 5 pada umumnya, 0 sampai 7 pada Mini dan Nano, 0 sampai 15 pada Mega) bisa juga dituliskan sebagai int (0 sampai 1023) contoh int analogPin = 3;
// potentiometer potentiome ter wiper (middle terminal) connected to
analog pin 3 // outside leads to ground and +5V int val = 0;
// variable to store the value read
void setup() {
R2G | Robot Research Group
Page 38
Serial.begin(9600);
//
setup serial
}
void loop() { val = analogRead(analogP analogRead(analogPin); in); Serial.println(val);
// read the input pin // debug value
}
8.3
analogWrite()
analogWrite() dapat digunakan untuk menulis nilai analog (gelombang PWM) untuk sebuah pin. Dapat juga digunakan menyalakan LED dengan cahaya yang bervariasi atau mengontrol motor dengan kecepatan yang bervariasi. Frekuensi sinyal PWM bisa mencapai 490 Hz. Di dalam board Arduino ATmega168 atau ATmega328, pin yang berfungsi adalah 3,5,6,9,10 sdan 11. Di dalam Arduino Arduino Mega
bekerja pada pin 2 bersama bersama 13, dalam Arduino ATmega8 hanya hanya
mendukung analogWrite() pada pin 9,10 dan 11. Anda tidak dapat memanggil pinMode() untuk menyeting pi sebagai output sebelum memanggil analogWrite(). Fungsi dari analogWrite tidak bisa bekerja tanpa pin analog atau fungsi analogRead. Syntax analogWrite(pin, value) parameter pin: pin yang untuk ditulis value : putaran penugasan : antara 0 (selalu off) dan 255 (selalu on) R2G | Robot Research Group
pada output PWM PWM yang dihasilkan pada pin 5 dan 6 akan mempunyai putaran penugasan yang lebih tinggi. Hal ini dikarenakan interaksi dengan fungsi millis() dan delay() yang membagi sesame penggunaan internal timer yang digunakan oleh output PWM. Contoh Set output pada LED dengan nilai yang disesuaikan dari nilai potensiometer int ledPin = 9;
// LED connected to digital pin 9
int analogPin = 3;
// potentiometer connected to analog pin 3
int val = 0;
// variable to store the read value
void setup() { pinMode(ledPin, OUTPUT);
// sets the pin as output
}
void loop() { val = analogRead(analog analogRead(analogPin); Pin); analogWrite(ledPin,
val / 4);
// read the input pin // analogRead
values go from 0 to 1023,
analogWrite values from 0 to 255 }
Advance I/O 9.1
pilseIn()
Fungsi ini digunakan untuk membaca sebuah pulsa (HIGH atau LOW) pada sebuah pin
R2G | Robot Research Group
Page 40
syntax pulseIn(pin,value) pulseIn(pin, value, timeout)
parameter pin : nomer pin yang akan dibaca pulsa nya (int) value : tipe dari pulsa (HIGH atau LOW) (int) timeout (optional) : angka dalam mikrosekon waktu tunggu pulsa untuk memualai, sefaulnya adalah 1 detik (unsigned long) contoh int pin = 7; unsigned long duration;
void setup() { pinMode(pin, INPUT); }
void loop() { duration = pulseIn(pin, HIGH); }
R2G | Robot Research Group
9.2
shiftOut()
shift out adalah sebuah byte dari data dalam satu bit per satuan waktu. Syntax shiftOut(dataPin, clockPin, bitOrder, value) parameter dataPin : pin yang menjadi output bit (int) clockPin : pin yang sekali dilewati dengan dataPin (int) bitOrder : bit yang akan diberikan untuk shift out berupa MSBFIRS atau LSBFIRST (Most significant Bit First atau Least Significant Bit First) value : data untuk shift out (byte) dataPin dan clockPin harus selalu dikonfigurasi sebagai output untuk memanggil pinMode() // Do this for MSBFIRST serial int data = 500; // shift out highbyte shiftOut(dataPin, clock, MSBFIRST, (data >> 8)); // shift out lowbyte shiftOut(data, clock, MSBFIRST, data);
// Or do this for LSBFIRST serial data = 500; // shift out lowbyte shiftOut(dataPin, clock, LSBFIRST, data); // shift out highbyte
R2G | Robot Research Group
Page 42
shiftOut(dataPin, clock, LSBFIRST, (data >> 8));
contoh For accompanying
circuit, see the tutorial on contr olling a 74HC595 s hift
register.
//**************************************************************// //
Name
: shiftOutCode, Hello World
//
//
Author
: Carlyn Maw,Tom Igoe
//
//
Date
: 25 Oct, 2006
//
//
Version : 1.0
//
//
Notes
: Code for using a 74HC595 Shift Register
//
: to count from 0 to 255
//
//
//****************************************************************
//Pin connected to ST_CP of 74HC595 int latchPin = 8; //Pin connected to SH_CP of 74HC595 int clockPin = 12; ////Pin connected to DS of 74HC595 int dataPin = 11; void setup() { //set pins to output because they are addressed in the main loop pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } void loop() { //count up routine for (int j = 0; j < 256; j++) { //ground latchPin and hold low for as long as you are transmitting digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, LSBFIRST, j); //return the latch pin high to signal chip that it //no longer needs to listen for information
R2G | Robot Research Group
digitalWrite(latchPin, HIGH); delay(1000);
9.3
tone()
Dapat menghasilkan gelombang kotak dengan spesifikisai frekuensi (50% siklus kerja) dalam sebuah pin.biasanya pin ini dikoneksikan pada buzzer atau speaker untuk memutar bunyi. Bunyi ini akan diputar terus menerus sebulum ada pemanggilan noTone(). Jika tone() sedang bekerja pada sebuah pin, maka pin yang lain tidak akan mempunyai efek apapun, jadi bila kita akan membunyikan suara pada beberapa pin, maka kita harus menyertakan fungsi noTone() pada setiap ahir ekspresinya. Syntax tone(pin, frequency) tone(pin, frequency, duration) 9.4
noTone()
Begitujuga sebaliknya, noTone() digunakan untuk mengahiri gelombang trigger dari tone() sehingga mematikan bunyi yang dihasilkan pada sebuah pin syntax noTone(pin)
R2G | Robot Research Group
Page 44
10 COMMUNICATION 10.1
Serial
Untuk berkomunikasi dengan computer atau device lain, semua board arduino mempunyai serial port (UART atau USART). Untuk berkomunikasi mengunakan digital pin 0 (RX) dan 1 (TX) seperti computer dengan USB. Dalam Arduino Mega, mempunyai mempunyai tambahan 3 serial port : serial 1 pada pin 19 (RX) dan 18 (TX), serial 2 pada pin 17 (RX) dan 16 (TX), serial 13 pada pin 15(RX) dan 14 (TX), untuk berkomuniksai dengan PC, Anda membutuhkan USB to Serial adaptor,untuk mengkomunikasikan dengan external TTL serial device. Jangan menyambungkan pin pada RS232 secara langsung, karena mempunyai +/-12v yang bisa merusak board Arduino. 10.2
INTERUPT
10.2.1
interrupt()
mengaktifkan kembali interupsi (setelah nonaktif oleh noInterupt() ).interupsi memperbolehkan program lain yang lebih penting untuk berjalan terlebih dahulu. Beberapa fungsi tidak akan dapat bekerja jika interupsi tersebut diable, dan berkomunikasi kembali ketika diabaikan. Contoh void setup() {} void loop() { noInterrupts(); // critical, time-sensitive code here interrupts(); // other code here }
R2G | Robot Research Group
10.2.2
noInterupts()
mematika interupsi (Anda dapat mengaktifkan kembali dengan interups()).fungsi ini adalah kebalikan dari fungsi interups(). Contoh void setup() {} void loop() { noInterrupts(); // critical, time-sensitive code here interrupts(); // other code here }
10.3
EXTERNAL INTERRUPT
10.3.1
attachInterrupt(interrupt, attachInter rupt(interrupt, function, mode)
fungsi yang lebih spesifik untuk memanggil external interrupt. Mengganti beberapa funsi sebelumnya yang telah disertakan. Kebanyakan board Arduino mempunyai 2 external interup. Nomer 0 (dalan digital pin 2) dan 1 (dalam digital pin 3). Arduino Mega mempunyai 4 tambahan : nomer 2 (pin 21), 3 (pin 20), 4 (pin 19) dan 5 (pin 18) parameter interrupt interrupt nomer interupsi (int) function : fungsi untuk memanggil interupsi yang terjadi, menjadi acuan bagi interrupt servicer routine
R2G | Robot Research Group
Page 46
mode : mendefinsikan jika terjadi trigger interupsi, ada 4 parameter yang menjadi validasi nilainya : LOW untuk trigger interupsi saat pin low CHANGE untuk trigger interupsi saat pin mengganti nilai RISING untuk trigger saat pin berpindah dari low menjadi high FALLING untuk pin yang berpindah dari high ke low Interupsi digunakan untuk membantu menangani masalah penjadualan waktu pada program mikrokontroler. Contoh int pin = 13; volatile int state = LOW; void setup() { pinMode(pin, OUTPUT); attachInterrupt(0, blink, CHANGE); } void loop() { digitalWrite(pin, state); } void blink() { state = !state; }
R2G | Robot Research Group
11 TIME 11.1
delay()
memberi jeda pada program unuk beberapa waktu ( dalam millisecond) syntax delay(ms) parameter ms : waktu dalam millisecond (unsigned long) contoh int ledPin = 13; void setup() { pinMode(ledPin, OUTPUT); } void loop() { digitalWrite(ledPin, HIGH); delay(1000); digitalWrite(ledPin, LOW); delay(1000); }
11.2
// LED connected to digital pin 13
// sets the digital pin as output
// // // //
sets the LED on waits for a second sets the LED off waits for a second
delayMicroseconds()
member jeda program dalam beberapa waktu (mikrodetik), 1000 microsecond adalah 1 milisecond dan 1juta microsecond adalah 1 detik.
R2G | Robot Research Group
Page 48
Syntax delayMicroseconds(us) parameter us : angka untuk jeda dalam microsecond (unsigned int) contoh int outPin = 8;
// digital pin 8
void setup() { pinMode(outPin, OUTPUT);
// sets the digital pin as output
}
void loop() { digitalWrite(outPin, HIGH);
// sets the pin on
delayMicroseconds(50); delayMicroseconds(50 );
// pauses for 50 microseconds
digitalWrite(outPin, LOW);
// sets the pin off
delayMicroseconds(50); delayMicroseconds( 50);
// pauses for 50 microseconds
}
Mengkonfigurasi pin nomer 8 sebagai pin output, memberikan pulsa dengan waktu 100 microsecond per periode .
R2G | Robot Research Group
B. Petunjuk Penggunaan Arduino
0017
1. Ekstrak (Unzip) file dalam CD : arduino-0017.zip
Gambar file arduino-0017.zip
R2G | Robot Research Group
Page 50
1.1
Penjelasan File & Folder hasil Ekstrak
Gambar file yang sudah terekstraksi 2. Hubungkan Kit ATMEGA 168 ke Komputer menggunakan kabel USB
Gambar kabel usb
R2G | Robot Research Group
3.
Diperlukan instalasi Driver untuk USB sebelum menggunakan Software Arduino
Manual ini menggunakan Operating System (OS) Windows XP . Sesaat setelah USB dihubungkan ke Komputer, maka akan muncul Window baru yang bertujuan untuk instalasi Driver USB Device (Pilih > Install from a list or specific location (Advanced) kemudian klik tombol Next> )
Gambar instalasi Arduino Selanjutnya adalah masuk ke Software Arduino, versi Arduino pada saat manual ini dibuat yang terbaru
adalah
Arduino
–
0017,
silahkan
cek
update
terbarunya
pada
http://arduino.cc/en/Main/Software . Klik ICON Arduino.exe, kita akan masuk ke tampilan software Arduino – Arduino – 0017 0017
R2G | Robot Research Group
Page 52
Tampilan utama Arduino
0017
R2G | Robot Research Group
Gambar window software Arduino
Pemilihan Port dan Tipe Board yang digunakan: (i)
Port : Nomor COM yang dipilih harus sesuai yang terdeteksi pada Device Manager
(ii)
Board : terdapat beberapa pilihan yang dapat digunakan untuk mendownload ATMEL ATMEGA 168, antara lain: a. Arduino Diecimilia, Duemilanove, or Nano w/ ATMEGA 168 b. Lily Pad Arduino w/ ATMEGA 168 c. Arduino Pro or Pro Mini (3.3V, 8Mhz) w/ ATMEGA 168 (*only for 8 Mhz XTALL used) d. Arduino NG or older w/ ATMEGA 168
R2G | Robot Research Group
Page 54
New Program : ketik kode program/ Copy – Paste – Paste dari Contoh Program
R2G | Robot Research Group
Compile untuk memastikan tidak ada kesalahan pengetikan program
R2G | Robot Research Group
Page 56
Upload, Upload , untuk Burn/ Upload Program ke Device
4.
Trial Program
A. Percobaan kontrol Lampu LED
> Lampu LED bisa dikontrol menggunakan akses pada port no.13 > Lampu LED kedip-kedip : hubungkan kabel USB download ke modul, open software arduino (IDE) dengan versi diatas 0012, pada software terdapat hardware selection ( Tools > Board), Board), pilih Arduino Nano. Nano .
R2G | Robot Research Group
> Kode untuk tes kedip LED: int ledPin = 13; void setup() { pinMode(ledPin, OUTPUT); } void loop() { digitalWrite(ledPin, HIGH); delay(1000); digitalWrite(ledPin, LOW); delay(1000); } B. Percobaan Push Button dan LED
> Modul dilengkapi dengan 2 buah Push Button (S6 dan S7)
> Terdapat jumper untuk mengatur konfigurasi daripada penggunaan push button. Ketika jumper pin digunakan, maka push button dapat digunakan, ketika jumper pin dicabut, maka push button tidak bisa digunakan dan jalurnya menjadi dapat digunakan (S6 = pin 2 dan S7 = pin 3).
R2G | Robot Research Group
Page 58
int ledPin = 13; int key_s6 = 2; int val=0; void setup() { pinMode(ledPin, OUTPUT); pinMode(key_s6, INPUT); } void loop() { if(digitalRead(key_s6)==0) { while(!digitalRead(key_s6)); val++; } if(val==1) { } digitalWrite(ledPin, HIGH);
if(val==2) { val=0; digitalWrite(ledPin, LOW); // Set Low untuk port LED, LED mati } }
> Percobaan berikut adalah menggunakan push button (S6 dan S7) untuk mengontrol lampu LED. int ledPin = 13; int key_s6 = 2; int key_s7 = 3; void setup() { pinMode(ledPin, OUTPUT); pinMode(key_s6, INPUT); pinMode(key_s7, INPUT); void loop()
R2G | Robot Research Group
{ if(digitalRead(key_s6)==0) { digitalWrite(ledPin, HIGH); } if(digitalRead(key_s7)==0) { digitalWrite(ledPin, LOW); } } C. Percobaan Motor Servo
Modul dilengkapi dengan port yang memudahkan untuk koneksi dengan motor servo dan melakukan kontrol terhadap motor servo tersebut. Perhatikan power supply (arus) dari modul terlalu kecil untuk menggerakan motor servo, maka gunakan catu daya tambahan pada terminal yang telah disediakan (7V ~ 12V DC). Pada saat menghubungkan tegangan pada modul, tidak perlu mencabut USB kabel yang terhubung, karena secara otomatis, pada saat catu daya tambahan dihubungkan (>6.5V DC), maka modul secara otomatis tidak terhubung dengan catu daya tambahan tersebut.
Pada IDE Arduino versi 0012, hadir dengan library file yang salah satunya mensupport untuk kontrol motor servo (yaitu pin 9 dan pin 10). Pada percobaan ini digunakan pin 9.
> Berikut ini adalah penjelasan koneksi Jumper PWR_Sel dalam kaitannya penambahan catu daya dari luar untuk motor servo R2G | Robot Research Group
Page 60
Jumper PWR_Sel dicabut saat modul menggunakan catu daya tambahan dari luar, USB kabel
terhubung ke Komputer, dan port DC Jack terhubung ke adaptor suply; Kondisi ini membuat catu daya antara mikroprosesor dengan catu daya ke motor servo dipisahkan sekaligus mencegah terjadinya arus besar masuk ke dalam mikroprosesor (untuk penggunaan normal, posisikan Jumper dalam kondisi dicabut). Jumper PWR_Sel dipasang berarti semua catu daya (Vcc) pada modul terhubung ke catu daya tambahan. Penggunaan Vcc sebagai supply tegangan keluar modul (misal ke sensor, motor servo, dll) tidak diijinkan, karena kestabilan catu daya ke mikroprosesor dapat terganggu. > Berikut ini listing kode programnya: #include Servo myservo; int pos = 0; void setup() { myservo.attach(9); } void loop() { for(pos = 0; pos < 180; pos += 1) { myservo.write(pos); delay(15); } for(pos = 180; pos>=1; pos-=1) { myservo.write(pos); delay(15); }}
R2G | Robot Research Group
Jika ada kebutuhan untuk menggunakan port mana saja untuk kontrol motor servo, maka library file yang ada harus ditambahkan, cek disini untuk library yang lebih lengkapnya: http://www.arduino.cc/playground/uploads/ComponentLib/servo.zip (Catatan : setelah di download, maka lakukan decompresi file .Zip tersebut dan lakukan copy ke arduino-00XX/hardware/libraries)
Berikut listing program untuk menggunakan port mana saja untuk mengontrol motor servo: #include Servo servo1; Servo servo2; Servo servo3; void setup() { servo1.attach(5); servo1.setMaximumPulse(2200); servo2.attach(11); servo2.setMaximumPulse(2200); servo3.attach(12); servo3.setMaximumPulse(2200); Serial.begin(19200); Serial.print("Ready"); } void loop() { static int v = 0; if ( Serial.available()) { char ch = Serial.read(); switch(ch) { case '0'...'9': v = v * 10 break; case 'a': servo1.write(v); v = 0; break; case 'b': servo2.write(v); v = 0; break;
R2G | Robot Research Group
Page 62
case 'c': servo3.write(v); v = 0; break; } } Servo::refresh(); }
Fitur Program IDE : data serial yang dikirim mendefinisikan derajat putaran, misalnya pada contoh diatas, dikirimkan data 85a yang berarti Motor Servo 1 berputar sebanyak 85 derajat, kemudian data 180c berarti Motor Servo 3 berputar sebanyak 180 derajat. D. Percobaan Motor DC
Modul menyediakan rangkaian untuk kendali motor dc (2 motor sekaligus), sehingga tidak perlu membuat rangkaian tambahan untuk mengendalikan motor. Pada modul driver motor menggunakan chip IC L298 yang mampu mengendalikan motor sampai dengan 2 Ampere per motor; Sama seperti penggunaan motor servo, terdapat fasilitas catu daya tambahan dari luar untuk supply tegangan ke motor (dengan nilai tegangan dan arus lebih besar). Perhatikan kutub postitif dan negatif pada saat menghubungkan catu daya tambahan motor pada modul.
> Pada modul juga tersedia jumper pin untuk memastikan modul motor driver digunakan, jika pin jumper dicabut, maka modul motor driver tidak bisa digunakan. R2G | Robot Research Group
Pada gambar sebelumnya, terlihat bahwa modul motor driver menggunakan port pin No. 4, 5, 6, dan 7. Pin 5 dan 6 adalah untuk kontrol PWM Motor, dimana Pin 5 digunakan untuk membuat ON (Enable 1/ E1) Motor 1, sedangkan Pin 6 membuat ON (Enable 2/ E2) Motor 2. Pin 4 untuk control arah putaran Motor 1 (Clock Wise-CW/ Counter Clock Wise-CCW) dan Pin 7 untuk kontrol arah putaran (Clock Wise-CW/ Counter Clock Wise-CCW) Motor 2.
Berikut kode program yang bisa digunakan :
void stop(void) { digitalWrite(E1,LOW); digitalWrite(E2,LOW); } void advance(char a,char b) { analogWrite (E1,a); // PWM Speed Control digitalWrite(M1,HIGH); analogWrite (E2,b); digitalWrite(M2,HIGH); } void back_off (char a,char b) { analogWrite (E1,a); digitalWrite(M1,LOW); analogWrite (E2,b); digitalWrite(M2,LOW); }
R2G | Robot Research Group
Page 64
void turn_L (char a,char b) { analogWrite (E1,a); digitalWrite(M1,LOW); analogWrite (E2,b); digitalWrite(M2,HIGH); } void turn_R (char a,char b) { analogWrite (E1,a); digitalWrite(M1,HIGH); analogWrite (E2,b); digitalWrite(M2,LOW); } void setup(void) { int i; for(i=6;i<=9;i++) pinMode(i, OUTPUT); Serial.begin(19200); } void loop(void) { char val = Serial.read(); if(val!=-1) { switch(val) { case 'f': advance (100,100); break; case 'b':
back_off (100,100);// break; case 'l':
R2G | Robot Research Group
turn_L (100,100); break; case 'r': turn_R (100,100); // break; } delay (40); } else stop(); } E. Penggunaan Port Serial
1. Pemilihan Port Serial pada IDE (Integrated Development Environtment)
Lakukan pemilihan port serial dimana modul terhubung dengan Komputer (untuk OS Windows, nomor port serial yang terhubung dengan modul bisa dilihat pada My Computer (Right Click) > Properties > Hardware > Device Manager > Serial Port.
> Kemudian terdapat menu Serial Monitor, digunakan untuk memilih baud rate (Click Send button) yang digunakan gar komunikasi antara modul dengan Komputer berjalan dengan sempurna.
R2G | Robot Research Group
Page 66
2. Masukan (Input) pada Port Serial
Modul memiliki komunikasi level serial TTL secara full-duplex, pin/ port serial terdapat pada pin 0 (Rx) dan pin 1 (Tx), dimana pada modul terdapat chip yang akan menkonversi data dari USB menjadi interface yang menggunakan TTL.
Untuk membangun komunikasi serial menggunakan modul ini, pada umumnya menggunakan syntax : Serial.begin(), Serial.read(), Serial.print(), Serial.println(), dsbnya.
Berikut contoh kode program dimana menggunakan port serial untuk mengirimkan data huruf “L” dari IDE (Komputer) ke modul dengan ditandai dengan kedipan lampu LED (L) pada board modul jika data berhasil diterima:
int ledPin = 13; int val; void setup() { pinMode(ledPin, OUTPUT); Serial.begin(9600); } void loop() { val = Serial.read(); if (-1 != val) { if ('L' == val) { digitalWrite(ledPin, HIGH); delay(500); digitalWrite(ledPin, LOW);
R2G | Robot Research Group
} } }
3. Keluaran (Output) pada Serial Port
Berikut ini contoh kode program untuk pengujian output dari port serial modul, dimana modulakan mengirimkan data berupa karakter karakt er & string (“Hello!HI, (“Hello!HI, I AM ROBOT”): void setup() { Serial.begin(9600); } void loop() { Serial.print("Hello!"); Serial.println("HI, I AM ROBOT"); Modul delay(1000); } Modul delay(1000); }
R2G | Robot Research Group
Page 68
4. Mengirim data serial secara wireless (APC220)
Modul ini kompatibel (bersesuaian) dengan modul komunikasi wireless APC220 dan modulbluetooth (DF-Bluetooth V.2).
R2G | Robot Research Group
APC220 dalam melangsungkan komunikasi dengan metode half-duplex, dan dapat menghandle banyak komunikasi dengan perangkat bluetooth lainnya (one to multipoint communication). Hal yang harus dilakukan untuk membangun komunikasi menggunakan alat ini, yaitu: setiap alat yang akan digunakan untuk melakukan komunikasi menggunakan modul harus di-set agar memiliki alamat yang unik (unique address), yang melakukan inisial komunikasi dan monitor adalah terminal utama (ditentukan dari awal). Terminal utama akan mengirimkan kode alamat (address code) dan dilengkapi dengan data, setiap kali pengiriman akan dicek apakah kode alamat (address code) ada yang sesuai, jika terjadi perbedaan, maka data akan hilang begitu saja (Do Not Response), jika kode alamat sesuai, maka data akan ditransmisikan (transfer data success); Proses diatas serupa juga dengan proses kerja RFID, pada saat Enable, APC220 akan memeriksa apakah alamat dari mana data berasal sudah sesuai/ tidak. Pastikan pada saat melakukan komunikasi, hanya sepasang alat yang berkomunikasi, sehingga diatur giliran komunikasi antar alat – agar tidak terjadi interferensi (gangguan) komunikasi. APC220 dapat menyediakan multi channel yang memudahkan dalam pengerjaan komunikasi dalam jaringan (network).
Pada percobaan keluaran (output) Port Serial sebelumnya, telah ditunjukkan bahwa modul dapat mengirimkan data serial dari modul ke komputer menggunakan kabel USB. Dengan adanya APC220 ini, maka data dikirimkan dengan menggunakan media udara. Lakukan setting koneksi antara komputer dengan APC220 terlebih dahulu, menggunakan software debugger yaitu COM PORT Debugger V2.0. Masukkan informasi COM Bluetooth yang digunakan, baud rate, data bit, parity, dan flow control, kemudian klik OK, akan terlihat hasil nya pada program (lihat gambar dibawah);
R2G | Robot Research Group
Page 70
Catatan : Module APC220 menggunakan serial port daripada modul, ketika hendak melakukan download program ke module, cabut dahulu module APC220, setelah download selesai, baru dipasang kembali. > Percobaan menggunakan modul Bluetooth (DF-Bluetooth V2) : modul Bluetooth V2 berdasarkan spesifikasi Bluetooth 2.0, yang kompatibel dengan Bluetooth 1.1, Bluetooth 1.2. Modul Bluetooth V2 memerlukan adaptor Bluetooth. Diperlukan untuk menginstal perangkat lunak Bluetooth IVT BlueSoleil (tersedia online untuk download), instal, pasang adaptor Bluetooth, setelah itu akan dipetakan dua port COM, tetapi dihraukan saja.
Modul Bluetooth DF-BluetoothV2 dipasang pada modul mikrokontroler dan dongle/ USB R2G | Robot Research Group
Bluetooth ke komputer, buka software BlueSoleil, bola kuning ditengah menunjukkan USB Bluetooth siap untuk digunakan, klik kanan pada bola kuning tersebut→ search equipment, jika bluetooth modul bekerja dan terdeteksi oleh USB Bluetooth, maka akan muncul bola biru dengan logo tanda tanya ini adalah DF-BluetoothV2 yang terdeteksi. Pada tanda tanya tersebut klik kanana→ match ball, kemudian akan muncul kotak dialog yang meminta kita mengisikan password (isikan dengan password default dari modul yaitu angka nol “0' empat kali = 0000).
Klik kanan pada icon bola dengan tanda tanya→ tanya→ search service, secara otoma oto matis tis akan dijalin koneksi antara modul dengan USB Bluetooth. Klik kanan kembali pada icon bola dengan tanda Tanya → akan terdeteksi koneksi dari port serial Bluetooth (misalnya (misalnya : COM30), ini adalah po rt COM yang baru. Setelah sukses melakukan koneksi, maka logo tanda tanya berwarna biru berubah menjadi hijau. Terakhir, ganti nilai baud rate pada port serial USB bluetooth menjadi 115200 bps, karena Bluetooth V2 memiliki baud rate pada 115200 bps.
Module BluetoothV2 menggunakan serial port daripada modul, ketika hendak melakukan
R2G | Robot Research Group
Page 72
download program ke module, module, cabut dahulu module BluetoothV2, setelah download aelesai, baru dipasang kembali.
Berikut adalah kode programnya : void setup() { Serial.begin(115200); digunakan 115200bps void loop() { Serial.print("Test"); Serial.println(" OK!"); kembali ke awal delay(1000); }
Gunakan kembali COMPORT Debuger V2.00, untuk melihat hasil pengiriman data dari modul ke komputer. (Perhatikan COM Port Serial yang digunakan, dan Baud Rate yang digunakan);
F. Percobaan Sensor Infrared Infrared GP2D 12
– 7), Untuk penggunaan sensor Infrared GP2D12, pada modul tersedia 8 buah pin analog (pin 0 – 7), R2G | Robot Research Group
yang didesain bersesuaian dengan pin header dari sensor Infrared GP2D12 (Signal/ Vcc/ Gnd).
Infrared GP2D12 didesain dari SHARP Jepang, digunakan untuk mengukur jarak berdasarkan pantulan sinar inframerah dengan jarak kerja antara 10cm ~ 80 cm.
Untuk mempertahankan output signal yang lebih stabil, pada bagian belakang sensor dapat ditambahkan kapasitor dengan nilai 10uF (lingkaran merah menunjukkan kutub ositif dari kaki kapasitor).
Berikut adalah kode programnya: int GP2D12 = 0; int val = 0; void setup() { Serial.begin(19200); } void loop()
R2G | Robot Research Group
Page 74
{ val = analogRead(GP2D12); if(val!=-1) Serial.println(val); serial delay(100); }
Buka tools untuk membaca data serial dari IDE, untuk melihat hasil pembacaan daripada sinyal(pilih baud rate 19200), jarak halangan pada depan sensor akan mempengaruhi nilai (berupa dataserial) yang dikirimkan dari modul ke komputer.
Pengukuran Jarak menggunakan PING Sensor jarak ultrasonik PING dari Parallax merupakan sensor yang paling banyak digunakan pada berbagai proyek riset dan robotika, kelebihannya antara lain selain dapat mengukur jarak 3cm – 3cm – 3m, 3m, juga hanya menggunakan menggunakan 1 jalur data. Pastikan Anda tidak salah pasang rangkaian PING. Contoh rangkaian berikut merupakan aplikasi pengukuran jarak menggunakan Arduino: PING.pde: // Program Demo PING untuk
mengukur Jarak
const int pingPin = 7;
void setup() { // initialize serial communication: Serial.begin(9600); }
R2G | Robot Research Group
void loop() { // establish variables for duration of the ping, // and the distance result in inches and centimeters: long duration, inches, cm;
// The PING))) is triggered by a HIGH pulse of 2 or more microseconds. // Give a short LOW pulse beforehand to ensure a clean HIGH pulse: pinMode(pingPin, OUTPUT); digitalWrite(pingPin, LOW); delayMicroseconds(2); digitalWrite(pingPin, HIGH); delayMicroseconds(5); digitalWrite(pingPin, LOW);
// The same pin is used to read the signal from the PING))): a HIGH pinMode(pingPin, INPUT); duration = pulseIn(pingPin, HIGH);
// convert the time into a distance inches = microsecondsToInches(duration); cm = microsecondsToCentimeters(duration);
Serial.print(inches); Serial.print("in, "); Serial.print(cm); Serial.print("cm"); Serial.println(); delay(100); }
long microsecondsToInches(long microseconds) { // According to Parallax's datasheet for the PING))), there are // 73.746 microseconds per inch (i.e. sound travels at 1130 feet per
R2G | Robot Research Group
Page 76
// second).
This gives the distance travelled by the ping, outbound
// and return, so we divide by 2 to get the distance of the obstacle. return microseconds / 74 / 2; }
long microsecondsToCentimeters(long microseconds) { // The speed of sound is 340 m/s or 29 microseconds per centimeter. // The ping travels out and back, so to find the distance of the // object we take half of the distance travelled. return microseconds / 29 / 2; }
Sensor Suhu LM35 adalah sensor suhu dari National Semiconductor yang mempunyai akurasi tinggi. Outputnya berupa tegangan analog dan memiliki jangkauan pengukuran -55ºC hingga +150ºC dengan akurasi ±0.5ºC. Tegangan output adalah 10mV/ºC. Output dapat langsung dihubungkan port mikrokontroler yang memiliki ADC atau dengan Arduino Arduino,, karena Arduino memiliki port ADC (analog input) sebanyak 6 buah. Analog input pada Arduino memiliki resolusi 10-bit, yang dapat memberikan keluaran 2^10 = 1024 nilai diskrit. Bila digunakan catu 5V, resolusi yang dihasilkan adalah 5000mV/1024 = 4.8mV. Karena LM35 memiliki resolusi output 10mV/ºC, maka resolusi termometer yang dibuat dengan Arduino adalah 10mV/4.8mV ~ 0.5ºC. Mari kita membuat sensor suhu sederhana dengan Arduino dan LM35. Pertama-tama siapkan rangkaian seperti ini:
R2G | Robot Research Group
Sambungkan Arduino ke komputer menggunakan USB dan gunakan contoh program seperti di bawah ini:
// deklarasi variable int tempPin = 0; void setup(){ Serial.begin(9600); // buka serial port, set baud rate 9600 bps }void loop() { tempC = analogRead(tempPin); tempC = (5.0 * tempC * 100.0)/1024.0; Serial.println((int)tempC,DEC); delay(1000);
}
R2G | Robot Research Group
Page 78
Pengaturan Fuse Bit ATMEGA 168
R2G | Robot Research Group
R2G | Robot Research Group
Page 80
KRCI 4T-V (Forte Vi) Wheel
Kontes Robot Cerdan Indonesia divisi beroda tingkat regional III STMIK AMIKOM menerjukan tim berodanya dengan nama 4T-V Wheel. Robot ini terdiri dari 8 sensor ultrasound yang digunakan untuk menghindari tembok agar robot tersebut tidak menabrak dinding, sebuah sensor suhu sebagai pendeteksi panas api, digital compas sebagai menentu arah. Tugas dari robot ini adalah untuk memadamkan api yang disediakan oleh dewan juri di suatu ruangan
secara
acak,
sehingga
robot
harus
menemukan
sumber
api
dan
harus
memadamkannya.Setelah robot tersebut berhasil memadamkan, tugas robot ini adalah kembali ketempat semula (home base) dengan maksimal waktu 2 menit. STMIK AMIKOM menunjuk tim AMIKOM ROBOTIC untuk membuat robot ini. Dari personel AMIKOM ROBOTIC tersebut sebagian besar adalah anggota dari R2G yang bergerak dibidang desain elektronika dan software engineering. Untuk itu, hasil kreasi robot ini adalah hasil kerja keras tim AMIKOM ROBOTIC dan tim dari R2G. Untuk membuat robot ini kita memerlukan sebuah Arduino Mega dengan jenis mikrokontroler ATMega128 karena memiliki input output yang lebih banyak dibanding mikrokontroler jenis lain. Pengendalian motor kanan dan motor kiri memanfaatkan motor driver berbasis LM293 / LM298. Untuk mengendalikan kecepatannya dapat dikontrol dengan memanfaatkan PWM (pulse Width Modulation) dengan range antara 0 - 254
R2G | Robot Research Group
Sensor yang digunakan untuk menghindari dinding labirin menggunakan sensor ultrasound. Cara kerja sensor ini adalah transmitter pada sensor ini mengeluarkan sinyal kemudian pantulan dari sinyal tersebut doterima receiver. Untuk meningkatkan akurasi dari sensor tersebut dapat dilakukan dengan metode trial and error.
Sensor ultrasound Sensor yang digunakan untuk memadamkan api menggunakan Thermophil Array Sensor (TPA) seri 81. Cara kerja sensor ini adalah mendeteksi perubahan suhu dilingkungan dan membedakan profil-profil warna yang biasanya dikeluarkan oleh api.
R2G | Robot Research Group
Page 82
TPA81 Untuk mendeteksi garis yang ada di dalam pintu ruangan, menggunakan sensor garis dengan memanfaatkan photodiode dan led.
R2G | Robot Research Group
Berikut listing program yang digunakan dalam robot KRCI Beroda 4T-V Wheel
/* ROBOT BERODA STMIK AMIKOM 2011 */
#include #include #include #include Servo myservo;
// buat objek servo
int pos;
//
#define rxPin 2
// Pin for rx
#define txPin 3
// Pin for tx
#define address 0x68
// Address of TPA81
#define softReg 0x00
// Byte for software version
#define ambiant 0x01
// Byte for ambiant temperature
#define hideCsr 0x04
// Byte to hide LCD03 cursor
#define clrScrn 0x0C
// Byte to move LCD03 cursor
#define crgRtn 0x0D LCD03
// Byte to perform a carriage return on
#define csrMv 0x02
//
int ultraSoundSignalPins[] = {45,44,42,41,40}; // Front Left,Front, Front Right, Rear Ultrasound signal pins char *us[] = {"ping","ping","ping","ping","ping"};
#define leftDir1
6
// Left motor direction 1, to AIn1.
#define leftDir2
7
// Left motor direction 2, to AIn2.
R2G | Robot Research Group
Page 84
#define rightDir1
3
// Right motor direction 1, to BIn1.
#define rightDir2
4
// Right motor direction 2, to BIn2.
#define leftSpeedPin
5
// Left motor speed control, to PWM_A
#define rightSpeedPin
2
// Left motor speed control, to PWM_A
#define btsMin
20
// Batas minimal jarak ping (cm)
#define INTERVAL readings.
25
// (ms) Interval between distance
#define sdtMin
16
// Batas jarak sudut Minimum (cm)
#define kipas
34
// set Ping 13 menjadi Kipas
#define lineKanan
39
// set pin 34 untuk lineKanan
#define lineKiri
38
// set pin 36 untuk lineKiri
#define limitKanan
35
#define limitKiri
36
#define obsKanan Obstacle
53
//limit Switch Kanan untuk detek
#define obsKiri
51
//limit Switch Kiri untuk detek Obstacle
int temperature[] = {0,0,0,0,0,0,0,0}; TPA81 LiquidCrystal lcd(31,30,29,28,27,26); lcd(31,30,29,2 8,27,26);
// panjang pembacaan data
// pin LCD
int mati=0;
void setup() { // set LCD 16 X 2 lcd.begin(16, 2); //lcd.setCursor(0,0);
R2G | Robot Research Group
//lcd.print("BERODA AMIKOM OK"); //lcd.setCursor(0,1); //lcd.print("AYO BERJUANG OK"); //delay(3000);
// set limit input pinMode(limitKanan,INPUT); pinMode(limitKiri,INPUT);
// Set motor direction pins as outputs. pinMode(leftDir1, OUTPUT); pinMode(leftDir2, OUTPUT); pinMode(rightDir1, OUTPUT); pinMode(rightDir2, OUTPUT);
// set pin pada servo myservo.attach(8); pinMode(rxPin, INPUT); pinMode(txPin, OUTPUT); serial port for LCD03
// Starts software
Wire.begin(); delay(500); sure everything is powerd up
// Wait to make
//set get data pada TPA81 //Serial.print(clrScrn, BYTE); //Serial.print(hideCsr, BYTE);
R2G | Robot Research Group
Page 86
int software = getData(softReg); getData(softR eg); version //Serial.println("TPA81 //Serial.println("TP A81 Example
// Get software
V:");
//Serial.print(software); Serial.begin(9600);
// Distance reading from rangefinder.
}
void loop() { unsigned long ultrasoundValue,jrk, lside,rside; for(int i=0; i < 5; i++){ ultrasoundValue = ping(i);
//Serial.print(us[i]); //Serial.print(ultrasoundValue); //Serial.print("in, ");
//Serial.print(ping(0)); //Serial.print(" "); //Serial.print(ping(1)); //Serial.print(" "); //Serial.println(ping(2)); delay(50); }
R2G | Robot Research Group
jrk = (ping(1)+ping(2)+ping(3))/3; lside=((ping(0))+(ping(2)/4))/2; rside=((ping(4))+(ping(3)/4))/2; int haluan_ki;
haluan_ki=14-lside; haluan_ki=14-lsi de;
//haluan=seting - side kanan
if (jrk>=20) { if ((haluan_ki>=-5)&&(haluan_ki<=0)) { forward(150,160);} if (haluan_ki==0) { forward(150,150);} if ((haluan_ki>11)&&(haluan_ki<=15)) { forward(160,150);} if ((haluan_ki>15)&&(haluan_ki<=22)) { forward(170,150);}
//================================= //if (ping(5)>40)
{ forward(160,140);}
//if (ping(4)<=15)
{ rightTurn(130,130) rightTurn(130,130);} ;}
if (ping(2)<=20) { if (rside>lside){
R2G | Robot Research Group
Page 88
rightTurn(200,200); } if(lside>rside){ leftTurn(200,200); } } //if (ping(0)>17)
{ leftTurn(180,180); }
} else { //if (ping(5)>40)
{ forward(160,140);}
//if (ping(4)<=15)
{ rightTurn(130,130);}
if (ping(2)<=15) { if (rside>lside){ rightTurn(200,200); } if(lside>rside){ leftTurn(200,200); } } //if (ping(0)>17)
{ leftTurn(180,180); leftTurn(180,180 ); }
else{ rightTurn(130,130);} } lcd.setCursor(0,0); lcd.print(haluan_ki); lcd.setCursor(0,1); lcd.print(jrk);
R2G | Robot Research Group
Serial.print(haluan_ki); // delay(50);
}
// end Main program ////////
SCAN KIRI
///////
void scanKiri() { long jrkUS1,jrkUS2,jrkUS3,jrkUS4,jrkUS5,jrkUS6,jrkUS7;
//jrkUS1 = US1(); jrkUS2 = US2(); jrkUS3 = US3(); jrkUS4 = US4(); jrkUS5 = US5(); jrkUS6 = US6(); jrkUS7 = US7();
int jarak, lside,haluan_ki; jarak=(jrkUS3+jrkUS6+jrkUS7)/3; lside=((jrkUS2+2)+jrkUS5+(jrkUS7/9))/3; //sisi kiri(rata-rata ultrasonik samping kiri) haluan_ki=20-lside; haluan_ki=20-lsi de;
R2G | Robot Research Group
//haluan=seting - side kanan
Page 90
if (jarak>=12) { if ((haluan_ki>=-5)&&(haluan_ki<=5)) {forward(150,150);} if ((haluan_ki>5)&&(haluan_ki<=10)) {forward(140,150);} if ((haluan_ki>10)&&(haluan_ki<=15)) {forward(130,150);} if ((haluan_ki>15)&&(haluan_ki<=18)) {forward(120,150);} if (haluan_ki>18) {rightTurn(130,130);} if ((haluan_ki<-5)&&(haluan_ki>=-10)) {forward(150,140);} if ((haluan_ki<-10)&&(haluan_ki>=-15)) {forward(150,130);} if (haluan_ki<-15) {forward(160,100);} //================================= if (us4>40)
{ forward(160,140);}
if (us6<=15)
{ rightTurn(130,130); rightTurn(130,130);} }
if (us3<=12)
{ rightTurn(130,130); rightTurn(130,130);} }
if (us4>40)
{ forward(160,140);}
if (us6<=15)
{ rightTurn(130,130); rightTurn(130,130);} }
if (us3<=12)
{ rightTurn(130,130); rightTurn(130,130);} }
} else {
R2G | Robot Research Group
else{ rightTurn(130,130);} }
Serial.println(haluan_ki); lcd.setCursor(0,0); lcd.print(haluan_ki); lcd.setCursor(0,1); lcd.print(jarak); lcd.setCursor(5,1); lcd.print(jrkUS2); lcd.setCursor(8,1); lcd.print(jrkUS5); lcd.setCursor(11,1); lcd.print(jrkUS7);* } //////////////////////////// ///////////////////////// SERVO DAN KIPAS ///////////////////////////////
void kipastpa() { for(pos = 0;pos < 160;pos += 1) { myservo.write(pos); // posisikan servo pada sudut 'pos' for(int i = 0; i < 8; i++){ Loops and stores temperature data in array
//
temperature[i] = getData(i+2); }
R2G | Robot Research Group
Page 92
if (temperature[3]>50 || temperature[4]>50 || temperature[5]>50){ digitalWrite(13,HIGH); delay(1500); digitalWrite(13,LOW); mati=1; } delay(15);
// tunggu 15 milidetik
}
// bergerak dari 180 sampai 0 derajat if(mati==0){ for(pos = 160;pos>=1;pos-=1) 160;pos>=1;pos -=1)
{
myservo.write(pos); // posisikan servo pada sudut 'pos' for(int i = 0; i < 8; i++){ Loops and stores temperature data in array temperature[i] = getData(i+2); } if (temperature[3]>50 || temperature[4]>50 || temperature[5]>50){ digitalWrite(13,HIGH); delay(1500); digitalWrite(13,LOW); mati=1; } delay(15);
// tunggu 15 milidetik
} }
R2G | Robot Research Group
//
if(mati==0){ for(pos = 0;pos < 160;pos += 1) { myservo.write(pos); // posisikan servo pada sudut 'pos' for(int i = 0; i < 8; i++){ Loops and stores temperature data in array
//
temperature[i] = getData(i+2); } if (temperature[3]>50 || temperature[4]>50 || temperature[5]>50){ digitalWrite(13,HIGH); delay(1500); digitalWrite(13,LOW); mati=1; } delay(15);
// tunggu 15 milidetik
} } }
//////////////////////// ////////////////// //////
FUNSI ROBOT MAJU //////////////////// /////////////////////////////// ///////////
void forward(char a,char b) { analogWrite(2, a); analogWrite(5, b); digitalWrite(leftDir1, digitalWrite(leftDir 1, HIGH);
// Left motor forward.
digitalWrite(leftDir2, HIGH);
R2G | Robot Research Group
Page 94
digitalWrite(rightDir1, digitalWrite(rightDi r1, HIGH);
// Right motor forward.
digitalWrite(rightDir2, HIGH); }
///////////////////////// FUNGSI ROBOT MUNDUR //////////////////////////// void backward() { //pwmMundur(100,100); digitalWrite(leftDir1, digitalWrite(leftDir 1, HIGH);
// Left motor backward.
digitalWrite(leftDir2, LOW); digitalWrite(rightDir1, digitalWrite(rightDi r1, HIGH);
// Right motor backward.
digitalWrite(rightDir2, LOW); }
//////////////////// FUNGSI ROBOT BELOK KANAN /////////////////////////// void rightTurn(char a, char b) { analogWrite(2, a); analogWrite(5, b); digitalWrite(leftDir1, digitalWrite(leftDir 1, HIGH);
// Left motor backward.
digitalWrite(leftDir2, LOW); digitalWrite(rightDir1, digitalWrite(rightD ir1, HIGH);
// Right motor forward.
digitalWrite(rightDir2, HIGH); }
R2G | Robot Research Group
/////////////////// FUNGSI ROBOT BELOK KIRI ////////////////////////// void leftTurn(char a, char b) { analogWrite(2, a); analogWrite(5, b); digitalWrite(leftDir1, digitalWrite(leftD ir1, HIGH);
// Left motor backward.
digitalWrite(leftDir2, HIGH); digitalWrite(rightDir1, digitalWrite(rightDi r1, HIGH);
// Right motor forward.
digitalWrite(rightDir2, LOW); }
////////////////// SET GET DATA TPA81 /////////////////////////// int getData(int reg){ of data from TPA81 Wire.beginTransm ission(address); Wire.beginTransmission(address); TPA81
Wire.send(reg);
// Function to receive one byte
// Begin communication with
// Send reg to TPA81
Wire.endTransmission();
Wire.requestFrom (address, 1); Wire.requestFrom(address,
// Request 1 byte
while(Wire.available() while(Wire.available () < 1);
// Wait for byte to arrive
int data = Wire.receive();
// Get byte
return(data);
// return byte
}
unsigned long ping(int index) { unsigned long echo, cm;
R2G | Robot Research Group
Page 96
pinMode(ultraSoundSignalPins[index], OUTPUT); digitalWrite(ultraSoundSignalPins[index], LOW); delayMicroseconds(2); digitalWrite(ultraSoundSignalPins[index], HIGH); delayMicroseconds(5); digitalWrite(ultraSoundSignalPins[index], LOW); pinMode(ultraSoundSignalPins[index], INPUT); digitalWrite(ultraSoundSignalPins[index], HIGH); echo = pulseIn(ultraSoundSignalPins[index], HIGH); cm = microsecondsToCentimeters(echo); return (cm); }
long microsecondsToCentimeters(long microseconds) { // The speed of sound is 340 m/s or 29 microseconds per centimeter. // The ping travels out and back, so to find the distance of the // object we take half of the distance traveled. return microseconds / 29 / 2; } ///////////////////////////////////////////////////
R2G | Robot Research Group