Category: Aplikasi Mikrokontroller AVR



Assalamualaykum.. :D
Akhirnya bisa update blog lagi uy..
setelah sekian lama disibukkan dengan kesibukan yang terus menerus datang menghampiri.. XD
Apa kabar nih sobat embedded-ist dan Roboticist?? :D
++ISTIMEWAAA…++ (Jawab ala Chibi.. XD)

Pada post kali ini saya akan membahas tentang penggunaan perangkat input digital yang berupa Keypad Matrix 4*4 ..
Tentu saja sobat sudah tau kan apa itu Keypad Matrix 4*4??
Secara umum keypad matrix 4*4 adalah 16 buah push button yang disusun / dirangkai dengan konnfigurasi matrix, sehingga memiliki index baris dan kolom..
Berikut contoh gambar dari keypad matrix 4*4 tersebut :

Keypad Matrix 4×4

Untuk rangkaiannya kira2 seperti ini :

Rangkaian Keypad Matrix 4×4

Penggunaan keypad matrix ini biasanya pada aplikasi yang membutuhkan banyak perangkat input teteapi pada kontrollernya (misal mikrokontroller) memiliki I/O yang terbatas..
Misalnya pada aplikasi input data untuk memasukkan nomor Hp, Nomor ID, Password, dll

Pertanyaannya adalah : Bagaimanakah cara membaca inputan dari keypad matrix ini dan mengetahui tombol manakah yang ditekan??
Itulah yang akan saya bahas pada artikel kali ini.
Kita akan sama2 belajar tentang bagaimana menggunakan Keypad Matrix 4*4 ini menggunakan BASCOM AVR dan mikrokontroller ATMega32.
Langsung saja, berikut adalah rangkaian yang akan kita gunakan :

Rangkaian Uji Coba

Secara garis besar, uji coba yang kita lakukan adalah membaca nilai output dari keypad matrix 4*4 dan ditampilkan ke LCD 16*2..
Langsung saja, berikut hasil uji cobanya :

Hasil Uji Coba

Prinsip kerja dari keypad matrix sebenarnya adalah menggunakan proses scanning Baris dan Kolom..
Pada Keypad Matrix 4*4 memiliki 4 buah Baris dan 4 buah kolom.
Jika kita menggunakan program scanning manual, maka salah satu dari Baris atau Kolom tsb harus di set sebagai output dan yang lainnya sebagai input (pada pin mikrokontroller yang terhubung dg keypad).

Pada contoh ini Kolom (PortD.0 – PortD.3) yang di set sebagai Output dan Baris sebagai Input (PinD.4 – PinD.7)
Langkah pertama adalah mengirimkan nilai 0001 pada Kolom, selanjutnya bit digeser ke kiri setiap 1 kali looping dan bila bit high (1) sudah mencapai bit paling kiri, maka diulangi lagi dari awal..
Sekuens-nya kira kira seperti ini : 0001 => 0010 => 0100 => 1000 => 0001 =>0010 =>…. dst

Kemudian untuk Baris (PinD.4 – PinD.7), semuanya di set sebagai input dengan nilai awal Low (0).
nah, dengan seperti ini ketika ada tombol yang ditekan, maka kita akan tahu tombol di koordinat manakah yang ditekan.
pada contoh gambar diatas, tombol yang ditekan adalah tombol B, Tombol B berada pada koordinat (Baris, Kolom) B(1,3).
Artinya : Ketika nilai Kolom = 0001, tombol yang terhubung ke PinD.5 DITEKAN.. atau nilai PortD.3 = 1 dan PinD.5 = 1
Terdengar rumit ha?? XDD

Diatas itu adalah algoritma cara membaca nilai keypad matrix secara manual..
Apabila kita memprogram menggunakan BASCOM AVR, hal diatas bisa dilakukan dengan jauuh lebih mudah.. XD
Karena pada BASCOM AVR telah disediakan fungsi untuk membaca keypad matrix 4*4.. :D
Fungsi itu adalah “GETKBD()”.. :D
Dengan fungsi Getkbd(), nilai dari tombol yang ditekan akan secara otomatis kita dapatkan!!
Sebagai contoh, pada gambar diatas ketika tombol “B” ditekan, maka fungsi Getkbd() akan memberikan nilai “7″..
Berikut tabel nilai yang akan diberikan oleh fungsi Getkbd() jika kita menggunakan rangkaian seperti pada contoh diatas :

Tombol yang ditekan      |       Nilai fungsi Getkbd()
‘                0                                          13
‘                1                                           0
‘                2                                           1
‘                3                                           2
‘                4                                           4
‘                5                                           5
‘                6                                           6
‘                7                                           8
‘                8                                            9
‘                9                                           10
‘                A                                            3
‘                B                                            7
‘                C                                           11
‘                D                                           15
‘                *                                           12
‘                #                                           14

Untuk Listing programnya, kira2 seperti ini :

 

'======================================================================================================
'joe4cva.wordpress.com
'Program : Mengakses Keypad 4*4 pada PortD
'Oleh : Pramudita Johan I.
'Elektronika Dan Instrumentasi
'Universitas Gadjah mada

$regfile = “m32def.dat” ‘Deklarasi mikrokontroller yang dipakai adalah ATMega32
$crystal = 12000000 ‘Deklarasi crystal yang dipakai adalah 11059200 Hz

Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
‘Mengkonfigurasi Pin LCD yang terkoneksi ke mikrokontroller
‘ Pin Db4 (Data Bus 4) = ke PortC.3
‘ Pin Db5 (Data Bus 5) = ke PortC.2
‘ Pin Db6 (Data Bus 6) = ke PortC.1
‘ Pin Db7 (Data Bus 7) = ke PortC.0
‘ Pin E (Enable) = ke PortC.4
‘ Pin RS (Register Select) = ke PortC.5
Config Lcdbus = 4 ‘Mengkonfig Bus LCD yang dipakai
Config Lcd = 16 * 2 ‘Mengkonfig type LCD yang dipakai (kolom * baris)
Cursor Off ‘Matikan cursor

Config Kbd = Portd , Debounce = 20 [ , Delay = 10]
‘mengkonfigurasi Keypad Matrix Pada Portd , Debounce = 20ms , Delay Antar Penekanan = 10ms
Dim Datakeypad As Byte ‘Deklarasi Variabel Datakeypad sebagai byte

Cls
Do
Datakeypad = Getkbd() ‘nilai variabel Datakeypad diambil dari keypad matrix
Locate 1 , 1
Lcd “Tes Keypad Matrx”
Locate 2 , 1
Lcd “Datakeypad : ” ; Datakeypad ; ” ” ‘tampilkan nilai datakeypad (NB : ketika tidak ada tombol yg ditekan, maka nilai datakeypad = 16)
Loop

‘============================================================================================

 

Demikian sedikit celotehan saya tentang Keypad Matrix 4*4.. Jika ada yang salah atau kurang,
mohon dikoreksi dan ditambahin via comment.. :D
Semoga Bermanfaat.. :D


Haloooo… :D
Welcome to my 2nd post in 2012..!! :D
Pada post kali ini ane mau membahas sesuatu yang sangat special (buat ane dan pacar ane tercinta).. :*
Sesuai judulnya, “Unwinged Angel’s Night Lamp” berarti Lampu Malam / Tidur Bidadari Tak Bersayap..
yap.. Unwinged Angel.. itu adalah panggilan sayang ane ke pacar ane (walopun kadang di bilang gombal).. :P
Ahahahahha..

“Sesuatu” yang ane bikin ini special cuma untuk pacar ane tercinta Alifia Assyifa.. :*
kenapa?? ya karena dia begitu special buat ane.. :*
#Aseeeekkkk… XD

My Unwinged Angel.. :*

Okee.. Sekarang penampakan dari “Sesuatu” yang ane bikin..

Night Lamp

Night Lamp

Beautiful.. :*

Okee.. sekarang ke bagian teknisnya..
Bagian yang menyala pada lampu diatas terbuat dari kristal Acrylic setebal 2 cm dan diukir menggunakan laser (laser engraving)..
Berikut spesifikasi detailnya :

  • Bagian yang menyala : Acrylic Crystal
  • Diukir dengan teknologi Laser Engraving
  • Dimensi : 17cm * 12cm * 2cm (p*l*t)
  • Mikrokontroller ATMega8
  • LED RGB 15 blok (masing2 blok terdiri dari sebuah LED Super Bright Merah, Hijau, dan Biru 3mm)
  • PWM Controlled
  • 16 mode nyala (via DIP Switch)
  •  Power Supply : 12V / 2A

Gambar PCB nya :

Board PCB

Jangan pada minta skematik ke ane gan, ane kalo gambar PCB ga pernah bikin skematiknya dulu.. :P
Bikin ribet soalnya..

Lampu ini memiliki 16 mode nyala yang bisa dipilih sesuai dengan mood dan suasana hati.. XD
Pemilihan mode nyala dapat dilakukan dengan cara mengubah posisi saklar pada DIP Switch 4 channel pada sisi kiri lampu..
Ke 16 mode nyala tersebut antara lain :

Pilihan Mode Nyala

  1. Red Blue : Kombinasi warna Merah dan Biru yang berubah dengan lembut (smooth)
  2. Red Green : Kombinasi warna Merah dan Hijau yang berubah dengan lembut (smooth)
  3. Blue Green : Kombinasi warna Biru dan Hijau yang berubah dengan lembut (smooth)
  4. Red Green Blue : Kombinasi warna Merah, Hijau, dan Biru yang berubah dengan lembut (smooth)
  5. Instant Change : Warna lampu berubah secara instan dengan urutan Merah => Orange => Kuning => Hijau => Turqoise => Cyan => Biru => Ungu => Pink => Merah
  6. Rainbow : Warna pelangi (mejikuhibiniu) yang ditampilkan secara bergantian dengan perubahan warna dengan lembut
  7. Colorfull : Hampir sama dengan Instant Change
  8. Red : Menyala merah dengan konstan
  9. Yellow : Menyala kuning dengan konstan
  10. Green : Menyala hijau dengan konstan
  11. Cyan : Menyala cyan dengan konstan
  12. Blue : Menyala biru dengan konstan
  13. Purple : Menyala ungu dengan konstan
  14. Pink : Menyala pink dengan konstan
  15. White : Menyala putih dengan konstan
  16. Padam : Lampu padam

Berikut Video nya :

 

Maap untuk Listing Programnya ane cuma bisa share sebagian aja..
Listing Program mode Red Blue :


'Author : Pramudita Johan Iswara
'Project : Unwinged Angel's Lamp
'Year : 2011 - 2012

$crystal = 12000000
$regfile = “m8def.dat”

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
Config Timer2 = Pwm , Compare Pwm = Clear Down , Prescale = 1 , Async = Off

Red Alias Ocr2
Green Alias Pwm1b
Blue Alias Pwm1a

Dim R As Bit , G As Bit , B As Bit

Red = 0
Blue = 255
Reset R
Set B

Do
If Red >= 254 Then Set R
If Red <= 1 Then Reset R
If Blue >= 254 Then Set B
If Blue <= 1 Then Reset B

If R = 0 And Red < 255 Then Incr Red
If B = 1 And Blue > 0 Then Decr Blue

If R = 1 And Red > 0 Then Decr Red
If B = 0 And Blue < 255 Then Incr Blue
Waitms 150
Loop

Lampu ini cocok bangett buat kado anniversary, kado pernikahan, hiasan rumah eksklusif, dll
Yang berminat bisa pesan ke ane dengan harga Rp 500.000,- (jika desain dari agan) dan
Rp 650.000,- (jika desain dari ane)
Ayoo ayoo dipesan gan.. :D


Assalamualaykum Wr. Wb.
wahaaa..
uda lamaa banget ga update blog uy..
buat pengunjung setia blog saya, saya minta maaf kalo uda 2 bulan lebih blog ini ga terupdate..
Dua bulan terakhir sibuk terus uy..
mulai dari ikutan INAICTA 2011, KP (Kerja Praktek), nyiapin robot buat IRO (International Robot Olympiad) 2011, bikin alat untuk dana hibah dari kampus, dll..

Nah pada post kali ini saya akan sedikit menulis sedikit tentang Fuzzy Logic (Logika Samar) yang dikombinasikan dengan PD (Proportional – Derivative) Controller.
nah kebetulan ada beberapa project saya yang memakai metode kontrol dengan algoritma ini, mulai dari robot Line Follower sampai prototype pengkondisi suhu dan kelembaban pada miniatur rumah jamur tiram (alat untuk dana hibah dari kampus).

Apa itu Fuzzy Logic??

Logika Fuzzy adalah peningkatan dari logika Boolean yang berhadapan dengan konsep kebenaran sebagian. Di mana logika klasik menyatakan bahwa segala hal dapat diekspresikan dalam istilah binary (0 atau 1, hitam atau putih, ya atau tidak), logika fuzzy menggantikan kebenaran boolean dengan tingkat kebenaran.

Logika Fuzzy memungkinkan nilai keanggotaan antara 0 dan 1, tingkat keabuan dan juga hitam dan putih, dan dalam bentuk linguistik, konsep tidak pasti seperti “sedikit”, “lumayan”, dan “sangat”. Dia berhubungan dengan set fuzzy dan teori kemungkinan. Dia diperkenalkan oleh Dr. Lotfi Zadeh dari Universitas California, Berkeley pada 1965.
(http://id.wikipedia.org/wiki/Logika_fuzzy)

Fuzzy Logic Sederhana

Dari ilustrasi gambar diatas, tentu temen – temen sudah mendapatkan gambaran tentang apa itu yang dinamakan Fuzzy Logic kan??
secara sederhana, Fuzzy Logic adalah suatu logika yang memperhitungkan nilai diantara “0″ dan “1″, “ya” dan “tidak”..
jadi kemungkinan yang akan muncul tidak akan berjumlah 2 lagi (hanya YA dan TIDAK), tetapi menjadi lebih banyak..
Misal : Tidak, Sangat Mendekati Tidak, Hampir Mendekati Tidak, Hampir Mendekati Ya, Sangat Mendekati Ya, dan Ya

Okee.. Cukup untuk pengenalan singkat tentang Fuzzy Logic nya..
Yang akan saya bahas lebih lanjut adalah penggunaan Fuzzy Logic + PD Controller pada sistem pengkondisi kelembaban udara pada miniatur rumah jamur tiram..

Gambar alatnya :

Miniatur Rumah Jamur Tiram

Sensor yang saya gunakan adalah sensor suhu dan kelembaban SHT11..
Gambar :

SHT11

Kemudian alat yang saya pakai untuk menaikkan kelembaban udara adalah “Ultrasonic Mist Maker”..
Gambar :

Ultrasonic Mist Maker

Berikut adalah 3 langkah mudah untuk memulai menggunakan Algoritma Fuzzy Logic Sederhana :

  1. Tentukan Parameter yang akan di fuzzy-fikasi
  2. Buat Tabel Linguistik (kelas data berdasarkan range nilai) dari parameter tersebut
  3. Bikin response eksekusi dari masing2 kelas data (de-fuzzy-fikasi) dari parameter tersebut

Nah, sekarang kita mulai mengaplikasikan Fuzzy Logic Sederhana tersebut dengan mengikuti langkah – langkah di atas..

  1. Parameter yang akan kita olah dengan Fuzzy Logic dalam kasus ini adalah Tingkat Kelembaban (Rh) dan Kecepatan Putar Kipas (PWM)
    Di sini Parameter Kelembaban adalah Parameter Input dan Parameter PWM adalah Parameter Output 
  2. Sekarang kita buat tabel linguistik dari dua parameter diatas. Misalnya seperti di bawah ini :

    Tabel Linguistik Rh

    Tabel Linguistik PWM

  3. Setelah Tabel Linguistik nya jadi, langkah selanjutnya adalah membuat response (Defuzzyfication) dari masing – masing kategori Parameter Input (Rh). Secara sederhana, proses defuzzyfication nya bisa dituliskan seperti di bawah ini :
    • Jika Rh = “Sangat Rendah”, maka PWM = “Sangat Pelan”
    • Jika Rh = “Rendah”, maka PWM = “Pelan”
    • Jika Rh = “Ideal”, maka PWM = “Normal”
    • Jika Rh = “Tinggi”, maka PWM = “Cepat”
    • Jika Rh = “Sangat Tinggi”, maka PWM = “Sangat Cepat”
    Nah, proses defuzzyfication seperti diatas masih memiliki kekurangan.
    Ya..
    Pada masing – masing kategori tersebut masih memiliki range nilai, sehingga kita akan banyak menuliskan tabel defuzzyfication untuk masing – masing nilai pada masing – masing kategori sehingga program menjadi kurang efisien terlebih lagi jika kita mengkehendaki kelembaban harus dipertahankan sesuai dengan yang kita inginkan..
    Untuk mengatasi hal tersebut, kita membutuhkan suatu algoritma kontroller yang berfungsi untuk menangani masalah seperti di atas.
    Kontroller yang biasa saya pakai adalah PD Controller (Proportional – Derivative Controller) sederhana.
    PD Controller adalah sistem kontrol dengan menggunakan konstanta KP dan KD untuk menangani error yang timbul dari suatu sistem. Error yang dimaksud di sini adalah selisih nilai pembacaan sensor terhadap nilai yang diharapkan.
    Misalkan kita mengharapkan kelembaban udara di dalam miniatur rumah jamur adalah 85%, sedangkan nilai kelembaban yang terbaca oleh sensor SHT11 adalah 82%, maka :
    Error = Nilai yang Diharapkan – Nilai yang Terbaca 
    Error = (85 – 82)%
    Error = 3%
    Jika kita menginginkan suatu sistem pengkondisi kelembaban udara dengan menggunakan PD Controller, maka tabel linguistik dari proses Fuzzy-fikasi parameter kelembaban dan nilai PWM akan sedikit bergeser, dimana kelembaban dan PWM yang dianggap sebagai kategori normal adalah nilai kelembaban dan PWM yang kita harapkan (sesuai setting yang di inputkan) ± 5% ..
    Kemudian akan muncul satu tabel linguistik baru, yaitu tabel linguistik nilai Error, dimana nilai error inilah yang akan diolah oleh PD Controller untuk menjaga nilai kelembaban udara relatif di dalam miniatur rumah jamur tsb.
    Tabel Linguistik Nilai Error :

    Tabel Linguistik Nilai Error

    Okee.. Selanjutnya kita masuk ke bagian PD Controller nya..
    Langsung saja, berikut adalah persamaan sederhana yang saya pake buat PD Controller nya :


    Do
    Error = Nilai_Referensi - Nilai_Terbaca
    Delta_Error = Error - Error_Sebelumnya
    Proportional = KP * Error
    Derivative = KD * Delta_Error

    Pwm_Rh = Pwm_Rh + Proportional
    Pwm_Rh = Pwm_Rh + Derivative
    If Pwm_Rh >= 255 then Pwm_Rh = 255
    if Pwm_Rh <= 0 then Pwm_Rh = 0

    If Nilai_Terbaca >= Nilai_Referensi then
    Reset Mist_Maker '(Matikan Mist Maker)
    Else
    Set Mist_Maker '(Nyalakan Mist Maker)
    End if

    Error_Sebelumnya = Error
    Loop

     

    Nilai Konstanta KP dan KD pada persamaan diatas didapatkan dengan memasukkan nilai konstanta tersebut pada settingan.
    Sistem kerja dari kipas yang dipakai adalah dengan meniupkan udara keluar dari miniatur rumah jamur, jadi ketika kelembaban di dalam sistem meningkat dan melebihi nilai referensi, maka Mist Maker dimatikan dan kecepatan putar kipas dalam membuang kelembaban udara keluar sistem akan semakin tinggi.Begitulah kira – kira tentang apa yang saya pahami sedikit tentang Fuzzy Logic dan PD Controller sederhana..
    Apabila terjadi miskonsep dan kerancuan saya mohon maaf dan mohon dikoreksi..
    Terima Kasih.. :DSemoga Bermanfaat.. :D

    Regards,

    joe4cva

Haloo temen2 semuaa.. :D
Aku ada mainan baru nih.. :D
Namanya sensor warna..!!
Sensor warna yang sederhana dan MURAH tentunya.. :D
ya.. MURAH.. Karena biaya pembuatannya ga sampai Rp 10.000,-

Komponen Sensor Warna ini antara lain :

  1. Photo Diode 3mm   x3
  2. LED Super Bright  Merah 5mm   x1
  3. LED Super Bright  Hijau 5mm   x1
  4. LED Super Bright  Biru 5mm   x1
  5. Resistor 1/4w 330, 4k7   @x3
    *Rangkaiannya sama persis kaya rangkaian sensor LF 

Prinsip Kerja :
Objek berwarna merah akan lebih banyak memantulkan cahaya warna merah
Objek berwarna hijau akan lebih banyak memantulkan cahaya warna hijau
Objek berwarna biru akan lebih banyak memantulkan cahaya warna biru

Karena ini merupakan rangkaian sensor warna yang sangat sederhana, maka sensor warna ini cuma bisa untuk membedakan 5 macam warna, yaitu :

  1. Merah
  2. Hijau
  3. Biru
  4. Putih
  5. Hitam

Langsung saja, berikut penampakan sensor warnanya :

Sensor Warna Sederhana

Siap Testing

Video Testing Sensor Warna :

Hasil Testing Sensor Warna :

Hasil Testing Sensor Warna

Setelah testing pertama selesai, pasti timbul pertanyaan : “Itu sensornya stabil ga ya??”
Maka dari itu berikut saya sertakan juga hasil uji kestabilan pembacaan sensor warna ini dengan cara mengambil data warna beberapa kali.
Dan hasilnya sbb :

Uji Kestabilan Sensor Warna

 

Sayangnya, sensor warna ini memiliki satu kekurangan yang sangat mendasar..
ya.. jarak pembacaannya masih sangat terbatas..
jarak baca optimalnya hanya sekitar 1 – 2 cm dari objek.. 

Bagaimana teman2?? :D
Tertarik untuk membuat juga?? :D

Berikut Listing Program yang saya gunakan pada video pengujian :

'Oleh : Pramudita J.I.  (joe4cva)
'Elektronika Dan Instrumentasi
'Universitas Gadjah Mada

$regfile = "m16def.dat"
$crystal = 16000000
$baud = 9600

Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Config Lcdbus = 4
Config Lcd = 16 * 2
Cursor Off

Config Pinb.0 = Input
Set Portb.0
Tombol1 Alias Pinb.0

Config Adc = Single , Prescaler = Auto , Reference = Avcc
Dim Red As Word , Green As Word , Blue As Word , Buff As Word , Warna As String * 5
Declare Sub Olah_warna(byval Merah As Word , Hijau As Word , Biru As Word)

'=====================Program Utama==========================
Utama:
Cls
Locate 1 , 1
Lcd "Color Detection"
Locate 2 , 1
Lcd "  by : joe4cva"
Do
If Tombol1 = 0 Then
Bitwait Tombol1 , Set
Print "Objek Terdeteksi"
Waitms 100
Goto Ambil_data_warna
End If
Loop
'============================================================

'========Sub Program Untuk Mengambil Data Warna Objek========
Ambil_data_warna:
Start Adc
Red = Getadc(0)
Green = Getadc(2)
Blue = Getadc(1)
Stop Adc
Call Olah_warna(Red , Green , Blue)
'=============================================================

'========Sub Program Untuk Mengolah Data Warna Objek==========
Sub Olah_warna(byval Merah As Word , Hijau As Word , Biru As Word)
 If Merah < Hijau Then
 Buff = Merah
 Else
 Buff = Hijau
 End If

 If Buff < Biru Then
 Buff = Buff
 Else
 Buff = Biru
 End If

 Waitms 100

 If Buff = Merah Then Warna = "Merah"
 If Buff = Hijau Then Warna = "Hijau"
 If Buff = Biru Then Warna = "Biru"
 If Merah < 100 And Hijau < 100 And Biru < 100 Then Warna = "Putih"
 If Merah > 700 And Hijau > 700 And Biru > 700 Then Warna = "Hitam"

 Print "Warna Objek : " ; Warna
 Print "R : " ; Merah
 Print "G : " ; Hijau
 Print "B : " ; Biru
 Print "Pendeteksian Selesai"
 Print "  "
 Print "  "
 Goto Utama
 End Sub
 '========================================================

Semoga Bermanfaat.. :D


									

74HC164.. SIPO (Serial In Parallel Out) Shift Register..
Adalah IC register geser 8 bit jenis SIPO, yaitu data yang dimasukkan secara serial dengan cara menggeser data sebelumnya dan menampilkannya secara parallel (ke delapan data yang tersimpan ditampilkan secara bersamaan)..
FYI : IC 74HC164 adalah IC yang saya gunakan untuk mengontrol nyala dari 60 buah LED pada jam digital yang sudah saya bahas pada post Jam Digital dengan DS1307 dan Animasi 60 Buah LED  

IC 74HC164

Pin Out IC 74HC164

Tabel Kebenaran

Fitur utama 74HC164 :
- Tegangan kerja : 2 – 6 volt
- Frekuensi kerja maksimum : 50 MHz
- Delay minimum untuk clock : 19 ns

Keterangan lebih lanjut tentang IC 74HC164 bisa dilihat di datasheetnya..
Download Datasheet 74HC164 di sini..

Okee.. Cukup untuk perkenalan IC nya.. :D
sekarang yang akan saya bahas adalah gimana cara make IC 74HC164 ini menggunakan ATMega32 dan program dengan BASCOM AVR..
Pada dasarnya kita cuma membutuhkan 3 buah pin I/O dari ATMega32 untuk mengakses IC 74HC164 ini. Port I/O manapun bisa dipakai. Ketiga pin I/O tersebut kemudian dihubungkan ke : pin Serial Input (Data), pin Clock, dan pin Reset (Clear) pada IC 74HC164.
Langsung saja, berikut hasil simulasinya :

Rangkaian dan Hasil Simulasi IC 74HC164

Listing Programnya :

'Oleh : Pramudita J.I.  (joe4cva)
'Elektronika Dan Instrumentasi
'Universitas Gadjah Mada

$regfile = "m32def.dat"
$crystal = 12000000

Config Lcdpin = Pin , Db4 = Porta.3 , Db5 = Porta.2 , Db6 = Porta.1 , Db7 = Porta.0 , E = Porta.4 , Rs = Porta.5
Config Lcdbus = 4
Config Lcd = 16 * 2
Cursor Off

Config Portd.5 = Output
Config Portd.6 = Output
Config Portd.7 = Output

Rst Alias Portd.5
Clock Alias Portd.6
Dat Alias Portd.7

Dim Data_out As Byte , Buffer As Byte
Data_out = 0

Set Rst

Do
Locate 1 , 1
Lcd Data_out ; "  "
Incr Data_out
Waitms 200
If Data_out > 46 Then Data_out = 0

'=============Proses Menyalakan Semua LED================
If Data_out <= 23 And Data_out <> Buffer Then
Set Dat
Reset Clock
Set Clock
End If
'========================================================

'==============Proses Mematikan Semua LED================
If Data_out > 23 And Data_out <> Buffer Then
Reset Dat
Reset Clock
Set Clock
End If
'========================================================

Buffer = Data_out
Loop

Konfigurasi rangkaian :
- PORTD.5 ke pin Clear/Reset
- PORTD.6 ke pin Clock
- PORTD.7 ke kedua buah pin Serial Input (Input A dan B disambung)

Pada aplikasi ini saya menggunakan 3 buah IC 74HC164 yang disusun secara “CASCADE” (Berurutan), jadi data input yang diterima oleh IC SIPO di depan adalah data output bit terakhir dari IC SIPO di belakangnya. Sedangkan untuk Clock dan Clear nya, ketiga IC ini dirangkai secara parallel dan sinkron (pulsa clock dan clear untuk masing – masing IC diberikan secara bersamaan).
Kemudian peran LCD di sini cuma sebagai penampil sudah data ke berapa yang dimasukkan ke rangkaian SIPO nya.. :D

Semoga Bermanfaat.. :D


Ketemu lagi dengan Servo..!! :D
Namun kali ini aplikasi penggunaan servo nya lebih sederhana dari post yang sebelumnya..
Kali ini servo yang dikontrol cuma 1 buah dan tanpa menggunakan Servo Controller ..
Untuk menggerakkan servo CW (Clock Wise) dan CCW (Counter Clock Wise) menggunakan dua buah push button (Tombol UP dan DOWN) kemudian tombol ketiga (SWEEP) digunakan untuk menggerakkan servo secara terus menerus dari posisi minimum ke maksimum dan seterusnya..

Langsung saja, berikut hasilnya :

Normal Mode

Sweep Mode

Keterangan :
- Tombol UP              =   PORTB.0
- Tombol DOWN        =  PORTB.1
- Tombol SWEEP        =  PORTB.2
- RC Servo                 =  PORTD.7
Listing Programnya :

'Oleh : Pramudita J.I.  (joe4cva)
'Elektronika Dan Instrumentasi
'Universitas Gadjah Mada

$regfile = "m32def.dat"
$crystal = 16000000

Config Portb.7 = Output
Config Servos = 1 , Servo1 = Portd.7 , Reload = 20

Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7
Config Lcdbus = 4
Config Lcd = 16 * 2
Cursor Off

Config Portd.7 = Output
Config Pinb.0 = Input
Config Pinb.1 = Input
Config Pinb.2 = Input
Set Portb.0
Set Portb.1
Set Portb.2
Tombol1 Alias Pinb.0
Tombol2 Alias Pinb.1
Tombol3 Alias Pinb.2

Dim Nilai As Byte , I As Byte
Nilai = 0
Enable Interrupts

Cls
Utama:
Do
Locate 1 , 1
Lcd "  Servo Tester"
Locate 2 , 1
Lcd "Nilai = " ; Nilai ; "  "

If Tombol2 = 0 Then
Incr Nilai
Waitms 20
End If

If Tombol1 = 0 Then
Decr Nilai
Waitms 20
End If

Servo(1) = Nilai

If Tombol3 = 0 Then
Bitwait Tombol3 , Set
Goto Sweep
End If
Loop

Sweep:
Locate 2 , 1
Lcd "Sweep Mode"
Do
For Nilai = 105 To 33 Step -1
  Servo(1) = Nilai
  Waitms 10
If Tombol3 = 0 Then
Bitwait Tombol3 , Set
Goto Utama
End If
Next

For Nilai = 33 To 105 Step 1
  Servo(1) = Nilai
  Waitms 10
If Tombol3 = 0 Then
Bitwait Tombol3 , Set
Goto Utama
End If
Next

Loop

Jika ingin mempercepat gerakan servonya, maka nilai dari “Reload” pada “Config Servos” atau jumlah “Step”  pada “For” dinaikkan / ditambah..
Oiya jika Servo yang digerakkan merk “HiTec”, maka port yang digunakan untuk output ke servo WAJIB DI CONFIG SEBAGAI OUTPUT (Pada program saya servo saya pasang di PORTD.7).. Soalnya kalo ga di config output servonya ga akan gerak..
Kapi kalo make Servo “Tower Pro” dan “Parallax”, portnya ga di config gpp..
Untuk merk servo yg lain saya kurang tau perlu di config output dulu apa ga.. Belum pernah nyoba soalnya..

Semoga Bermanfaat.. :D


“Aaahhh Bosaaann dengan LCD Text..!!”  >.<”
Mungkin bagi sebagian orang pernah merasakan hal diatas..
Dan mungkin saya juga termasuk salah satu diantaranya..
Tapi apa daya harganya terlalu mahal untuk kantong saya.. hehe..

Tapi harga tidak jadi soal kalo untuk belajar..
Nah mari kita belajar menggunakan LCD Grafik..!!  (di Proteus tapi) :P

Secara umum, cara akses dan mengkonfigurasinya ga jauh beda dengan LCD Text yang sering kita gunakan..
Bedanya, kalo di LCD Teks koordinat yang kita tulis untuk menuliskan data atau teks adalah koordinat baris dan kolom, sedangkan pada LCD Grafik adalah koordinat pixel nya. Selain itu kita juga memiliki kebebasan bereksperimen jika kita menggunakan LCD Grafik.
Dengan LCD Grafik kita bisa :
- Menggambar Garis
- Menggambar Lingkaran
- Menuliskan Teks
- Menampilkan Gambar

LCD Grafik 240x128 pixel Biru

Nah yang akan saya bahas kali ini adalah Cara Menampilkan Gambar pada LCD Grafik 240×128 pixel.. :D
Berikut Hasilnya :

Tampilan Gambar pada LCD 240x128 pixel di Proteus

Listing Programnya :

'Oleh : Pramudita J.I.  (joe4cva)
'Elektronika Dan Instrumentasi
'Universitas Gadjah Mada

$regfile = "m32def.dat"
$crystal = 12000000
$hwstack = 32
$swstack = 10
$framesize = 40

Config Graphlcd = 240 * 128 , Dataport = Porta , Controlport = Portc , Ce = 2 , Cd = 3 , Wr = 0 , Rd = 1 , Reset = 4 , Fs = 5 , Mode = 8
Cls                 'membersihkan seluruh tampilan LCD
'Opsi yang lain :
' CLS TEXT   = hanya membersihkan teks display
' CLS GRAPH = hanya membersihkan bagian grafik
Cursor Off

Do
Showpic 0 , 0 , Joe4cva       'koordinat pixel 0,0 sebagai awal tampilan gambar
Loop
End

Joe4cva:
$bgf "j4c.bgf"                'ini gambarnya..!!

Nah pertanyaannya adalah darimana gambar tersebut (file dg ekstensi *.bgf) didapat??
Jawabannya gampang.. Gambar tersebut di dapat dari Bascom AVR nya..!!
Di Bascom AVR terdapat Tools yang berfungsi untuk mengubah file *.bmp menjadi *.bgf (Bascom Graphical File)..
Yaa.. Hanya file BMP yang mampu diconvert..
Tools tersebut namanya adalah “Graphic Converter” (Tools => Graphic Converter)
Gambar :

Graphic Converter

Gambar Resource (*.bmp) :

Gambar *.bmp

Gambar sebelum di convert (Resolusinya disesuaikan dengan resolusi LCD Grafiknya) :

Gambar Sebelum Diconvert

Nah untuk LCD type dipilih sesuai resolusi LCD Grafik yang digunakan..
Disini saya make yang 240*128 pixel.
Klik “SAVE” untuk meng-convert gambar yang telah dipilih menjadi *.bgf

Hasilnya :

Gambar Setelah Diconvert

Nah, kalo file *.bgf nya uda jadi, tinggal gunakan syntax $bgf “nama_file” untuk menampilkannya pada LCD Grafik..
Oiya, file program dan file *.bgf “HARUS DALAM SATU FOLDER” !!
kalo ga dalam satu folder pasti akan muncul error seperti ini kalo di compile :

Error

Semoga Bermanfaat.. :D


Mungkin ini adalah proyek aplikasi mikrokontroller paling berkesan yang pernah aku buat.
Alasannya adalah karena aku bikin jam digital ini special cuma buat kekasihku tercinta Alifia Assyifa pas 2nd Anniversary kita pada tanggal 06 Juli 2010 lalu.. :D

Ya.. Sudah setahun yang lalu saya buatnya..
Dan ternyata sampai sekarang jam tersebut masih bekerja dengan baik.. :D

Berikut penampakan jam digitalnya :

2nd Anniversary Digital LED Clock

Full Circle

Okeee..
Cukup untuk cerita flashback-nya, sekarang masuk ke masalah teknisnya.. :D

Spesifikasi jam diatas adalah :
Mikrokontroller ATmega32
RTC DS1307
8x IC 74LS164 (SIPO Shift register)
4x seven segment common anode
60x LED 3mm (melingkar)
6x huruf inisial nama
Box kayu
Kaca acrylic
Dimensi (P x L x T) = (14 x 14 x 7) cm

Komponen utama pada jam diatas setelah mikrokontroller adalah IC RTC (Real Time Clock) DS1307.
DS1307 adalah IC RTC dari MAXIM (Dallas Semiconductor) yang memiliki interface / protokol komunikasi melalui jalur I2C.
Berikut fitur – fitur utama DS1307 :
- Mampu menghitung detik, menit, jam, hari (day of week), tanggal, bulan, dan tahun (hingga tahun 2100)
- 56-byte RAM Internal Non-Volatile yang di backup oleh baterai untuk menyimpan data
- TWI (Two Wire) Interface (I2C)

DS1307

Rangkaian DS1307 ke Mikrokontroller

Untuk lengkapnya bisa dibaca di datasheetnya..
Download Datasheet DS1307 disini..

Kemudian komponen selanjutnya yg ga kalah penting adalah IC 74LS164.
IC 74LS164 adalah IC SIPO (Serial In Parallel Out) Shift Register 8 bit. Disini IC ini berfungsi sebagai controller untuk ke 60 LED yang berfungsi sebagai indikator detikan pada jam ini. Disini saya memakai 8 buah IC 74LS164 (kok banyak banget?? iya kan IC nya cuma 8bit, sedangkan butuhnya kan 60 bit, jadi ya butuh 8 buah IC 74LS164 => 8 * 8 = 64). Ke-8 IC ini saya rangkai secara seri dengan clock yang sinkron untuk semua IC (semua IC menerima clock secara bersamaan).

Pin Out IC 74LS164

Koneksi 74LS164 ke Mikrokontroller ATMega32

Untuk lengkapnya bisa dibaca di datasheetnya..
Download Datasheet 74LS164 disini..

Nah, berikut adalah hasilnya.. :D

Listing Programnya :

'Oleh : Pramudita J.I.  (joe4cva)
'Elektronika Dan Instrumentasi
'Universitas Gadjah Mada

$regfile = "m32def.dat"
$crystal = 12000000
$baud = 19200
$lib "mcsbyte.lbx"
$lib "ds1307clock.lib"
$framesize = 16
$hwstack = 24
$swstack = 16

Config Porta.0 = Output
Config Porta.1 = Output
Config Porta.2 = Output
Rst Alias Porta.1
Ck Alias Porta.0
Dat Alias Porta.2
Dim A As Byte , B As Byte , C As Byte , D As Byte , Menit As Integer , Jam As Integer
Menit = 0

Config Portd.2 = Output
Config Portd.3 = Output
Config Portd.4 = Output
Config Porta.7 = Output
Set Portd.2
Set Portd.3
Set Portd.4
Set Porta.7

Config Pind.5 = Output
Config Pind.6 = Output
Config Pind.7 = Output
Set Portd.5
Set Portd.6
Set Portd.7
Setting Alias Pind.5
Up Alias Pind.6
Down Alias Pind.7

Config Portc.2 = Output
Config Portc.3 = Output
Config Portc.4 = Output
Config Portc.5 = Output
Config Portc.6 = Output
Config Portc.7 = Output

Reset Portc.2
Reset Portc.3
Reset Portc.4
Reset Portc.5
Reset Portc.6
Reset Portc.7

Declare Sub Cocok
Config Sda = Portc.1
Config Scl = Portc.0
Config Portb = Output

Const Ds1307w = &HD0
Const Ds1307r = &HD1

Config Clock = User
Dim Weekday As Byte
Dim Jam_puluhan As Byte
Dim Jam_satuan As Byte , Buff2 As Byte

Dim Menit_puluhan As Byte
Dim Menit_satuan As Byte , Buff As Byte
Dim I As Byte
Dim Stat As Bit

Print "DS1307"                                              '

Time$ = "03:46:00"
Date$ = "05/11/10"
'Kedua baris distas digunakan untuk menyetting nilai awal dari Jam dan Tanggal pada IC DS1307

Reset Stat
Utama:
Do
Print Time$
Set Dat
A = _sec
Menit = _min
Jam = _hour
Menit_puluhan = _min / 10
Buff = Menit_puluhan * 10
Menit_satuan = _min - Buff

Jam_puluhan = _hour / 10
Buff2 = Jam_puluhan * 10
Jam_satuan = _hour - Buff2

If _sec = 0 Then
Reset Rst
Set Rst
Reset Ck
Set Ck
End If

If Setting = 0 Then
Bitwait Setting , Set
Gosub Cocok
End If

Portb = Lookup(Menit_puluhan , Data7a)
Set Portd.3
Reset Porta.7
Waitus 3000
Portb = Lookup(Menit_satuan , Data7)
Set Porta.7
Reset Portd.4
Waitus 3000

Portb = Lookup(Jam_satuan , Data7)
Set Portd.4
Reset Portd.2
Waitus 3000
Portb = Lookup(Jam_puluhan , Data7a)
Set Portd.2
Reset Portd.3
Waitus 3000

Portb = Lookup(Menit_puluhan , Data7)
Reset Portd.0
Set Portd.3

If Stat = 0 Then
Set Dat
Reset Rst
Set Rst
For B = 0 To A
Reset Ck
Set Ck
Next
End If

If A <> D And Stat = 1 Then
Reset Ck
Set Ck
End If

Set Stat
D = A
Loop
End

Data7:
Data &B11000000 , &B11111001 , &B10100100 , &B10110000 , &B10011001 , &B10010010 , &B10000010 , &B11111000 , &B10000000 , &B10010000
Data7a:
Data &B11000000 , &B11111001 , &B10100100 , &B10110000 , &B10011001 , &B10010010 , &B10000010 , &B11111000 , &B10000000 , &B10010000
Data1:
Data &B11111110 , &B11111101 , &B11111011 , &B11110111 , &B11101111

Getdatetime:
  I2cstart
  I2cwbyte Ds1307w
  I2cwbyte 0
  I2cstart
  I2cwbyte Ds1307r
  I2crbyte _sec , Ack
  I2crbyte _min , Ack
  I2crbyte _hour , Ack
  I2crbyte Weekday , Ack
  I2crbyte _day , Ack
  I2crbyte _month , Ack
  I2crbyte _year , Nack
  I2cstop
  _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
  _month = Makedec(_month) : _day = Makedec(_day) : _year = Makedec(_year)
Return

Setdate:
  _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
  I2cstart
  I2cwbyte Ds1307w
  I2cwbyte 4
  I2cwbyte _day
  I2cwbyte _month
  I2cwbyte _year
  I2cstop
Return

Settime:
  _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
  I2cstart
  I2cwbyte Ds1307w
  I2cwbyte 0
  I2cwbyte _sec
  I2cwbyte _min
  I2cwbyte _hour
  I2cstop
Return

Sub Cocok:
Do
If Up = 0 Then
Incr Menit
Waitms 80
If Menit > 59 Then
Menit = 0
Incr Jam
If Jam > 23 Then Jam = 0
End If
End If

If Down = 0 Then
Decr Menit
Waitms 80
If Menit < 0 Then
Menit = 59
Decr Jam
If Jam < 0 Then Jam = 23
End If
End If

Menit_puluhan = Menit / 10
Buff = Menit_puluhan * 10
Menit_satuan = Menit - Buff

Jam_puluhan = Jam / 10
Buff2 = Jam_puluhan * 10
Jam_satuan = Jam - Buff2

Portb = Lookup(Menit_puluhan , Data7b)
Set Portd.3
Reset Porta.7
Waitus 5000
Portb = Lookup(Menit_satuan , Data7b)
Set Porta.7
Reset Portd.4
Waitus 5000

Portb = Lookup(Jam_satuan , Data7b)
Set Portd.4
Reset Portd.2
Waitus 5000
Portb = Lookup(Jam_puluhan , Data7b)
Set Portd.2
Reset Portd.3
Waitus 5000

Portb = Lookup(Menit_puluhan , Data7b)
Reset Portd.0
Set Portd.3

If Setting = 0 Then
Bitwait Setting , Set
_sec = 0
_min = Menit
_hour = Jam
Goto Settime
End If

Loop
End Sub

Data7b:
Data &B01000000 , &B01111001 , &B00100100 , &B00110000 , &B00011001 , &B00010010 , &B00000010 , &B01111000 , &B00000000 , &B00010000

Semoga Bermanfaat.. :D


SD21..
mainan saya selama 6 bulan pertama di tahun 2011..
SD21 adalah servo controller pertama yang saya pakai dan saya sangat puaass memakainya.. :D
karena saya bebas mengatur gerakan servo – servo saya sesuka hati baik posisi dan kecepatannya.. :D

Gambar : SD21

SD21 adalah Servo Controller buatan Devantech yang memiliki interfaca I2C (Inter Integrated Circuit). Sesuai namanya, SD21 mampu mengontrol 21 buah RC-Servo (merk HiTec, Futaba, Tower Pro, dsb) secara individu baik posisi dan kecepatannya. Secara personal, saya suka make SD21 karena dia make komunikasi I2C dan Power Supply untuk Servo dan untuk controllernya bisa dibikin TERPISAH.. :D
Untuk spesifikasi lengkapnya, bisa langsung kunjungi :
http://www.robot-electronics.co.uk/htm/sd21tech.htm

Sekedar share pengalaman saya menggunakan SD21, kalo menggunakan SD21 untuk mode “Group Move” (menggerakkan beberapa servo secara bersamaan dengan sudut yg berbeda tetapi waktu yang diberikan sama) kita harus menghitung kecepatan dan delay dari masing – masing servo tersebut secara manual. Nah, untuk mempermudah menghitungnya, bisa menggunakan aplikasi “SD21 Speed and Delay Counter” yang dibikin oleh temen saya (Credit to : Mas Tiara Bagus S.P.A.) dan bisa di download disini :
http://www.mediafire.com/?etcxro8op78cyr5 
Cukup untuk perkenalan SD21 nya. Yang akan saya bahas kali ini adalah gimana cara make SD21 ini untuk mengontrol 10 buah RC-Servo (Hitec HS-7955TG). Disini saya menggunakan Channel Servo 1 – 10 pada SD21 nya dan untuk Power Supply ke servonya saya memakai Batre LiPo 11,1V/1300mAH + UBEC (Ultimate Battery Eliminator Circuit) 6V/8A dan saya pisahkan dari Power Supply untuk controller dan Mikro masternya..
Berikut hasilnya :

Listing Programnya :

'Oleh : Pramudita J.I.  (joe4cva)
'Elektronika Dan Instrumentasi
'Universitas Gadjah Mada

$regfile = "m32def.dat"
$framesize = 42
$swstack = 42
$hwstack = 42
$crystal = 16000000
$baud = 9600

Const Sd21_slaveid = &HC2
Declare Function Sd21_version() As Byte
Declare Sub Posisi(byval Servo As Byte , Byval Position As Word)
Declare Sub Kecepatan(byval Servo As Byte , Byval Speed As Byte)

Config Scl = Portc.0
Config Sda = Portc.1
Dim I As Byte

I2cinit
Print "SD21 Testprogramm "
Print "SD21 Firmware Version:" ; Sd21_version()

Wait 2

Do
'Kecepatan Channel_Servo , Nilai_Kecepatan   (Nilai Kecepatan antara 0 - 255)
Kecepatan 1 , 80
Kecepatan 2 , 80
Kecepatan 3 , 80
Kecepatan 4 , 80
Kecepatan 5 , 80
Kecepatan 6 , 80
Kecepatan 7 , 80
Kecepatan 8 , 80
Kecepatan 9 , 80
Kecepatan 10 , 80

For I = 0 To 2
'Posisi Channel_Servo , Sudut_Servo   (Sudut servo dalam lebar pulsa dg satuan uS antara 800 - 2200)
Posisi 1 , 800
Posisi 2 , 800
Posisi 3 , 800
Posisi 4 , 800
Posisi 5 , 800
Posisi 6 , 800
Posisi 7 , 800
Posisi 8 , 800
Posisi 9 , 800
Posisi 10 , 800
Waitms 500

Posisi 10 , 2200
Posisi 9 , 2200
Posisi 8 , 2200
Posisi 7 , 2200
Posisi 6 , 2200
Posisi 5 , 2200
Posisi 4 , 2200
Posisi 3 , 2200
Posisi 2 , 2200
Posisi 1 , 2200
Waitms 500
Next I

Kecepatan 1 , 60
Kecepatan 2 , 60
Kecepatan 3 , 60
Kecepatan 4 , 60
Kecepatan 5 , 60
Kecepatan 6 , 60
Kecepatan 7 , 60
Kecepatan 8 , 60
Kecepatan 9 , 60
Kecepatan 10 , 60

Posisi 1 , 1500
Posisi 2 , 1500
Posisi 3 , 1500
Posisi 4 , 1500
Posisi 5 , 1500
Posisi 6 , 1500
Posisi 7 , 1500
Posisi 8 , 1500
Posisi 9 , 1500
Posisi 10 , 1500
Waitms 700

Posisi 3 , 800
Posisi 8 , 800
Waitms 500
Posisi 3 , 2200
Posisi 8 , 2200
Waitms 700
Posisi 3 , 1500
Posisi 8 , 1500
Waitms 700

Posisi 1 , 800
Posisi 6 , 800
Posisi 2 , 800
Posisi 7 , 800
Posisi 4 , 2200
Posisi 9 , 2200
Posisi 5 , 2200
Posisi 10 , 2200
Waitms 700

Posisi 1 , 2200
Posisi 6 , 2200
Posisi 5 , 800
Posisi 10 , 800
Waitms 600

Posisi 1 , 800
Posisi 2 , 2200
Posisi 4 , 800
Posisi 5 , 2200
Posisi 6 , 800
Posisi 10 , 2200
Posisi 7 , 2200
Posisi 9 , 800
Waitms 700

Posisi 1 , 1500
Posisi 2 , 1500
Posisi 4 , 1500
Posisi 5 , 1500
Posisi 6 , 1500
Posisi 7 , 1500
Posisi 9 , 1500
Posisi 10 , 1500
Waitms 700

Loop
End

Function Sd21_version() As Byte
Local Firmware As Byte
Local I2cread As Byte
I2cread = Sd21_slaveid + 1
I2cstart
I2cwbyte Sd21_slaveid
I2cwbyte 64
I2cstop
I2cstart
I2cwbyte I2cread
I2crbyte Firmware , Nack
I2cstop
Sd21_version = Firmware
End Function
Return

Sub Posisi(byval Servo As Byte , Byval Position As Word)
Local Register As Byte
Local Lowpos As Byte
Local Highpos As Byte
Register = Servo - 1
Register = Register * 3
Register = Register + 1
Lowpos = Low(position)
Highpos = High(position)
I2cstart
I2cwbyte Sd21_slaveid
I2cwbyte Register
I2cwbyte Lowpos
I2cwbyte Highpos
I2cstop
End Sub
Return

Sub Kecepatan(byval Servo As Byte , Byval Speed As Byte)
Local Register As Byte
Register = Servo - 1
Register = Register * 3
I2cstart
I2cwbyte Sd21_slaveid
I2cwbyte Register
I2cwbyte Speed
I2cstop
End Sub
Return

Semoga Bermanfaat.. :D


Berikut ini adalah tulisan lanjutan tentang Multiplexer yang telah saya tulis pada post sebelumnya. Bedanya, kalo pada post yang yang pertama saya membahas tentang Mux seri 74LS151, nah yang post kedua ini saya akan mencoba untuk membahas aplikasi dari Mux jenis CMOS seri CD4051..

Pin Out diagram CD4051

Berikut ini adalah aplikasi menggunakan Mux untuk menghemat port ADC pada mikrokontroller AVR ATMega32. Pada dasarnya, Mikrokontroller ATMega32 hanya memiliki 8 buah channel ADC 10bit, jadi kita hanya bisa memasang 8 buah sensor yang memiliki interface output berupa variasi tegangan.
Nah, dengan menggunakan multiplexer CD4051, kita bisa memasang hingga 8 buah sensor yang outputnya berupa variasi tegangan pada 1 port ADC mikrokontroller ATMega32..
Pada aplikasi ini, saya mencoba mengakses 16 buah sensor dengan output variasi tegangan (diwakilkan dengan Potensiometer) dengan menggunakan 2 buah Mux CD4051 yang diakses secara sinkron dan parallel kemudian hasil pembacaannya ditampilkan pada LCD teks 20*4.

Hasil Simulasi dengan Proteus

Keterangan Rangkaian :

- Output Mux A masuk ke Channel ADC 0 (PORTA.0)

- Output Mux B masuk ke Channel ADC 1 (PORTA.1)

- Selektor A ke PORTB.5

- Selektor B ke PORTB.6

- Selektor C ke PORTB.7

Keterangan Tampilan LCD :

1A        5A        1B        5B

2A        6A        2B        6B

3A        7A        3B        7B

4A        8A        4B        8B

Listing Program :

'Oleh : Pramudita J.I.  (joe4cva)
'Elektronika Dan Instrumentasi
'Universitas Gadjah Mada

$regfile = "m32def.Dat"
$crystal = 16000000

Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.7 , Rs = Portc.6
Config Lcdbus = 4
Config Lcd = 20 * 4
Cursor Off

Config Adc = Single , Prescaler = Auto , Reference = Avcc
Config Portb.5 = Output
Config Portb.6 = Output
Config Portb.7 = Output
Out1 Alias Portb.5
Out2 Alias Portb.6
Out3 Alias Portb.7
Reset Out1
Reset Out2
Reset Out3

Dim Sensor(8) As Word , Sensor2(8) As Word
Dim Data_out As Byte , Buff As Byte
Data_out = 0
Declare Sub Cek
Cls

Do
Gosub Cek
'MUX 1
Locate 1 , 1
Lcd Sensor(1) ; " "
Locate 2 , 1
Lcd Sensor(2) ; " "
Locate 3 , 1
Lcd Sensor(3) ; " "
Locate 4 , 1
Lcd Sensor(4) ; " "
Locate 1 , 6
Lcd Sensor(5) ; " "
Locate 2 , 6
Lcd Sensor(6) ; " "
Locate 3 , 6
Lcd Sensor(7) ; " "
Locate 4 , 6
Lcd Sensor(8) ; " "

'MUX 2
Locate 1 , 11
Lcd Sensor2(1) ; " "
Locate 2 , 11
Lcd Sensor2(2) ; " "
Locate 3 , 11
Lcd Sensor2(3) ; " "
Locate 4 , 11
Lcd Sensor2(4) ; " "
Locate 1 , 16
Lcd Sensor2(5) ; " "
Locate 2 , 16
Lcd Sensor2(6) ; " "
Locate 3 , 16
Lcd Sensor2(7) ; " "
Locate 4 , 16
Lcd Sensor2(8) ; " "
Loop

Sub Cek
Start Adc
Incr Data_out
If Data_out = 8 Then Data_out = 0
Out1 = Data_out.0
Out2 = Data_out.1
Out3 = Data_out.2
Buff = Data_out + 1
Sensor(buff) = Getadc(0)
Sensor2(buff) = Getadc(1)
End Sub
Return

Semoga Bermanfaat.. :D
Follow

Get every new post delivered to your Inbox.

Join 1,477 other followers