Tampilkan postingan dengan label ROBOTIK. Tampilkan semua postingan
Tampilkan postingan dengan label ROBOTIK. Tampilkan semua postingan

September 09, 2012

Tutorial RFID RDM630 dengan Mikrokontroler


Sebelumnya saya juga pernah memposting tentang RFID tipe ID20 (bisa juga untuk ID12. Bedanya RDM630 dengan ID20 dan ID12 adalah pada jarak pembacaan data, kalau pada ID20 data bisa dibaca sampai data 16cm, ID12 bisa sampai 8cm, sedangkan RDM630 ini paling jauh sekitar 1cm. Selain itu juga berbeda pada data yang dikirim, jika pada ID20 dan ID12 data yang dikirim selalu diakhiri dengan ENTER atau chr(13) sehingga pembacaan data bisa diakhiri dengan diterimanya ENTER, sedangkan pada RDM630 data tidak diakhiri dengan ENTER sehingga pembacaan data bisa diakhiri dengan menghitung banyaknya data yang sudah masuk atau sampai tidak diterima data atau kosong.
Konfigurasi PIN pada RDM630 adalah sebagai berikut

Ada dua tipe data yang bisa dibaca, yaitu TTL dan WIEGAND, pada contoh ini yang akan dibahas adalah pembacaan data TTL. Untuk detail lengkap RDM630 bisa dilihat pada datasheet.

Rangkaian skematiknya sebagai berikut:
Listing programnya dengan BASCOM AVR sbb:
'===========================================================
'PROGRAM RFID RDM630 DENGAN BASCOM AVR
'PROGRAMMER = WAHYU RAHMANIAR
'COMPANY    = TECHNOLOGINATION
'===========================================================

$regfile = "m32def.dat"
$crystal = 8000000
$baud = 9600

'Konfigurasi LCD
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
Config Lcd = 16 * 2

Dim Cek As String * 1
Dim Datas As String * 20
Dim Id As String * 20
Dim I As Integer

Cls
Cursor Off
Locate 1 , 1
Lcd "==RFID RDM630=="
Locate 2 , 1
Lcd "TECHNOLOGINATION"
Wait 1

Mulai:

Datas = ""
I = 0
Do
Cek = Inkey()
If Cek <> "" Then
Incr I
Datas = Datas + Cek
End If
Loop Until I > 13
I = 0
Cls
Cursor Off
Locate 1 , 1
Lcd "Data ID: "
Locate 2 , 1
Lcd Datas
Wait 1 
Dekatkan ID dengan jarak kurang lebih 1 cm, jika rangkaiannya benar maka ID akan terbaca dan tampil datanya pada LCD. disini

sumber
Program juga dapat didownload

Juni 13, 2012

pengontrol kecepatan motor dengan Atmega16

Dengan proyek ini, Anda dapat mengontrol motor stepper unipolar. Anda dapat mengontrol kecepatan dan arah motor.

Kecepatan dan arah serta dapat berubah dengan bantuan tombol. Data yang ditampilkan di atas layar LCD.

Sebuah tombol 4x4 digunakan untuk memasukkan kecepatan dan memilih arah.

Load file hex ke dalam chip, jangan lupa untuk memilih osilator internal pada 10MHz.

Kemudian beralih di sirkuit dan pilih arah dengan menekan tombol yang sesuai (Kiri atau Kanan). Lalu masukkan kecepatan melalui tombol angka dan tekan tombol Enter untuk memulai operasi. Untuk mematikan motor tekan saklar terpisah yang terhubung ke A.0 pelabuhan

Proteus file simulasi juga ditambahkan dengan file download, sehingga Anda dapat menjalankan program di desktop Anda.

download program dan simulasi proteus

April 30, 2012

Kunci Otomatis menggunakan AVR ATMEGA16

Ini postingan pertama saya dalam hal mikrokontroller seri ATMEGA16. Saya anggap yang sedang membaca artikel saya ini telah mengerti tentang mikrokontroler khususnya ATMEGA. Disini saya menggunakan compiler CVAVR Codevison dengan simulasi proteus. Program ini saya ambil dari elektro-kontrol.blogspot.com tapi dengan menggunakan keypad 3x4...(kalo di web aslinya pakai keypad 4x4). Jadi saya cuma modif sedikit saja.


berikut penjelasan dari elektro-kontrol.blogspot.com

Mungkin teman-teman semua sudah tahu tentang aplikasi yang bernama pengunci pintu (door lock) berpassword, pada aplikasi ini sudah saya realisasikan pada hardware yang sesungguhnya dan berhasil.

Kesulitan utama dari aplikasi ini adalah ketika seorang user memasukkan password dengan menggunakan keypad, kita harus dapat menyimpan input yang berasal dari keypad kedalam satu variabel. Misalnya user menekan 6, lalu 2, lalu 0 dan 4 berarti passwornya adalah 6204 (misalkan). Nilai tersebut harus dijadikan dalam 1 variabel yang kemudian akan dibandingkan dengan password yang sebenarnya. Jika user memasukkan password dengan benar maka akan membuka kunci, jika salah maka kunci tidak akan terbuka.

Untuk mengatasi masalah tersebut saya menggunakan array untuk mendeteksi berapa kali penekanan keypad dan angka berapa yang akan ditekan. Baiklah disini saya akan menjelaskan algoritma yang saya buat. Jika user menekan 6, lalu 2 lalu 0 dan 4 maka seperti ini logikanya:

Awalnya saya deklarasikan array sebagai berikut:
array[10], i=0;

saat terjadi penekanan angka 6 maka;
i++ (saya increamentkan) jadi i=1
kemudian angka 6 saya simpan pada variabel array[i] jadi array[1]=6

kemudian saat terjadi penekanan angka 2, maka:
i++ (saya increamentkan lagi) jadi i=2
kemudian angka 2 saya simpan pada variabel array[i] jadi array[2]=2

kemudian saat terjadi penekanan angka 0, maka:
i++ (saya increamentkan lagi) jadi i=3
kemudian angka 0 saya simpan pada variabel array[i] jadi array[3]=0

kemudian saat terjadi penekanan angka 4, maka:
i++ (saya increamentkan lagi) jadi i=4
kemudian angka 4 saya simpan pada variabel array[i] jadi array[4]=4
maka didapat array[1]=6, array[2]=2, array[3]=0, array[4]=4

kalo sudah didapat seperti diatas maka kita tinggal kumpulkan dalam satu variabel (nama variabelnya misalkan nilai) caranya:

saat i bernilai 1, i=1 kita hitung dengan rumus:
nilai=array[1]  //jadi nilai=6

saat i bernilai 2, i=2 kita hitung dengan rumus:
nilai=(array[1]*10)+array[2]  //jadi nilai=62

saat i bernilai 3, i=3 kita hitung dengan rumus:
nilai=(array[1]*100)+(array[2]*10)+array[3]  //jadi nilai=620

saat i bernilai 4, i=4 kita hitung dengan rumus:
nilai=(array[1]*1000)+(array[2]*100)+(array[3]*10)+array[4]  //jadi nilai=6204
Sudah mengerti bukan, dari rumus-rumus diatas masih dapat disederhanakan, menjadi:

jika i=1
nilai=array[i]

jika i bernilai (i>=2 dan i<=8)
nilai=(nilai*10)+array[i]
Banyaknya penekanan tombol saya batasi sampai 8 kali. Sebenarnya saya ingin membuatnya sampai 10 kali tetapi saat saya coba tidak berjalan dengan lancar saat penekanan ke 9 kali. Saya tidak tahu kenapa? Jika teman-teman bisa memecahkannya tolong beri tahu saya!

Baiklah kembali lagi ke aplikasi yang akan kita buat. Langsung saja ke cara kerjanya, gambar rangkaiannya bisa anda lihat dibawah ini. Saat pertama kali alat ini saya nyalakan maka dalam keadaan tidak terkunci (unlock), untuk menguncinya (lock) anda harus menekan tombol = (lihat gambar keypad dibawah). Setelah terkunci, jika anda ingin membukanya kembali anda harus memasukkan passwordnya (jika sudah mengetikan password tekan tombol + untuk memasukkannya). Jika benar maka akan membuka kunci, tetapi jika salah kunci tidak akan terbuka. Ketika sudah terbuka maka cara kerjanya kembali lagi ke awal. Sedangkan tombol ON/C saya gunakan untuk menghapus password jika salah dalam pengetikannya. Untuk indikator kuncinya saya menggunakan sebuah LED, jika LED menyala maka dalam keadaan tidak terkunci dan jika mati dalam keadaan terkunci.



/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.6 Professional
Automatic Program Generator
© Copyright 1998-2005 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
e-mail:office@hpinfotech.com

Project : 
Version : 
Date    : 9/20/2011
Author  : F4CG                            
Company : F4CG                            
Comments: 


Chip type           : ATmega16
Program type        : Application
Clock frequency     : 12.000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 256
*****************************************************/

#include <mega16.h>
#include <delay.h>
#include <stdlib.h>
#include <stdio.h>


// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>

// Declare your global variables here
float nilai=0,password=321;
char temp[12],array[10],i=0,index=0;

void lock()
{
while(index==0)
{
  lcd_gotoxy(0,0);
  lcd_putsf("please press #");
  lcd_gotoxy(0,1);
  lcd_putsf("to lock");
  
  PORTB=0b10111111;
  delay_ms(10);
  if(PINB.3==0)
  {
  index=1;
  PORTD.1=1;//terkunci
  lcd_clear();
  lcd_gotoxy(0,0);
  lcd_putsf("LOCKED");
  delay_ms(100);
  lcd_clear();
  
  }
}
 }

void enter()
{
if(nilai==password)
{                  
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Unlock");
delay_ms(100);
i=0; nilai=0;
PORTD.1=0;//kunci terbuka
index=0;
}       
else
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Wrong Password");
i=0; nilai=0;
index=1;//masih terkunci
}
}                       

void simpan_dalam1variabel()
{
if(i==1)
{nilai=array[i];}
if(i>=2 && i<=11)
{nilai=(nilai*10)+array[i];}
}                           

void scanning_keypad()
{                              

lcd_gotoxy(0,0);
lcd_putsf("enter u'r pass:");

PORTB=0b11101111;
delay_ms(3);
if(PINB.0==0)
{i++;array[i]=1;simpan_dalam1variabel();delay_ms(30);}
if(PINB.1==0)
{i++;array[i]=4;simpan_dalam1variabel();delay_ms(30);}
if(PINB.2==0)
{i++;array[i]=7;simpan_dalam1variabel();delay_ms(30);}
if(PINB.3==0)
{enter();delay_ms(30);}

PORTB=0b11011111;
delay_ms(3);
if(PINB.0==0)
{i++;array[i]=2;simpan_dalam1variabel();delay_ms(30);}
if(PINB.1==0)
{i++;array[i]=5;simpan_dalam1variabel();delay_ms(30);}
if(PINB.2==0)
{i++;array[i]=8;simpan_dalam1variabel();delay_ms(30);}
if(PINB.3==0)
{i++;array[i]=0;simpan_dalam1variabel();delay_ms(30);}

PORTB=0b10111111;
delay_ms(3);
if(PINB.0==0)
{i++;array[i]=3;simpan_dalam1variabel();delay_ms(30);}
if(PINB.1==0)
{i++;array[i]=6;simpan_dalam1variabel();delay_ms(30);}
if(PINB.2==0)
{i++;array[i]=9;simpan_dalam1variabel();delay_ms(30);}
if(PINB.3==0)
{delay_ms(30);}
}        
void tampil_lcd()
{
if(nilai>0)
{
ftoa(nilai,0,temp);
lcd_gotoxy(0,1);
lcd_puts(temp);
}
}
void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A 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 
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 

April 19, 2012

Tutorial Seven Segment dengan AVR GCC / winAVR

 
Sebelumnya saya sudah pernah memposting tentang Tutorial Seven Segment dengan CodeVision AVR, untuk mengetahui tentang Seven Segment itu sendiri bisa dilihat pada postingan sebelumnya tersebut.
Kali ini saya akan memberikan tutorial untuk menampilkan dispkay angka pada Seven Segment dengan program AVR Studio atau winAVR.


Rangkaian Skematiknya sbb:




Ada dua cara untuk menampilkan tulisan pada Seven Segment dengan AVR Studio ini, cara pertama listing programnya sebagai berikut:

/*
================================================
Program Seven Segment Display dengan AVR Studio
Programmer     : Wahyu Rahmaniar
Company        : Technologination                
================================================
 */


#include<avr/io.h>
#include<util/delay.h>

#define DATA_DDR     DDRC
#define DATA_PORT      PORTC
#define Pin_a             0
#define Pin_b             1
#define Pin_c             2
#define Pin_d             3
#define Pin_e             4
#define Pin_f             5
#define Pin_g             6
//#define Pin_Dec         7
#define F_CPU 12000000ul

void Display(int a);

  void main(void)
 
  {
  unsigned int i;
  i=0;
  DATA_DDR = 0XFF;
  do
  {
  Display(i);
  i++;
  if(i>9) i=0;
  _delay_ms(3000);
  }
  while(1);
   
 }

  void Display(int a)
  {
  switch(a)
  {
  case 0: 
  DATA_PORT = 0b11000000;
  break;           
  case 1:           
  DATA_PORT = 0b11111001;
  break;           
  case 2: 
  DATA_PORT = 0b10100100;
  break;
           
  case 3: 
  DATA_PORT = 0b10110000;
  break;       
  case 4: 
  DATA_PORT = 0b10011001;
  break;
  case 5: 
  DATA_PORT = 0b10010010;
  break;           
  case 6: 
  DATA_PORT = 0b10000011;
  break;           
  case 7: 
  DATA_PORT = 0b11111000;
  break;           
  case 8: 
  DATA_PORT = 0b10000000;
  break;       
  case 9: 
  DATA_PORT = 0b10011000;
  break;                   
    }
}


Cara Kedua listing programnya sebagai berikut:

/* 
================================================
Program Seven Segment Display dengan AVR Studio
Programmer     : Wahyu Rahmaniar
Company        : Technologination     
================================================           
*/

#include<avr/io.h>
#include<util/delay.h>

#define DATA_DDR     DDRC
#define DATA_PORT      PORTC
#define Pin_a             0
#define Pin_b             1
#define Pin_c             2
#define Pin_d             3
#define Pin_e             4
#define Pin_f             5
#define Pin_g             6
#define Pin_Dec         7
#define F_CPU 12000000ul

void Display(int a);

  void main(void) 
  {
  unsigned int i;
  i=0;
  DATA_DDR = 0XFF;
  do
  {
  Display(i);
  i++;
  if(i>9) i=0;
  _delay_ms(3000);
  }
  while(1);   
 }

  void Display(int a)
  {
  switch(a)
  {
  case 0: 
            DATA_PORT|=_BV(Pin_g);
            DATA_PORT&=~(_BV(Pin_a)|_BV(Pin_b)|_BV(Pin_c)|_BV(Pin_d)|_BV(Pin_e)|_BV(Pin_f));
            break;           
  case 1:           
            DATA_PORT|=(_BV(Pin_a)|_BV(Pin_d)|_BV(Pin_e)|_BV(Pin_f)|_BV(Pin_g));
            DATA_PORT&=~(_BV(Pin_b)|_BV(Pin_c));
            break;           
  case 2:
            DATA_PORT|=(_BV(Pin_c)|_BV(Pin_f));
            DATA_PORT&=~(_BV(Pin_b)|_BV(Pin_d)|_BV(Pin_e)|_BV(Pin_a)|_BV(Pin_g));
            break;
  case 3: 
            DATA_PORT|=(_BV(Pin_e)|_BV(Pin_f));
            DATA_PORT&=~(_BV(Pin_c)|_BV(Pin_d)|_BV(Pin_a)|_BV(Pin_b)|_BV(Pin_g));
            break;
  case 4: 
            DATA_PORT|=(_BV(Pin_a)|_BV(Pin_d)|_BV(Pin_e));
            DATA_PORT&=~(_BV(Pin_c)|_BV(Pin_b)|_BV(Pin_f)|_BV(Pin_g));
            break;
  case 5: 
            DATA_PORT|=(_BV(Pin_b)|_BV(Pin_e));
            DATA_PORT&=~(_BV(Pin_a)|_BV(Pin_c)|_BV(Pin_d)|_BV(Pin_f)|_BV(Pin_g));
            break;
           
  case 6: 
            DATA_PORT|=(_BV(Pin_a)|_BV(Pin_b));
            DATA_PORT&=~(_BV(Pin_c)|_BV(Pin_d)|_BV(Pin_f)|_BV(Pin_g)|_BV(Pin_e));
            break;
  case 7: 
            DATA_PORT|=(_BV(Pin_d)|_BV(Pin_e)|_BV(Pin_f)|_BV(Pin_g));
            DATA_PORT&=~(_BV(Pin_a)|_BV(Pin_c)|_BV(Pin_b));
            break;
  case 8: 
            DATA_PORT&=~(_BV(Pin_a)|_BV(Pin_d)|_BV(Pin_e)|_BV(Pin_c)|_BV(Pin_b)|_BV(Pin_f)|_BV(Pin_g));
            break;
  case 9: 
            DATA_PORT|=(_BV(Pin_d)|_BV(Pin_e));
            DATA_PORT&=~(_BV(Pin_a)|_BV(Pin_c)|_BV(Pin_b)|_BV(Pin_f)|_BV(Pin_g));
            break;                   
    }
}


Kedua program di atas fungsinya sama yaitu untuk menampilkan angka 0 sampai 9 pada 7 segment display.

Simulasi dan listing program lengkapnya bisa di download disini.


sumber

April 14, 2012

Tutorial Seven Segment dengan CodeVision AVR

Tutorial Seven Segment dengan CodeVision AVR

Seven Segment adalah komponen yang terdiri dari tujuh led yang tersusun sedemikian rupa sehingga dapat digunakan untuk menampilkan angka 0-9 dan titik atau koma. Seven Segment seperti led pada umunya memiliki berbagai macam tampilan warna, yaitu merah, kuning, hijau, dsb dan berbagai macam ukuran.
Seven segment berdasarkan input logikanya terbagi menjadi dua macam, yaitu Common Anoda (input logika 0) dan Common Cathoda (input logika 1).
Hal yang perlu diperhatikan dalam setiap komponen seven segment adalah pin-pin pada yang mewakili urutan segmentnya (A-G dan titik), karena tidak semua seven segment sama urutannya walaupun sama ukurannya.

Salah satu contoh urutan kaki pada seven segment adalah sbb:



Ada berbagai macam cara dalam menampilkan seven segment, antara lain dengan menggabungkan langsung setiap pin 7 segment ke pin mikro, menggabungkan pin-pin 7 segment (sehingga yang terhubung ke mikro cuma 7 pin walaupun memakai lebih dari satu buah 7 segment) dengan common setiap 7 segment ke satu pin mikro, menggunakan IC BCD (cara ini lebih mudah, karena tidak perlu memikirkan data setiap led 7 segment, hanya mengirimkan data angka 0-9), dan menggunakan IC Shift Register.

Pada tutorial kali ini saya menggunakan cara kedua, yaitu menggabungkan setiap pin-pin 7 segment (saya menggunakan 3 buah 7 segment) dengan setiap pin common masing-masing 7 segment terhubung pada 1 pin mikrokontroler.


Seven Segment yang saya gunakan adalah Common Anoda, karena logika yang dikirimkan adalah 0 sehingga lebih sedikit power yang terbagi.


Contoh programnya dengan CodeVision AVR adalah sbb:

/*****************************************************
Tutorial 7SEGMENT dengan CodeVision AVR
Programmer : WAHYU RAHMANIAR
Company : TECHNOLOGINATION
*****************************************************/

#include
#include
#include
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x1B ;PORTA
#endasm
#include


// Declare your global variables here
char satuan, puluhan, ratusan, urut;
unsigned int data, data_temp;
unsigned int i;
unsigned char Baris1[16];

void tampil()
{
PORTD=ratusan;//mengirimkan data ratusan
PORTB=0x80;//menyalakan digit1
delay_ms(50);

PORTD=puluhan;//mengirimkan data puluhan
PORTB=0x40;//menyalakan digit2
delay_ms(50);

PORTD=satuan;//mengirimkan data satuan
PORTB=0x20;//menyalakan digit3
delay_ms(50);
//lamanya waktu scanning ditentukan oleh intruksi delay
}

void nyala_led()//fungsi untuk mengubah kedalam format 7segment
{
if (urut==0){urut=0xc0;}
if (urut==1){urut=0xf9;}
if (urut==2){urut=0xa4;}
if (urut==3){urut=0xb0;}
if (urut==4){urut=0x99;}
if (urut==5){urut=0x92;}
if (urut==6){urut=0x82;}
if (urut==7){urut=0xf8;}
if (urut==8){urut=0x80;}
if (urut==9){urut=0x90;}
}

void main(void)
{
PORTA=0x00;
DDRA=0x00;

PORTB=0x00;
DDRB=0xE0;

PORTC=0x00;
DDRC=0x00;

PORTD=0xFF;
DDRD=0xFF;

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

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 11.719 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0xD2;
TCNT1L=0x3A;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

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

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

// 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);
//PORTB.0=1;
i=0;
while (1)
{
if(PORTB.0==0)
{
i++;
}

data=i;

sprintf(Baris1,"Counter=%5u",data);
lcd_gotoxy(0,0);
lcd_puts(Baris1);

data_temp=data;
ratusan=data_temp/100;
urut=ratusan;
nyala_led();
ratusan=urut;

data_temp=data_temp%100;
puluhan=data_temp/10;
urut=puluhan;
nyala_led();
puluhan=urut;

satuan=data_temp%10;
urut=satuan;
nyala_led();//fungsi untuk menyalakan led 7segment
satuan=urut;

tampil();//fungsi untuk mengaktifkan 7segment berdasarkan urutan
delay_ms(1000);
lcd_clear();

};
}

Simulasi dengan proteus dan program dengan CV AVR dapat didownload
disini.

sumber