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