Senin, 25 Oktober 2010

TPA81 : Coding Kontrol Motor Servo

.
Mungkin agak telat dan nanti akhir maret akan kupindahkan post ini di bulan Oktober 2010 bersamaan dengan penjelasan sensor TPA81.

Penjelasan sebelumnya di post : TPA81 : Mengendalikan Motor Servo
dan sekarang akan saya bahas cara mengendalikan motor servo melalui sensor TPA81.

Coding TPA81 + Servo
Coding disamping TPA_address nya 0xD0

fungsi unsigned char TPA_wirte(char value) ganti dengan void TPA_write(char value), berfungsi untuk menulis data pergerakan sudut servo dan besarnya sudut ditentukan dari nilai value-nya.

Nilai value minimal adalah 0x00 atau 0 dan maksimal adalah 0x1F atau 31 nilai selain itu menyebabkan kontrol motor servo terhenti.

Pengulangan servo dari nilai variabel loop dan nilai sudut servo dari variabel x. Selain itu pada fungsi TPA81_write terdapat tundaan 10mS yang dibutuhkan oleh komunikasi I2C

Coding disamping terdiri dari 3 bagian yaitu :
  • Kontrol motor servo dari nilai 0 hingga nilai 32 dengan tundaan antar nilai adalah 0 mS (sebenarnya 10mS). Fungsi ini akan diulang sebanyak 5 kali.
  • Kontrol motor servo dari nilai 0 hingga nilai 32 dengan tundaan antar nilai adalah 100 mS (sebenarnya 110mS). Fungsi ini akan diulang sebanyak 3 kali.
  • Kontrol motor servo dari nilai 0 hingga nilai 32 dengan tundaan antar nilai adalah 250 mS (sebenarnya 260mS). Fungsi ini akan diulang sebanyak 1 kali.
Coding diatas masukkan langsung di coding sebelumnya yaitu :


Video-nya sudah saya buat dan nanti diupload.

Semoga membantu ...^^v...

Minggu, 24 Oktober 2010

TPA81 : Mengendalikan Motor Servo

Modul Sensor TPA81 adalah sensor thermopile array yang menggunakan mikrokontroller tipe PIC16F88. Selain berfungsi untuk mengakses dan membaca sensor suhu, juga ditambahkan fitur pengendalian motor servo. Oleh sebab itu terdapat pin kontrol motor servo.

Pin ini disediakan dengan maksud sebagai pendukung kerja sensor TPA81 namun tidak menutup kemungkinan digunakan untuk keperluan yang anda inginkan.

Motor servo yang digunakan berfungsi sebagai tempat sensor TPA81 diletakkan yang kemudian motor servo bergerak ke kiri-kanan (atau sesuai keinginan) sehingga dapat digunakan metode scanning untuk mendeteksi / membaca suhu.

Motor Servo
Pada datasheet sensor TPA81, contoh motor servo yang digunakan adalah motor servo Hitec HS-311 dengan spesifikasi berikut :
Link :
Motor Servo Hitec HS-311 A
Motor Servo Hitec HS-311 B



Jika tidak memiliki motor servo tipe tersebut maka bisa digantikan dengan tipe sejenisnya / spesifikasinya mirip, khususnya pada pewaktuan untuk mengontrol sudut pergerakan motor tersebut.

Register Command pada TPA81
Untuk mengakses motor servo, register yang digunakan adalah register 0.
Ingat register ini memiliki fungsi yang berbeda ketika di Baca dan ketika di Tulis.

Saat di Tulis register 0 akan berfungsi sebagai Command register, yaitu register yang akan memberikan perintah posisi motor servo.

Saat di Baca register 0 akan memberikan informasi versi softaware yang diprogram pada modul TPA81.

Posisi Motor Servo
Nilai command / posisi motor servo yang dapat diberikan pada modul TPA81 sebanyak 32 step (nilai command : 0 - 31) dengan tipikalnya untuk mempresentasikan sudut 180 derajat.
Cara menghitung sudut motor servo adalah :

Posisi Motor Servo = (Nilai Command * 60) + 540 uS


Jika nilai command diberikan yaitu nilai 0 - 31 maka range pulsa-nya antara 540 uS hingga 2400 uS dan setiap step perubahan waktunya adalah 60 uS. Menulis nilai command selain 0 - 31 (misalnya 32, 33, 34, dst) akan menghentikan pulsa untuk motor servo.

Coding Motor Servo
Dari tabel tersebut maka nilai command yang dapat diberikan pada register 0 antar 0 - 31 atau 0x00 - 0x1F
Memberikan nilai selain itu akan menghentikan sinyal pulsa motor servo.

Bukannya g mau posting coding-nya, tapi memang belum pernah mencoba mengakses motor servo melalui TPA81. Jadi Codingnya belum ku posting.
Tar lagi nyoba kok, ini lagi nunggu pesanan motor servonya.
Servo datang-program-test-lalu Posting, OK. Sabar ya..

Saya bukan tipe orang yang memposting sesuatu yang belum saya coba sama sekali.
Semoga manfaat ... ^^v...
CMIIW..

Rabu, 20 Oktober 2010

TPA81 : Waktu Sampling Pengukuran

Baca dulu :
Seperti yang sudah saya tuliskan pada post sebelumnya, sensor TPA81 adalah sensor yang dapat mendeteksi dan mengukur suhu secara simultan pada 8 titik/pixel tanpa menyentuh sumber panas tersebut. Dan berbeda dengan sensor PIR yang hanya dapat mendeteksi perubahan suhu, sensor TPA81 dapat mengukur suhu statik (suhu tidak berubah) maupun suhu dinamis.
Oleh sebab itu, sensor TPA81 baik jika digunakan untuk akuisisi pengukuran suhu (pada range tertentu >> suhu relatih rendah).

TPA81 Waktu Sampling
Sensor TPA81 memiliki waktu sampling minimal untuk memperoleh data pengukuran suhu yang valid. Pada datasheet sensor TPA81 halaman 3 tertulis sebagai berikut :



Arti pada 2 kalimat terakhir begini (Bhs Inggris pas-pasan) :
Register 2 - 9 adalah 8 pixel suhu / temperatur.
Akuisisi (pengambilan data) suhu dilakukan secara terus-menerus dan pembacaan akan tepat sekitar 40 mS setelah sensor berada pada posisi yang baru.

Bisa diartikan bahwa, Agar data yang diperoleh valid dan benar maka sebaiknya pengambilan data suhu pada sensor TPA81 setiap minimal 40 mS.
Masalahnya adalah sensor TPA81 memiliki 8 pixel / titik pengukuran suhu, sehingga sedikit membingungkan apakah 40 mS itu untuk setiap pixel yang terdapat pada sensor TPA81 atau 40 mS untuk seluruh pixel tersebut.

Jika 40 mS untuk 8 pixel maka waktu sampling sensor TPA81 minimal adalah 40 mS.
Sedangkan jika 40 mS untuk 1 pixel maka waktu sampling sensor TPA81 keseluruhan minimalnya adalah 40 mS x 8 = 320 mS.

TPA81 Waktu Sampling 40 mS
Saya pribadi menggunakan waktu sampling 40 mS dan codingnya sebagai berikut :








TPA81 Waktu Sampling 320 mS
Beberapa Coding yang menggunakan waktu sampling ini dan codingnya sebagai berikut :

Perbedaannya hanya pada menempatkan fungsi delay_ms(40);




Oiya terlanjur upload lg..
Loopingnya ganti tuh nilainya seperti berikut :
for (x=0; x<=7; x++)

Buru-buru + ngantuk, jadi khilaf deh..
Semoga manfaat ... ^^v...
CMIIW..

Selasa, 12 Oktober 2010

TPA81 : Mengakses dgn Protokol I2C

.
Seperti telah dijelaskan pada posting sebelumnya bahwa sensor TPA81 menggunakan protokol I2C dan memiliki koneksi interface seperti gambar disamping.
Jangan lupa menambahkan Resistor Pull Up di sisi master (Mikrokontroller) dengan nilai yang direkomondasikan 1k8 ohm.
Pastikan semua interface / hubungan antara mikrokontroller dengan sensor TPA81 telah sempurna, dan modul mikrokontroller anda juga berfungsi dengan baik.

Modul sensor TPA81 juga dilengkapi dengan pin motor Servo serta fungsi tambahan untuk mengatur sudut pergerakan motor servo tersebut. Sehingga anda cukup memberikan data sudut dalam heksadesimal dan modul TPA81 secara otomatis akan mengendalikan motor servo tersebut. Fungsi ini sangat berguna jika anda meletakkan modul sensor TPA81 pada motor servo lalu menggunakan metode scanning untuk pendeteksian / pengukuran suhu.

TPA81 Register
Sebelum ke coding, beberapa register harus di ketahui terlebih dahulu, seperti terlihat pada gambar di samping.
Hanya Register 0, 1, 2, dan 3 yang dapat di baca/tulis sedangkan register lainnya dapat di baca saja.




Register 0 memiliki 2 fungsi, jika di Tulis maka akan berfungsi sebagai register Command yang memberikan perintah data mengatur posisi motor servo. Sedangkan jika di Baca akan memberikan infomasi versi refisi software / firmware modul TPA81.

Register 1, 2, 3 digunakan untuk melakukan proses kalibrasi pada sensor TPA81 dan disarankan untuk tidak menulis pada register ini karena dapat merusak data kalibrasi yang telah di program oleh manufakturnya. Tapi tidak perlu khawatir karena terdapat proteksi untuk proses penghapusan dan penulisan kalibrasi pada register-register ini yaitu penulisan perintah sebanyak 3 byte secara berurutan yang dapat mencegah penghapusan data kalibrasi secara tidak sengaja.

Register 1 jika di Baca akan memberikan data Temperatur Ambient.
Register 2 - 9 jika di Baca akan memberikan data Temperatur Pixel 1 - Pixel 8.

Coding TPA81
Program berikut mengunakan CodeVisionAVR v2.03.9
Langkah-langkah :
  • Jalankan CoViAVR, buat project baru, dan gunakan CodeWizzard, Chip misal : ATmega8535, Clock : 11.0592 MHz.
  • Tampilan menggunakan komputer komunikasi UART, Protokol : Baudrate :9600,8N1.
  • Tampilan LCD 16 x 2 padaPortB.
  • Modul sensor TPA81 SDA : PORTC.0 dan SCL : PORTC.1

Program sebagai berikut :

Wah terlanjur Upload..
Ada yang lupa tuh..
Berikan waktu kira-kira (minimal) 40 mS sebelum membaca kembali data suhu terukur pada modul TPA81 agar datanya valid.

Ada sedikit kerancuan yang saya lihat pada beberapa Coding dan akan saya bahas di posting selanjutnya.

Semoga manfaat ... ^^v...
CMIIW..

Sabtu, 09 Oktober 2010

TPA81 Thermopile Array










Beberapa link bacaan :

Link-link d atas sudah sangat menjelaskan bagaimana cara mengakses sensor Thermopile Array. Dan saya mencoba menjelaskan dengan versi saya dan mungkin tidak jauh berbeda dengan link-link tersebut. Dan semakin banyak referensi semakin baik bukan ^^.

Thermopile Array TPA81
Sensor TPA81 adalah sensor Thermopile Array yaitu sensor yang terdiri dari 8 buah / pixel sensor panas yang tersusun secara berbaris. Setiap pixel sensor ini mampu mendeteksi cahaya inframerah dengan range 2 µm - 22 µm yaitu range yang dimiliki oleh radiasi panas. TPA81 merupakan sensor non kontak yaitu mampu mendeteksi suhu suatu benda tanpa perlu menyentuhnya.

Sensor PIR atau Sensor Pyro-electric juga merupakan sensor pendeteksi suhu (tubuh manusia) dan juga sensor non kontak akan tetapi kelemahan sensor ini adalah hanya dapat mendeteksi jika terjadi Perubahan Suhu oleh sebab itu PIR tidak dapat digunakan pada pengukur dan pendeteksi suhu statik / tetap. Jika menggunakan sensor PIR maka salah satu harus bergerak agar terjadi perubahan suhu yaitu objek-nya yang bergerak (Manusia berjalan didepan sensor PIR) atau sensor PIR-nya dibuat bergerak (dengan motor stepper / servo).

Field Of View (FOV)
Sensor TPA81 memiliki luas pandang /pendeteksian yang lebar karena dilengkapi dengan lensa dan rangkaian elektronik built in selain itu mampu mendeteksi cahaya lilin hingga jarak 2 meter tanpa terpengaruh cahaya lainnya. FOV TPA81 mencapai 41° x 6° sehingga setiap pixelnya memiliki FOV 5.12° x 6°.

Posisi Pixel pada sensor TPA81 sejajar dengan orientasi panjang PCB-nya dan pixel 1 ditunjukkan / terdekat dengan tanda tab / "topi" pada sensor Thermopile-nya seperti pada gambar disamping.





Koneksi / Interface I2C
Sensor TPA81 menggunakan komunikasi I2C (Inter Integrated Circuit) yang menggunakan 2 jalur saja yaitu SDA (Serial Data) dan SCK (Serial Clock) tetapi jangan lupa menggabungkan Ground-nya (Jika menggunakan 2 power supply). Oleh sebab itu komunkasi dengan sensor TPA81 juga menggunakan protokol I2C.

Resistor Pull Up sangat diperlukan pada jalur SDA dan SCK dengan nilai yang direkomondasikan adalah 1,8 Kohm akan tetapi saya mencoba dengan nilai 2200 ohm dan tidak ada masalah. Jika resistor Pull Up tidak terpasang maka data yang akan terbaca akan selalu konstan / sama meskipun sensor TPA81 didekatkan / dijauhkan terhadap lilin. Ketika saya mencoba tanpa resistor Pull Up, semua pixel TPA81 membaca data dengan nilai 191 ada juga yang 255 semua seperti pada link ini :
http://www.ccsinfo.com/forum/viewtopic.php?p=135506.

Karena menggunakan jalur I2C maka anda dapat memparallelkan jalur SDA dan SCK untuk mengakses perangkat I2C lainnya atau mengakses 8 buah sensor TPA81 untuk aplikasi Thermal Imaging 2 dimensi atau menampilkan pembacaan temperatur secara matriks dengan 8 x 8 = 64 pixel. Saya ingin mencoba tapi mengeluarkan biaya 8 x 1,2 juta = 9,6 juta hanya untuk ujicoba,
Wadduuuhhh....

Sensor TPA81 pada komunikasi I2C akan selalu menjadi Slave dan tidak mungkin Master. Hal yang perlu diingat jika mengakses 8 buah TPA81 adalah resistor Pull Up 1K8 ohm pada SDA dan SCK diletakkan sedekat mungkin dengan Master (Mikrokontroller anda) sehingga hanya ada 2 buah resistor Pull Up, hal ini karena pada sensor TPA81 telah terpasang resistor pull up internal dan tidak memerlukan resistor pull up tambahan.

Pada aplikasi CodeVisionAVR telah tersedia library yang berfungsi untuk mengakses komponen yang menggunakan komunikasi data menggunakan format I2C yaitu pada library I2C.h sehingga dapat mengakses dengan mudah sensor TPA81.
Untuk memahami cara komunikasi menggunakan protokol I2C, misalnya pada salah satu link berikut : http://www.robot-electronics.co.uk

Pin Do Not Connect (Jangan dihubungkan), sesuai dengan artinya jangan di hubungkan kemanapun. Pin Do Not Connect digunakan oleh pabriknya untuk memprogram mikrokontroller PIC16F88 pada modul TPA81 yaitu jalur CPU MLCR dan memiliki internal pull up.
Saya menghubungkan pin ini dan memberikan logika 1 atau logika 0 ke pin ini tapi tidak ada masalah, namun untuk amannya sebaiknya JANGAN dihubungkan (Ga tanggung jawab klo rusak lho).

Semoga manfaat... ^^v....

Kamis, 30 September 2010

RPM Motor DC : Menghitung kecepatan dalam RPM

Baca dulu :

Berikut ini adalah langkah terakhir dalam menentukan kecepatan putaran motor DC dalam RPM (Revolutions Per Minute) , dan untuk mengingat kembali, berikut spesifikasinya :
  • Motor DC satu arah.
  • Sensor berupa encoder piringan menggunakan lubang.
  • Lubang = logika 0, No lubang = logika 1.
  • Banyak lubang 4 buah dengan perbedaan 90 derajat.
  • Update nilai RPM setiap 1 detik.
  • Interupsi encoder dengan mode Falling Edge / NGT

Logika perhitungan RPM
Encoder yang digunakan adalah tipe piringan yang menggunakan lubang atau garis hitam-putih, banyaknya lubang adalah 4 buah lubang maka 1 putaran = 4 lubang.







Kasus 1: Interupsi eksternal mendeteksi 2400 lubang dalam waktu 1 menit yang berarti :
  • 1 menit terdeteksi 2400 lubang (Clock lubang), maka
  • 2400 / 4 = 600 putaran atau 600 RPM
Kasus 2: Interupsi eksternal mendeteksi 1800 lubang dalam waktu 30 detik yang berarti :
  • 30 detik = 30/60 = 0,5 menit
  • 1800 / 4 = 450 putaran dalam 30 detik, maka
  • 450 / 0,5 = 900 RPM
Kasus 3: Interupsi eksternal mendeteksi 60 lubang dalam waktu 200 mS yang berarti :
  • 200 mS = 200 / 60000 = 0,0033333 menit
  • 60/ 4 = 15 putaran dalam 200 mS, maka
  • 15 / 0,0033333 = 4500,045 RPM
Kasus 4: Interupsi eksternal mendeteksi 100 lubang dalam waktu 1 S yang berarti :
  • 1 S = 1 / 60 = 0,016667 menit
  • 100 / 4 = 25 putaran dalam 1 S, maka
  • 25 / 0,016667 = 1.499,97 RPM

Coding CoViAVR
Pada post sebelumnya, Timer yang digunakan adalah timer 8 bit, lalu interupsi eksternal menggunakan mode falling edge, tampilan data RPM akan ditampilkan ke komputer melalui port serial dengan protokol 9600,8,N,1.

Langkah-langkah :
  • Jalankan program CoViAVR, buat project baru, dan gunakan CodeWizzardAVR.
  • Atur komunikasi serial, interupsi Eksternal dan timer 8 bit.

























Selanjutnya silahkan lihat coding berikut :

Oiya.. lupa aktifin kedap-kedip LED-nya..
Silahkan koreksi sendiri ya..
Udah teranjur d upload gambarnya..
CMIIW.. Ok.

Semoga manfaat ;)

Selasa, 28 September 2010

RPM Motor DC : Pengaturan Timer 8 bit

.
Seperti yang saya katakan sebelumnya bahwa pengaturan timer 8 bit agak sulit dibanding pengaturan timer 16 bit karena timer 8 bit memiliki nilai 0 - 255 sedangkan timer 16 bit bernilai 0 - 65536.
Nilai frekuensi yang digunakan adalah 10.800 Hz dan untuk mendapatkan nilai 10.800 counting, timer 8 bit tidak mampu menghitungnya sehingga digunakan variabel / memori tambahan agar dapat diperoleh 10.800 counting.

Perhitungan Nilai Counting Timer
Nilai frekuensi clock yang digunakan adalah 10.800 Hz atau 10,8 kHz dan timer 8 bit hanya mampu hingga 255 hitungan maka :
10.800 / 255 = 42.35294
10.800 / 250 = 43.2
10.800 / 220 = 49.0909
10.800 / 200 = 54
10.800 / 180 = 60
10.800 / 108 = 100
Dari nilai-nilai diatas jangan gunakan nilai pecahan karena kurang akurat dan gunakan nilai yang hasilnya bulat (dan maksimum) atau nilainya 200, maka :
255 - 200 = 55 atau 0x37 dalam heksadesimal.

Nilai 55 atau 0x37 adalah nilai Start Value timer yang akan digunakan sedangkan nilai 54 atau 0x36 adalah nilai memori counting, jika nilai memori telah sama dengan 54 berarti frekuensi telah mencapai 1 Hz.

Pengaturan Timer 0 / 8 bit Timer
Timer 0 pada AVR (ATmega8535) adalah timer 8 bit sehingga mempunyai Counting Value dari 0 - 255 atau 0x00 - 0xff.
Langkah-langkah pengaturan timer :
  • Diatas kertas tentukan nilai counting yaitu 200 counting yaitu Start Value = 55 atau 0x37 dan memori counting = 54 atau 0x36.



  • Gunakan CodeWizzardAVR dan tentukan jenis Chip serta Clocknya. Saya gunakan ATmega8535 dengan clock 11.059.200 Hz atau 11,0592 MHz.
  • Pada Tab timer sub tab Timer 0 dan atur seperti pada gambar.










  • Berikan nilai awal timer (Timer Value) 0x37 agar didapatkan counting sebanyak 200 pada timer 0.
  • Buat global variabel dengan nama unsigned char cnt_1Hz;
  • Untuk mengecek benar tidaknya, gunakan coding berikut yang akan mematikan dan menyalakan LED pada PORTC setiap 1 Hz.



  • Jika nyala LED telah sesuai, selesai dah.
Next : fiuhh cape.. tar dlu dah..

Semoga Manfaat ;)

RPM Motor DC : Pengaturan Timer 16 bit

.
Setelah merancang dan membuat alat dengan sempurna selanjutnya mengatur timer agar selalu mengupdate nilai PWM setiap 1 detik.
Seperti yang saya katakan sebelumnya, update setiap 1 detik sebenarnya cukup lama tetapi agar mudah memahami penggunaan timer maka digunakan nilai 1 detik

Perhitungan Nilai Counting Timer

Mikrokontroller AVR memiliki jantung berupa clock internal ataupun external dengan satuan MHz dan clock ini juga digunakan oleh Timer sebagai pemicu counting yang menyebabkan Value Timer bertambah hingga terjadi Overflow.
Pada AVR Timer/Counter : Introduction saya umpamakan seperti menaiki tangga dan frekuensi menaiki tangga tersebut maksimum senilai dengan nilai Clock kristalnya.

Clock yang akan saya gunakan pada mikrokokntroller AVR adalah 11,0592 MHz sehingga nilai Clock timer maksimum 11,0592 MHz dan ini sangat cepat.
Oleh sebab itu gunakan prescaler yaitu faktor pembagi clock, prescaler ini menjadi faktor pembagi sumber clock sehingga nilai clock yang ke timer menjadi lebih kecil. (Datasheet ATmega8535 hal 85/321)

Pada CodeWizzardAVR telah dibuat faktor pembaginya (prescaler) sehingga kita hanya tinggal menggunakan saja. Nilai frekeunsi yang akan digunakan pada sumber clock dibawah nanti adalah nilai clock terendah yaitu 10,8 kHz atau 10.800 Hz.

1 detik adalah 1 Hz sehingga jika ingin update nilai RPM setiap 1 detik maka interupsi timer diatur setiap 1 Hz / 1 detik. Yaitu clock timer 10.800 Hz dibagi dengan nilai tertentu sehingga didapatkan 1Hz maka:

10.800 Hz / 10.800 = 1 Hz artinya overflow yang akan mengaktifkan interupsi terjadi ketika Timer Value telah mengcounting 10.800 hitungan.

Pengaturan Timer 1 / 16 bit Timer
Timer 1 pada AVR (ATmega8535) adalah timer 16 bit sehingga mempunya Counting Value dari 0 - 65535 atau 0x0000 - 0xffff.
Pertama kali saya mencoba membahas timer 16 bit karena lebih mudah dipahami akan tetapi timer yang digunakan pada perancangan nanti adalah timer 8 bit. Alasannya karena menggunakan timer 8 bit agak sulit akan tetapi output PWM OC1A dan PWM OC1B lebih sering digunakan khususnya pada aplikasi mobil robot yang harus mengatur kecepatan motor DC kedua rodanya, sehingga sebisa mungkin gunakan timer 0 terlebih dahulu.

Langkah-langkah pengaturan timer :

  • Diatas kertas tentukan nilai counting yaitu 10.800 counting maka :
65.535 - 10.800 = 54.735
54.735 = 0xD5CF dalam nilai heksadesimal.
Nilai 0xD5CF adalah nilai awal timer (Start Value)
  • Buka aplikasi CoViAVR dan buat Project baru.
  • Gunakan CodeWizzardAVR dan tentukan jenis Chip serta Clocknya. Saya gunakan ATmega8535 dengan clock 11.059.200 Hz atau 11,0592 MHz.
  • Pada Tab timer sub tab Timer 1 dan atur seperti pada gambar.










  • Berikan nilai awal timer (Value) 0xD5CF agar didapatkan counting sebanyak 10.800 counting.
  • Untuk mengecek benar tidaknya, gunakan coding berikut yang akan mematikan dan menyalakan LED pada PORTC setiap 1 Hz / 1 detik.
  • Jika nyala led telah sesuai, selesai dah.

Next : RPM Motor DC : Pengaturan Timer 8 bit

Semoga Manfaat ;)

Selasa, 21 September 2010

RPM motor DC : Perancangan Alat

.
Saya akan mencoba menulis salah satu aplikasi dalam menggunakan timer.
Pada kasus ini mikrokontroller berfungsi sebagai penghitung kecepatan putaran motor DC dengan satuan RPM atau Tachometer.
Spesifikasi :
  • Motor DC satu arah.
  • Sensor berupa encoder piringan menggunakan lubang.
  • Lubang = logika 0, No lubang = logika 1.
  • Banyak lubang 4 buah dengan perbedaan 90 derajat.
  • Update nilai RPM setiap 1 detik.
  • Interupsi encoder dengan mode Falling Edge / NGT
Update nilai 1 detik sebenarnya cukup lama, nilai 1 detik dipilih agar nanti penjelasan pada timernya mudah dipahami.

Rangkaian Encoder
Rangkaian sensor encoder banyak diinternet dan sensornya pun banyak dijual di pasaran dengan harga terjangkau. Selain itu juga bisa dibuat menggunakan sensor cahaya seperti LDR atau sensor phototransistor atau sensor InfraRed meskipun hasilnya kurang presisi dibanding menggunakan sensor encoder.
Seperti pada link berikut :
http://letsmakerobots.com/node/12293
http://thedenneys.org/pub/robot/encoders/

Tambahan :
  • Gunakan IC 74HC14 (untuk kecepatan tinggi dan jika lubang pada piringan encoder sangat banyak) atau 74LS14 (murah dan kecepatan rendah) agar output pada sensor encoder menjadi kotak sempurna (Sinyal digital).
  • Setelah rangkaian encoder selesai, uji coba dulu rangkaian tersebut dengan menggunakan AVOmeter, jangan lanjut ke proses selanjutnya jika belum sempurna.
  • Pasang rangkaian tampilan indikator LED di port mikrokontroller sebagai indikator Lubang terdeteksi.
Diagram Blok Alat
Gambar diagram blok dibawah ini adalah perancangan alat yang akan digunakan.
Output sensor Encoder menjadi input IC 74HC14 agar sinyalnya menjadi kotak sempurna yang menjadi input digital INT0 (Interupsi 0) pada port mikrokontroller AVR.
Pada PORTC.0 ditambahkan LED indikator yang LED ini akan menyala atau mati (toggle) setiap terdeteksi lubang pada encoder.
Output PWM pada timer 1 OC1A digunakan untuk mengendalikan kecepatan motor DC.

Atur Interupsi Sensor
Hubungkan output sensor Encoder pada mikrokontroller pin INT0 atau INT1 (terserah tapi harus sesuai dengan codingnya). Interupsi yang saya coba pilih adalah interupsi 0 / INT0.

Buka aplikasi CoViAVR dan gunakan CodeWizzardAVR seperti berikut : Pilih : Falling edge / NGT.









  • Low Level : Sinyal input akan dianggap interupsi jika sinyal input berada pada Low Level / Logika 0.
  • Any Change : Sinyal input akan dianggap interupsi jika terjadi perubahan sinyal dari logika 0 - logika 1 atau logika 1 ke logika 0.
  • Falling Edge : Sinyal input akan dianggap interupsi jika terjadi perubahan input dari logika 1 ke logika 0.
  • Rising Edge : Sinyal input akan dianggap interupsi jika terjadi perubahan input dari logika 0 ke logika 1.
Pada fungsi interupsi eksternal INT0 tulis sebagai berikut :
(Jangan lupa DDRC.0 = 1 yaitu PORTC.0 sebagai output)
Program chip dan coba cek lagi sensor encodernya.

Uji coba dan LED pada PORTC.0 harus mati-nyala-mati-nyala setiap sensor encodernya di halangi-tidak dihalangi (dengan benda gelap). Klo belum cek rangkaian sampai sempurnya.

Next : RPM Motor DC : Pengaturan Timer 16 bit

Semoga manfaat ;)

Senin, 20 September 2010

AVR Timer : Timer Value and Compare Match

.
Penggunaan Timer secara mendasar yaitu scanning Timer Value setiap saat, yaitu dengan cara mengaktifkan timer lalu timer akan counting secara otomatis dan pada Main loop (program utama) selalu deteksi nilai counting timer (Timer Value), dan jika counting timer = timer yang diinginkan, maka selanjutnya lakukan proses yang diinginkan.

Seperti pada contoh sebelumnya, anda ingin counting hanya sebanyak 250 counting (dari 0 - 249) lalu setiap saat pada Main Loop mengecek register Timer Value apakah telah mencapai 250 hitungan atau tidak, maka hal ini membuang siklus waktu, memperlambat proses, dan tidak efisien.
Sedangkan jika menggunakan flag OV (OverFlow) sebagai detektor, pada timer 8 bit flag OV akan aktif jika counting timer lebih dari 255 (OV = nilai 256) yang artinya nilainya kelebihan 6 counting dari nilai counting 250 yang diinginkan.
Oleh sebab itu dibutuhkan solusi lain yaitu dengan menggunakan Start Value (Timer Value) atau Compare Match.

Start Value

Start Value timer adalah nilai awal Timer Value saat proses counting timer terjadi. Yaitu dengan menentukan nilai awal timer, misal Timer Value = 0x05h maka timer tidak dimulai dari 0x00 tetapi dari nilai 0x05. Timer Value adalah register nilai timer yang terus bertambah sebagai counting timer.

Compare Match
Compare Match adalah membandingkan nilai Timer Value dengan nilai tertentu yang telah didefinisikan pada register pembanding. Jika nilai Compare Match dan Timer Value telah sama maka flag pada status akan set dan Timer Value akan reset (ke nilai awal 0x00 / nilai yg telah didefinisikan).

Mode Timer CTC
AVR memiliki fungsi spesial yang disebut "Clear on Timer Compare" atau CTC. Mode operasi CTC terjadi secara hardware dengan membandingkan nilai timer (Timer Value) saat ini dengan nilai timer yang ditentukan. Dan karena terjadi secara hardware maka tidak perlu secara software untuk terus mengecek Timer Value saat ini, cukup dengan melihat status flag-nya saja. Selain itu mode CTC secara otomatis akan mereset nilai Timer Value menjadi 0x00 jika nilai pembanding timer telah sama, dan anda lakukan hanya mereset flagnya saat nilai timernya tercapai.

Sumber : www.avrfreaks.net dan datasheet AVR.
(Panjang bener bacanya... Bahasa inggris jadi agak pusing artiinya... T T)




Pada post selanjutnya akan saya coba beri contoh menghitung putaran motor DC menggunakan interupsi timer.

CMIIW ...^^v...

Rabu, 15 September 2010

AVR Timer/Counter : Introduction

.
Kali ini saya mencoba share mengenai Timer/Counter.
Topik ini baru saya pelajari dari datasheet dan internet.
Jadi harap maklum jika masih ada kesalahan pemahaman.
Mohon koreksinya. ^_^v

Timer/Counter adalah 2 hal yang serupa tapi tak sama.
Jika dimisalkan anda berlari jarak 100 meter dengan waktu tempuh 20 detik sebanyak 150 langkah maka 20 detik adalah timernya, 150 langkah adalah counternya, dan kecepatannya 5 m/s.

Untuk aplikasi yang umum misalnya seperti mengukur kecepatan motor DC dengan menggunakan encoder yang menggunakan piringan-hitam putih sebagai sensor detektor encoder maka keliling piringan hitam-putih adalah jarak, time sampling adalah timernya dan banyaknya count hitam-putih adalah langkahnya.
Sebelum ke aplikasi sebaiknya pahami dulu dasarnya.

Dasar Timer
Semua AVR memiliki fitur Timer/Counter 8 bit, ada pula yang memiliki timer 16 bit. Timer/Counter bisa sebagai Timer jika menggunakan internal clock atau sebagai Counter jika pin external digunakan sebagai sumber clock untuk menghitung (counting). Beberapa AVR juga dapat menggunakan kristal 32,768 KHz sebagai sumber eksternal clock.

Timer/Counter pada AVR bekerja secara asinkron dengan AVR Core atau dengan kata lain Timer/Counter memiliki sirkuit yang terpisah dengan AVR Core sehingga dapat bekerja secara independen pada Main program, berinteraksi dengan control dan count register, dan berinteraksi dengan interupsi timer. Timer pada AVR dapat digunakan untuk menghasilkan Output pada pinnya seperti pada penggunaan PWM.


Gambar disamping adalah ilustrasi timer 8 bit dan timer 16 bit.
Jika timer dimisalkan anak tangga, timer 8 bit memiliki 256 anak tangga dengan nilai 0-255 (0x00 - 0xFF) dan timer 16 bit memiliki 65536 anak tangga dengan nilai 0-65535 (0x0000 - 0xFFFF).

Counting timer seperti menaiki anak tangga tersebut satu-persatu dengan waktu yang tetap.
Misalkan anda menaiki 1 anak tangga setiap 1,5 detik maka pada nilai 255 total waktu anda adalah 1,5 x 255 = 382,5 detik, sehingga tampak bahwa timer adalah counter dengan waktu yang periodik.
Jika telah mencapai 255 dan masih naik terus maka akan terjadi OverFlow (melimpah/kelebihan nilai) yang berarti flag overflow (tanda terjadi OV) akan SET yaitu berlogika 1 dan nilai register counting akan mulai dari 0 (reset) atau mulai dari anak tangga 0.
Overflow ini dapat digunakan sebagai interupsi atau fungsi lainnya.

t pada gambar adalah resolusi waktu dengan persamaan 1/frekuensi sumber clock.
Jika menggunakan sumber clock dengan frekuensi 250 Hz maka resolusi waktu adalah 1/250 Hz = 0.004 detik.
Jika pada aplikasi anda menggunakan timer untuk LED mati 1 detik dan nyala 1 detik sedangkan sumber clock yang anda gunakan adalah 250 Hz yang memiliki resolusi 0.004 detik maka:
  • 0.004 detik x Count = 1 detik
  • Count = 1 / 0.004
  • Count = 250
Didapatkan nilai Count = 250 yang artinya nilai counting timer untuk mendapatkan 1 detik adalah dari 0-250, sehingga masih bisa menggunakan timer 8 bit.
Sebaliknya jika sumber clock yang digunakan mencapai 1000 Hz dengan resolusi waktu 1/1000 = 0.001 detik maka :
  • 0.001 detik x Count = 1 detik
  • Count = 1 / 0.001
  • Count = 1000
Nilai Count 1000 tidak bisa menggunakan timer 8 bit secara langsung dan ada 2 cara mengatasinya yaitu menggunakan timer 16 bit atau menggunakan timer 8 bit yang diulang 4 kali
(4 x 250 = 1000).

Mencari ilmu tidak cukup hanya untuk mengetahui tapi untuk dipahami."
Semoga Manfaat ;)

Senin, 05 Juli 2010

Tips membuat sendiri "Downloader USB".

.
Sudah banyak modul / dongle untuk memprogram Mikrokontroller AVR.
Menggunakan port serial, parallel, dan USB, yang termurah dan termudah adalah menggunakan port parallel selain itu port parallel memliliki kecepatan program yang tinggi dibanding dengan port serial maupun USB. Oleh sebab itu untuk memprogram banyak chip mikrokontroller dengan kecepatan tinggi sebaiknya menggunakan port parallel karena menggunakan port USB atau port serial akan memakan waktu lama. Akan tetapi laptop sekarang sudah tidak mendukung dan menyediakan port parallel hanya tersedia pada PC, oleh sebab itu dibutuhkan dongle USB yaitu programmer yang memprogram mikrokontroller menggunakan port USB.

Judul post Tips membuat sendiri "Downloader USB" di beri tanda petik karena dongle ini tidak benar-benar di buat sendiri, melainkan mencontoh dan meniru dongle USB yang dibuat orang lain.
Akan tetapi mengubah string atau nama pembuat yang akan tampil di Device Manager sehingga tampak seperti buatan sendiri.

Membuat Hardware

Berikut informasi singkat membuat hardwarenya.
Sumber link-linknya :
www.fischl.de/usbasp
www.scienceprog.com
www.fun4diy.com
www.ulrichradig.de

Ingat yang tidak disarankan pada rangkaian ini adalah menggunakan Power Supply dari port USB untuk memberikan tegangan ke rangkaian mikrokontrollernya karena bisa merusak port USB tersebut.
Rangkaian skematiknya :





"Dongle USB-ku"

Setelah membuat hardwarenya atau membeli USB ISP untuk memprogram AVR, pasang di port USB dan instal drivernya kamudian cek di device manager maka akan muncul nama pembuat Dongle USB tersebut, seperti Kli*** Ro***, K-1**, dll bahkan driver USB-RS232 Converter seperti PL2*** serial port COM juga bisa di ubah data stringnya.

Tips ini intinya adalah bagaimana mengubah string tersebut menjadi nama yang anda inginkan seperti : USB buatanku, Dongle USBku, Downloader USB AVR Usahaku, dll.
Caranya pada link berikut ;

www.payztronics-store.com/forum/Dongle USB

Semoga manfaat ;)

Jumat, 02 Juli 2010

Konversi Angka ASCII menjadi nilai

.
Interface dengan komputer menjadi hal yang wajib untuk aplikasi berbasis mikrokontroller, tetapi komunikasi yang terjadi khususnya data ASCII harus diolah terlebih dahulu. Pengolahan ASCII angka (string angka) penting jika data tersebut akan dikalkulasi pada proses perhitungan / aritmatika di mikrokontroller agar hasil perhitungannya tidak salah.
Oleh sebab itu dibutuhkan suatu fungsi mengubah data string (angka ASCII) menjadi nilai bertipe integer, float, atau char pada mikrokontroller.

Menerima Data ASCII
Sumber data ASCII yang datang ke mikrokontroller bisa dari berbagai macam seperti : Komputer, mikrokontroller lain, input keypad, perangkat wireless, dll, yang penting anda paham bahwa data yang dikomunikasikan adalah data ASCII. Oleh sebab itu sebaiknya anda memahami dan mengetahui apa itu data ASCII, jika tidak, akan susah untuk memahami selanjutnya. Searching di google atau di post-post sebelumnya.
Link tabel ASCII : ASCII

Pada kasus ini, data ASCII diterima dari komputer melalui port serial (COM) yaitu komunikasi secara serial asinkron (USART).
Baca link-link berikut : Tutorial komunikasi data.

Cara I : Buat Fungsi sendiri
Agar mudah saya menggunakan fungsi getchar() seperti pada coding berikut :









Misal data yang akan dikirim dari komputer adalah "12345" maka proses yang terjadi di MCU yaitu:
  1. Menunggu karakter dari komputer dengan fungsi getchar().
  2. Data diterima akan disimpan di variabel buf_rx[x] dengan nilai x yang bersesuaian.
  3. Data diterima adalah buf_rx[0]='1', buf_rx[1]='2', buf_rx[2]='3',buf _rx[3]='4', buf_rx[4]='5'.
  4. Ubah data ASCII angka menjadi nilai heksadesimal. ASCII '1' = 0x31 heks oleh sebab itu agar nilai heksadesimalnya menjadi 0x01, nilai tersebut harus dikurangi 0x30 sehingga '1'-0x30 = 0x01. Maka '1'-0x30=0x01, '2'-0x30=0x02, '3'-0x30=0x03, '4'-0x30=0x04, '5'-0x30=0x05.
  5. Gabungkan nilai tersebut sehingga di dapat nilai integer yang sebenarnya. Maka 1 x10000 + 2x1000 + 3x100 + 4x10 + 5 = 12345 (dua belas ribu tiga ratus empat puluh lima).
  6. Ambil data yang telah dikonversi lalu tampilkan data yang diterima di LCD (Optional).
  7. Selesai deh.
Cara II : Menggunakan Library stdlib.h
Fungsi strtoint ini memang terbatas yaitu komunikasi harus 5 buah data. Pada library CoViAVR telah ada fungsi atoi (Array to Integer) pada library stdlib.h. dan lebih sederhana tuh ^^.




Semoga manfaat ;)

Rabu, 09 Juni 2010

Ask : Mengubah string angka menjadi nilai

.
Asker : CJDW dan Lufi
About :
Konversi tipe string (karakter angka) ke nilai (integer,float,char)
Question :
mas gimana cara membaca suatu nilai (smua tipe data baik integer, float, sting dll) dalam dunia USART.?? Kan kalau pake getchar kan fungsi yg cuma menerima sebuah karakter saja.
soalnya aku coba baca nilai 234 misal dari komuter pake USART yg kebaca '4' pake getchar.. gimana caranya? suwun nggih

Too PayZ:
Mikrokontroller AVR ATmega8535 atau uC 8 bit sejenisnya, memiliki buffer komunikasi data UART yaitu register yang bernama UDR. Register UDR ada 2 buah, masing-masing bernilai 8 bit / 1 byte yaitu 1 byte UDR buffer untuk menerima data dan 1 byte UDR buffer untuk mengirim data. Setiap terjadi penerimaan / pengiriman data satu huruf, angka, atau nilai, data ini disimpan di UDR penerima / pengirim. Karena UDR bernilai 1 byte sehingga hanya mampu menerima / mengirim 1 data pada 1 waktu.

Fungsi getchar() sebenarnya membaca data yang tersimpan pada buffer UDR sehingga hanya menerima 1 data ASCII pada satu waktu, oleh sebab itu dibutuhkan memori yang berfungsi sebagai buffer tambahan agar data ASCII yang terbaca satu-satu tersebut bisa diolah dan digabungkan menjadi 1 buah nilai.
Sehingga data '1', '2', '3', '4' akan menjadi 1234 (integer).

Sama seperti pertanyaan pada : Angka pd LCD lebih dari 1 digit
maka akan saya bahas dalam 1 postingan berikut :
Konversi Angka ASCII menjadi nilai

Semoga manfaat ;)

Sabtu, 05 Juni 2010

Ask : Angka pd LCD lebih dari 1 digit

.
Asker : Masyunan
About :
LCD lebih dari 1 digit.
Question :
mas mo tanya,tentang cara menulis LCD dengan keypad lebih dari 1 digit...thx...

Too PayZ:
Logika menampilkan digit angka dan huruf pada LCD hampir sama tetapi pengolahan di dalam mikronya berbeda. Jika huruf lebih mudah dan hanya mengatur posisi x dan y, bahkan dengan menggunakan perintah putsf dan menghitung banyaknya huruf (karakter) yang digunakan sudah dapat menampilkan huruf dengan posisi tertentu.

Untuk angka berbeda dan lebih rumit karena pengolahan terjadi 2 kali :
  1. Pada LCD yaitu pegaturan posisi x dan y, lebih rumit lagi jika bergeser kekiri atau kekanan setiap ada angka / digit baru yang ditampilkan.
  2. Pada Mikrokontroller yaitu mengubah angka yang diberikan (diinputkan) menjadi sebuah nilai untuk pengolahan aritmetika (matematika) yang akan diproses selanjutnya.
Ada juga yang bertanya pada : Mengubah string angka menjadi nilai
"mas gimana cara membaca suatu nilai (smua tipe data baik integer, float, sting dll) dalam dunia USART.?? Kan kalau pake getchar kan fungsi yg cuma menerima sebuah karakter saja.
soalnya aku coba baca nilai 234 misal dari komuter pake USART yg kebaca '4' pake getchar.. gimana caranya? suwun nggih"

Pertanyaan serupa tapi mirip ;)
Bedanya yang satu dapat input dari keypad kemudian di tampilkan di LCD.
Yang satu lagi dapat input dari komputer kemudian di tampilkan di LCD.

Yang dapat input dari komputer umumnya berupa string angka '1', '2', '3', '4', '5', dst sedangkan yang dapat input dari keypad bisa berupa string angka atau nilai heksadesimal tergantung programmernya.

Saran saya, semua data dikonversi menjadi string (data ASCII), meskipun menggunakan keypad. Data pada keypad tetap berupa string karena keypad selain angka juga suatu saat akan menanpilkan huruf.
Jadi anda bisa membuat fungsi scanning keypad seperti pada keypad HP (Handphone).
Ditekan 1x huruf 'A', 2x huruf 'B', 3x huruf 'C', dan 4x string '1', dst.

Silahkan baca posting ini untuk pertanyaan anda : Konversi Angka ASCII menjadi nilai

Semoga manfaat ;)

Rabu, 02 Juni 2010

Ask : Array dalam bahasa C

.
Asker : Haglan
About :
Array dalam bahasa C.
Question :
mw tanay nih arti program ini apa (int global_array2[]={1,2,3};) trus( int global_array2[]={1,2,3};) trus (char global_array4[]="This is a string";) tlng bantuannya

Too PayZ:
Mungkin pertanyaan Haglan diatas berkaitan dengan pertanyaan yang ini:
"bos mw tnya nih .... langkah2 merubah pdu ke teks gmna yah ?? secara program gmn yh mhn bantuannya ."

Saya sudah 3 kali mengerjakan perangkat berbasis SMS.
Perangkat pertama dan kedua menggunakan mode PDU dengan menggunakan bahasa Assembler mikrokontroller AT89S51, sedangkan perangkat ketiga menggunakan Modem SIM300 menggunakan mode TEXT dengan bahasa C AVR mikrokontroller ATmega8535.
Diantara mode TEXT dan mode PDU, mode PDU cukup sulit dan secara Coding lebih susah dipahami serta fleksibilitasnya kurang.

Saran saya, untuk aplikasi menggunakan SMS sebaiknya menggunakan perangkat yang telah mendukung mode TEXT. Perangkat anda bisa memiliki fleksibilitas tinggi dan selalu bisa di upgrade atau dikembangkan untuk aplikasi yang luas.

Pertanyaan int global_array2[]={1,2,3};) trus( int global_array2[]={1,2,3};) trus (char global_array4[]="This is a string"; salah satunya digunakan klo aplikasi SMS dengan mode PDU.
Pada aplikasi ini variabel global array ini digunakan sebagai RAM untuk menyimpan data yang akan berfungsi sebagai pembanding, yaitu membandingkan data yang akan dibaca pada PDU SMS dengan data yang kita inginkan (yang disimpan pada global_array).

Saya jelaskan untuk aplikasi secara umum saja ( saya rubah sedikit).
A => int global_array1[]={1,2,9};
B => signed int global_array2[]={-260,1,2,9,500};
C => unsigned char global_array3[]={'1','9','C','$','G'};
D => char global_array4[]="This is a string"

Contoh A
A => int global_array1[]={1,2,9};
Pada contoh A global variabel tipenya adalah int dengan nilai range 0-65535 (secara default int akan diubah menjadi unsigned int oleh CodeVisionAVR) oleh sebab itu selama nilai berada pada jangkauan 0-65535, tidak akan menghasilkan error pada program (Compiler mungkin tidak mengeluarkan pesan error).
Penulisan Array bisa seperti ini int global_array1[3]={1,2,9}; itu jika jumlah array diketahui (sedikit) yaitu 3 buah array, tetapi jika jumlah array banyak atau tidak diketahui (atau malas menghitungnya) dapat dituliskan seperti ini int global_array1[]={1,2,9}; selanjutnya nanti compiler yang urus.
Contoh A seolah-olah dituliskan seperti ini:
int global_array1[0]=1; //array selalu dimulai dari 0 (nol).
int global_array1[1]=2;
int global_array1[2]=9;

Contoh B
B => signed int global_array2[]={-260,1,2,9,500};
Pada contoh B global variabel tipenya adalah signed int dengan nilai range -32768 - 32767
(Penjelasan sama dengan contoh A).
Contoh B seolah-olah dituliskan seperti ini:
int global_array2[0]=-260; //array selalu dimulai dari 0 (nol).
int global_array2[1]=1;
int global_array2[2]=2;
int global_array2[3]=9;
int global_array2[4]=500;

Contoh C
C => unsigned char global_array3[]={'1','9','C','$','G'};
Pada contoh C global variabel tipenya adalah unsigned char dengan nilai range 0 - 255.
Karakter yang terdapat pada keyboard, text, LCD karakter, dll menggunakan ASCII dengan nilai range 0-255 sehingga tidak mungkin bernilai negatif.
(Penjelasan sama dengan contoh A).
Contoh C seolah-olah dituliskan seperti ini:
int global_array3[0]='1';
// ingat 1 tidak sama dengan '1'
//1 = 0x01 sedangkan '1' = 0x31; heksa desimal
//atau 1 = 1 sedangkan '1' = 49; desimal
int global_array3[1]='9';
int global_array3[2]='C';
int global_array3[3]='$';
int global_array3[4]='G';

Contoh D
D => char global_array4[]="This is a string"
Pada contoh D global variabel tipenya adalah char dengan nilai range 0 - 255 (secara default char akan diubah menjadi unsigned char oleh CodeVisionAVR).
Karakter yang terdapat pada keyboard, text, LCD karakter, dll menggunakan ASCII dengan nilai range 0-255 sehingga tidak mungkin bernilai negatif.
(Penjelasan sama dengan contoh A).
Contoh D seolah-olah dituliskan seperti ini:
int global_array4[0]='T';
int global_array4[1]='h';
int global_array4[2]='i';
int global_array4[3]='s';
int global_array4[4]=' '; // karakter spasi'
int global_array4[5]='i';
int global_array4[6]='s';
int global_array4[7]=' '; // karakter spasi
int global_array4[8]='a';
int global_array4[9]=' '; // karakter spasi
int global_array4[10]='s';
int global_array4[11]='t';
int global_array4[12]='r';
int global_array4[13]='i';
int global_array4[14]='n';
int global_array4[15]='g';

Selengkapnya baca Help CodeVisionAVR
Semoga manfaat ;)

Senin, 19 April 2010

Panel Surya Atap Rumah

.
Depan












Belakang

















Mikrokontroller AVR












Servo X, Y, dan Sensor Cahaya LDR










Topik yang Populer