Minggu, 29 Juli 2012

Membaca Nilai Sensor Proximity via ADC

Melanjutkan postingan saya tentang ADC (Analog Digital Converter) , kali ini saya akan membahas penerapannya yaitu membaca nilai sensor garis/ proximity via ADC. Untuk compilernya saya menggunakan codevision AVR, karena lebih simpel dan kita tidak perlu menghafal register-register AVR.

Langsung saja, buka codevision klik File- New - Project.Jangan lupa setting chip dan clock. Setelah itu klik tab ADC
Pada tampilan tab ADC,
  • ADC Enabled, digunakan untuk mengaktifkan fitur ADC
  • Use 8 bits digunakan untuk memilih mode 8 bit, tetapi jika menginginkan mode 10 bit, tidak perlu dicentang
  • ADC Interrupt untuk mengaktifkan interupt ADC atau tidak
  • High Speed untuk mengaktifkan mode highspeed atau tidak
  • Volt. Ref : referensi tegangan ADC. ubah ke AVCC pin, agar ADC menggunakan referensi tegangan 5 volt
  • ADC Clock untuk memilih frekuensi clock ADC.
  • Auto Trigger Source untuk menentukan sumber trigger ADC
Sekarang klik File - Generate, Save and Exit.. Simpan Filenya.
Dibawah ini hasil listing program yang telah saya buat :


/****************************************************
Project     : Pembacaan Nilai ADC pada sensor garis
Author      : Rifqi Arridho Abid
Company : EIRRG

Chip type                             : ATmega8535
Program type                       : Application
AVR Core Clock frequency : 16,000000 MHz
Memory model                     : Small
External RAM size                : 0
Data Stack size                     : 128
*****************************************************/
#include <mega8535.h>
#include <delay.h>
#include <stdio.h>

#include <delay.h>

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

#define ADC_VREF_TYPE 0x40


// Membaca hasil ADC
   unsigned int read_adc(unsigned char adc_input)
{
   ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
   delay_us(10);     // Delay dibutuhkan untuk penyetabil tegangan input ADC
   ADCSRA|=0x40;    // Memulai konversi analog - digital
 
// Menunggu konversi analog-digital selesai
   while ((ADCSRA & 0x10)==0);
   ADCSRA|=0x10;
   return ADCW;
}


// Declare your global variables here
   unsigned int s1,s2,s3,s4,s5,s6,s7,s8;
   unsigned char kata[16],kata1[16];  
 

   void data_sensor()
{
    s1=read_adc(0);
        delay_us(10);
    s2=read_adc(1);
        delay_us(10);
    s3=read_adc(2);
        delay_us(10);
    s4=read_adc(3);
        delay_us(10);
    s5=read_adc(4);
        delay_us(10);
    s6=read_adc(5);
        delay_us(10);
    s7=read_adc(6);
        delay_us(10);
    s8=read_adc(7);
        delay_us(10);          
     
   //Menampilkan nilai ADC ke lcd              
   sprintf(kata,"%d %d %d %d",s1,s2,s3,s4);
   sprintf(kata1,"%d %d %d %d",s5,s6,s7,s8);
     
   lcd_clear();
   lcd_gotoxy(0,0);
   lcd_puts(kata);
   lcd_gotoxy(0,1);
   lcd_puts(kata1);    
   delay_ms (100);
}                                        
 
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
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// 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;

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

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

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// 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=0x00;

// USART initialization
// USART disabled
UCSRB=0x00;

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

// ADC initialization
// ADC Clock frequency: 125,000 kHz
// ADC Voltage Reference: AVCC pin
// ADC High Speed Mode: Off
// ADC Auto Trigger Source: ADC Stopped
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x87;
SFIOR&=0xEF;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=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 4
// D5 - PORTC Bit 5
// D6 - PORTC Bit 6
// D7 - PORTC Bit 7
// Characters/line: 16
lcd_init(16);

while (1)
      {
      // Place your code here
         data_sensor ();    //memanggil void data_sensor
      }
}


Perhatikan kode berikut :
#define ADC_VREF_TYPE 0x40

// Membaca hasil ADC
   unsigned int read_adc(unsigned char adc_input)
{
   ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
   delay_us(10);     // Delay dibutuhkan untuk penyetabil tegangan input ADC
   ADCSRA|=0x40;    // Memulai konversi analog - digital
   
// Menunggu konversi analog-digital selesai
   while ((ADCSRA & 0x10)==0);
   ADCSRA|=0x10;
   return ADCW;
}

// ADC initialization
// ADC Clock frequency: 125,000 kHz
// ADC Voltage Reference: AVCC pin
// ADC High Speed Mode: Off
// ADC Auto Trigger Source: ADC Stopped
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x87;
SFIOR&=0xEF;
Blok program diatas adalah inisialisasi dan prosedur baca ADC yang dibentuk oleh codevision. Coba kita bandingkan dengan setting registernya.Misalkan register ADMUX=0x60 maka bit REFS1 = 0 dan bit REFS0=1. Jadi ADC menggunakan tegangan referensi (Vref) = Vcc.

Dibawah ini hasil pembacaan sensor garis yang saya buat, pada saat di warna putih bernilai < 50 dan pada saat di warna hitam >700 (menggunakan mode 10 bit).


Silahkan di share dengan menuliskan sumbernya..
Created by: Rifqi Arridho Abid

ADC (Analog Digital Converter)

Penggunaan ADC terutama dalam bidang pengukuran masih sangat banyak, terutama keluaran sensor yang masih berupa analog yang harus dikonversi ke digital agar bisa diolah oleh mikrokontroler.Karena sedang menggunakan atmega 8535 maka kali ini saya akan menjelaskan fitur ADC dari mikrokontroler atmega 8535 :

  • Resolusi 8 bit dan 10 bit
  • 8 chanel input
  • 0 - Vcc input ADC 
  • Waktu konversi 65 - 260 us
  • 3 mode pemilihan tegangan referensi
Tegangan referensi ADC dapat dipilih menggunakan tegangan referensi internal maupun eksternal.  Jika menggunakan tegangan referensi internal, bisa dipilih on-chip internal reference voltage yaitu sebesar 2.56V atau sebesar AVCC.  Jika menggunakan tegangan referensi eksternal, dapat dihubungkan melalui pin AREF

Data hasil konversi ADC 10 bit (1024) adalah:
ADC = (Vin/Vref)*1024


Data hasil konversi ADC 8 bit (256) adalah:
ADC = (Vin/Vref)*256


Ada beberapa langkah yang harus dilakukan untuk menginisialisasi ADC yaitu penentuan clock, tegangan referensi, format data output dan mode pembacaan.Berikut register-register yang perlu di setting saat inisialisasi :
  • Register ADMUX
Register ini mengatur tegangan referensi yang digunakan ADC, format data output dan saluran ADC

REFS1 REFS0 ADLAR MUX4 MUX2 MUX1 MUX0

Pemilihan mode pada bit pengatur tegangan referensi  REFS1 - REFS0

REFS1  REFS0  Mode Tegangan Referensi
0 0 Pin Vref
0 1 VCC
1 0 Tidak digunakan
1 1 Vref internal = 2,56 V

ADLAR adalah bit keluaran ADC.Jika ADC telah selesai maka data ADC akan diletakkan di register ADCH dan ADCL.
MUX0 - MUX4 adalah bit- bit pemilihan saluran pembacaan ADC.

  • Register ADCSRA
adalah register 8 bit berfungsi untuk melakukan pengontrolan status ADC

ADEN ADCS ADATE ADIF ADIE ADPS2 ADPS1 ADPS0
keterangan :
ADEN (bit 7) merupakan bit pengatur aktivasi ADC
ADCS (bit 6) merupakan bit penanda dimulainya konversi ADC
ADATE (bit 5) merupakan bit pengatur aktivasi otomatis 
ADIF (bit 4) merupakan bit penanda akhir konversi ADC
ADIE (bit 3) merupakan bit pengatur aktivasi interupt
ADPS0-ADPS2 (bit 0 - bit 2) merupakan bit pengatur clock ADC

  • Register SFIOR
Adalah register 8 bit yang mengatur sumber pemicu ADC. Jika bit ADATE pada register ADCSRA bernilai 0 maka ADPS0-ADPS2 tidak berfungsi.

Penerapan register -register yang telah dibahas diatas akan saya bahas menggunakan compiler codevison AVR.Saya akan membahas penerapan pembacaan sensor proximity menggunakan ADC. Klik disini untuk membaca selengkapnya.


Silahkan di share dengan menuliskan sumbernya..
Created by: Rifqi Arridho Abid

Minggu, 15 Juli 2012

Implementasi Saklar Push On Pada Bel Elektronika Sederhana

Saklar Push On

Saklar berfungsi untuk menghubungkan atau memutuskan arus listrik yang mengalir dari sumber tegangan menuju output dari sebuah sistem ke sistem lainnya.Salah satunya adalah saklar push on, prinsip kerjanya yaitu kedua terminal akan terhubung selama ditekan.





Setelah mengetahui fungsi dan cara kerja saklar seperti diatas, maka kita bisa membuat alat yang sederhana menggunakan saklar.Salah satu contohnya yaitu bel elektronik, dengan ditambah buzzer maka alat ini sudah jadi.Gambar diatas adalah rangkaian yang saya buat, cara kerjanya sederhana, ketika push on ditekan maka kutub positif baterai (9V) terhubung dengan kutub positif buzzer sehingga akan mengeluarkan bunyi yang ditandai dengan nyala indikator led.


Video dibawah ini adalah bel yang telah selesai saya buat, sangat cocok ditempatkan disamping pintu kamar kosan, itung2 biar temen kosan gak usah teriak2 atau gedor2 pintu saat mencari saya.. hahaha (pengalaman pribadi).




Sabtu, 14 Juli 2012

Menentukan Besar Resistor Pada Led

LED (light emitting diode) adalah salah satu jenis dioda maka led memiliki 2 kutub yaitu anoda dan katoda. Led mempunyai kecenderungan polarisasi dan hanya akan menyala jika diberikan forward bias (arus maju).Ini dikarenakan  led terbuat dari bahan semikonduktor yang hanya akan mengizinkan arus listrik mengalir ke satu arah (anoda ke katoda ) dan tidak ke arah sebaliknya. Oleh karena itu, pemasangan kutub led tidak boleh terbalik .



Besarnya arus menentukan terangnya sebuah led, akan tetapi perlu diingat bahwa besarnya arus yang diperbolehkan 10mA-20mA dan pada tegangan 1,6V –  3,5 V tergantung karakter warna yang dihasilkan.Apabila arus yang mengalir lebih dari 20mA maka led akan terbakar.Untuk menghindari kerusakan pada led maka pada rangkaian led dipasang sebuah resistor sebagai pembatas arus.


Untuk mencari nilai resistor pada led maka kita harus mengetahui tegangan kerja dari led tersebut. Menurut datasheet tegangan kerja / jatuh pada sebuah led menurut warna yang dihasilkan adalah :


1.      Infra merah
1,6 V
2.       Merah
1,8 V – 2,1 V
3.       Oranye
2,2 V
4.       Kuning
2,4 V
5.       Hijau
2,6 V
6.       Biru
3,0 V – 3,5 V
7.       Putih
3,0 – 3,6 V
8.       Ultraviolet
3,5 V

Berdasarkan data di atas maka apabila kita ingin mencari nilai resistor pada LED dapat menggunakan rumus hukum OHM :

V = I . R
R = V/ I
R = ( Vs-Vd ) / I

dimana : 
R adalah nilai resistor yang ingin digunakan dalam OHM
Vs adalah besarnya tegangan sumber dalam Volt
Vd adalah besarnya tegangan jatuh dalam Volt
I adalah besarnya arus forward yang diinginkan dalam Ampere

Cara diatas adalah untuk mengitung resistor pada led secara manual, akan tetapi jika anda malas untuk menghitung anda bisa klik link dibawah untuk menghitung secara otomatis.


Silahkan di share dengan menuliskan sumbernya..
Created by: Rifqi Arridho Abid