Tampilkan postingan dengan label Robotika. Tampilkan semua postingan
Tampilkan postingan dengan label Robotika. Tampilkan semua postingan

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, 10 Januari 2012

Robot Pengikut Garis Menggunakan Mikrokontroler

Setelah ane posting tentang rangkaian minimum system AVR, sensor garis dengan komparator, dan driver motor. Saatnya ane mencoba menggabungkan rangkaian tersebut menjadi sebuah robot yang dapat mengikuti garis. Mungkin disini saya akan share hanya garis besar’y saja, tetapi jangan khawatir saya juga akan kasih coding’y dalam bahasa C dengan compiler Codevision AVR.

OK., langsung aja…!!! kita lihat diagram blok dibawah ini.

 
Gambar 1. Diagram Blok Robot Pengikut Garis

Diagram blok diatas merupakan gambaran secara umum dari sistem robot pengikut garis. Dari inputan bisa dilihat terdapat 8 sensor dengan inisial s1 – s8. Kemudian sensor tersebut masuk ke komparator, dari komparator diolah oleh mikrokontroler untuk menghasilkan gerakan motor dc (roda) agar robot dapat mengikuti garis dengan baik. Untuk penjelasan tentang sensor garis degan komparator bisa lihat disini, kemudian untuk rangkaian minimum system avr bisa baca disini juga, sedangkan rangkaian driver motor bisa lihat disana.

 
Berikut gambar atau foto robot pengikut garis yang pernah ane & temen ane buat:

 
Gambar 2. Robot Banzay


Robot ini merupakan robot yang paling sederhana dengan komponen seadanya., itu juga boleh minjem punya temen (hehe..) proses pembuatanya hanya 2 hari. Tapi dengan usaha yang keras dan doa dari temen2 robot ini pernah menjadi juara 3 di Tybot LFC 2010, Alhamdulillah sesuatu..,!! (syahrini :mode on). Hehehe..,
Nah.., sekarang kita main ke logika sederhana robot pengikut garis ini. Sensor yang saya gunakan untuk membaca garis sebanyak 8 buah (photodiode dipasangkan dengan led superbright). Sehingga didapat logika pembacaan sensor seperti gambar dibawah ini.

  
Gambar 4. Logika Sensor Garis

Setelah mengetahui kemungkinan-kemungkinan posisi sensor, maka selanjutnya harus didefinisikan aksi dari setiap kondisi tersebut. Aksi pergerakan robot terhadap sensor garis dapat dilihat pada table dibawah ini.

Posisi Sensor

Aksi Robot


Roda Kiri

Roda kanan
1.
Belok kanan tajam
Maju cepat
Berhenti
2.
Belok kanan sedang
Maju cepat
Maju sangat lambat
3.
Belok kanan ringan
Maju cepat
Maju lambat
4.
Maju kanan
Maju cepat
Maju sedang
5.
Maju Lurus
Maju cepat
Maju cepat
6.
Maju kiri
Maju sedang
Maju cepat
7.
Belok kiri ringan
Maju lambat
Maju cepat
8.
Belok kiri sedang
Maju sangat lambat
Maju cepat
9.
Belok kiri tajam
Berhenti.
Maju cepat

Agar pergerakan robot menjadi lebih smooth / halus, maka kecepatan robot diatur sesuai dengan pembacaan sensor garis.  Jika posisi robot menyimpang dari garis , maka robot akan melambat. Namun jika robot berada tepat diatas garis maka robot akan bergerak cepat. Robot juga dapat kembali ke garis pada saat robot terlepas sama sekali dari garis. Hal ini bisa dilakukan karena robot selalu mengingat kondisi terakhir pembacaan sensor. Jika terakhir kondisinya adalah disebelah kanan garis, maka robot akan bergerak ke kanan, dan sebaliknya.

sekarang ane akan share coding’y pake bahasa C dengan compiler codevision AVR:

#include <mega16.h>
#include <delay.h>
#define motka1  PORTD.0
#define motka2  PORTD.1
#define motki1  PORTD.2
#define motki2  PORTD.3
#define lpwm OCR1A
#define rpwm OCR1B
#define sensor PINA

// Declare your global variables here
void maju()
{motki1=1;  motki2=0;
 motka1=1;  motka2=0;}
void stop()
{motki1=0;  motki2=0;
 motka1=0;  motka2=0;}
void mundur()
{lpwm=150;  rpwm=150;
 motki1=0;  motki2=1;
 motka1=0;  motki2=1;}
void bkir()
{lpwm=200;  rpwm=250;
 motki1=1;  motki2=0;
 motka1=0;  motka2=1;}
void bkan()
{lpwm=250;  rpwm=200;
 motki1=0;  motki2=1;
 motka1=1;  motka2=0;}
 
void garishitam()
{
 int PV;
 sensor=PINA;
 sensor&=0xFF;
 switch(sensor)
 { //satu sensor
   case 0b11111110: bkan();                       PV=0;   break;
   case 0b11111101: maju(); lpwm=250; rpwm=0;     PV=0;   break;
   case 0b11111011: maju(); lpwm=250; rpwm=150;   PV=0;   break;
   case 0b11110111: maju(); lpwm=250; rpwm=200;   PV=0;   break;
   case 0b11101111: maju(); lpwm=200; rpwm=250;   PV=1;   break;
   case 0b11011111: maju(); lpwm=150; rpwm=250;   PV=1;   break;
   case 0b10111111: maju(); lpwm=0; rpwm=250;     PV=1;   break;
   case 0b01111111: bkir();                       PV=1;   break;
   //dua sensor
   case 0b11111100: maju(); lpwm=250; rpwm=50;    PV=0;   break;
   case 0b11111001: maju(); lpwm=250; rpwm=75;    PV=0;   break;
   case 0b11110011: maju(); lpwm=250; rpwm=150;   PV=0;   break;
   case 0b11100111: maju(); lpwm=250; rpwm=250;           break;
   case 0b11001111: maju(); lpwm=150; rpwm=250;   PV=1;   break;
   case 0b10011111: maju(); lpwm=75; rpwm=250;    PV=1;   break;
   case 0b00111111: maju(); lpwm=50; rpwm=250;    PV=1;   break;
   case 0b11111111:
                    if(PV==0)
                    {bkan();   break;}
                    else if(PV==1)
                    {bkir();   break;}
 }
}

void main(void)
{
//Sensor Garis
PORTA=0x00;
DDRA=0x00;
//Motor
PORTB=0x60;
DDRB=0x6F;
// PWM menggunakan timer 1
TCCR1A=0xA1;
TCCR1B=0x0A;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

ACSR=0x80;
SFIOR=0x00;
while (1)
      {
      // Place your code here
      garishitam();
      };
}

Dari coding diatas berikut video dari robot ane, cekidot :