Menggunakan Internal Pullup Resistor Arduino
Menggunakan Internal Pullup Resistor Arduino
Dengan adanya internal pullup resistor, kita tidak perlu lagi menambahkan resistor pada tombol sebagai
pullup. Cukup mengaktifkan internal pullup resistor dengan program.
Mungkin ada bertanya, buat apa sih pullup resistor?
Jika pin Arduino diset sebagai INPUT, maka logika yang terbaca oleh Arduino tergantung INPUT yang di-
berikan. Jika pin dihubungkan ke VCC, logika yang terbaca adalah HIGH. Jika pin dhibungkan ke GND, maka
logika yang terbaca adalah LOW. Lalu bagaimana jika pin tidak dihubungkan ke VCC atau GND?
Nah, kondisi seperti itu disebut floating. Logika pada pin bisa dibilang kacau, HIGH dan LOW bergantian.
Logika pada pin INPUT seakan digantung, nggak jelas. Sehingga kita butuh resistor untuk menentukan kondisi
defaultnya, apakah akan dibuat default HIGH atau default LOW.
Untuk mengaktifkan internal pullup resistor, pin Arduino tidak didefinisikan dengan INPUT lagi, tapi
INPUT_PULLUP. Langsung buat rangkaian seperti di bawah ini. Setelah itu, coba kedua program di bawah
untuk melihat perbedaan antara penggunaan INPUT dan INPUT_PULLUP.
1. /*
2. * INTERACTIVE ROBOTICS
3. * Program Tombol tanpa Pullup Resistor
4. */
5.
6. const byte PIN_TOMBOL = 2; // tombol pada pin 2
7.
8. boolean data = HIGH; // variabel penyimpan data dari tombol
9. boolean data_last = data; // dan data sebelumnya
10.
11. void setup() {
12. [Link](19200); // buka koneksi ke serial
13. while(!Serial);
14.
15. pinMode(PIN_TOMBOL,INPUT); // tombol sebagai input
16. }
17.
18. void loop() {
19. data = digitalRead(PIN_TOMBOL); // baca data tombol
20. if(data != data_last){ // jika data berbeda dari data sebelumnya
21. [Link]( data ); // cetak ke serial monitor
22.
23. data_last = data; // simpan data sebagai data sebelumnya
24.
25. }
26. }
27.
Setelah program diupload, Anda boleh cek di Serial Monitor dengan baud rate 19200. Nilai apa yang
keluar, 0 atau 1? Atau tampilannya kacau? Saya sengaja tidak menampilkan hasilnya di sini supaya Kalian
mencobanya sendiri. ^_^
Ketika pin Arduino dalam kondisi floating (tidak jelas apakah defaultnya 0 atau 1), maka dia akan
kebingungan. Sehingga yang muncul di Serial Monitor adalah 0 dan1 bergantian, meski tombol tidak diapa-
apakan.
Selanjutnya edit baris 16 hingga menjadi program selanjutnya, dan bandingkan hasilnya.
1. /*
2. * INTERACTIVE ROBOTICS
3. * Program Tombol tanpa Pullup Resistor
4. */
5.
6. const byte PIN_TOMBOL = 2; // tombol pada pin 2
7.
8. boolean data = HIGH; // variabel penyimpan data dari tombol
9. boolean data_last = data; // dan data sebelumnya
10.
11. void setup() {
12. [Link](19200); // buka koneksi ke serial
13. while(!Serial);
14.
15. pinMode(PIN_TOMBOL,INPUT_PULLUP); // tombol sebagai input dengan
16. } // pullup resistor
17.
18. void loop() {
19. data = digitalRead(PIN_TOMBOL); // baca data tombol
20. if(data != data_last){ // jika data berbeda dari data sebelumnya
21. [Link]( data ); // cetak ke serial monitor
22.
23. data_last = data; // simpan data sebagai data sebelumnya
24.
25. }
26. }
Pada program yang kedua, data akan muncul jika tombol ditekan. Berdasarkan logika program, data di-
cetak ke serial monir apabila data berubah (logika yang diterima berbeda dengan logika sebelumnya), lihat
baris 20.
Dengan tambahan pengetahuan ini, Anda telah belajar bagaimana menangani input berupa tombol dan
mengerti tentang pullup resistor yang ada dalam internal Arduino.
Membuat Tombol Multikondisi
Apa maksud dari tombol multikondisi? Normalnya, tombol push button hanya punya dua logika, ON dan
OFF, namun kondisi ON tidak dapat terkunci. Jika kita menggukan switch ON/OFF seperi saklar, kondisi ON
akan terkunci dengan mudah karena proses pengunciannya secara fisik.
Jika kita pakai tombol push button, akan susah kalau kita ingin mengunci kondisi ON. Sebab logika tombol
akan langsung berubah menjadi OFF ketika tombol kita lepas.
Untuk mengawali belajar tentang tombol multikondisi, pertama kita akan membuat program yang lebih
manusiawi. Program yang lebih manusiawi maksudnya adalah informasi yang muncul di serial monitor bukan
angka 0 atau 1, tapi tulisan yang lebih bisa dipahami.
Pada Serial Monitor dari output Program tersebut muncul tulisan ON ketika tombol ditekan. Lalu akan
muncul tulisan OFF ketika penekanan tombol dilepas. Mungkin sesekali akan muncul tulisan ON dan OFF
dua kali. Hal tersebut bisa menjadi masalah, sebab memang perubahaan data memang terjadi 2 kali yaitu
perubahan dari OFF ke ON ketika tombol mulai ditekan dan perubahan dari ON ke OFF saat tombol dilepas.
Kita bisa memodifikasi karakteristik tombol di atas supaya mirip dengan switch ON/OFF. Jadi, ketika tom-
bol ditekan, maka kondisi akan ON. Jika tombol ditekan lagi, kondisi berubah menjadi OFF. Jika tombol dite-
kan lagi, kondisi menjadi ON lagi, dan seterusnya.
Jadi status ON dan OFF-nya seakan bisa dikunci seperti switch atau saklar. Silakan langsung coba program
selanjunya.
1. /*
2. * INTERACTIVE ROBOTICS
3. * Program Tombol dengan Lock Status
4. */
5.
6. // kita set supaya tombol active low
7. #define ON LOW // active low
8. #define OFF !ON
9.
10. // tombol pada pin 2
11. const byte PIN_TOMBOL = 2;
12.
13. boolean data = OFF; // data awal ada OFF
14. boolean data_last = data; // dan data sebelumnya juga OFF
15.
16. boolean logika = data; // variabel untuk lock status
17.
18. // delay untuk penekanan tombol.
19. // setelah tombol ditekan, maka selama 150 ms
20. // tidak bisa ditekan.
21. // delay ini berguna untuk menghindari 2 kali eksekusi
22. unsigned long delay_press = 150; // dalam ms
23. unsigned long delay_press_last = 0;
24.
25. void setup() {
26. // buka koneksi ke serial
27. [Link](19200);
28. while(!Serial);
29.
30. pinMode(PIN_TOMBOL,INPUT_PULLUP); // tombol sebagai input dengan
31. } // pullup resistor
32.
33. void loop() {
34.
35. // jika selisih waktu penekanan tombol
36. // lebih besar dari waktu delay tombol
37. // baca tombol lagi, jika tidak tombol tdk dibaca
38. if( millis() - delay_press_last > delay_press ){
39.
40. data = digitalRead(PIN_TOMBOL); // baca data tombol
41.
42. // jika data berbeda dari data sebelumnya
43. // cetak ke serial monitor
44. if(data != data_last){
45.
46. if(data == ON){ // jika data = ON
47.
48. logika = !logika; // balik status logika tombol
49.
50. // jika ON, cetak ON
51. // jika OFF, cetak OFF
52. if( logika == ON ){
53. [Link](“ON”);
54.
55. } else {
56. [Link](“OFF”);
57. }
58. }
59.
60. // simpan data sebagai data sebelumnya
61. data_last = data;
62. // catat waktu penekanan tombol terakhir
63. delay_press_last = millis();
64. }
65. }
66. }
Pada Program Tombol dengan Lock Status, status ON atau OFF tombol tidak didasarkan pada data yang di-
baca oleh digitalRead(). Akan tetapi, status ON atau OFF ditentukan dengan variabel logika (lihat baris 16).
Cara kerjanya seperti ini :
1. Pertama kali, variabel logika berstatus OFF.
2. Jika tombol ditekan, data variabel logika dibalik menjadi OFF.
3. Jika tombol ditekan lagi, data variabel logika dibalik lagi menjadi ON. Begitu seterusnya.
4. Proses pembalikan logika dilakukan pada baris 48.
5. Untuk membalik logika, kita hanya butuh mendeteksi penekanan tombol, yaitu ketika kondisi tombol
= ON. Lihat baris46.
Program 9.4 sudah tidak lagi menampilkan dua kali eksekusi untuk sekali penekanan tombol. Pencegahan
dua kali eksekusi dilakukan dengan menambahkan pemeriksaan apakah logika tombol berubah atau tidak
(lihat baris 44). Terakhir kali menekan tombol dicatat pada baris 63.
Jadi, selama logika tombol tidak berubah, maka Arduino akan mengunci status dan tombol tidak akan
pernah terbaca berkali-kali. Kecuali tombol dilepas, baru status akan kembali berubah.
CHALANGE !
1. Tambahkan 1 buah LED, coba program-program yang sudah dibuat pada pertemuan ini dengan LED. Dan
amati cara kerja program-program tersebut. Catat apa yang kalian amati pada Handbook/catatan kalian.
Syarat untuk mengelola tombol dengan sebuah pin Input adalah pin tersebut harus Analog. Di Arduino
Uno, kita bisa menggunakan pin A0 – A5. Kenapa harus analog? Sebab, kita akan mengimplementasikan
konsep pembagi tegangan dan data diterima dengan pin analog. Anda boleh memperhatikan gambar diatas,
sebab konsep yang akan kita pakai akan seperti gambar tersebut.
Jika semua resistor memiliki nilai resistansi yang sama, maka secara teori data output bisa dihitung seperti
Tabel di bawah ini. Berapapun nilai resistornya, yang penting nilainya seragam, maka hasilnya akan seperti
tabel ini.
Berdasarkan tabel di atas, jika data dari analogRead() adalah sekitar 204, berarti tombol S1 ditekan. Jika
data dari analogRead() adalah sekitar 511, berarti tombol S4 ditekan. Saya sebut kira-kira karena bisa jadi
nilai resistansi resistor agak berbeda, jadi bisa kurang bisa lebih.
Untuk mengatasi kurang lebih nilai tersebut, kita bisa ambil nilai toleransi 10 – 20. Misal untuk tombol
S1, berarti nilai untuk mengidentifikasi tombolnya adalah antara 194 – 214. Selanjutnya, mari kita buktikan
dengan program.
1. Arduino x 1
2. Push button x 5
3. Resistor dengan nilai seragam x 5
4. Project board x 1
5. Kabel jumper secukupnya
1 /*
2 * INTERACTIVE ROBOTICS
3 * Program Menu 5 Tombol
4 */
5
6 // definisikan 5 tombol
7 #define TOMBOL_NONE 0
8 #define TOMBOL1 1
9 #define TOMBOL2 2
10 #define TOMBOL3 3
11 #define TOMBOL4 4
12 #define TOMBOL5 5
13
14 // output tombol di pin A0
15 const byte PIN_TOMBOL = A0;
16
17 // nilai data tombol sesuai tabel
18 const int TOMBOL_VAL[] = {204,255,341,511,1023};
19
20 // nilai koreksi
21 const byte KOREKSI = 15;
22
24 // tombol dalam array
25 const byte TOMBOL[] = {
26 TOMBOL1, TOMBOL2, TOMBOL3,
27 TOMBOL4, TOMBOL5 };
28
29 // tombol saat ini dan tombol sebelumnya
30 byte tombol = 0;
31 byte tombol_last = 0;
32
33 // data saat ini dan data sebelumnya
34 int data = 0;
35 int data_last = 0;
36
37 // delay untuk penekanan tombol
38 unsigned long delay_press = 400; // dalam ms
39 unsigned long delay_press_last = 0;
40
41 void setup() {
42 // buka koneksi ke serial
43 [Link](19200);
44 while(!Serial);
45
46 // tombol sebagai input
47 pinMode(PIN_TOMBOL,INPUT);
48 }
49
50 void loop() {
51 // panggil fungsi utk membaca tombol
52 TombolListener();
53 }
54
55 void TombolListener(){
56 // jika selisih waktu penekanan tombol
57 // lebih besar dari waktu delay tombol
58 // baca tombol lagi, jika tidak tombol tdk dibaca
59 if( millis() - delay_press_last > delay_press ){
60 // baca data analog tombol
61 data = analogRead(PIN_TOMBOL);
62 // reset tombol sebelumnya
63 tombol = TOMBOL_NONE;
64 // cocokkan data dengan ke-5 data tombol
65 for(byte i=0; i<sizeof(TOMBOL); i++){
66 // hitung koreksi data tombol
67 // jika ada yang cocok,
68 // catat tombol yang sesuai, lalu
69 // hentikan looping.
70 if( abs(data - TOMBOL_VAL[i]) < KOREKSI ){
71 tombol = TOMBOL[i];
72 break;
73 }
74 }
75
76 // jika ada tombol yang cocok
77 // cetak tombol, panggil aksi tombol
78 // lalu catat waktu pembacaan tombol
79 if(tombol != TOMBOL_NONE){
80 [Link](tombol);
81
82 AksiTombol(tombol);
83
84 tombol_last = tombol;
85 delay_press_last = millis();
86 }
87 }
88 }
89
90 // fungsi AksiTombol
91 // INPUT : byte tombol
92 void AksiTombol(byte tombol){
93 switch(tombol){
94 case TOMBOL1:
95 // proses sesuatu
96 [Link](“Menu 1”);
97 break;
98 case TOMBOL2:
99 // proses sesuatu
100 [Link](“Menu 2”);
101 break;
102
103 case TOMBOL3:
104 // proses sesuatu
105 [Link](“Menu 3”);
106 break;
107
108 case TOMBOL4:
109 // proses sesuatu
110 [Link](“Menu 4”);
111 break;
112
113 case TOMBOL5:
114 // proses sesuatu
115 [Link](“Menu 5”);
116 break;
117 }
118 }
1. Referensi data untuk 5 buah tombol ada di baris 18. Sedangkan nilai toleransi yang dipilih adalah angka
15 (lihat baris 21).
2. Ketika tombol ditekan, maka data dari tombol diterima dengan analogRead() pada baris 61.
3. Sebelum mendeteksi tombol, tombol direset untuk menghindari salah baca (lihat baris 63).
4. Berikutnya data yang terbaca akan dicocokkan dengan SEMUA referensi nilai tombol (lihat fungsi loop di
baris 65).
5. Data akan dicocokkan dengan setiap referensi data. Jika selisihnya lebih kecil dari nilai toleransi
(lihat baris 70), maka pilih tombol, lalu stop looping dengan perintah break pada baris 72.
6. Setelah tombol terpilih, pilih AksiTombol() yang sesuai denga tombol yang terpilih (lihat baris 82).
contoh tampilan output Menu 5 Tombol
Setelah program 5 tombol dengan satu pin ini bekerja dengan baik, mari kita lanjut dengan aksi untuk
menghidupkan led untuk setiap tombol. Program tombol dan LED ini adalah kombinasi dari program mem-
baca banyak tombol dan program tombol dengan lock status. Program tombol dan LED ini akan kita gunakan
sebagai dasar untuk mempelajari EEPROM pada bab berikutnya. Jadi, pastikan Anda mencoba program tera-
khir pada Bab ini.
Rangkain 5 Tombol 5 LED
1. Arduino Uno x 1
2. Push button x 5
3. Resistor x 10 (bebas)
4. LED x 10
5. Project Board x 1
6. Jumper secukupnya
Skema Rangkaian
Program 5 Tombol 5 LED
1 /*
2 * INTERACTIVE ROBOTICS
3 * Program 5 Tombol 5 LED
4 */
5
6 // led setting active high
7 #define LED_ON HIGH
8 #define LED_OFF !LED_ON
9
10 // definisikan 5 tombol
11 #define TOMBOL_NONE 0
12 #define TOMBOL1 1
13 #define TOMBOL2 2
14 #define TOMBOL3 3
15 #define TOMBOL4 4
16 #define TOMBOL5 5
17
18 // output tombol di pin A0
19 // pin led di pin 2 - 6
20 const byte PIN_TOMBOL = A0;
21 const byte PIN_LED[] = {2,3,4,5,6};
22
23 // nilai data tombol sesuai tabel
24 // dan nilai toleransi 15
25 const int TOMBOL_VAL[] = {204,255,341,511,1023};
26 const byte TOLERANSI = 15;
27
28 // status led untuk lock status
29 byte STATUS_LED[] = {LED_OFF,LED_OFF,LED_OFF,LED_OFF,LED_OFF};
30
31 // tombol dalam array
32 const byte TOMBOL[] = {
33 TOMBOL1, TOMBOL2, TOMBOL3,
34 TOMBOL4, TOMBOL5 };
35
36 // tombol saat ini dan tombol sebelumnya
37 byte tombol = 0;
38 byte tombol_last = 0;
39
40 // data saat ini dan data sebelumnya
41 int data = 0;
42 int data_last = 0;
43
44 // delay untuk penekanan tombol
45 unsigned long delay_press = 400; // dalam ms
46 unsigned long delay_press_last = 0;
47
48 void setup() {
49 // buka koneksi ke serial
50 [Link](19200);
51 while(!Serial);
52
53 // tombol sebagai input
54 pinMode(PIN_TOMBOL,INPUT);
55
56 // pin sebagai output, defaultnya OFF
57 for(byte i=0; i<sizeof(PIN_LED); i++){
58 pinMode(PIN_LED[i],OUTPUT);
59 digitalWrite(PIN_LED[i],LED_OFF);
60 }
61 }
62
63 void loop() {
64
65 // panggil fungsi utk membaca tombol
66 TombolListener();
67 }
68
69 void TombolListener(){
70
71 // jika selisih waktu penekanan tombol
72 // lebih besar dari waktu delay tombol
73 // baca tombol lagi, jika tidak tombol tdk dibaca
74 if( millis() - delay_press_last > delay_press ){
75
76 // baca data analog tombol
77 data = analogRead(PIN_TOMBOL);
78 // reset tombol sebelumnya
79 tombol = TOMBOL_NONE;
80 // cocokkan data dengan ke-5 data tombol
81 for(byte i=0; i<sizeof(TOMBOL); i++){
82 // hitung koreksi data tombol
83 // jika ada yang cocok,
84 // catat tombol yang sesuai, lalu
85 // hentikan looping.
86 if( abs(data - TOMBOL_VAL[i]) < TOLERANSI ){
87 tombol = TOMBOL[i];
88 break;
89 }
90 }
91
92 // jika ada tombol yang cocok
93 // cetak tombol, panggil aksi tombol
94 // lalu catat waktu pembacaan tombol
95 if(tombol != TOMBOL_NONE){
96 [Link](tombol);
97
98 AksiTombol(tombol);
99
100 tombol_last = tombol;
101 delay_press_last = millis();
102 }
103 }
104 }
105 // fungsi AksiTombol
106 // INPUT : byte tombol
107 void AksiTombol(byte tombol){
108
109 // konversi dari nomer tombol menjadi index tombol
110 byte index_led = tombol-1;
111
112 // balik status LED sesuai index/led yang cocok
113 // jika HIGH, ubah jadi LOW, dan sebaliknya
114 STATUS_LED[index_led] = !STATUS_LED[index_led];
115
116 // cetak sesuai tombol yang terpilih
117 switch(tombol){
118 case TOMBOL1:
119 // proses sesuatu
120 if( STATUS_LED[index_led] == LED_ON ){
121 [Link](“Nyalakan LED 1”);
122 } else {
123 [Link](“Matikan LED 1”);
124 }
125 break;
126
127 case TOMBOL2:
128 // proses sesuatu
129 if( STATUS_LED[index_led] == LED_ON ){
130 [Link](“Nyalakan LED 2”);
131 } else {
132 [Link](“Matikan LED 2”);
133 }
134 break;
135
136 case TOMBOL3:
137 // proses sesuatu
138 if( STATUS_LED[index_led] == LED_ON ){
139 [Link](“Nyalakan LED 3”);
140 } else {
141 [Link](“Matikan LED 3”);
142 }
143 break;
144
145 case TOMBOL4:
146 // proses sesuatu
147 if( STATUS_LED[index_led] == LED_ON ){
148 [Link](“Nyalakan LED 4”);
149 } else {
150 [Link](“Matikan LED 4”);
151 }
152 break;
153
154 case TOMBOL5:
155 // proses sesuatu
156 if( STATUS_LED[index_led] == LED_ON ){
157 [Link](“Nyalakan LED 5”);
158 } else {
159 [Link](“Matikan LED 5”);
160 }
161 break;
162
163 }
164 // hidup matikan led, sesuai status led
165 digitalWrite(PIN_LED[index_led],STATUS_LED[index_led]);
166 }
Setelah Kalian mempelajari dan memahami cara kerja Program terakhir dari Bab ini, mari lanjut mem-
pelajari EEPROM. EEPROM bisa kita gunakan untuk menyimpan data-data aplikasi yang sifatnya tidak boleh
berubah ketika Arduino mati atau restart.
EEPROM SEBAGAI BLACKBOX
Secara singkat EEPROM bisa diibaratkan sebagai hardisk internal pada Arduino. Data yang disimpan dalam
EEPROM tidak akan hilang meski Arduino dimatikan. Mungkin Anda pernah menghadapi masalah tentang-
konfigurasi atau settingan Arduino yang hilang setelah Arduino restart atau mati. Kita ambil contoh Program
5 Tombol 5 Led pada bab sebelumnya.
Pada program 5 Tombol 5 Led, ketika beberapa LED kita hidupkan, lalu Arduino kita reset, maka led yang
tadinya hidup akan kembali ke kondisi awal, yaitu semua LED tidak menyala. Untuk menyimpan LED status
LED nyala atau tidak, kita bisa menyimpan informasi tersebut pada EEPROM. Apabila terjadi kegagalan sis-
tem, maka Arduino tidak akan kehilangan data meskipun Arduino restart berulang-ulang. Itulah kenapa judul
pada bab ini kita namakan BlackBox.
Mari kita membuat program counter sederhana. Jika arduino baru start atau restart, maka counter tidak
mengulang dari depan lagi, tapi melanjutkan counter sebelumnya. Membuat sistem yang seperti ini dapat
dilakukan dengan bantuan EEPROM. Mari kita praktek…
Program ini tidak membutuhkan rangkaian khusus karena kita hanya simulasi dengan counter dan EE-
PROM yang sudah ada di internal Arduino. Jika Anda baru saja mencoba rangkaian lain, biarkan saja rangka-
ian tersebut karena tidak akan mempengaruhi program.
Program Simulasi EEPROM
1 /*
2 * INTERACTIVE ROBOTICS
3 * Program Simulasi EEPROM
4 */
5
6 // import library EEPROM
7 #include <EEPROM.h>
8
9 // pilih adrress 0 untuk menyimpan data
10 const byte ADDR_COUNTER = 0;
11
12 // nilai maksimum counter
13 const byte counter_max = 100;
14
15 void setup() {
16 // buka koneksi ke serial
17 [Link](19200);
18 while(!Serial);
19
20 // print tulisan Starting saat mulai start
21 [Link](“Starting...”);
22 }
23
24 void loop() {
25 // gunakan nonblocking_delay
26 // untuk delay responsive
27 if ( nonblocking_delay(1000) ){
28
29 // eksekusi fungsi untuk membaca
30 // dan menyimpan data dalam EEPROM
31 byte data = ReadSaveCounter();
32
33 // cetak counter di serial monitor
34 [Link](“Counter : “);
35 [Link](data);
36 }
37
38 }
39
40 // fungsi untuk baca-tulis data ke EEPROM
41 // INPUT : -
42 // OUTPUT : byte data counter
43 byte ReadSaveCounter(){
44
45 // baca alamat 0 pada EEPROM
46 byte counter = [Link]( ADDR_COUNTER );
47 // data yang diperoleh dari EEPROM tambah 1
48 // jika hasil counter > nilai maksimum counter
49 // reset counter ke 0
50 counter++;
51 if (counter > counter_max) counter = 0;
52
53 // simpan lagi data yang telah dimodifikasi
54 [Link](ADDR_COUNTER, counter);
55
56 // return data
57 return counter;
58 }
59
60 // tambahan untuk membuat delay non blocking
61 unsigned long nonblocking_time = millis();
62 unsigned long nonblocking_last = millis();
63 boolean nonblocking_delay(long milidetik){
64 nonblocking_time = millis();
65 if(nonblocking_time - nonblocking_last >= milidetik){
66 nonblocking_last = nonblocking_time;
67 return true;
68 }
69 }
70 return false;
71 }
Output program simulasi EEPROM
Ouput program menunjukkan bahwa setiap program restart, data counter langsung dilanjut berdasarkan
data yang disimpan pada EEPROM. Selanjutnya mari kita membuat program 5 Tombol 5 LED dapat menyim-
pan status LED. Sehingga ketika Arduino aktif, status LED akan disesuaikan dengan kondisi status LED sebel-
umnya.
Program EEPROM 5 Tombol 5 LED
1 /*
2 * INTERACTIVE ROBOTICS
3 * Program Simulasi EEPROM
4 */
5
6 // import library EEPROM
7 # <EEPROM.h>
8
9 // led diset active high
10 #define LED_ON HIGH
11 #define LED_OFF !LED_ON
12
13 // definisikan 5 tombol
14 #define TOMBOL_NONE 0
15 #define TOMBOL1 1
16 #define TOMBOL2 2
17 #define TOMBOL3 3
18 #define TOMBOL4 4
19 #define TOMBOL5 5
20
21 // output tombol di pin A0
22 // pin led di pin 2 - 6
23 const byte PIN_TOMBOL = A0;
24 const byte PIN_LED[] = {2,3,4,5,6};
25
26 // alamat EEPROM untuk data LED
27 const byte ADDR_LED[] = {0,1,2,3,4};
28
29 // nilai data tombol sesuai tabel
30 // dan nilai toleransi 15
31 const int TOMBOL_VAL[] = {200,250,338,507,1014};
32 const byte TOLERANSI = 15;
33
34 // status led untuk lock status
35 byte STATUS_LED[] = {LED_OFF,LED_OFF,LED_OFF,LED_OFF,LED_OFF};
36
37 // tombol dalam array
38 const byte TOMBOL[] = {
39 TOMBOL1, TOMBOL2, TOMBOL3,
40 TOMBOL4, TOMBOL5 };
41
42 // tombol saat ini dan tombol sebelumnya
43 byte tombol = 0;
44 byte tombol_last = 0;
45
46 // data saat ini dan data sebelumnya
47 int data = 0;
48 int data_last = 0;
49
50 // delay untuk penekanan tombol
51 unsigned long delay_press = 400; // dalam ms
52 unsigned long delay_press_last = 0;
53
54 void setup() {
55 // buka koneksi ke serial
56 [Link](19200);
57 while(!Serial);
58
59 // tombol sebagai input
60 pinMode(PIN_TOMBOL,INPUT);
61
62 // pin sebagai output, defaultnya OFF
63 for(byte i=0; i<sizeof(PIN_LED); i++){
64 pinMode(PIN_LED[i],OUTPUT);
65 digitalWrite(PIN_LED[i],LED_OFF);
66 }
67
68 // panggil fungsi PrepareLED
69 // untuk mengetahui status led sebelumnya
70 PrepareLED();
71
72 }
73
74 void loop() {
75 // panggil fungsi utk membaca tombol
76 TombolListener();
77 }
78
79 void TombolListener(){
80
81 // jika selisih waktu penekanan tombol
82 // lebih besar dari waktu delay tombol
83 // baca tombol lagi, jika tidak tombol tdk dibaca
84 if( millis() - delay_press_last > delay_press ){
85
86 // baca data analog tombol
87 data = analogRead(PIN_TOMBOL);
88 // reset tombol sebelumnya
89 tombol = TOMBOL_NONE;
90 // cocokkan data dengan ke-5 data tombol
91 for(byte i=0; i<sizeof(TOMBOL); i++){
92 // hitung koreksi data tombol
93 // jika ada yang cocok,
94 // catat tombol yang sesuai, lalu
95 // hentikan looping.
96 if( abs(data - TOMBOL_VAL[i]) < TOLERANSI ){
97 tombol = TOMBOL[i];
98 break;
99 }
100 }
101
102 // jika ada tombol yang cocok
103 // cetak tombol, panggil aksi tombol
104 // lalu catat waktu pembacaan tombol
105 if(tombol != TOMBOL_NONE){
106 [Link](tombol);
107
108 AksiTombol(tombol);
109
110 tombol_last = tombol;
111 delay_press_last = millis();
112 }
113 }
114 }
115
116 // fungsi AksiTombol
117 // INPUT : byte tombol
118 void AksiTombol(byte tombol){
119
120 // konversi dari nomer tombol menjadi index tombol
121 byte index_led = tombol-1;
122
123 // balik status LED sesuai index/led yang cocok
124 // jika HIGH, ubah jadi LOW, dan sebaliknya
125 STATUS_LED[index_led] = !STATUS_LED[index_led];
126
127 // cetak sesuai tombol yang terpilih
128 switch(tombol){
129 case TOMBOL1:
130 // proses sesuatu
131 if( STATUS_LED[index_led] == LED_ON ){
132 [Link](“Nyalakan LED 1”);
133 } else {
134 [Link](“Matikan LED 1”);
135 }
136 break;
137
138 case TOMBOL2:
139 // proses sesuatu
140 if( STATUS_LED[index_led] == LED_ON ){
141 [Link](“Nyalakan LED 2”);
142 } else {
143 [Link](“Matikan LED 2”);
144 }
145 break;
146
147 case TOMBOL3:
148 // proses sesuatu
149 if( STATUS_LED[index_led] == LED_ON ){
150 [Link](“Nyalakan LED 3”);
151 } else {
152 [Link](“Matikan LED 3”);
153 }
154 break;
155
156 case TOMBOL4:
157 // proses sesuatu
158 if( STATUS_LED[index_led] == LED_ON ){
159 [Link](“Nyalakan LED 4”);
160 } else {
161 [Link](“Matikan LED 4”);
162 }
163 break;
164
165 case TOMBOL5:
166 // proses sesuatu
167 if( STATUS_LED[index_led] == LED_ON ){
168 [Link](“Nyalakan LED 5”);
169 } else {
170 [Link](“Matikan LED 5”);
171 }
172 break;
173 }
174
175 // hidup matikan led, sesuai status led
176 digitalWrite(PIN_LED[index_led],STATUS_LED[index_led]);
177 // simpan status led pada EEPROM sesuai alamat
178 [Link](ADDR_LED[index_led],STATUS_LED[index_led]);
179 }
180
181 // fungsi PrepareLED
182 // untuk membaca data EEPROM saat awal start
183 void PrepareLED(){
184 for(byte i=0; i<sizeof(ADDR_LED); i++){
185 // baca alamat EEPROM ke i
186 STATUS_LED[i] = [Link](ADDR_LED[i]);
187 // status led adalah boolean 0 atau 1
188 // jika data yg tersimpan > 1, reset ke 0
189 if(STATUS_LED[i] > 1) STATUS_LED[i] = 0;
190 // kondisikan LED sesuai data yg tersimpan
191 digitalWrite(PIN_LED[i],STATUS_LED[i]);
192 }
193 }
Cara kerja program ini seperti Program 5 Tombol 5 LED, yang membedakannya adalah proses penyim-
panan status LED di EEPROM (lihat baris 180). Selain itu, ketika program mulai start, maka program akan
membaca status LED sebelumnya di memori dengan fungsi PrepareLED (lihat baris 70). Fungsi PrepareLED()
ada di baris 183 – 193, sedangkan baris untuk membaca data di EEPROM ada di baris 186.
*Setelah materi ini dipelajari jangan lupa untuk terus di pelajari/diulang dirumah dengan alat asli/simulator.
karena sebelum kelas di mulai di pertemuan selanjutnya, akan ada rivew atau test singkat oleh Trainer...
HEHEHEHE.... Terus Semangat ‘-’)9
Anda pasti pernah lihat display seven segment, entah di pom bensin, kalku-
lator generasi lama, atau perangkat elektronika yang menampilkan angka
dalam bentuk kotak. Display seven segment terdiri dari 7 buah lampu LED
yang bisa menampilkan angka, dan kadang ada tambahan 1 LED sebagai titik
di pojok bawah.
Sebelum kita lanjut membuat rangkaian dan program, ada baiknya kita pa-
hami dulu tentang tipe seven segmen yang biasa kita temui. Jangan sampai
salah pilih. Tipe seven segment yang penulis maksud adalah tipe Common
Cathode dan Common Anode. Cathode atau Katoda, adalah istilah lain dari
GND (ground).
Secara umum, LED pada seven segment diberi label A, B, C, D, E, F, G, dan DP. Semua segment LED te
hubung menjadi satu pada salah satu sisinya. Jika yang terhubung jadi satu adalah kaki positif, maka disebut
dengan Common Anode (CA). Jika yang terhubung jadi satu adalah kaki negatifnya, maka disebut dengan
Common Cathode (CC). Kalian boleh memperhatikan dengan seksama gabar di bawah ini.
Rangkaian Seven Segment 1 Digit
1. Arduino x 1
2. Display 7 Segment 1 Digit CC x 1
3. Resistor 1k x 1
4. Project Board x 1
5. Kabel jumper secukupnya
1 /*
2 * INTERACTIVE ROBOTICS
3 * Program Seven Segment 1 Digit
4 */
5
6 // definisikan CC, CA, ON, dan Brightness
7 #define COMMON_ANODE HIGH
8 #define COMMON_CATHODE LOW
9 #define ON HIGH
10 #define BRIGHTNESS 100
11
12 // konfigurasi seven segment CC
13 // CC : active low
14 boolean COMMON = COMMON_CATHODE;
15 boolean SEGMENT_ON = LOW;
16 boolean SEGMENT_OFF = !SEGMENT_ON;
17
18 // pin 2-9 untuk segmen A – DP
19 const byte SegA = 2; // A
20 const byte SegB = 3; // B
21 const byte SegC = 4; // C
22 const byte SegD = 5; // D
23 const byte SegE = 6; // E
24 const byte SegF = 7; // F
25 const byte SegG = 8; // G
26 const byte SegDp = 9; // DP
27 // jadikan array biar mudah
28 const byte SEGMENT[] = {SegA, SegB, SegC, SegD, SegE, SegF, SegG,
29 SegDp};
30
31 // pengaturan untuk brightness
32 unsigned long brightness_now = 0;
33 unsigned long brightness_last = 0;
34 unsigned long brightness_limit = 0;
35
36 // data counter untuk ditampilkan
37 byte counter = 0;
38
39 void setup() {
40 // sesuaikan active low/high
41 // dengan tipe Common Anode atau Common Cathode
42 if( COMMON == COMMON_ANODE ){
43 SEGMENT_ON = !ON;
44 } else {
45 SEGMENT_ON = ON;
46 }
47 SEGMENT_OFF = !SEGMENT_ON;
48
49 // set segment sebagai output
50 for(byte i=0; i<sizeof(SEGMENT); i++){
51 pinMode(SEGMENT[i],OUTPUT);
52 }
53 }
54
55 void loop() {
56 // counter data setiap 1 detik
57 // jika lebih besar dr 9, reset ke 0
58 if( nonblocking_delay(1000) ){
59 counter++;
60 if(counter > 9) counter = 0;
61 }
62
63 // tampilkan angka di seven segment
64 Digit(counter, SEGMENT_OFF, BRIGHTNESS);
65 }
66
67 // fungsi Digit
68 // untuk menampilkan angka pada seven segment
69 void Digit(byte data, boolean dp, int brightness){
70
71 // delay nyala segment, efeknya pada brigthness
72 brightness_limit = constrain(brightness,1,100);
73 brightness_limit = map(brightness_limit,1,100,1,5000);
74
75 brightness_now = micros();
76 if(brightness_now – brightness_last < brightness_limit){
77 // nyalakan 7 segmen sesuai angka
78 switch(data){
79 case 0:
80 digitalWrite(SegA, SEGMENT_ON);
81 digitalWrite(SegB, SEGMENT_ON);
82 digitalWrite(SegC, SEGMENT_ON);
83 digitalWrite(SegD, SEGMENT_ON);
84 digitalWrite(SegE, SEGMENT_ON);
85 digitalWrite(SegF, SEGMENT_ON);
86 digitalWrite(SegG, SEGMENT_OFF);
87 digitalWrite(SegDp, dp);
88 break;
89
90 case 1:
91 digitalWrite(SegA, SEGMENT_OFF);
92 digitalWrite(SegB, SEGMENT_ON);
93 digitalWrite(SegC, SEGMENT_ON);
94 digitalWrite(SegD, SEGMENT_OFF);
95 digitalWrite(SegE, SEGMENT_OFF);
96 digitalWrite(SegF, SEGMENT_OFF);
97 digitalWrite(SegG, SEGMENT_OFF);
98 digitalWrite(SegDp, dp);
99 break;
100
101 case 2:
102 digitalWrite(SegA, SEGMENT_ON);
103 digitalWrite(SegB, SEGMENT_ON);
104 digitalWrite(SegC, SEGMENT_OFF);
105 digitalWrite(SegD, SEGMENT_ON);
106 digitalWrite(SegE, SEGMENT_ON);
107 digitalWrite(SegF, SEGMENT_OFF);
108 digitalWrite(SegG, SEGMENT_ON);
109 digitalWrite(SegDp, dp);
110 break;
111
112 case 3:
113 digitalWrite(SegA, SEGMENT_ON);
114 digitalWrite(SegB, SEGMENT_ON);
115 digitalWrite(SegC, SEGMENT_ON);
116 digitalWrite(SegD, SEGMENT_ON);
117 digitalWrite(SegE, SEGMENT_OFF);
118 digitalWrite(SegF, SEGMENT_OFF);
119 digitalWrite(SegG, SEGMENT_ON);
120 digitalWrite(SegDp, dp);
121 break;
122
123 case 4:
124 digitalWrite(SegA, SEGMENT_OFF);
125 digitalWrite(SegB, SEGMENT_ON);
126 digitalWrite(SegC, SEGMENT_ON);
127 digitalWrite(SegD, SEGMENT_OFF);
128 digitalWrite(SegE, SEGMENT_OFF);
129 digitalWrite(SegF, SEGMENT_ON);
130 digitalWrite(SegG, SEGMENT_ON);
131 digitalWrite(SegDp, dp);
132 break;
133
134 case 5:
135 digitalWrite(SegA, SEGMENT_ON);
136 digitalWrite(SegB, SEGMENT_OFF);
137 digitalWrite(SegC, SEGMENT_ON);
138 digitalWrite(SegD, SEGMENT_ON);
139 digitalWrite(SegE, SEGMENT_OFF);
140 digitalWrite(SegF, SEGMENT_ON);
141 digitalWrite(SegG, SEGMENT_ON);
142 digitalWrite(SegDp, dp);
143 break;
144
145 case 6:
146 digitalWrite(SegA, SEGMENT_ON);
147 digitalWrite(SegB, SEGMENT_OFF);
148 digitalWrite(SegC, SEGMENT_ON);
149 digitalWrite(SegD, SEGMENT_ON);
150 digitalWrite(SegE, SEGMENT_ON);
151 digitalWrite(SegF, SEGMENT_ON);
152 digitalWrite(SegG, SEGMENT_ON);
153 digitalWrite(SegDp, dp);
154 break;
155
156 case 7:
157 digitalWrite(SegA, SEGMENT_ON);
158 digitalWrite(SegB, SEGMENT_ON);
159 digitalWrite(SegC, SEGMENT_ON);
160 digitalWrite(SegD, SEGMENT_OFF);
161 digitalWrite(SegE, SEGMENT_OFF);
162 digitalWrite(SegF, SEGMENT_OFF);
163 digitalWrite(SegG, SEGMENT_OFF);
164 digitalWrite(SegDp, dp);
165 break;
166
167 case 8:
168 digitalWrite(SegA, SEGMENT_ON);
169 digitalWrite(SegB, SEGMENT_ON);
170 digitalWrite(SegC, SEGMENT_ON);
171 digitalWrite(SegD, SEGMENT_ON);
172 digitalWrite(SegE, SEGMENT_ON);
173 digitalWrite(SegF, SEGMENT_ON);
174 digitalWrite(SegG, SEGMENT_ON);
175 digitalWrite(SegDp, dp);
176 break;
177
178 case 9:
179 digitalWrite(SegA, SEGMENT_ON);
180 digitalWrite(SegB, SEGMENT_ON);
181 digitalWrite(SegC, SEGMENT_ON);
182 digitalWrite(SegD, SEGMENT_ON);
183 digitalWrite(SegE, SEGMENT_OFF);
184 digitalWrite(SegF, SEGMENT_ON);
185 digitalWrite(SegG, SEGMENT_ON);
186 digitalWrite(SegDp, dp);
187 break;
188 }
189
190 }else{
191 // matikan semua 7 segment
192 for(byte d=0; d<sizeof(SEGMENT); d++){
193 digitalWrite(SEGMENT[d], SEGMENT_OFF);
194 }
195 brightness_last = brightness_now;
196 }
197 }
198 // tambahan untuk membuat delay non blocking
199 unsigned long nonblocking_time = millis();
200 unsigned long nonblocking_last = millis();
201 boolean nonblocking_delay(long milidetik){
202 nonblocking_time = millis();
203 if(nonblocking_time – nonblocking_last >= milidetik){
204 nonblocking_last = nonblocking_time;
205 return true;
206 }
207 return false;
208 }
7. Brightness terkait dengan berapa lama waktu LED segment nyala dan mati. Anda bisa mengamati baris
76 untuk pengecekan lama segment nyala dan baris 192 – 193 untuk segment OFF seluruhnya. Silakan
coba ubah-ubah angkanya supaya Anda bisa bisa memahaminya lebih baik.
Seven Segment 4 Digit
Seven segment 4 digit memiliki 12 kaki. 8 kaki untuk segment, dan 4 untuk digit D1, D2, D3, dan D4. Cara
kerjanya sama dengan seven segment 1 digit. Hanya saja, untuk menampilkan angka di semua digit, kita
harus melakukan scanning untuk setiap digit. Jadi ke-4 digit harus gantian nyala.
1. Arduino x 1
2. Display 7 Segment 4 Digit CC x 1
3. Project board x 1
4. Resistor dengan nilai yang seragam x 4
5. Kabel jumper secukupnya
Rangkaian pin Arduino dan 7 segment 4 digit :
Program Seven Segment 4 Digit
1 /*
2 * INTERACTIVE ROBOTICS
3 * Program Seven Segment 4 Digit
4 */
5
6 // definisikan CC, CA, ON, dan Brightness
7 #define COMMON_ANODE HIGH
8 #define COMMON_CATHODE LOW
9 #define ON HIGH
10 #define BRIGHTNESS 100
11
12 // konfigurasi seven segment CC
13 // CC : active low
14 boolean COMMON = COMMON_CATHODE;
15 boolean SEGMENT_ON = LOW;
16 boolean SEGMENT_OFF = !SEGMENT_ON;
17 boolean DIGIT_ON = HIGH;
18 boolean DIGIT_OFF = !DIGIT_ON;
19
20 // pin 2-9 untuk segmen A - DP
21 const byte SegA = 2; // A
22 const byte SegB = 3; // B
23 const byte SegC = 4; // C
24 const byte SegD = 5; // D
25 const byte SegE = 6; // E
26 const byte SegF = 7; // F
27 const byte SegG = 8; // G
28 const byte SegDp = 9; // DP
29
30 // pin A0-A3 untuk digit 1-4
31 const byte Digit1 = A0;
32 const byte Digit2 = A1;
33 const byte Digit3 = A2;
34 const byte Digit4 = A3;
35
36 // jadikan array biar mudah
37 const byte SEGMENT[] = {SegA, SegB, SegC, SegD, SegE, SegF, SegG,
38 SegDp};
39 const byte DIGIT[] = {Digit1, Digit2, Digit3, Digit4};
40 // digit terpilih - 0 dari digit satuan (kanan)
41 byte DIGIT_SELECT = 0;
42
43 // pengaturan untuk brightness
44 unsigned long brightness_now = 0;
45 unsigned long brightness_last = 0;
46 unsigned long brightness_limit = 0;
47
48 // counter dari -50
49 int counter = -50;
50
51 // string angka
52 String str_data_last = “”;
53
54 void setup() {
55
56 // sesuaikan active low/high
57 // dengan tipe Common Anode atau Common Cathode
58 if( COMMON == COMMON_ANODE ){
59 SEGMENT_ON = !ON;
60 DIGIT_ON = ON;
61 } else {
62 SEGMENT_ON = ON;
63 DIGIT_ON = !ON;
64 }
65 SEGMENT_OFF = !SEGMENT_ON;
66 DIGIT_OFF = !DIGIT_ON;
67
68 // set pin segment sebagai output
69 for(byte i=0; i<sizeof(SEGMENT); i++){
70 pinMode(SEGMENT[i],OUTPUT);
71 }
72 }
73
74 void loop() {
75
76 // counter data setiap 100 ms
77 // jika lebih besar dr 200, reset ke -50
78 if( nonblocking_delay(100) ){
79 counter++;
80 if(counter > 200) counter = -50;
81 }
82
83 // tampilkan angka di seven segment
84 Digit(counter, SEGMENT_OFF, BRIGHTNESS);
85
86 }
87
88 void Digit(int data, boolean dp, int brightness){
89
90 // delay nyala segment, efeknya pada brigthness
91 brightness_limit = constrain(brightness,1,100);
92 brightness_limit = map(brightness_limit,1,100,1,5000);
93
94 // konversi angka menjadi string
95 // lalu cek lebar angkannya
96 String str_data = String(data);
97 byte len_data = str_data.length();
98
99 brightness_now = micros();
100 if(brightness_now - brightness_last < brightness_limit){
101
102 // replace data sesuai digit yang terpilih
103 if( DIGIT_SELECT < len_data ){
104
105 // jika data < 0, berarti ada tanda - di depan
106 if( data < 0 && DIGIT_SELECT == 0){
107 data = ‘-’;
108 } else {
109 // ambil data sesuai index digitnya
110 data = (str_data.substring(DIGIT_SELECT,DIGIT_SELECT+1)).toInt();
111 }
112
113 // nyalakan digit yang terpilih
114 digitalWrite(DIGIT[DIGIT_SELECT],DIGIT_ON);
115 }
116
117 // nyalakan 7 segmen sesuai angka
118 switch(data){
119 case 0:
120 digitalWrite(SegA, SEGMENT_ON);
121 digitalWrite(SegB, SEGMENT_ON);
122 digitalWrite(SegC, SEGMENT_ON);
123 digitalWrite(SegD, SEGMENT_ON);
124 digitalWrite(SegE, SEGMENT_ON);
125 digitalWrite(SegF, SEGMENT_ON);
126 digitalWrite(SegG, SEGMENT_OFF);
127 digitalWrite(SegDp, dp);
128 break;
129
130 case 1:
131 digitalWrite(SegA, SEGMENT_OFF);
132 digitalWrite(SegB, SEGMENT_ON);
133 digitalWrite(SegC, SEGMENT_ON);
134 digitalWrite(SegD, SEGMENT_OFF);
135 digitalWrite(SegE, SEGMENT_OFF);
136 digitalWrite(SegF, SEGMENT_OFF);
137 digitalWrite(SegG, SEGMENT_OFF);
138 digitalWrite(SegDp, dp);
139 break;
140
141 case 2:
142 digitalWrite(SegA, SEGMENT_ON);
143 digitalWrite(SegB, SEGMENT_ON);
144 digitalWrite(SegC, SEGMENT_OFF);
145 digitalWrite(SegD, SEGMENT_ON);
146 digitalWrite(SegE, SEGMENT_ON);
147 digitalWrite(SegF, SEGMENT_OFF);
148 digitalWrite(SegG, SEGMENT_ON);
149 digitalWrite(SegDp, dp);
150 break;
151
152 case 3:
153 digitalWrite(SegA, SEGMENT_ON);
154 digitalWrite(SegB, SEGMENT_ON);
155 digitalWrite(SegC, SEGMENT_ON);
156 digitalWrite(SegD, SEGMENT_ON);
157 digitalWrite(SegE, SEGMENT_OFF);
158 digitalWrite(SegF, SEGMENT_OFF);
159 digitalWrite(SegG, SEGMENT_ON);
160 digitalWrite(SegDp, dp);
161 break;
162
163 case 4:
164 digitalWrite(SegA, SEGMENT_OFF);
165 digitalWrite(SegB, SEGMENT_ON);
166 digitalWrite(SegC, SEGMENT_ON);
167 digitalWrite(SegD, SEGMENT_OFF);
168 digitalWrite(SegE, SEGMENT_OFF);
169 digitalWrite(SegF, SEGMENT_ON);
170 digitalWrite(SegG, SEGMENT_ON);
171 digitalWrite(SegDp, dp);
172 break;
173
174 case 5:
175 digitalWrite(SegA, SEGMENT_ON);
176 digitalWrite(SegB, SEGMENT_OFF);
177 digitalWrite(SegC, SEGMENT_ON);
178 digitalWrite(SegD, SEGMENT_ON);
179 digitalWrite(SegE, SEGMENT_OFF);
180 digitalWrite(SegF, SEGMENT_ON);
181 digitalWrite(SegG, SEGMENT_ON);
182 digitalWrite(SegDp, dp);
183 break;
184
185 case 6:
186 digitalWrite(SegA, SEGMENT_ON);
187 digitalWrite(SegB, SEGMENT_OFF);
188 digitalWrite(SegC, SEGMENT_ON);
189 digitalWrite(SegD, SEGMENT_ON);
190 digitalWrite(SegE, SEGMENT_ON);
191 digitalWrite(SegF, SEGMENT_ON);
192 digitalWrite(SegG, SEGMENT_ON);
193 digitalWrite(SegDp, dp);
194 break;
195
196 case 7:
197 digitalWrite(SegA, SEGMENT_ON);
198 digitalWrite(SegB, SEGMENT_ON);
199 digitalWrite(SegC, SEGMENT_ON);
200 digitalWrite(SegD, SEGMENT_OFF);
201 digitalWrite(SegE, SEGMENT_OFF);
202 digitalWrite(SegF, SEGMENT_OFF);
203 digitalWrite(SegG, SEGMENT_OFF);
204 digitalWrite(SegDp, dp);
205 break;
206
207 case 8:
208 digitalWrite(SegA, SEGMENT_ON);
209 digitalWrite(SegB, SEGMENT_ON);
210 digitalWrite(SegC, SEGMENT_ON);
211 digitalWrite(SegD, SEGMENT_ON);
212 digitalWrite(SegE, SEGMENT_ON);
213 digitalWrite(SegF, SEGMENT_ON);
214 digitalWrite(SegG, SEGMENT_ON);
215 digitalWrite(SegDp, dp);
216 break;
217
218 case 9:
219 digitalWrite(SegA, SEGMENT_ON);
220 digitalWrite(SegB, SEGMENT_ON);
221 digitalWrite(SegC, SEGMENT_ON);
222 digitalWrite(SegD, SEGMENT_ON);
223 digitalWrite(SegE, SEGMENT_OFF);
224 digitalWrite(SegF, SEGMENT_ON);
225 digitalWrite(SegG, SEGMENT_ON);
226 digitalWrite(SegDp, dp);
227 break;
228
229 case ‘-’:
230 digitalWrite(SegA, SEGMENT_OFF);
231 digitalWrite(SegB, SEGMENT_OFF);
232 digitalWrite(SegC, SEGMENT_OFF);
233 digitalWrite(SegD, SEGMENT_OFF);
234 digitalWrite(SegE, SEGMENT_OFF);
235 digitalWrite(SegF, SEGMENT_OFF);
236 digitalWrite(SegG, SEGMENT_ON);
237 digitalWrite(SegDp, dp);
238 break;
239
240 }
241 }else{
242 // matikan semua digit
243 for(byte d=0; d<sizeof(DIGIT); d++){
244 digitalWrite(DIGIT[d], DIGIT_OFF);
245 }
246
247 // matikan semua segment
248 for(byte d=0; d<sizeof(SEGMENT); d++){
249 digitalWrite(SEGMENT[d], SEGMENT_OFF);
250 }
251
252 // lanjut ke digit berikutnya
253 DIGIT_SELECT++;
254 // jika semua digit sudah ditampilkan, reset ke 0
255 if( DIGIT_SELECT >= len_data) DIGIT_SELECT = 0;
256
257 brightness_last = brightness_now;
258 }
259 }
260
261 // tambahan untuk membuat delay non blocking
262 unsigned long nonblocking_time = millis();
263 unsigned long nonblocking_last = millis();
264 boolean nonblocking_delay(long milidetik){
265 nonblocking_time = millis();
266 if(nonblocking_time - nonblocking_last >= milidetik){
267 nonblocking_last = nonblocking_time;
268 return true;
269 }
270 return false;
271 }
Program ini masih menggunakan contoh counter, namun counternya dari -50 hingga 200. Cara kerja pro-
gram di atas mirip dengan program seven segment 1 Digit. Yang berbeda adalah :
1. Ada pin digit yang harus diinisialisasi (lihat baris 31 – 34, 39, dan 69 – 71)
2. Untuk menampilkan angka, proses menampilkan angka harus satu-persatu untuk setiap digit yang
terpilih pada variabel DIGIT_SELECT.
3. Karena angka yang ditampilkan lebih dari 1 digit, maka angka akan dikonversi menjadi string
(lihat baris 96), lalu pilih satu-persatu berdasarkan posisi indeksnya dengan cara memecah string angka
tersebut (lihat baris 110). Angka yang terpilih akan dikonversi menjadi angka dan ditampilkan sesuai
angka yang cocok (lihat baris 118 – 238).
4. Untuk menampilkan angka minus, maka data harus dicek apakah < 0 atau tidak (lihat baris 106).
5. Proses pergeseran digit dipilih saat semua segment dimatikan (lihat baris 255).
Ibaratnya begini, jika ingin menghidupkan lampu, kita harus pencet saklar yang nempel di tembok. Tapi jika
menggunakan relay, kita bisa menghidupkan atau mematikan lampu tanpa menyentuh saklar lagi. Relay dise-
but juga sebagai saklar elektronik, yaitu saklar dapat dikontrol dengan alat elektronik lainnya seperti Arduino.
1. Dua kaki untuk listrik + dan GND, jika arus dan tegangannya cukup, maka relay akan aktif yang ditandai
dengan bunyi ‘Tek’.
2. Satu kaki sumber C (common), kaki ini yang akan dihubungkan ke kaki NC atau NO. Jika relay akan
digunakan untuk mengontrol lampu rumah, maka kaki C disambung ke salah satu jalur listrik dari PLN.
3. Kaki NC (Normally Close), sebelum relay aktif, kaki NC nyambung ke kaki C (perhatikan gambar). Tapi kalau
relaynya aktif, kaki NC terputus dari kaki C.
4. Kaki NO (Normally Open), sebelum relay aktif, kaki NO tidak nyambung ke mana-mana. Tapi ketika relay
aktif, kaki NO terhubung ke kaki C.
Sebelum mencoba relay yang sudah dirangkai dalam sebuah modul, istilah yang perlu kita pahami yaitu :
Active Low dan Active High. Active Low artinya, relay akan aktif kalau input diberi logika LOW atau GND. Se-
dangkan Active High artinya, relay akan aktif apabila input diberi logika HIGH atau +5v.
Relay Active Low atau Active High bisa dicek pad spesifikasi yang telah ditentukan oleh pabriknya. Jika
Anda ragu, Anda bisa cek langsung modul relaynya dengan beberapa komponen dan power supply yang
cocok.
Selain untuk menentukan Active Low atau Active High, cara ini bisa kita gunakan untuk menentukan apa-
kah relay berfungsi dengan baik atau tidak. Untuk relay Active Low, relay akan aktif jika input dihubungkan ke
GND. Jika relay Active High, relay aktif jika input dihubungkan ke VCC.
Namun jika relay tidak merespon ketika diberi input GND atau VCC, pastikan kabel-kabelnya terhubung
dengan benar. Kalau semua sudah benar, tapi tetap tidak ada respon. Kemungkinan besar ada komponen
yang rusak.
Cara Kerja Relay
Relay dapat bekerja karena adanya medan magnet yang digunakan untuk menggerakkan saklar. Saat kump-
aran diberikan tegangan sebesar tegangan kerja relay maka akan timbul medan magnet pada kumparan
karena adanya arus yang mengalir pada lilitan kawat. Kumparan yang bersifat sebagai elektromagnet ini
kemudian akan menarik saklar dari kontak NC ke kontak NO. Jika tegangan pada kumparan dimatikan maka
medan magnet pada kumparan akan hilang sehingga pegas akan menarik saklar ke kontak NC.
Prinsip kerja dari relay ini yaitu: pada C1 dan C2 terdapat kumparan sebagai driver. ketika C1 dan C2 belum
dilewati arus, maka terminal Com dan No akan tersambung, dan ketika C1 dan C2 dilewati arus maka plat
Com akan berpindah sehingga terminal Com dan No akan tersambung.
EXERCISE
Skema Rangkaian.
Setelah meyusun rangkaian seperti pada gambar, buka IDE Arduino dan buat coding berikut :
1 /*
2 * INTERACTIVE ROBOTICS
3 * Program Control Relay dengan Communication Serial
4 */
5
6 int Relay = 10;
7 int deteksi;
8
9 void setup()
10 {
11 pinMode(Relay, OUTPUT);
12 [Link](9600);
13 }
14
15 void loop()
16 {
17 if([Link]() > 0){
18 deteksi = [Link]();
19 }
20
21 // Jika Deteksi bernilai ‘1’ maka Relay menyala
22 if (deteksi == ‘1’) {
23 digitalWrite(Relay, HIGH);
24 }
25
26 else if(deteksi==’2’) {
27 digitalWrite(Relay, LOW);
28 }
29 }
CHALANGE !
1. Tambahkan Pin Relay yang lain untuk mengontrol lampu lain atau alat elektronik lain.
PERHATIAN..!!!
Jangan Gunakan Langsung terhubung dengan Listrik Tegangan 220 V kalau belum benar-benar faham. Ikuti
Instruksi Trainer / bertanya pada Trainer bila masih kurang paham dalam proses merangkai project
1. Susun dan rangkai rangkaina Driver Motor tanpa skema namun sesuai dengan keterangan pin yang su-
dah diberikan.
1 /*
2 * INTERACTIVE ROBOTICS
3 * Program Control Motor DC L298 IC
4 */
5
6 int motor1Pin1 = 3; // pin In1 Arduino
7 int motor1Pin2 = 4; // pin In2 Arduino
8 int motor2Pin1 = 8; // pin In3 Arduino
9 int motor2Pin2 = 9; // pin In4 Arduino
10 int state;
11 int flag = 0; // Memastikan serial komunikasi hanya mengirim satu
12 perintah
13 int stateStop = 0;
14
15 void setup() {
16
17 // set pin sebagai OOUTPUT
18 pinMode(motor1Pin1, OUTPUT);
19 pinMode(motor1Pin2, OUTPUT);
20 pinMode(motor2Pin1, OUTPUT);
21 pinMode(motor2Pin2, OUTPUT);
22
23 // Menginisialisasi komunikasi serial pada Boud rate 9600
24 [Link](9600);
25 }
26
27 void loop() {
28 // Jika beberapa saat dikirimkan perintah, maka akan membaca dan
29 menyimpan dalam sebuah keadaan tertentu.
30 if([Link]() > 0){
31 state = [Link]();
32 flag=0;
33 }
34
35 // Jika menerima perintah ‘1’ motor DC akan maju
36 if (state == ‘1’) {
37 digitalWrite(motor1Pin1, HIGH);
38 digitalWrite(motor1Pin2, LOW);
39 digitalWrite(motor2Pin1, LOW);
40 digitalWrite(motor2Pin2, HIGH);
41 if(flag == 0){
42 [Link](“MAJUUUU!!!!”);
43 flag=1;
44 }
45 }
46
47 // Jika menerima perintah ‘2’ motor DC akan Belok Kiri
48 else if (state == ‘2’) {
49 digitalWrite(motor1Pin1, HIGH);
50 digitalWrite(motor1Pin2, LOW);
51 digitalWrite(motor2Pin1, LOW);
52 digitalWrite(motor2Pin2, LOW);
53 if(flag == 0){
54 [Link](“BELOK KIRI!!”);
55 flag=1;
56 }
57
58 delay(1500);
59 state=3;
60 stateStop=1;
61 }
62
63 // Jika menerima perintah ‘3’ motor DC akan Berhenti
64 else if (state == ‘3’ || stateStop == 1) {
65 digitalWrite(motor1Pin1, LOW);
66 digitalWrite(motor1Pin2, LOW);
67 digitalWrite(motor2Pin1, LOW);
68 digitalWrite(motor2Pin2, LOW);
69 if(flag == 0){
70 [Link](“BERHENTI!!”);
71 flag=1;
72 }
73 stateStop=0;
74 }
75
76 // Jika menerima perintah ‘4 ‘ motor DC akan Belok Kanan.
77 else if (state == ‘4’) {
78 digitalWrite(motor1Pin1, LOW);
79 digitalWrite(motor1Pin2, LOW);
80 digitalWrite(motor2Pin1, LOW);
81 digitalWrite(motor2Pin2, HIGH);
82 if(flag == 0){
83 [Link](“BELOKKANAN!!”);
84 flag=1;
85 }
86 delay(1500);
87 state=3;
88 stateStop=1;
89 }
90
91 // jika menerima perintah ‘5 ‘ motor DC akan Mundur
92 else if (state == ‘5’) {
93 digitalWrite(motor1Pin1, LOW);
94 digitalWrite(motor1Pin2, HIGH);
95 digitalWrite(motor2Pin1, HIGH);
96 digitalWrite(motor2Pin2, LOW);
97 if(flag == 0){
98 [Link](“MUNDUR!!”);
99 flag=1;
100 }
101 }
Line Follower Robot – sebuah jenis robot yang termasuk kedalam
kategori robot mobile yang di desain untuk bekerja secara autonomous
dan memiliki kemampuan dapat mendeteksi dan bergerak mengikuti
(follows) garis yang ada di permukaan. Sistem kendali yang digunakan
dirancang untuk bisa merasakan jalur garis yang ada dan melakukan
manuver gerakan agar tetap bisa mengikuti garis tersebut.
Ketika transmitter (infrared) memancarkan cahaya ke bidang berwarna putih, cahaya akan dipantulkan
hampir semuanya oleh bidang berwarna putih tersebut. Sebaliknya, ketika transmitter memancarkan cahaya
ke bidang berwarna gelap atau hitam, maka cahaya akan banyak diserap oleh bidang gelap tersebut, sehing-
ga cahaya yang sampai ke receiver tinggal sedikit. Nah, artinya kita sudah bisa membedakan pembacaan garis
dari sensor bukan? Kalau kita sudah tahu, perbedaan cahaya yang diterima oleh receiver akan menyebabkan
hambatan yang berbeda-beda di dalam receiver (photo dioda) tersebut. Ilustrasinya seperti gambar di bawah
ini.
Kalau cahaya yang dipancarkan ke bidang putih, sensor akan :
Sebaliknya, kalau cahaya yang dipantulkan oleh bidang hitam, maka sensor akan :
EXERCISE + CHALANGE :
1. Susun/rangkai rangkaian Line Follower Robot dengan Arduino dan coding sesuai instruksi pada modul ini.
Keterangan Rangkaian :
1. Bisa Menggunakan Segala Jenis Arduino (UNO, NANO, MEGA, MINI, dll), karena penomoran pinnya sama.
Tinggal cocokkan Saja nomor Pin-Pin nya.
2. Pin Modul Sensor no. 1 ==> Pin A5 Arduino
3. Pin Modul Sensor no. 2 ==> Pin A4 Arduino
4. Pin Modul Sensor no. 3 ==> Pin A3 Arduino
5. Pin Modul Sensor no. 4 ==> Pin A2 Arduino
6. Pin In1 Driver Motor ==> Pin 7 Arduino
7. Pin In2 Driver Motor ==> Pin 6 Arduino
8. Pin In3 Driver Motor ==> Pin 5 Arduino
9. Pin In4 Driver Motor ==> Pin 4 Arduino
10. Pin ENA-bawah Driver Motor ==> Pin 9 Arduino
11. Pin ENB-bawah Driver Motor ==> Pin 9 Arduino
12. Pin ENA-atas Driver Motor ==> Pin 5V Arduino
13. Pin ENB-atas Driver Motor ==> Pin 5V Arduino
14. OUT1 dan OUT2 Driver Motor ==> Motor 1
15. OUT3 dan OUT4 Driver Motor ==> Motor 2
16. Pin 12V Driver Motor ==> Hubungkan ke baterai
17. Pin GND Driver Motor ==> Hubungkan ke Ground(-) Baterai dan Ground(GND) Arduino
18. Kaki vcc pada masing-masing komponen hubungkan ke sumber power positif 5v (bisa dari 5v Arduino)
19. Kaki gnd/ground pada masing-masing komponen hubungkan ke sumber negatif power (dihubungkan ke
pin gnd Arduino)
CODING :
1 /*
2 * INTERACTIVE ROBOTICS
3 * Program Line Follower Robot 4 sensor
4 */
5
6 // inialisasi pin sensor garis 1 sampai 4
7 // sensor1 dan snsor2 = sensor sebelah kanan
8 // sensor3 dan sensor4 = sensor sebelah kiri
9 const int sensor1 = A5;
10 const int sensor2 = A4;
11 const int sensor3 = A3;
12 const int sensor4 = A2;
13
14 // inialisasi pin motor kanan dan motor kiri
15 // motor1 dan motor2 = motor kanan
16 // motor3 dan motor4 = motor kiri
17 const int motor1 = 7;
18 const int motor2 = 6;
19 const int motor3 = 5;
20 const int motor4 = 4;
21
22 // inialisasi pin speed motor
23 // wajib pin support PWM
24 const int pinSpeed = 9;
25
26 // inialisasi variabel data 1 sampai 4
27 int data1, data2, data3, data4;
28
29 // inialisasi nilai kecepatan motor
30 // range nilai antara 0 sampai 255
31 int speedMotor = 255;
32
33 // ---------- program dfault/setting awal ---------- //
34
35 void setup() {
36 // inialisasi pin motor sebagai output
37 pinMode(motor1, OUTPUT);
38 pinMode(motor2, OUTPUT);
39 pinMode(motor3, OUTPUT);
40 pinMode(motor4, OUTPUT);
41
42 // inialisasi pin sensor sebagai input
43 pinMode(sensor1, INPUT);
44 pinMode(sensor2, INPUT);
45 pinMode(sensor3, INPUT);
46 pinMode(sensor4, INPUT);
47
48 // inialisasi pin speed motor sebagai output
49 pinMode(pinSpeed, OUTPUT);
50 }
51
52 // ------ program utama, looping/berulang terus-menerus ------ //
53
54 void loop () {
55 // masing2 variabel data menyimpan hasil pembacaan sensor
56 // berupa logic LOW/HIGH
57 data1 = digitalRead(sensor1);
58 data2 = digitalRead(sensor2);
59 data3 = digitalRead(sensor3);
60 data4 = digitalRead(sensor4);
61
62 // mengatur kecepatan motor
63 analogWrite(pinSpeed, speedMotor);
64
65 // ---- pengaturan jalannya robot sesuai pembacaan sensor ---- //
66
67 if (data1 == LOW && data2 == LOW && data3 == LOW && data4 == LOW)
68 {
69 // maju
70 digitalWrite(motor1, HIGH);
71 digitalWrite(motor2, LOW);
72 digitalWrite(motor3, HIGH);
73 digitalWrite(motor4, LOW);
74 }
75
76 else if (data1 == HIGH && data2 == HIGH && data3 == HIGH && data4
77 == LOW)
78 {
79 // kanan
80 digitalWrite(motor1, LOW);
81 digitalWrite(motor2, HIGH);
82 digitalWrite(motor3, HIGH);
83 digitalWrite(motor4, LOW);
84 }
85
86 else if (data1 == LOW && data2 == HIGH && data3 == HIGH && data4 ==
87 HIGH)
88 {
89 // kiri
90 digitalWrite(motor1, HIGH);
91 digitalWrite(motor2, LOW);
92 digitalWrite(motor3, LOW);
93 digitalWrite(motor4, HIGH);
94 }
95
96 else if (data1 == HIGH && data2 == HIGH && data3 == LOW && data4 ==
97 LOW)
98 {
99 // kanan
100 digitalWrite(motor1, LOW);
101 digitalWrite(motor2, HIGH);
102 digitalWrite(motor3, HIGH);
103 digitalWrite(motor4, LOW);
104 }
105
106 else if (data1 == LOW && data2 == LOW && data3 == HIGH && data4 ==
107 HIGH)
108 {
109 // kiri
110 digitalWrite(motor1, HIGH);
111 digitalWrite(motor2, LOW);
112 digitalWrite(motor3, LOW);
113 digitalWrite(motor4, HIGH);
114 }
115
116 else if (data1 == HIGH && data2 == LOW && data3 == LOW && data4 ==
117 LOW)
118 {
119 // kanan
120 digitalWrite(motor1, LOW);
121 digitalWrite(motor2, HIGH);
122 digitalWrite(motor3, HIGH);
123 digitalWrite(motor4, LOW);
124 }
125
126 else if (data1 == LOW && data2 == LOW && data3 == LOW && data4 ==
127 HIGH)
128 {
129 // kiri
130 digitalWrite(motor1, HIGH);
131 digitalWrite(motor2, LOW);
132 digitalWrite(motor3, LOW);
133 digitalWrite(motor4, HIGH);
134 }
135
136 else if (data1 == HIGH && data2 == LOW && data3 == HIGH && data4 ==
137 LOW)
138 {
139 // kanan
140 digitalWrite(motor1, LOW);
141 digitalWrite(motor2, HIGH);
142 digitalWrite(motor3, HIGH);
143 digitalWrite(motor4, LOW);
144 }
145
146 else if (data1 == LOW && data2 == HIGH && data3 == LOW && data4 ==
147 HIGH)
148 {
149 // kiri
150 digitalWrite(motor1, HIGH);
151 digitalWrite(motor2, LOW);
152 digitalWrite(motor3, LOW);
153 digitalWrite(motor4, HIGH);
154 }
155
156 else if (data1 == LOW && data2 == HIGH && data3 == LOW && data4 ==
157 LOW)
158 {
159 // kanan
160 digitalWrite(motor1, LOW);
161 digitalWrite(motor2, HIGH);
162 digitalWrite(motor3, HIGH);
163 digitalWrite(motor4, LOW);
164 }
165
166
167 else if (data1 == LOW && data2 == LOW && data3 == HIGH && data4 ==
168 LOW)
169 {
170 // kiri
171 digitalWrite(motor1, HIGH);
172 digitalWrite(motor2, LOW);
173 digitalWrite(motor3, LOW);
174 digitalWrite(motor4, HIGH);
175 }
176
177 else if (data1 == LOW && data2 == HIGH && data3 == HIGH && data4 ==
178 LOW)
179 {
180 //maju
181 digitalWrite(motor1, HIGH);
182 digitalWrite(motor2, LOW);
183 digitalWrite(motor3, HIGH);
184 digitalWrite(motor4, LOW);
185 }
186
187 else if (data1 == HIGH && data2 == HIGH && data3 == HIGH && data4
188 == HIGH)
189 {
190 // maju
191 digitalWrite(motor1, HIGH);
192 digitalWrite(motor2, LOW);
193 digitalWrite(motor3, HIGH);
194 digitalWrite(motor4, LOW);
195 }
196 }
*Setelah materi ini dipelajari jangan lupa untuk terus di pelajari/diulang dirumah dengan alat asli/simulator.
karena sebelum kelas di mulai di pertemuan selanjutnya, akan ada rivew atau test singkat oleh Trainer...
HEHEHEHE.... Terus Semangat ‘-’)9
Apa itu Robot Avoider? Seperti apa cara kerja robot tersebut?.
Robot Avoider adalah robot halang rintang karena pada dasarnya robot ini
menggunakan sensor yang membuat robot dapat merubah haluan gerakn-
ya. Robot Avoider ini menggunakan sensor ultrasonic sensor, apabila robot
mendeteksi benda atau dinding dalam jarak tertentu maka secara otomatis
robot akan berputar ke kanan atau ke kiri bisa juga mundur. Maka dari itu
robot ini disebut sebagai Robot Halang Rintang.
Aplikasi dari sistem Robot ini cukup banyak, dari mulai Robot penyapu/
pembersih lantai sederhana, Robot penjelajah dan sistemnya juga dipakai
pada sistem pengereman otomatis pada beberapa produk mobil saat ini.
EXERCISE + CHALANGE :
1. Susun dan rangkai Avoider Robot tanpa skema namun sesuai dengan keterangan pin yang sudah ada
pada Coding.
1 /*
2 * INTERACTIVE ROBOTICS
3 * Program Avoider Robot 3 Sensor
4 */
5
6 #define rightMotor_Dir 4 // arah putar (Motor 1 / kanan)
7 #define rightMotor_Vel 5 // kontrol kecepatan (Motor 1 / Kiri)
8 #define leftMotor_Vel 6
9 #define leftMotor_Dir 7
10 #define fullspeed 255
11 #define nospeed 0
12 #define lowspeed1 50
13 #define lowspeed2 75
14 #define lowspeed3 100
15 #define lowspeed4 150
16 #define lowspeed5 175
17 #define highspeed1 225
18 #define highspeed2 176
19 #define highspeed3 200
20 #define highspeed4 215
21 #define highspeed5 250
22
23 int tengah ;
24 int kiri;
25 int kanan;
26
27 #include<NewPing.h>
28 #define TRIGGER_PIN 19
29 #define ECHO_PIN 18
30 #define MAX_DISTANCE 500
31 NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
32
33 #define TRIGGER_PIN1 17
34 #define ECHO_PIN1 16
35 NewPing sonar1(TRIGGER_PIN1, ECHO_PIN1, MAX_DISTANCE);
36
37 #define TRIGGER_PIN2 15
38 #define ECHO_PIN2 14
39 NewPing sonar2(TRIGGER_PIN2, ECHO_PIN2, MAX_DISTANCE);
40
41 void maju() {
42 //Motor diberi HIGH untuk bergerak CW
43 digitalWrite(rightMotor_Dir,HIGH);
44 //Motor diberi HIGH agar EN=full speed
45 analogWrite(rightMotor_Vel,60);
46 //Motor diberi HIGH untuk bergerak CW
47 digitalWrite(leftMotor_Dir,HIGH);
48 //Motor diberi HIGH agar EN=full speed
49 analogWrite(leftMotor_Vel,60);
50 }
51
52 void mundur() {
53 //Motor diberi HIGH untuk bergerak CW
54 digitalWrite(rightMotor_Dir,LOW);
55 //Motor diberi HIGH agar EN=full speed
56 analogWrite(rightMotor_Vel,50);
57 //Motor diberi HIGH untuk bergerak CW
58 digitalWrite(leftMotor_Dir,LOW);
59 //Motor diberi HIGH agar EN=full speed
60 analogWrite(leftMotor_Vel,50);
61 }
62
63 void berhenti() {
64 //Motor diberi HIGH untuk bergerak CW
65 digitalWrite(rightMotor_Dir,LOW);
66 //Motor diberi HIGH agar EN=full speed
67 analogWrite(rightMotor_Vel,nospeed);
68 //Motor diberi HIGH untuk bergerak CW
69 digitalWrite(leftMotor_Dir,LOW);
70 //Motor diberi HIGH agar EN=full speed
71 analogWrite(leftMotor_Vel,nospeed);
72 }
73
74 void belok kanan() {
75 //Motor diberi HIGH untuk bergerak CW
76 digitalWrite(rightMotor_Dir,HIGH);
77 //Motor diberi HIGH agar EN=full speed
78 analogWrite(rightMotor_Vel,50);
79 //Motor diberi HIGH untuk bergerak CW
80 digitalWrite(leftMotor_Dir,LOW);
81 //Motor diberi HIGH agar EN=full speed
82 analogWrite(leftMotor_Vel,90);
83 delay(200);
84 }
85
86 void belok kiri() {
87 //Motor diberi HIGH untuk bergerak CW
88 digitalWrite(rightMotor_Dir,HIGH);
89 //Motor diberi HIGH agar EN=full speed
90 analogWrite(rightMotor_Vel,90);
91 //Motor diberi HIGH untuk bergerak CW
92 digitalWrite(leftMotor_Dir,LOW);
93 //Motor diberi HIGH agar EN=full speed
94 analogWrite(leftMotor_Vel,50);
95 delay(200);
96 }
97
98 void setup() {
99 pinMode (4,OUTPUT); //Setting pin 4 sebagai output
100 pinMode (5,OUTPUT); //Setting pin 5 sebagai output
101 pinMode (6,OUTPUT); //Setting pin 6 sebagai output
102 pinMode (7,OUTPUT); //Setting pin 7 sebagai output
103 [Link](115200);
104 }
105
106 void loop() {
107 delay(100);
108 tengah = sonar.ping_cm();
109 kanan = sonar1.ping_cm();
110 kiri = sonar2.ping_cm();
111
112 if (tengah == 0 ) {
113 tengah = MAX_DISTANCE;
114 }
115 if (kanan == 0 ){
116 kanan = MAX_DISTANCE;
117 }
118 if (kiri == 0 ){
119 kiri = MAX_DISTANCE;
120 }
121
122 [Link](“ hasil pengukuran “);
123 [Link](tengah);
124 [Link](“ cm”);
125 [Link](kanan);
126 [Link](“ cm”);
127 [Link](kiri);
128 [Link](“ cm”);
129
130 if(kiri<=10 && tengah<=10 && kanan <=10) {
131 mundur();
132 }
133
134 else if((tengah <=10) && (kiri <=10)) {
135 belokkanan();
136 }
137
138 else if ((tengah <=10) && (kanan <=10)) {
139 belokkiri();
140 }
141
142 else if(kiri <=10) {
143 belokkanan();
144 }
145
146 else if(kanan <=10){
147 belokkiri();
148 }
149
150 else if (tengah <=10){
151 belokkanan();
152 }
153
154 else {
155 maju();
156 }
157 }
Jika terjadi kesulitan dan ada hal yang kurang/tidak dipahami, segera bertanya pada Trainer dan ikuti instruksi
Trainer, demi keamanan dalam pembuatan project dan menghindari resiko kerusakan fatal pada alat yang
digunakan dalam pembuatan project.
*Setelah materi ini dipelajari jangan lupa untuk terus di pelajari/diulang dirumah dengan alat asli/simulator.
karena sebelum kelas di mulai di pertemuan selanjutnya, akan ada rivew atau test singkat oleh Trainer...
HEHEHEHE.... Terus Semangat ‘-’)9
Bluetooth adalah suatu protokol komunikasi wireless yang bek-
erja pada frekuensi radio 2.4 GHz untuk pertukaran data pada per-
angkat seperti hanphone,laptop,dan perangkat lainnya . Sama halnya
di dalam menggunakan mikrokontroller,seringkali kita memerlukan
suatu protokol komunikasi yang dapat digunakan untuk mengirimkan
dan menerima data,untuk itu bluetooth adalah salah satu alat yang
sangat efektif untuk komunikasi di ruang lingkup/area yang bersifat
lokal.
Bluetooth HC-05 adalah salah satu modul bluetooth yag sering digunakan oleh kebanyakan user mik-
rokontroller seperti arduino dikarenakan pemakaiannya yang mudah,harganya murah,dan banyak tersedia di
pasaran. Kelebihan dari modul bluetooth HC-05 ini adalah bisa digunakan sebagai master maupun digunakan
sebagai slave,berbeda dengan bluetooth tipe HC-06 yang hanya bisa digunakan sebagai slave.
Sebelum menggunakan bluetooth HC-05 alangkah baiknya dilakukan konfigurasi terlebih dahulu ,yaitu
masuk ke mode [Link] itu AT Command? AT Command adalah perintah-perintah yang digunakan
dalam komunikasi dengan serial port,hal ini juga berlaku untuk modul HC 05 sehingga user bisa mengubah
status master dan slave,nama bluetooth,baud rate,dan pasword nya.
Cara masuk ke AT command ini sangat mudah dan simpel dikarenakan tidak membutuhkan program ataupun
software khusus.
EXERCISE :
*hubungkan pin RX ke RX
*hubungkan pin TX ke TX
*hubungkan VCC ke 5 volt DC dari arduino
*hubungkan GND ke gnd arduino
***untuk masuk ke mode AT command ini , RX hubungkan ke RX TX hubungkan ke TX
Setelah itu masukkan program kosong dari arduino IDE ke board arduino seperti di bawah ini :
*tekan dan tahan tombol pada modul bluetooth HC-05 dan pasang kabel arduino
ke port usb komputer/laptop anda.
*lepas setelah terpasang selama 3 detik
*maka lampu pada modul bluetooth akan berkedip secara perlahan
*kemudian masuklah ke serial monitor arduino ide di pojok kanan atas
*setting seperti di bawah ini yaitu plih Both NL & CR dan 38400 baud
*ketik AT kemudian send
*akan muncul pesan error,tapi itu bukan masalah .Ketik saja lagi AT
Untuk lebih jelasnya bisa dilihat di datasheet Modul bluetooth HC-05 itu sendiri.
CHALANGE :
2. Buatlah sebuah rangkian dimana disana terdapat 3 buah rangkaian led dan rangkaian Bluetooth seperti
gambar dibawah, lalu cobalah buat program serial Available agar rangkaian LED dapat di control dengan
Android.
SKEMA RANGKAIAN
HINT SOURCE CODE :
1 /*
2 * INTERACTIVE ROBOTICS
3 * Program controling dengan Android
4 */
5
6 int lampu1=13;
7 int lampu2=12;
8 int lampu3=11;
9 int melihat;
10
11 void setup() {
12 pinMode(lampu1, OUTPUT);
13 digitalWrite(lampu1,LOW);
14 digitalWrite(lampu2,LOW);
15 digitalWrite(lampu3,LOW);
16 [Link](9600);
17 }
18
19 void loop() {
20 if([Link]()>0){
21 melihat=[Link]();
22 }
23 if(melihat==’1’){
24 digitalWrite(lampu1,HIGH);
25 }
26 else if(melihat==’2’){
27 digitalWrite(lampu1,LOW);
28 }