Mengakses EEPROM pada Mikrokontroler AVR

Meng-akses EEPROM internal AVR dilakukan dengan menggunakan global variable, diawali dengan atribut memori eeprom atau __eeprom.

/* Nilai 1 disimpan dalam EEPROM saat chip programming */
eeprom int alfa = 1;
eeprom char beta;
eeprom long array1[5];

/* Sebuah string disimpan dalam EEPROM selama chip programming */
eeprom char string[]="Hello";

void main(void) 
{
  int i;

/* Pointer to EEPROM */
  int eeprom *ptr_to_eeprom;

/* Menulis 0x55 langsung ke EEPROM */
  alfa=0x55;
/* atau tidak langsung dengan menggunakan sebuah pointer */
  ptr_to_eeprom=&alfa;
  *ptr_to_eeprom=0x55;

/* Membaca nilai langsung dari EEPROM */
  i = alfa;
/* atau tidak langsung dengan menggunakan sebuah pointer */
  i = *ptr_to_eeprom;
}

Menggunakan PID pada Robot Line Follower

Ingin membuat robot yang dapat mengikuti garis? Dengan kecepatan rendah, prosesnya cukup mudah. Jika sensor membaca arah pergerakan ke kiri, arah robot digerakkan ke kanan, demikian sebaliknya. Proses ini memiliki batasan terutama ketika kecepatan dinaikkan dan bentuk lintasan yang berkelok-kelok. Untuk kasus demikian, umumnya digunakan pengendali PID.

PID singkatan dari Proportional, Integral, Derivative. Pengendali PID meggunakan perhitungan matematika untuk memproses data dari sensor dan menggunakannya untuk mengendalikan arah dan/atau kecepatan robot. Mengapa PID bisa lebih baik dibanding model sederhana di atas?

Perilaku Robot ketika Mengikuti Garis

Misalnya robot kita memiliki 3 sensor, kiri, tengah dan kanan. Ketika sensor tengah melihat garis, robot diprogram untuk bergerak lurus. Ketika sensor kiri melihat garis, robot diprogram untuk belok ke kanan. Ketika sensor kanan melihat garis, robot diprogram untuk belok ke kiri. Dengan pemrograman demikian, robot akan bergerak “bergelombang” di atas garis, dan jika terlalu cepat, maka akan kehilangan kendali dan berhenti mengikuti garis (garis merah pada gambar di samping).

Metoda ini hanya memperhatikan satu perilaku saja, yakni, robot harus selalu berada di tengah garis. Untuk meningkatkan performance, kita harus memperhatikan dua perilaku lainnya – berapa cepat robot bergerak dari satu sisi ke sisi lain dan berapa lama dia tidak berada di tengah garis. Ketiga perilaku ini disebut Proportional, Integral dan Derivative dalam terminologi pengendali PID.

Berikut adalah beberapa definisi dari beberapa terminologi yang digunakan dalam PID:

Target Position – Untuk mengikuti garis, posisi ini adalah tengah garis. Kita akan merepresentasikannya dengan nilai nol.

Measured Position – Seberapa jauh ke kiri atau ke kanan terhadap garis. Nilai ini dapat negatif atau positif untuk merepresentasikan posisi relatif terhadap garis.

Error – Perbedaan antara target position dan measured position.

Proportional – Mengukur berapa jauh robot kita keluar dari garis. Proportional merupakan dasar untuk membaca posisi robot dengan menggunakan sensor. Semakin banyak data, semakin akurat kita dapat mengukur posisi robot di atas garis.

Integral – Mengukur akumulasi error terhadap waktu. Nilai integral naik ketika robot tidak berada di tengah garis. Semakin lama robot tidak berada di tengah garis, semakin tinggi nilai integral.

Derivative – Mengukur seberapa sering robot bergerak dari kiri ke kanan atau dari kanan ke kiri.

Faktor P – Kp, adalah konstanta yang digunakan untuk memperbesar dan memperkecil pengaruh dari Proportional.

Faktor I – Ki, adalah konstanta yang digunakan untuk memperbesar dan memperkecil pengaruh dari Integral.

Faktor D – Kd, adalah konstanta yang digunakan untuk memperbesar dan memperkecil pengaruh dari Derivative.

Dengan mengkombinasikan nilai Proportional, Integral dan Derivative, kita dapat mengendalikan pergerakan robot secara lebih presisi, dibanding hanya menggunakan Proportional. Perilaku ideal ditunjukkan oleh garis merah pada gambar di kiri. Pergerakan robot menjadi lebih “halus”, tidak “bergelombang” seperti sebelumnya, dan robot lebih “sering” berada di tengah garis.

Performance keseluruhan penerapan PID bergantung pada jumlah dan tingkat presisi dari sensor dan kemampuan dari mikrokontroler yang digunakan.

Paparan di atas adalah prinsip di atas kertas. Dalam praktek, bagian-bagian terkait harus disesuaikan agar optimal untuk karakteristik robot yang digunakan. Begitu pun nilai Kp, Ki dan Kd yang digunakan, perlu penyesuaian sehingga hasilnya maksimal.

NEXT SYSTEM Robotics Learning Center, mulai bulan Mei 2009, mengadakan kelas pelatihan khusus “Pemrograman Robot Line Following”. Selain mempelajari konsep penjejakan garis dan pengendalian dengan PID, peserta pun akan belajar bagaimana melakukan performance tuning sehingga hasilnya optimal.

Untuk informasi lebih lanjut mengenai kelas pelatihan di atas serta perangkat robot yang digunakan, silahkan menghubungi:

NEXT SYSTEM
Robotics Learning Center
ITC Kosambi F2
Jl. Baranang Siang 6-8, Bandung 40112

Tel. (022) 4222062, 085100775874
WhatsApp 085102238024

Email: info@nextsys.web.id

http://edukasi.nextsys.web.id

Line Sensor pada Line Follower

Pada aplikasi Robot Line Follower, ada sejumlah pilihan line sensor yang dapat digunakan. Yang paling sederhana menggunakan LDR, dengan menggunakan prinsip pembagi tegangan. Tipikal, LDR memiliki resistansi sekitar 1 M dalam keadaan gelap gulita, dan memiliki resistansi di bawah 1 K dalam keadaan terang benderang. Namun, LDR memiliki respons yang agak lambat, sehingga untuk line follower yang lebih agresif, perlu mempertimbangkan penggunaan photodioda atau phototransistor yang lebih responsif  ~ 1 uS.

Berikut adalah dua rangkaian line sensor sederhana berbasis phototransistor. Rangkaian kiri dapat digunakan sebagai sensor analog, sementara rangkaian kanan dapat digunakan sebagai sensor digital.

Bila memerlukan informasi produk dan pelatihan terkait dengan mikrokontroler dan robotik, silahkan menghubungi:

NEXT SYSTEM
Robotics Learning Center
ITC Kosambi F2
Jl. Baranang Siang 6-8, Bandung 40112
Tel. (022) 4222062, 085100775874
WhatsApp 085102238024

Email: info@nextsys.web.id

Memrogram Mikrokontroler AVR

AVR memiliki dua mode pemrograman: Parallel Programming Mode (Parallel Mode) dan Serial Downloading Mode (ISP mode).

Pada Parallel Mode, divais yang akan diprogram ditempatkan pada soket pemrograman dan diperlukan tegangan 12V pada pin RESET. Komunikasi antara programmer dan divais dilakukan dengan perintah pemrograman secara paralel. Kecepatan pemrograman dua kali lebih cepat dibanding ISP Mode. Cara pemrograman ini biasanya digunakan dalam pre-program dan/atau ISP Mode tidak dapat digunakan karena faktor disain. Kebanyakan programmer, kecuali STK500, kelihatannya tidak mendukung mode ini.

Pada ISP Mode, divais berkomunikasi melalui interface SPI untuk memprogram dan mem-verifikasi. Mode ini hanya memerlukan tiga jalur sinyal tanpa tegangan pemrograman 12 Volt, sehingga dapat langsung memprogram sistem target – ISP (In-System Programming). Hanya saja, ISP Mode tidak dapat merubah fuse bit pada beberapa divais, dan beberapa divais tidak memiliki fitur ISP. Divais seperti ini harus diprogram secara paralel.

Ketika menggunakan AVR dengan ISP Mode, target board harus dirancang dengan mempertimbangkan fungsi ISP, yang menggunakan pin ISP : RESET, SCK, MISO dan MOSI. Pin ISP dapat berbagi antara fungsi I/O dan ISP dengan memuaskan. Ketika menggunakan pin I/O yang memiliki fungsi ISP, harap diperhatikan hal-hal berikut:

a. Sisipkan sebuah resistor antara pin RESET dan rangkaian reset untuk menghindari interferensi dari rangkaian reset.
b. Pastikan bahwa aksi ISP tidak menimbulkan efek pada fungsi lain.
c. Jangan men-drive dari rangkaian luar saat operasi ISP berlangsung, atau bila dikehendaki demikian, perlu disisipkan sebuah resistor.
d. Jangan menghubungkan dengan beban berat karena akan mempengaruhi fungsi ISP.

Sensor Temperatur LM35

LM35 dari National Semiconductor adalah sebuah sensor temperatur centigrade presisi, yang memiliki tegangan output analog. Memiliki jangkauan pengukuran -55ºC hingga +150ºC dengan akurasi ±0.5ºC. Tegangan output adalah 10mV/ºC. Tegangan output dapat langsung dihubungkan dengan salah satu port mikrokontroler yang memiliki kemampuan ADC, misalnya ATmega8535.

ADC pada ATmega8535 memiliki resolusi 10-bit, yang dapat memberikan keluaran 2^10 = 1024 nilai diskrit. Bila digunakan catu referensi 5V, resolusi yang dihasilkan adalah 5000mV/1024 = 4.8mV. Karena LM35 memiliki resolusi output 10mV/ºC, maka resolusi termometer yang dibuat dengan ATmega8535 adalah 4.8mV/10mV ~ 0.5ºC.

Beberapa varian LM35:

  • LM35, LM35A memiliki jangkauan -55ºC hingga +150ºC.
  • LM35C, LM35CA memiliki jangkauan -40ºC hingga +110ºC.
  • LM35D memiliki jangkauan 0ºC hingga +100ºC.

Saat ini, tersedia sejumlah besar sensor temperatur yang lebih cerdas serta mudah penggunaannya, misalnya DS1820. Hasil pengukuran sudah dalam bentuk digital, dan dikirimkan ke mikrokontroler secara serial.

Berikut adalah contoh program pembacaan sensor LM35 dan menampilkan besaran temperatur pada layar Serial Monitor. Program dibuat dengan software NS.One:

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  int sensor = analogRead(0);
  float temp = (float) sensor * 500.0 / 1024.0;
  Serial.println(temp);
  delay(1000);
}

Pemrograman Mikrokontroler PIC dengan Bahasa C

Mikrokontroler PIC 16F877 merupakan salah satu produk dari Microchip yang sangat populer. Hadir dalam beberapa kemasan, namun yang umum beredar di pasaran umum adalah PDIP 40. Mikrokontroler ini memiliki flash 8kB, 33 buah port I/O, 8 kanal ADC dan 2 kanal PWM; sehingga cukup ideal untuk diterapkan dalam aplikasi robotika.

Ada sejumlah compiler bahasa tingkat tinggi yang tersedia untuk PIC, diantaranya MikroC yang berbasis Bahasa C. Pemrograman dengan MikroC cukup mudah. Kelihatannya, pihak pengembang ingin memanjakan penggunanya, sehingga dalam beberapa bagian, kemudahan menjadi keterbatasan. Anyway, untuk pembelajar pemula atau mereka yang ingin meng-aplikasikan mikrokontroler PIC secara cepat, MikroC merupakan produk yang bisa dipertimbangkan.

Bagi mereka yang ingin mempelajari mikrokontroler PIC dengan cepat, NEXT SYSTEM Robotics Learning Center yang berlokasi di Bandung, menyelenggarakan kelas pelatihan Pemrograman Mikrokontroler PIC dengan Bahasa C, BASIC dan Pascal. Peserta pelatihan bisa mendapatkan PIC 16F877 dengan harga sangat ekonomis.

Silahkan menghubungi telepon (022) 4222062 atau email info@nextsys.web.id untuk informasi lebih lanjut.

Pemrograman Mikrokontroler dengan Bahasa C

Kembali ke era kegelapan dari mikroprosesor, dimana pengembangan software dilakukan secara eksklusif dengan bahasa assembly yang spesifik dari divais tertentu. Bahasa assembly ini menggunakan mnemonic sebagai pengganti dari kode numerik bahasa mesin. Untuk menuliskan 0x12 0x07 0xA4 0x8F yang akan memerintahkan chip untuk memasukkan sebuah nilai ke sebuah lokasi memori, kita dapat menuliskannya demikian dengan bahasa assembly: MOV 22, MYBUFFER+7. Program assembler akan menerjemahkan perintah tersebut ke dalam kode mesin.

Saya pernah menulis kode dalam bahasa mesin sewaktu kuliah dulu, dan percayalah saat saya mengatakan bahwa bahasa assembly merupakan langkah maju dalam upaya meningkatkan produktivitas. Namun, bahasa assembly untuk sebuah piranti terikat dengan piranti tersebut. Sulit untuk menjadi mahir di dalam bahasa assembly karena ketika mikrokontroler yang dimaksud kadaluarsa atau hilang dari pasaran, maka apa yang kita pelajari pun menjadi mubazir. Bahasa assembly merupakan bahasa dengan tujuan tertentu yang hanya bekerja pada chip tertentu. Bila kita menguasai bahasa assembly untuk chip Motorola, tidak secara otomatis kita akan menguasai bahasa assembly untuk chip Zilog.

Bagaimana dengan bahasa tingkat tinggi? Seperti Bahasa C misalnya?

Bahasa tingkat tinggi umumnya dikembangkan untuk tujuan umum, untuk pemakain secara luas. Bahasa C merupakan salah satu bahasa tingkat tinggi yang banyak diminati. Sekali kita belajar C, kita dapat berpindah dengan mudah diantara keluarga mikrokontroler, menulis software dengan lebih cepat dan kode yang dibuat lebih mudah dimengerti dan di-maintain. Namun harus dicatat, mikrokontroler yang dimaksud harus memiliki C compiler yang ditulis untuknya. Dengan kata lain, kita bisa membuat program dalam bahasa C untuk mikrokontroler AVR, bila tersedia C compiler untuk AVR.

Saat ini, tidak sulit mencari C compiler untuk mikrokontroler yang beredar di pasaran, walaupun harus sedikit menunggu untuk chip-chip keluaran terbaru.

Satu produk C Compiler open source untuk mikrokontroler AVR, yang cukup banyak diminati, adalah WinAVR, yang dapat diunduh dari http://sourceforge.net/projects/winavr. WinAVR dapat diadaptasikan ke dalam AVR Studio IDE yang memiliki GCC plug-in.

Sensor Cahaya

Sejumlah divais elektronik sederhana dapat digunakan sebagai “mata” pada robot.

Photoresistor atau sel CdS (cadmium-sulfide)

Sel CdS memiliki resistansi yang nilainya bergantung pada cahaya yang diterimanya. Bila tidak ada cahaya yang mengenainya, resistansi-nya sangat tinggi, sementara ketika dikenai cahaya, nilai resistansi-nya turun. Sel CdS sangat mudah dihubungkan dengan komponen elektronik lainnya, namun yang harus diperhatikan, komponen ini memiliki reaksi yang lambat, tidak dapat “menangkap” lampu kilat lebih dari 20 atau 30 kali per detik.

Photodiode

Merupakan versi dioda dari phototransistor. Satu karakteristik umum dari kebanyakan photodiode adalah, outputnya rendah, bahkan ketika dikenakan cahaya terang. Agar memberikan output yang efektif, biasanya, output photodiode dihubungkan dengan sebuah penguat. Tidak seperti sel CdS, reaksi photodiode sangat cepat, dapat “menangkap” lampu kilat puluhan ribu kali per detik.

Phototransistor

Merupakan photodiode dengan penguatan internal. Kemasannya sama dengan transistor biasa, dengan bagian atas terbuka. Namun ada juga yang berbentuk mirip dengan photodiode. Reaksi phototransistor sedikit lebih rendah dibanding photodiode.

 

Mikrokontroler AVR Seri Tiny

AVR Tiny merupakan mikrokontroler yang mengesankan dan ekonomis. Secara fisik cukup kecil, namun di dalamnya tidak demikian. AVR Tiny mengusung arsitektur AVR RISC yang kompatibel dengan semua mikrokontroler AVR. Mereka memiliki In System Programming (ISP), Flash Memory, Internal EEPROM dan RAM, Timer, Interupsi, Analog Comparator, ADC dan yang lainnya.

Berikut adalah beberapa anggota keluarga ATtiny, namun tidak semuanya tersedia di Indonesia:

  • ATtiny11 1-Kbyte In-System programmable Flash Program Memory, 32 byte SRAM, Up to 6 MIPS throughput at 6 Mhz.
  • ATtiny12 1-Kbyte In-System programmable Flash Program Memory, 32 byte SRAM, 64 Byte EEPROM, Up to 8 MIPS throughput at 8 Mhz.
  • ATtiny13 1-Kbyte In-System programmable Flash Program Memory, 64-Byte SRAM, 64-Byte EEPROM, 32-Byte Register File, 4-channel 10-bit A/D, Up to 20 MIPS throughput at 20 Mhz.
  • ATtiny15L 1-Kbyte In-System programmable Flash Program Memory, 64-Byte EEPROM, 32-Byte Register File, 4-channel 10-bit A/D, Up to 1.6 MIPS throughput at 1.6 MHz.
  • ATtiny2313 2K Bytes of In-System Self-Programmable Flash, 128 Bytes In-System Programmable EEPROM, 128 Bytes Internal SRAM. USI–Universal Serial Interface, Full Duplex UART. debugWIRE for on-chip-debug. Up to 20 MIPS throughput at 20 MHz. Compatible with Obsolete AT90S2313.
  • ATtiny24 2K Bytes of In-System Self-Programmable Flash, 128 Bytes In-System Programmable EEPROM, 128 Bytes Internal SRAM. 8-bit and 16-bit timer/counters with PWM, 10-bit ADC, USI-Universal Serial Interface, On-chip Temperature Sensor. debugWIRE for on-chip-debug. Up to 20 MIPS throughput at 20 MHz. 1.8 – 5.5 V operation.
    * 8KB version: ATtiny84
    * 4KB version: ATtiny44
  • ATtiny25 2K Bytes of In-System Self-Programmable Flash, 128 Bytes In-System Programmable EEPROM, 128 Bytes Internal SRAM. Two 8-bit timer/counters with PWM and prescaler, 10-bit ADC, USI-Universal Serial Interface. debugWIRE for on-chip-debug. Up to 20 MIPS throughput at 20 MHz. 1.8 – 5.5 V operation.
    * 8KB version: ATtiny85
    * 4KB version: ATtiny45
  • ATtiny26 2K Flash Program Memory, 128 Bytes SRAM, 128-Byte EEPROM, 11-Channel 10-bit A/D converter. Universal Serial Interface. High Frequency PWM. Up to 16 MIPS throughput at 16 MHz.
  • ATtiny28L 2K Flash Program Memory, 32 bytes register file, Keyboard interrupt, high-current LED driver, Analog Comparator. Up to 4 MIPS throughput at 4 MHz.
  • ATtiny44 4K Bytes of In-System Self-Programmable Flash, 256 Bytes In-System Programmable EEPROM, 256 Bytes Internal SRAM. 8-bit and 16-bit timer/counters with PWM, 10-bit ADC, USI-Universal Serial Interface, On-chip Temperature Sensor. debugWIRE for on-chip-debug. Up to 20 MIPS throughput at 20 MHz. 1.8 – 5.5 V operation.
    * 8KB version: ATtiny84
    * 2KB version: ATtiny24
  • ATtiny45 4K Bytes of In-System Self-Programmable Flash, 256 Bytes In-System Programmable EEPROM, 256 Bytes Internal SRAM. Two 8-bit timer/counters with PWM and prescaler, 10-bit ADC, USI-Universal Serial Interface. debugWIRE for on-chip-debug. Up to 20 MIPS throughput at 20 MHz. 1.8 – 5.5 V operation.
    * 8KB version: ATtiny85
    * 2KB version: ATtiny25
  • ATtiny84 8K Bytes of In-System Self-Programmable Flash, 512 Bytes In-System Programmable EEPROM, 512 Bytes Internal SRAM. 8-bit and 16-bit timer/counters with PWM, 10-bit ADC, USI-Universal Serial Interface, On-chip Temperature Sensor. debugWIRE for on-chip-debug. Up to 20 MIPS throughput at 20 MHz. 1.8 – 5.5 V operation.
    * 4KB version: ATtiny44
    * 2KB version: ATtiny24
  • ATtiny85 8K Bytes of In-System Self-Programmable Flash, 512 Bytes In-System Programmable EEPROM, 512 Bytes Internal SRAM. Two 8-bit timer/counters with PWM and prescaler, 10-bit ADC, USI-Universal Serial Interface. debugWIRE for on-chip-debug. Up to 20 MIPS throughput at 20 MHz. 1.8 – 5.5 V operation.
    * 4KB version: ATtiny45
    * 2KB version: ATtiny25

Menggunakan Perintah RCTIME pada PBASIC

Dalam PBASIC, perintah RCTIME dapat digunakan untuk mengukur waktu charge dan discharge dari sebuah rangkaian resistor / kapasitor. Untuk mengukur resistansi dan kapasitansi, gunakan sensor resistif atau kapasitif seperti thermistor atau sensor kelembaban kapasitif atau potensiometer. Dalam penginderaan yang lebih luas, RCTIME dapat berfungsi sebagai stopwatch yang presisi untuk kejadian yang berdurasi sangat pendek.

Ketika RCTIME di-eksekusi, perintah ini akan memulai sebuah counter (menghitung jumlah unit waktu). Counter ini akan segera berhenti setelah pin yang ditentukan tidak lagi dalam kondisi 0 atau 1 (tergantung pada definisi yang diberikan). Gambar di bawah menunjukkan rangkaian RC yang cocok untuk digunakan dengan perintah RCTIME. Rangkaian A disarankan, karena ambang logika BASIC Stamp adalah sekitar 1.4 Volt. Ini berarti bahwa tegangan yang diamati pada pin akan dimulai pada 5V, kemudian turun hingga 1.4V (span 3.6V) sebelum RCTIME berhenti. Dengan rangkaian B, tegangan akan mulai pada 0V kemudian naik hingga 1.4V (span 1.4V) sebelum RCTIME berhenti.
Sebelum RCTIME di-eksekusi, kapasitor harus ditempatkan pada keadaan yang ditentukan dalam perintah RCTIME. Sebagai contoh, untuk rangkaian A, kapasitor harus di-charge hingga penuh (5V) terlebih dahulu.

Berikut adalah urutan instruksi tipikal untuk rangkaian A (asumsi menggunakan pin 7)”

result VAR Word
HIGH 7
PAUSE 1
RCTIME 7, 1, result
DEBUG DEC ? result
END

Pada BASIC Stamp 2, unit waktu adalah 2 µs, sementara pada BASIC Stamp 2p, unit waktu adalah 0.75 µs.