Jumat, 24 Oktober 2014

Interface Joystick PS 2 berbasis Mikrokontroller AVR dan compiler Codevision AVR

Bissmilahirrohmanirrohim..,

Hhmm.., dah lama gak posting jadi rada kaku..., hohohooo..,

     Sekarang saya akan mencoba untuk share kepada teman-teman cara interface joystick PS2 dengan mikrokontroler AVR dan program yang digunakan bahasa C compiler Codevision AVR yang di aplikasikan pada robot beroda. Joystick PS2 ada 2 tipe yang Wire / kabel dan Wireless tanpa kabel, pada ajang KRAI penggunaan joystick ini sangat familiar karena mudah penggunaan'y dan simple. Interface Joystick PS dengan Mikrokontroler AVR ini menggunakan komunikasi SPI (Serial Peripheral Interface) atau yg dikenal dengan 3 kabel, tapi disini saya tidak akan bahas detail tentang SPI (ask google), 

Ok langsung aja, 
1. Kita lihat Pin Konfigurasi dari Joystick PS 2

Gambar 1. Pin konfigurasi Joystick PS2

     Dari gambar diatas bisa kita lihat joystick PS memiliki 9 pin dengan warna yang berbeda. akan tetapi ada beberapa joystick(tipe kabel/wire) di pasaran yang hanya memiliki 8 pin. Dari 9 atau 8 pin tersebut yang hanya digunakan hanya 6 pin / warna dengan mengabaikan tegangan motor(Getar) pada joystick. 6 warna kabel tersebut yaitu (Brown = data), (Orange = Command), (Black = Ground), (Red = Power), (Yellow = Attention), dan (Blue = Clock). Hati-hati terhadap warna Orange dan Kuning karena hampir sama jika terbalik maka joystick tidak akan bisa digunakan.

2. Rangkaian Joystick PS2 dengan Mikrokontroler.


Gambar 2. Rangkaian joystick PS2 dengan Mikrokontroler

    Dari rangkaian diatas joystick PS2 dengan mikrokontroler cukup sederhana hanya 4 pin yaitu Mosi, Miso, SCK, dan Pin bebas. Untuk pin SCK, MOSI, PB4(bebas) diberi resistor 220 ohm sebagai pengaman, sedangkan resistor 4k7 ohm pada MISO sebagai Pull-up. Pin SCK dihubungkan ke kabel joystick warna biru, PB4 (pin bebas) dihubungkan ke kabel joystick warna kuning, Pin MOSI dihubungkan ke kabel joystick warna orange, dan Mosi dihubungkan ke kabel joysick warna Coklat dan diberi pull-up.Sedangkan untuk power joystick diberi tegangan 5 V (merah) dan ground (hitam).

3. Pertukaran data joystick dengan mikrokontroler


     Pertukaran data joystick dengan uC terlihat pada tabel 1 dan 2. Untuk mengawali komunikasi dengan joystick, mikrokontroler mengirim Byte pertama berupa perintah 0x0, kemudian Byte kedua dengan perintah 0x42 (baca data) sekaligus menerima tipe joystick (0x41 [65] untuk digital, dan 0x73 [115] untuk analog) dari kontroler joystick. Byte ketiga dan seterusnya uC menerima data dari kontroler joystick berturut-turut 0x5A (ready), data digital 1, dan data digital 2. Data digital ini bersifat Aktif LOW (0). jadi jika tidak ada tombol di tekan akan diterima data 0xFF (0b11111111). 
misal jika kita menekan / mengaktifkan tombol R2 maka potongan coding'y :

 if (byte5==0b11111101).    // Tombol R2 di baris byte 5 dengan kolom bit 1 aktifkan low. (liat tabel 1)
{       
         lcd_clear();
         lcd_gotoxy(0,1);         
         lcd_puts("R2");
         delay_ms(100);       
 } 

    Jika joystick dalam kondisi analog maka komunikasi dilanjutkan dengan data analog 1, data analog 2, data analog 3, data analog 4. dimana saat kondisi netral berupa data 0x7F (127) dengan nilai minimal 0 dan nilai maksimal 0xFF(255). saat operasi digital, byte 6 - 9 selalu memberikan data 0xFF. 
misal jika kita ingin mengaktifkan analog kanan - sumbu x. maka potongan coding'y :

 if ( (ID == 115) && (byte6 == 0b00000000) || (byte6 == 0b11111111) ) // mode analog diaktifkan(115)  {        
      itoa(byte6, analog6);           // byte 6 == 0b11111111  analog kanan - sumbu x di aktifkan, dsb.
      lcd_clear();
      lcd_gotoxy(0,1);
      lcd_puts(analog 6);
      lcd_gotoxy(0,5);                      
      lcd_puts(" analog ON");          
      delay_ms(100);
}

dari tabel diatas berikut prosedur untuk membaca data dari joystick :
void baca_data()
{        
        PORTB.4 = 0;       
        spi(0x01);    
        ID = spi(0x42);
        SS = spi(0);
        byte4 = spi(0);
        byte5 = spi(0);
        byte6 = spi(0);
        byte7 = spi(0);
        byte8 = spi(0);
        byte9 = spi(0);
        PORTB.4 = 1;
}

    Portb.4 sebagai psxattn pada kodisi iddle / awal berlogika high (1), untuk mengaktifkan maka diberi logika low (0), kemudian terjadi pertukaran data seperti yg di jelaskan diatas. komunikasi di akhiri dengan memberi Portb.4 logika high (1) kembali.

     Sebenernya saya punya banyak contoh coding'y yang di dapat dr om google, ataupun program yang saya buat sendiri. 
berikut salah satu full program interface joystick menggunakan mikrokontroler avr atmega8.


Chip type                                : ATmega8
Program type                           : Application
AVR Core Clock frequency   : 8.000000 MHz
Memory model                       : Small
External RAM size                 : 0
Data Stack size                       : 256
*****************************************************/


#include <mega8.h>
#include <stdlib.h>
// Alphanumeric LCD Module functions
#include <alcd.h>

// SPI functions
#include <spi.h>
#include <delay.h>
// Declare your global variables here
unsigned char spi(unsigned char data);

void main(void)
{
// Declare your local variables here
unsigned char byte4, byte5, byte6, byte7, byte8, byte9;
unsigned char ID, SS;
unsigned char *analog;
unsigned char *analog6;
unsigned char *analog7;
unsigned char *analog8;
unsigned char *analog9; 

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=Out Func4=In Func3=Out Func2=Out Func1=In Func0=In
// State7=T State6=T State5=0 State4=T State3=0 State2=0 State1=T State0=T
PORTB=0x04;
DDRB=0x2C;
// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 62.500 kHz
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: High
// SPI Data Order: LSB First
SPCR=0x7F;
SPSR=0x00;

// Alphanumeric LCD initialization
// Connections specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTC Bit 0
// RD - PORTC Bit 1
// EN - PORTC Bit 2
// D4 - PORTC Bit 3
// D5 - PORTC Bit 4
// D6 - PORTC Bit 5
// D7 - PORTB Bit 0
// Characters/line: 8
lcd_init(16);

while (1)
{
      // Place your code here
        lcd_clear();
        PORTB.2 = 0;
        spi(0x01);    
        ID = spi(0x42);
        SS = spi(0);
        byte4 = spi(0);
        byte5 = spi(0);
        byte6 = spi(0);
        byte7 = spi(0);
        byte8 = spi(0);
        byte9 = spi(0);
        PORTB.2 = 1;
     
      lcd_clear();
      itoa(ID, analog);
      lcd_gotoxy(0,0);
      lcd_puts(analog);
     
      if (ID == 65)
      {
       lcd_gotoxy(5,0);
       lcd_puts("analog off");
       delay_ms(500);
      }
     
      else if (ID == 115)
      {
       lcd_gotoxy(5,0);
       lcd_puts("analog on");
       delay_ms(500);
      }

       lcd_clear();     
       if (byte4 == 0b01111111)
        {
         lcd_clear();
         lcd_gotoxy(0,1);
        lcd_puts("left");
        delay_ms(700);
        }     
       
       else if (byte4 == 0b10111111)
        {
        lcd_clear();
         lcd_gotoxy(0,1);
        lcd_puts("down");
         delay_ms(700);
        }
       
       else if (byte4 == 0b11011111)
       {
         lcd_clear();
         lcd_gotoxy(0,1);
         lcd_puts("right");
         delay_ms(700);
        }
       
       else if (byte4 == 0b11101111)
       {
         lcd_clear();
         lcd_gotoxy(0,1);
        lcd_puts("up");
         delay_ms(700);
        }               
      
       else if (byte4 == 0b11110111)
       {
         lcd_clear();
         lcd_gotoxy(0,1);
         lcd_puts("start");
         delay_ms(700);
        }                 
                 
       else if (byte4 == 0b11111110)
       {
         lcd_clear();
         lcd_gotoxy(0,1);
         lcd_puts("select");
         delay_ms(700);
       }
       
       else if (byte5 == 0b01111111)
       {
        lcd_clear();
        lcd_gotoxy(0,1);
        lcd_puts("kotak");
        delay_ms(700);
       }

       else if (byte5 == 0b10111111)
       {
         lcd_clear();
         lcd_gotoxy(0,1);
         lcd_puts("X");
         delay_ms(700);
       }
        
       else if (byte5 == 0b11011111)
       {
         lcd_clear();
         lcd_gotoxy(0,1);
         lcd_puts("bulat");
         delay_ms(700);
       }
       
       else if (byte5 == 0b11101111)
       {
         lcd_clear();
         lcd_gotoxy(0,1);
         lcd_puts("segitiga");
         delay_ms(700);
       }               
      
       else if (byte5 == 0b11110111)
       {
         lcd_clear();
         lcd_gotoxy(0,1);
         lcd_puts("R1");
         delay_ms(700);
       } 
       
       else if (byte5 == 0b11111011)
       {
         lcd_clear();
         lcd_gotoxy(0,1);
         lcd_puts("L1");
         delay_ms(700);
       }
      
       else if (byte5 == 0b11111101)
       {
         lcd_clear();
         lcd_gotoxy(0,1);
         lcd_puts("R2");
         delay_ms(700);
       } 
      
       else if (byte5 == 0b11111110)
       {
         lcd_clear();
         lcd_gotoxy(0,1);
         lcd_puts("L2");
         delay_ms(700);       
       }
                      
      else if ( (ID == 115) && (byte6 == 0b00000000) || (byte6 == 0b11111111) )
      {itoa(byte6, analog6);
      lcd_clear();
      lcd_gotoxy(0,1);
      lcd_puts(analog6);
      lcd_gotoxy(0,5);
      lcd_puts(" analog ON");          
      delay_ms(700);}
     
      else if ( (ID == 115) && (byte7 == 0b00000000) || (byte7 == 0b11111111) )  
      {itoa(byte7, analog7);
      lcd_clear();
      lcd_gotoxy(0,1);
      lcd_puts(analog7);
      lcd_gotoxy(0,5);
      lcd_puts(" analog ON");
      delay_ms(700);}
      
      else if ((ID == 115) && (byte8 == 0b00000000) || (byte8 == 0b11111111) )
      {itoa(byte8, analog8);
      lcd_clear();
      lcd_gotoxy(0,1);
      lcd_puts(analog8);
      lcd_gotoxy(0,5);
      lcd_puts(" analog ON");
      delay_ms(700);}
     
      else if ((ID == 115) && (byte9 == 0b00000000) || (byte9 == 0b11111111) )
      {itoa(byte9, analog9);
      lcd_clear();
      lcd_gotoxy(0,1);
      lcd_puts(analog9);
      lcd_gotoxy(0,5);
      lcd_puts(" analog ON");
      delay_ms(700);}
     
      lcd_clear();            
}
}

    Jika teman-teman perlu refrensi coding joystick PS dengan mikrokontroler menggunakan bahasa C codevision avr bisa download disini, atau program robot saya yang menggunakan joystick silahkan download disana.

Refrensi:

Berikut adalah video interface Joystick PS dengan mikrokontoler AVR yang diaplikasikan untuk menggerakan Robot beroda. 


Minggu, 20 April 2014

DIY Sound Activation

Assalamualaikum.., wr.,wb.

Pada postingan sebelumnya yaitu Rangkain Komparator saya menyebutkan salah satu aplikasi dari rangkaian komparator adalah membuat sound activation., nah kali ini saya akan mencoba ngeshare rangkaian sound activation.,

Dalam dunia robotika khususnya perlombaan Kontes Robot Pemadam Api Indonesia (KRPAI) sound activation digunakan untuk menghidupkan / mengaktifkan robot. karena jika menggunakan alat ini maka mendapat bonus dalam sistem penilaian.

Berikut rangkaian dari sound activation yang pernah saya buat.,


Gambar 1. Rangkaian Sound Activation

Dari rangkaian diatas mic condensor berfungsi sebagai penerima sinyal suara yang dirangkai menjadi pembagi tegangan, kemudian tegangan dari mic condensor masuk ke input inverting (V-) IC LM324 / LM393. Kemudian trimpot untuk mensetting nilai tegangan input non inverting / tegangan refrensi (V+) dalam hal ini digunakan sebagai sensitivitas mic condensor. Tegangan output dari komparator masuk ke port mikrokontroler dan diberi indikator led. Setelah di uji coba mic condensor ketika mendeteksi suara, lampu indikator led menyala atau logika High (1). sedangkan jika mic condensor tidak mendeteksi suara, lampu indikator led tidak menyala atau logika low (0). 

Trimpot yang digunakan sebaiknya jenis multi turn, hal ini dikarenakan agar sensitivitas dari mic condensor bisa diatur sebaik mungkin. berikut jenis trimpot multi turn yg digunakan.



 Gambar 2. Trimpot Multi turn

Sound activation ini masih memiliki kekurangan yaitu jarak suara yang diterima tidak terlalu jauh. sehingga harus di tambah dengan rangkaian penguat.

Oke sampai disini dulu, dan berikut video uji coba sound activation yang saya buat.,

DIY Flame sensor (Sensor api) menggunakan Fotodioda

Assalamualaikum., wr,wb.

Hmm.., minggu santai paling enak yaa.., Ngeblog. hohoho..., Keep Go Blog (baca'y pelan2 aja..)

Postingan kali semoga bisa bermanfaat bagi teman2 yang khusus'y mengikuti kontes robot pemadam api Indonesia (KRPAI) dengan kantong pas-pasan, dana dari kampus blm turun sedangkan harga sensor muahal-muahal di tambah waktu perlombaan dah mepet. hehehe..., #pengalaman pribadi.

Oke langsung aja, saya akan menshare gimana cara membuat sensor api / flame sensor sederhana tapi cukup mumpuni untuk mendeteksi api. Kalo di bandingkan dengan UV-tron atau TPA81 yaa.., pasti jauh. hoho..
mereka kan sensor dengan harga tinggi, sedangkan kalo fotodioda murah meriah., hehehe..

Rangkaian  sensor api ini sebener'y sensor garis yang biasa saya pakai pada robot line follower. sensor yang digunakan yaitu Fotodioda. Sensor ini bisa mendeteksi cahaya tampak, sinar infra merah, ultraviolet, sampai sinar X. so, karena api mengandung sinar Infra merah dan atau Ultraviolet, maka sensor fotodioda sudah pasti bisa mendeteksi ada'y api. berikut rangkaian dari flame sensor / sensor api.

Gambar 1. Sensor Api

Pada rangkaian sensor api diatas menggunakan prinsip Komparator,  Tegangan sensor photodiode yang masuk ke input inverting (V-) IC LM324/LM393 diperoleh menggunakan persamaan pembagi tegangan. Sedangkan Trimpot untuk mensetting nilai tegangan input non inverting / tegangan refrensi (V+) dalam hal ini digunakan sebagai sensitivitas sensor fotodioda. Tegangan output dari komparator masuk ke port mikrokontroler dan diberi indikator led. Setelah di uji coba sensor fotodioda ketika mendeteksi api, lampu indikator led mati atau logika Low (0). sedangkan jika fotodioda tidak mendeteksi api, lampu indikator led menyala atau logika High (1). 

Jika tidak menggunakan rangkaian komparator sebenernya juga bisa, dengan memanfaatkan fitur ADC pada mikrokontroler, sehingga sensor fotodioda cukup di rangkai dengan prinsip pembagi tegangan.
Tapi kalau dalam robot KRPAI saya lebih memilih sensor fotodioda di rangkai menggunakan prinsip komparator, hal ini di karenakan untuk mengurangi beban kerja dari mikrokontroler yang sudah terprogram utk algoritma memadamkan api.
Tambahan satu lagi, sensor api menggunakan fotodioda ini sebaiknya di beri shield / pelindung agar bisa fokus utk mendeteksi api dan tidak terpengaruh cahaya luar,

Oke sampai disini dulu yaa.., klo ada yang bingung komen aja....
Yang penasaran gimana kinerja sensor ini bisa liat video di bawah ini:

Sabtu, 19 April 2014

Rangkaian komparator sederhana

Assalamualaikum., wr,wb

Udah lama gak ngeblog., ampe lupa gmn cara'y ngeblog. hahaha...
Sekarang saya akan ngebahas sedikit tentang yang sederhana dari elektronika., yaitu rangkaian komparator
mengapa saya ambil tema ini, karena dari rangkaian komparator kita bisa banyak membuat aplikasi rangkaian utk robotika, seperti membuat sensor garis, sensor api, sound aktivation, dll.
Oke langsung aja.,

Komparator adalah komponen elektronik yang berfungsi membandingkan 2 nilai kemudian memberikan hasil  mana yang lebih besar dan mana yang lebih kecil. komparator bisa dibuat dari konfigurasi open-loop Op Amp. Jika kedua input pada Op Amp pada kondisi open-loop, maka Op Amp akan membandingkan kedua saluran input tersebut. Hasil dari komparasi dua tegangan pada saluran masukan akan menghasilkan tegangan saturasi positif (+Vsat) atau saturasi negatif (-Vsat).

Sebuah rangkaian komparator pada Op Amp akan membandingkan tegangan yang masuk pada satu saluran input dengan tegangan referensi. Tegangan output berupa tegangan high atau low sesuai dengan perbandingan Vin dan Vref. Berikut adalah rangkaian komparator sederhana.


Gambar 1. Rangkaian Komparator sederhana

Vref di hubungkan ke +V supply, kemudian R1 dan R2 digunakan sebagai pembagi tegangan, sehingga nilai tegangan yang di referensikan pada masukan + op-amp adalah sebesar :
Vref = [R1/(R1+R2) ] * Vsupply
Op-amp tersebut akan membandingkan nilai tegangan pada kedua masukannya, apabila masukan (-) lebih besar dari masukan (+) maka, keluaran op-amp akan menjadi sama dengan – Vsupply, apabila tegangan masukan (-) lebih kecil dari masukan (+) maka keluaran op-amp akan menjadi sama dengan + Vsupply.
jadi dalam hal ini dapat disimpulkan bahwa:
* Jika input non inverting (V+) >  input inverting (V-) maka Vout = Vsat+
* Jika input non inverting (V+) <  input inverting (V-) maka Vout = Vsat-
Untuk jenis IC Op-Amp yang biasa digunakan pada rangkaian komparator yaitu LM324,LM339,danLM393.

Oke saya kira cukup penjelasan tentang rangkaian komparator sederhana., 
untuk aplikasi dari rangkaian komparator seperti sensor garis, sensor api, dan sound aktifasi nanti saya Posting di blog saya., 

Referensi:
http://madelektro.blogspot.com/2013/04/komparator-op-amp.html#.U1NZU6h_uul
http://palleko.blogspot.com/2012/06/rangkaian-komparator.html

Kamis, 07 Maret 2013

Komunikasi serial antar 2 Mikrokontroler (Master-Slave)

Assalamualaikum., wr. wb.

Postingan kali ini saya akan mencoba untuk membahas tentang komunikasi serial antar 2 mikrokontroller. hal ini dikarenakan rasa penasaran saya untuk menghubungkan 2 mikrokontroler, yang satu sebagai Master dan yg satu lagi sebagai Slave. dulu kasus ini pernah saya temui ketika membuat suatu robot, yang mana robot ini harus menggunakan lebih dari 1 mikrokontroler. kemudian untuk menghubungkan antar mikrokontroler tersebut saya menggunakan teknik port-pin (teknik yg paling simple & lucu) hehehe...,
Ok., langsung aja kita liat foto rangkaian komunikasi serial antar 2 mikrokontroler di bawah ini:

Gambar 2. Rangkaian mikrokontroler master-slave
Disini saya menggunakan 2 mikrokontroler AVR ATmega 32. dengan kristal 8 Mhz,  seharus'y yg bagus utk komunikasi serial menggunakan kristal 11.059200 Mhz, supaya baudrate error'y 0.0%. Sensor ultrasonik yang saya gunakan HC-SR04 (sensor cina coy!), servo yang saya pakai micro gws, dan baterai yang saya gunakan adalah baterai lipo 2S 500mAh. Mikrokontroler yg dijadikan master (minsys yg warna hijau) berfungsi mengirimkan data (transmitter) dan Mikrokontroler yg di jadikan Slave(minsys yg warna biru) akan menerima data (Receiver) dari mikrokontroler (Master). supaya lebih gampang mungkin bisa melihat diagram blok di bawah ini:

Gambar 2. Diagram Blok.

Prinsip kerja dari diagram blok diatas yaitu mikrokntroler master akan mengaktifkan sensor ultrasonik pada PortB dan menampilkan data jarak pada LCD di PortC. Jika jarak yg di deteksi sensor ultrasonik  kurang dari sama dengan (<=100 mm) maka mikrokontroler master akan mengirimkan karakter ke mikrokontroler slave, yang kemudian mikrokontroler slave akan menggerakan motor servo. Pengiriman karakter ini menggunakan komunikasi serial yang mana pada Mikro Master terhubung pada PortD.1 (Tx) dan Mikro Slave terhubung pada PortD.0 (Rx). dan satu lagi ground antar ke-2 mikrokontroler ini harus di satukan. Baudrate yg digunakan yaitu 9600. Untuk lebih jelas'y mungkin bisa dilihat video'y di akhir postingan ini.

Next..!! lanjut ke codevision AVR.

Pengaturan mikrokontroler, kristal, dan port B (sensor Us) menggunakan codewizard pada sisi Transmitter.

Gamar 3. Pengaturan Mikro,kristal,dan port sensor Us

Pengaturan USART dan LCD menggunakan codewizard pada sisi Transmitter.

Gambar 4. Pengaturan Usart dan LCD
Pengaturan mikrokontroler, kristal, dan usart  menggunakan codewizard pada sisi Receiver.

Gambar 5. Pengaturan mikrokonroler, kristal, dan USART.
======================================================================
Berikut Listing Program pada sisi Transmiter:

/*****************************************************

Project : Komunikasi serial antar 2 mikro

Author  : Mr.Jho_robin

Company : URC
Comments: Program untuk Transmitter <master>
Chip type           : ATmega32
Program type        : Application
Clock frequency     : 8.000000 MHz
Memory model        : Small
External RAM size   : 0
Data Stack size     : 512
*****************************************************/
#include <mega32.h>
#include <delay.h>
#include <stdio.h>
#include <math.h>
#define triger PORTB.0
#define echo PINB.1
// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>

unsigned char buf[33];
unsigned int counter,jarak;

void hysr04()
        triger=1;
        delay_us(10);
        triger=0;
        while (echo==0)
        {counter=0;
         jarak=0;
        }
        while (echo==1) 
        counter++;
        jarak=counter/3.4;                     // supaya hasil''mm' maka dibagi 3.4 
        sprintf(buf,"jarak=%4d mm ",jarak);        
        lcd_gotoxy(0,1);
        lcd_puts(buf);
        lcd_gotoxy(0,0);
        lcd_putsf("sensor cina Coy!");
        delay_ms(200);
}      

void main(void)
{

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTB=0x00;
DDRB=0x01;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTD=0x00;
DDRD=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// LCD module initialization
lcd_init(16);
lcd_gotoxy(0,0);
lcd_putsf("Joko Kegantengan");
delay_ms(1000);
lcd_clear();

while (1)
      {
       hysr04();
       if(jarak<=100)
       { printf("k");}
       else
       { printf("s");}
      };
}

========================================================================
Berikut Listing Program pada sisi Receiver :

/*****************************************************

Project : Komunikasi serial antar 2 mikro

Author  : Mr.Jho_robin

Company : URC
Comments: Program untuk Receiver <slave>
Chip type           : ATmega32
Program type        : Application
Clock frequency     : 8.000000 MHz
Memory model        : Small
External RAM size   : 0
Data Stack size     : 512
*****************************************************/

#include <mega32.h>

#include <delay.h>
#include <stdio.h>
#define servo PORTC.0
unsigned int j;
unsigned char servok;
unsigned char receive;

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Place your code here
    j++;
         if(j==625)
            j=0;
        else
    {
        if(j<=servok) servo=1;
        else servo=0;
  }
 }
void posisi()
{
 servok=28;
 delay_ms(800);
 servok=75;
 delay_ms(800);
}

void diam()
{
 servok=49;
}

void main(void)
{

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTC=0x00;
DDRC=0x01;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x01;
TCNT0=0x00;
OCR0=0x00;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: Off
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x10;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// Global enable interrupts
#asm("sei")

while (1)
      {
         receive=getchar();
         if(receive=='k')
           {posisi();}
         else if (receive=='s')
           {diam();}   
      };
}

=======================================================================
 Berikut video dari komunikasi serial antar 2 mikrokontroler.


Sebenernya saya ingin melanjutkan komunikasi serial antar 3 mikro dengan 1 master dan 2 slave. Program sudah siap, akan tetapi mikrokontroler'y yg terakhir ternyata rusak. T.T. mungkin jika sudah ada mikrokontroler'y saya akan coba posting lanjutan dari komunikasi serial antar 2 mikrokontroler. 
jika ada yg ingin di tanyakan silahkan komen aja. Ok..!!!

Reff:
http://www.musbikhin.com/komunikasi-dua-mikrokontroler-menggunakan-serial-usart
http://too-payz.blogspot.com/2010/03/kauc-komunikasi-antar-mikrokontroller_10.html

Kamis, 31 Januari 2013

Cara Menggunakan Servo Controller SSC32 dengan CodeVision AVR

Assalamualaikum.., wr.wb.


     Setelah ane posting tentang Pengenalan Motor Servo, kali ini ane mau share bagaimana cara menggunakan servo controller ssc32 untuk menggerakan motor servo dengan pemograman bahasa C codevision AVR. 

     Ok., langsung ja.., Servo controller ssc32 merupakan device yang berfungsi untuk menggerakkan motor servo hingga 32 buah motor. ssc32 sama halnya dengan driver motor pada motor dc, yaitu untuk menjembatani antara minsys mikrokontroler dengan motor servo. Servo controller ssc32 yang saya gunakan merupakan buatan dari lynxmotion. Harga ssc32 kalau sekarang sktr $40, tapi jangan takut di Indonesia sudah ada yg berhasil membuat kloningan ssc32 dengan harga yg lebih murah sktr 350rb. berikut penampakan servo controller ssc32.
Gambar 1. Servo Controller SSC32

Jika ada yang mau download user manual bisa klik disini. 

Spesifikasi ssc32 :
  • Microcontroller = Atmel ATMEGA168-20PU
  • EEPROM = 24LC32P (Required for 2.01GP) 
  • Speed = 14.75 MHz
  • Internal Sequencer = 12 Servo Hexapod (Alternating Tripod)  
  • Serial input = True RS-232 or TTL, 2400, 9600, 38.4k, 115.2k, N81 
  • Outputs = 32 (Servo or TTL)  
  • Inputs = 4 (Static or Latching, Analog or Digital) 
  • PC interface = DB9F
  • Current requirements = 31mA  
  • Microcontroller interface = Header posts 
  • Servo control = Up to 32 servos plug in directly  
  • Servo motion control = Immediate, Timed, Speed or Synchronized. 
  • PC board size = 3.0" x 2.3"  
  • VS current capacity = 15 amps per side, 30 amps max
     Selanjutnya untuk melihat bagian ssc32 , jumper dan connector SSC32 dapat dilihat dibawah ini:

Gambar 2. Bagian-Bagian SSC32
Gambar 3. Jumper dan Connector SSC32
     Dari gambar diatas kita bisa melihat aturan main dari ssc32, dan kayaknya gak perlu ane jelasin coz emank udah jelas., hehehe,, tp klo emank ada yang belum jelas komen ja yak..!! 
Komunikasi yg digunakan ssc32 dengan Minsys Avr adalah serial. dimana dalam coding'y mempunyai aturan main sendiri, seperti di bawah ini.

contoh untuk menggerakan 1 servo :
 " # 2 P1500 <cr> "
dari contoh tsb servo akan bergerak pada channel 2 ke posisi 1500, dan cr itu merupakan karakter ascii 13 yg diperlukan untuk melakukan gerakan servo.

contoh untuk menggerakan group servo :
 "# 0 P500 #2 P1000 #4 P500 #6 P1000 <cr>"
dari contoh tsb servo pada channel 0 dan 4 bergerak ke posisi 500, sedangkan untuk channel 2 dan 6 akan bergerak ke posisi 1000.

Sebelum kita ke pemograman bahasa C CVAVR untuk menggunakan ssc32, sebaiknya kita lihat dulu wiring diagramdi bawah ini.

Gambar 4. Wiring Diagram SSC32

     Dari wiring diagram diatas dapat kita lihat konektor untuk ssc32 dengan bot board / minsys hanya 2 kabel yaitu warna merah (RX) dan warna hitam (ground), hal ini karena bot board / minsys sebagai transmitter / pengirim data. jika pada minsys avr seri atmega 16, 8535 atau 32. maka konektor (RX) di hubungkan pada pin d.1. kemudian untuk supply tegangan terdapat warna merah (+) dan warna hitam (-), sumber tegangan yang digunakan yaitu 9 Vdc untuk supply ssc32 dan 6 Vdc untuk supply motor servo. sumber tegangan tersebut terpisah agar tidak saling membebani. setelah itu untuk konektor servo terdapat 3 kabel yaitu merah(+), hitam (ground / - ), dan kuning (sinyal / pulsa).

Next..!!! kita lanjut ke Codevision AVR.

Pengaturan mikrokontroler dan kristal menggunakan codewizard :


Pengaturan komunikasi serial menggunakan codewizard :



Listing Program sebagai berikut :

/*****************************************************
Project :  Komunikasi serial ssc32
Date    :   31/3/2013
Author  : Joko Lelono
Company : Jhorobin
Comments: minsys hanya sebagai transmitter

Chip type           : ATmega8535
Program type        : Application
Clock frequency     : 11.059200 MHz
Memory model        : Small
External RAM size   : 0
Data Stack size     : 256
*****************************************************/
#include <mega8535.h>
#include <delay.h>
#include <stdio.h>

void main(void)
{

PORTD=0x00;
DDRD=0x00;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 115200
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x05;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

while (1)
      {
      // Place your code here
      putsf("#16 P500 #20 P500");        // servo di channel 6 dan channel 20 ke posisi 0 derajat.
      putchar(13);
      delay_ms(2000);
      putsf("#16 P2200 #20 P2200");    // servo di channel 6 dan channel 20 ke posisi 180 derajat.
      putchar(13);
      delay_ms(2000);
      };
}


Gimana gan simple kan.., hehehe,.. coding diatas hanya sample untuk menggerakan 2 motor servo dan 2 posisi. coding diatas bisa di kembangkan lagi untuk smoothing servo dan project robot berkaki ataupun humanoid dengan menggerakan banyak servo.

ohya untuk temen2 yg gak punya servo controller ssc32 gak usah takut, nanti ane akan bahas tentang servo controller menggunakan minsys avr dengan memanfaatkan interupt timer. so keep follow my blog..!!

ane kira cukup sampai disini dulu pembahas ssc32. untuk video bisa liat di bawah ini, klo ada yg kurang jelas komen ja. Ok..!!
Semoga bermanfaat.

Wassalam..,














Selasa, 29 Januari 2013

Pengenalan Motor Servo


Assalamualaikum..,wr.wb.

Gak Nyangka ternyata blog gak pernah di update ampe 1 tahun. untung masih bisa di buka. hehehe..,
OK dah ane langsung aja, Kali ini ane akan mencoba membahas tentang Motor Servo.

      Motor servo pada pada umumnya terdiri dari dua jenis yaitu motor servo standar yang memiliki putaran 180o dan motor servo continuos yang memiliki putaran 360o. Motor servo hanya memiliki 3 buah kabel yaitu Vcc, Ground, dan sinyal. Motor servo memiliki kemampuan mempertahankan posisi sudutnya (jika diberikan pulsa terus-menerus), karena kemampuannya tersebut motor servo juga disebut position locking motor. Pada robot, motor ini sering digunakan untuk bagian kaki, lengan, atau bagian-bagian lain yang mempunyai gerakan terbatas dan membutuhkan torsi yang cukup besar.
      Motor servo standar 180o dapat bergerak dua arah (CW dan CCW) dengan defleksi masing-masing sudut mencapai 90o sehingga total defleksi sudut dari kanan–tengah–kiri adalah 180o seperti yang terlihat pada (Gambar 1).


 Gambar 1. Sudut Motor Servo

     Ada beberapa merk motor servo di pasaran, motor servo yang sering saya gunakan yaitu merk Hitec HS-322HD, HS-422, dan GWS micro standard. berikut penampakan dari motor servo tsb.

Gambar 2. Dari kiri - kanan : Hitec HS-322HD,
HS-422, dan GWS micro standard

Adapun spesifikasi dari motor servo tersebut dapat dilihat pada tabel di bawah ini :

Tabel 1. Spesifikasi motor servo
     Pada diatas menjelaskan spesifikasi motor servo jenis standar (HS-322),  (HS-422), dan motor servo jenis mikro (GWS Micro standard), motor servo yang memiliki ukuran lebih besar biasanya memiliki torsi yang lebih besar pula dan servo yang memiliki ukuran lebih kecil memiliki kecepatan putar yang lebih cepat.
      Motor servo akan bergerak secara baik jika pin outputnya diberikan sinyal PWM dengan frekuensi 50Hz. Motor servo digerakkan oleh sebuah  pulsa ± 20ms, lebar pulsa antara 0,5ms dan 2,5ms menyatakan awal dan akhir dari range sudut maksimum. Berikut adalah bentuk pulsa yang harus diberikan pada motor servo dapat dilihat pada (Gambar 3).
 

 Gambar 3. Pergerakan Motor Servo Terhadap Perubahan Lebar Pulsa.

      Motor servo pada (Gambar 3) apabila diberikan durasi pulsa high sebesar 1,5ms maka horn dari motor servo akan bergerak 90o (center), durasi pulsa high kurang dari 1,5ms maka horn dari motor servo akan bergerak mendekati 0o , dan jika durasi pulsa high lebih dari 1,5ms maka horn dari motor servo akan bergerak mendekati 180o. Nilai pulsa diatas tidaklah mutlak dikarenakan setiap motor servo memliki karakteristik yang berbeda. Hubungan antara sudut motor servo dengan durasi pulsa high berbanding lurus atau linear. Berikut adalah gambar hubungan antara sudut dan durasi pulsa high motor servo. 
Gambar 4. Hubungan antara sudut dan durasi pulsa high motor servo.
Dari diatas terlihat hubungan antara sudut motor servo dengan durasi pulsa high adalah berbanding lurus atau linear, untuk menentukan besarnya durasi pulsa high terhadap sudut motor servo bisa menggunakan persamaan garis lurus (Stroud, 1987). 


Keterangan :
t  = durasi pulsa high untuk sudut yang diinginkan (ms)
t1 = durasi pulsa high untuk sudut awal (ms)
t2 = durasi pulsa high untuk sudut akhir (ms)
θ  = Sudut yang diinginkan (derajat)
θ1 = Sudut awal (derajat)
θ2 = Sudut akhir (derajat)

Berikut adalah contoh dari perhitungan'y.:
Jika sudut yang diinginkan 90o maka:

                                             
Jika sudut yang diinginkan 142o maka :




Ok. ane rasa cukup untuk pengenalan motor servo.
Kalau ada yang kurang jelas silahkan komen ja. OK..!!!
 
selanjutnya ane akan bahas tentang Servo Controller .
so, ikutin terus blog ane..!!! hehe...,