Tampilkan postingan dengan label Software Design. Tampilkan semua postingan
Tampilkan postingan dengan label Software Design. Tampilkan semua postingan

Minggu, 07 September 2014

Komunikasi Data Android dengan Arduino via USB

Terdapat banyak cara agar smartphone android bisa saling bertukar data/berkomunikasi dengan arduino. Salah satu cara yang praktis adalah dengan menggunakan usb serial. 
Disini saya akan berbagi tentang komunikasi android ke arduino via usb dengan tambahan library dari  usb-serial-for-android .Dengan library ini kita tidak perlu membeli lagi shield usb host atau arduino ADK untuk berkomunikasi dengan android, jadi secara biaya juga lebih hemat. Syarat menggunakan library ini adalah android support USB Host, lalu bagaimana jika ternyata smartphone android kita tidak support USB Host? 

Anda bisa membaca artikel sebelumnya Membuat Smartphone Android Support USB Host .

Pada artikel ini, saya akan menerapkan komunikasi serial antara android dengan arduino untuk menyalakan led .Langkah selanjutnya adalah:
  1. Download library usb-serial
  2. Copy file library usb-serial-for-android-v010.jar ke project yang anda buat di folder libs
  3. Buat file dengan nama device_filter.xml ,isi dengan sourcecode seperti dibawah ini, lalu simpan di direktori /res/xml/
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <!-- 0x0403 / 0x6001: FTDI FT232R UART -->
        <usb-device vendor-id="1027" product-id="24577" />
    
        <!-- 0x2341 / Arduino -->
        <usb-device vendor-id="9025"
            product-id="0067" />
    
        <!-- 0x16C0 / 0x0483: Teensyduino  -->
        <usb-device vendor-id="5824" product-id="1155" />
    
        <!-- 0x10C4 / 0xEA60: CP210x UART Bridge -->
        <usb-device vender-id="4292" product-id="60000" />
    </resources>
    
  4. Konfigurasi AndroidManifest.xml seperti dibawah ini 
  5. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.testserial"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="19" />
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" > 
            <activity
                android:name="com.example.testserial.serial">    
                <intent-filter>
           <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
         </intent-filter> 
         <meta-data
                  android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" 
                  android:resource="@xml/device_filter" />
            </activity> 
        </application> 
    </manifest>
    
  6. Sekarang kita buat user interfacenya main.xml, sederhana saja menggunakan LinearLayout dan terdiri dari beberapa Button
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"    
        android:orientation="vertical" 
        android:background="#060000">
    
        <TextView
            android:id="@+id/textView1"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="#FFFFFF"
            android:textStyle="bold"
            android:textSize="18dp"         
            android:text="Button dengan OnClickListener" />
    
        <LinearLayout 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_gravity="center_horizontal"
        android:paddingTop="10dp"
        >
         <Button
             android:id="@+id/merahOn"
             android:background="#FF0000"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="ON" />
         <Button
                android:id="@+id/putihOn"
                android:background="#FFFFFF"         
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="ON" />
        </LinearLayout>
        
        
        <LinearLayout 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_gravity="center_horizontal"
        android:paddingBottom="5dp"
        >
         <Button
             android:id="@+id/merahOff"
             android:background="#FF0000"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="OFF" />
         <Button
                android:id="@+id/putihOff"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:background="#FFFFFF"
             android:text="OFF" />
         </LinearLayout>
    
        <TextView
            android:id="@+id/teks"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:textColor="#FFFFFF"        
            android:textStyle="bold"
            android:paddingBottom="10dp"
            android:text="" />
        
        <View 
            
            android:layout_width="fill_parent"       
         android:layout_height="1dp"
         android:background="#FFFFFF"
         />
    
        <TextView
            android:id="@+id/textView2"        
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="#FFFFFF"
            android:textStyle="bold"
            android:textSize="18dp"  
            android:text="Button dengan OnTouchListener" />
        
        <LinearLayout 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_gravity="center_horizontal"
        android:paddingTop="10dp"
        android:paddingBottom="5dp"
        >
         <Button
             android:id="@+id/BTmerahOn"
             android:background="#FF0000"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="ON" />
         <Button
                android:id="@+id/BTputihOn"
                android:background="#FFFFFF"         
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="ON" />
        </LinearLayout>
        
           <TextView
            android:id="@+id/teks1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:textColor="#FFFFFF"        
            android:textStyle="bold"
            android:paddingBottom="10dp"
            android:text="" />
        
       
    </LinearLayout>
    
  7. Sekarang buat program serial.java
  8. package com.example.testserial; 
    
    import android.app.Activity;
    import android.content.Context;
    import android.hardware.usb.UsbManager;
    import android.os.Bundle;
    import android.os.Handler;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.View.OnTouchListener;
    import android.widget.Button;
    import android.widget.TextView;
    
    import java.io.IOException;
    import com.hoho.android.usbserial.driver.UsbSerialDriver;
    import com.hoho.android.usbserial.driver.UsbSerialProber;
     
    
    public class serial extends Activity 
    {
        private UsbManager usbManager;
        private UsbSerialDriver device;
        
        TextView teks,teks1;
        byte[] kirim,kirim1;
        int pm,mm=0;
        
        public void onCreate(Bundle savedInstanceState) 
        {
            super.onCreate(savedInstanceState);       
            setContentView(R.layout.main);
            
            teks  = (TextView)findViewById(R.id.teks); 
            teks1 = (TextView)findViewById(R.id.teks1);
            usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
            
            Button merahOn = (Button)findViewById(R.id.merahOn);  
            merahOn.setOnClickListener(new OnClickListener() 
            {
                public void onClick(View v) 
                {
                    if (device != null)
                    {
                        kirim = new byte[] {(byte)'M','O','N','\n'};
                        try
                        {
                            device.write(kirim, 500);     
                            teks.setText("Merah Nyala");
                            mm=0;
                        }
                        catch (IOException e)
                        {
                            teks.setText("Pengiriman data gagal");
                        }
                    }
                    else
                    {
                        teks.setText("Perangkat Tidak Ditemukan");
                    }
                }
            });  
            
            Button putihOn = (Button)findViewById(R.id.putihOn);  
            putihOn.setOnClickListener(new OnClickListener() 
            {
                public void onClick(View v) 
                {
                    if (device != null)
                    {
                        kirim = new byte[] {(byte)'P','O','N','\n'};
                        try
                        {
                            device.write(kirim, 500);     
                            teks.setText("Putih Nyala");
                            pm=0;
                        }
                        catch (IOException e)
                        {
                            teks.setText("Pengiriman data gagal");
                        }
                    }
                    else
                    {
                        teks.setText("Perangkat Tidak Ditemukan");
                    }
                }
            });  
            
            Button putihOff = (Button)findViewById(R.id.putihOff);  
            putihOff.setOnClickListener(new OnClickListener() 
            {
                public void onClick(View v) 
                {
                    if (device != null)
                    {
                        kirim = new byte[] {(byte)'P','O','F','\n'};
                        try
                        {
                            device.write(kirim, 500);     
                            teks.setText("Putih Mati");
                            pm = 1;
                        }
                        catch (IOException e)
                        {
                            teks.setText("Pengiriman data gagal");
                        }
                        
                        if (pm==1 && mm==1)
                        {
                            teks.setText("LED MATI");
                            pm=0;
                            mm=0;
                        }
                    }
                    else
                    {
                        teks.setText("Perangkat Tidak Ditemukan");
                    }
                }
            }); 
            
            
            Button merahOff = (Button)findViewById(R.id.merahOff);  
            merahOff.setOnClickListener(new OnClickListener() 
            {
                public void onClick(View v) 
                {
                    if (device != null)
                    {
                        kirim = new byte[] {(byte)'M','O','F','\n'};
                        try
                        {
                            device.write(kirim, 500);     
                            teks.setText("Merah Mati");
                            mm=1;
                        }
                        catch (IOException e)
                        {
                            teks.setText("Pengiriman data gagal");
                        }
                        
                        if (pm==1 && mm==1)
                        {
                            teks.setText("LED MATI");      
                        }
                    }
                    else
                    {
                        teks.setText("Perangkat Tidak Ditemukan");
                    }
                }
            });  
    
    
        }
    
    public void onResume() 
        {      
          super.onResume();
          
          device = UsbSerialProber.acquire(usbManager);
          if (device == null) 
          { 
             teks.setText("Perangkat Tidak Ditemukan");
          } 
          else 
          {
              try 
              {   
                 device.open();    
                 device.setBaudRate(9600); 
                 teks.setText("Perangkat Ditemukan");             
              } 
              catch (IOException err) 
              {               
                 try 
                 {     
                    device.close();
                 } 
                 catch (IOException err2) 
                 {}
                
                 device = null;
                 return;
              }
          }
                
       }
    }  
  9. Setelah semua program di android dibuat, sekarang kita buat program baca serial di arduino, disini saya menggunakan board arduino uno R3
  10. int ledMerah=5;
    int ledPutih=6;
    
    int maksData = 10;
    char data[10];
    int dataIndex;
    
    void bacaSerial()
    {
      if (Serial.available() > 0)
      {
         char dataMasuk = Serial.read();
         data[dataIndex] = dataMasuk;
         
          if(dataMasuk=='\n')
          {      
              data[dataIndex] = '\0';       
              dataIndex = 0;
            
              String stringData = String(data);
            
              if(strcmp(data, "MON")  == 0)
              {                    
                 digitalWrite(ledMerah, HIGH);         
              }       
              else if(strcmp(data, "PON")  == 0)
              {                    
                 digitalWrite(ledPutih, HIGH);         
              }  
              else if(strcmp(data, "POF")  == 0)
              {                    
                 digitalWrite(ledPutih, LOW);         
              } 
              else if(strcmp(data, "MOF")  == 0)
              {                    
                 digitalWrite(ledMerah, LOW);         
              } 
          } 
          
         else
         {
            if(dataIndex++ >= maksData)
            {
              dataIndex = 0;
            }   
         }
      }
    }
    
    void setup()
    {
      pinMode(ledMerah, OUTPUT); 
      pinMode(ledPutih, OUTPUT); 
      
      dataIndex = 0;
      Serial.begin(9600);
    }
    
    void loop()
    {
      bacaSerial();
    }
Hasil dari program yang telah dibuat akan seperti ini:


Pada program android yang dibuat diatas menggunakan Button yang diberi listener OnClickListener, sehingga :
  • Ketika Button di android ditekan maka hanya mengirim perintah satu kali saja 
  • Data serial yang diterima di arduino akan dieksekusi satu kali, dan akan berganti state saat mendapat input lagi dari Button lainnya
Lalu bagaimana jika kita ingin mengirim data secara kontinu ketika button ditekan? 
  • Buat button dengan listener OnTouchListener
Silahkan di share dengan menuliskan sumbernya..
Created by: Rifqi Arridho Abid

Jumat, 14 Juni 2013

Kontrol Fuzzy Logic Berbasis Sensor Ultrasonik Pada Navigasi Robot Pemadam Api Beroda

A. Pendahuluan

  Perkembangan ilmu pengetahuan memacu perkembangan teknologi yang dapat membantu aktifitas manusia. Pada umumnya manusia tertarik dengan sesuatu yang dapat meringankan beban dari pekerjaannya. Salah satu caranya dengan adanya pemakaian robot. Robot memiliki beberapa kelebihan dalam pekerjaan dibandingkan manusia, salah satunya adalah dalam aspek tenaga, kualitas kerja yang statis, dan masih banyak lagi. 
   Sementara itu, perkembangan dunia robotik di Indonesia mulai berkembang dengan pesat, dimana dapat dilihat dari banyaknya kontes-kontes robot yang diadakan saat ini. Salah satu kontesnya adalah KRCI(Kontes Robot Cerdas Indonesia), yang mana merupakan ajang kontes robot bertaraf nasional. Pada lomba ini robot dihadapkan pada lintasan tertentu. 
  Robot Cerdas Pemadam Api divisi beroda adalah robot yang memiliki kemampuan menjelajahi suatu arena untuk menemukan titik api kemudian memadamkannya dan kembali ke titik awal dengan waktu secepat mungkin. Agar dapat melakukan misi tersebut dalam waktu yang cepat, sistem navigasi dalam perancangan robot memegang peranan penting, seperti sistem navigasi right-wall following, left-wall following, dead recogning, dan lain-lain. 
   Pada sistem kerja robot juga dibutuhkan suatu input berupa sensor yang berguna sebagai media perindraan robot. Sensor yang biasa digunakan pada robot adalah sensor ultrasonik sebagai sensor untuk mengukur jarak. Sensor ini dapat memberikan data sejauh apa robot ini dapat bergerak, sesuai dengan adanya halangan di depannya. Selain itu dalam robot pemadam api juga ditambahkan sensor untuk mendeteksi  api dan sensor untuk mendeteksi suhu api, yaitu sensor UVtron dan Thermal Array.   
   Penggunaan sensor ultaksonik tidak terbatas hanya untuk mendapatkan jarak, tetapi sensor ini juga memungkinkan robot dapat mengetahui posisi robot tersebut terhadap suatu lintasan (apakah robot sudah dalam posisi yang tepat atau tidak). Posisi robot yang miring dapat disempurnakan dengan dilakukannya kontrol kecepatan motor terhadap perbandingan pembacaan ultrasonik dengan metode fuzzy logic. 
    Dengan adanya kesamaran posisi robot yang didapat dari sensor ultrasonik (dekat, sedang, atau jauh,dll), maka metode fuzzy logic dinilai tepat. Diharapkan dengan menggunakan metode ini bisa mendapatkan hasil yang terbaik dalam memposisikan robot dalam lintasannya secara tepat dikarenakan banyak kemungkinan yang terjadi pada posisi robot saat melalui lintasan. Dengan latar belakang itu semua, maka kami membuat tugas besar kami dengan judul “Desain dan Implementasi Robot Pemadam Api Beroda dengan Kontrol Fuzzy Logic Berbasis Sensor Ultrasonik”.

1) Batasan Masalah
   Kami membatasi masalah-masalah dalam tugas besar sebagai 
   berikut :
a. Menggunakan 2 sensor ultrasonik sebagai media pembacaan 
   jarak dan penentuan posisi robot (1 didepan, 1 di kanan 
   robot).
b. Robot berjalan dengan sistem navigasi right-wall following
c. Robot akan mencari titik api, memadamkannya, dan kembali 
   posisi awal start
d. Bahasa pemrograman yang digunakan adalah bahasa pemrograman C
e. Menggunakan metode fuzzy logic untuk menyempurnakan jalannya 
   robot serta adanya penambahan program untuk mendapatkan hasil 
   yang terbaik dalam navigasi

2) Proses Fuzzyfikasi

     Setelah kita mendapatkan nilai jarak dari tiap sensor, langkah selanjutnya adalah fuzzyfikasi yakni proses pengubahan nilai data jarak setiap sensor menjadi bentuk himpunan fuzzy menurut fungsi keanggotaannya.Proses awal di dalam proses fuzzyfikasi adalah membuat fungsi keanggotaan dari setiap masukan terlebih dahulu, serta menentukan banyaknya variabel linguistic di dalam fungsi keanggotaan yang akan kita buat nantinya. Dari fungsi keanggotaan yang kita buat akan dapat diketahui nilai derajat keanggotaan masing-masing variabel dalam himpunan fuzzy yang telah dibuat.Dalam tugas besar kami, terdapat dua masukan dari sensor ultrasonik, yaitu sensor ultrasonik depan dan sensor ultrasonik kanan. Masukan dari sensor ultrasonik depan memiliki dua variabel linguistic, yaitu DEKAT dan JAUH dengan menggunakan fungsi keanggotaan trapesium. Berikut tampilan fungsi keanggotaan dari sensor ultrasonik depan di dalam sebuah gambar :

   Dari fungsi keanggotaan di atas, dapat diketahui derajat keanggotaan masing-masing variabel dala himpunan fuzzy DEKAT dan JAUH. Untuk menghitung derajat keanggotaan dapat menggunakan persamaan sebagai berikut : 

   Sedangkan untuk sensor ultrasonik kanan memiliki tiga variabel linguistic, yaitu DEKAT, SEDANG, dan JAUH dengan fungsi keanggotaan gabungan dari fungsi segitiga dan trapesium seperti yang tampak pada gambar :
3) Rules Evaluation
  Pada rules evaluation, terjadi pengolahan data input fuzzyfikasi dengan hasil keluaran yang dikehendaki dengan aturan-aturan tertentu. Dari aturan-aturan yang dibentuk inilah yang nantinya akan menentukan respon dari sistem terhadap berbagai kondisi set point dan gangguan yang terjadi pada sistem yang akan dibuat. Dalam tugas besar kami set point yang kami ambil adalah 8 cm dari dinding, dimana posisi tersebut berada pada posisi sedang pada sensor kanan. Berikut adalah tabel rules evaluation :

Dari tabel di atas, maka kita memiliki 6 aturan sebagai berikut :
•IF sensor depan=DEKAT AND sensor kanan=DEKAT THEN motor kiri=PELAN AND motor kanan=CEPAT
•    IF sensor depan=DEKAT AND sensor kanan=CUKUP THEN motor kiri=PELAN AND motor kanan=CEPAT
•    IF sensor depan=DEKAT AND sensor kanan=JAUH THEN motor kiri=CEPAT AND motor kanan=PELAN
•    IF sensor depan=JAUH AND sensor kanan=DEKAT THEN motor kiri=PELAN AND motor kanan=CEPAT
•    IF sensor depan=JAUH AND sensor kanan=CUKUP THEN motor kiri=SEDANG AND motor kanan=CEPAT
•    IF sensor depan=JAUH AND sensor kanan=JAUH THEN motor kiri=CEPAT AND motor kanan=SEDANG

  Setelah mendapatkan aturan seperti tabel di atas, maka selanjutnya yang dilakukan adalah mencari nilai derajat keanggotaan untuk nilai setiap aturan yang didapat. Nilai keanggotaan untuk keluaran didapatkan dengan menggunakan fungsi AND.Misalkan didapatkan aturan sebagai berikut :

•IF Sensor Depan = DEKAT(0.5) AND Sensor Kanan = DEKAT(0.5) THEN Motor Kiri = PELAN AND Motor Kanan = CEPAT
• IF Sensor Depan = DEKAT(0.75) AND Sensor Kanan = CUKUP(0.5) THEN Motor Kiri = PELAN AND Motor Kanan = CEPAT
• IF Sensor Depan = JAUH(0.75) AND Sensor Kanan = CUKUP(0.25) THEN Motor Kiri = SEDANG AND Motor Kanan = SEDANG

Maka keluaran akan mendapatkan nilai keanggotaan sebagai berikut :
o IF Sensor Depan = DEKAT(0.5) AND Sensor Kanan = DEKAT(0.5) THEN Motor Kiri = PELAN(0.5) AND Motor Kanan = CEPAT(0.5)
o IF Sensor Depan = DEKAT(0.75) AND Sensor Kanan = CUKUP(0.5) THEN Motor Kiri = PELAN(0.5) AND Motor Kanan = CEPAT(0.5)
o IF Sensor Depan = JAUH(0.75) AND Sensor Kanan = CUKUP(0.25) THEN Motor Kiri = SEDANG(0.25) AND Motor Kanan = SEDANG(0.25)

   Setelah nilai linguistic keluaran telah mendapatkan nilai derajat keanggotaan, maka pada nilai linguistic keluaran yang sejenis dicari nilai derajat keanggotaan yang maksimum untuk digunakan dalam pengolahan data selanjutnya, yakni defuzzifikasi.
Misalnya dari data di atas didapatkan nilai-nilai maksimum setiap linguistic keluaran sebagai berikut :
 
    Motor Kiri
PELAN(0.5), PELAN(0.5) → maka nilai derajat keanggotaan PELAN = 0.5
SEDANG(0.25) → maka nilai derajat keanggotaan SEDANG = 0.25

    Motor Kanan
SEDANG(0.25) → maka nilai derajat keanggotaan SEDANG = 0.25
CEPAT(0.5), CEPAT(0.5) → → maka nilai derajat keanggotaan CEPAT

Lalu, setelah mendapatkan derajat keanggotaan pada nilai keluarannya, nilai keluaran juga memiliki fungsi keanggotaan model singletone, yang merupakan model interferensi sederhana. Dalam tugas besar ini kami menggunakan Model Sugeno

4) Defuzzyfikasi
Proses ini merupakan penggabungan dari beberapa fuzzy set yang telah didapatkan. Misal kita dapat menggunakan data di atas :

>>Motor Kiri
PELAN(0.5), PELAN(0.5) → maka nilai derajat keanggotaan PELAN = 0.5
SEDANG(0.25) → maka nilai derajat keanggotaan SEDANG = 0.25

Fungsi Keanggotaan Motor Kiri

>>Motor Kanan
SEDANG(0.25) → maka nilai derajat keanggotaan SEDANG = 0.25
CEPAT(0.5), CEPAT(0.5) →  maka nilai derajat keanggotaan CEPAT = 0.5


Fungsi Keanggotaan Motor Kanan


 
   Proses selanjutnya adalah mengolah data tersebut menggunakan metode Weight Average untuk proses defuzzifikasinya. Metode ini mengambil rata-rata dengan menggunakan nilai derajat keanggotaan dari proses komposisi fuzzy set menggunakan Model Sugeno sebelumnya.Dari data sebelumnya, didapatkan data sebagai berikut:

Motor Kiri = PELAN(0.5), SEDANG(0.25)
Motor Kanan = SEDANG(0.25), CEPAT(0.5)
Data diatas dapat diolah sebagai berikut :

>>Motor Kiri
PWMKIRI=  ((0.5)70+(0.25)150)/(0.5+0.25)=96.6
 
Jadi, berdasarkan persamaan di atas nilai kecepatan Motor Kiri yang didapat adalah 96.6 PWM
 
>>Motor Kanan
PWMKANAN=  ((0.25)150+(0.5)230)/(0.25+0.5)=203.3
 
Jadi, berdasarkan persamaan di atas nilai kecepatan Motor Kanan yang didapat adalah 203.3 PWM. Inilah hasil tugas besar fuzzy logic yang saya buat 


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

Senin, 17 September 2012

Dasar Input dan Output Microcontroller AVR

Dasar input dan output sangat dibutuhkan sekali pada pemrograman mikrokontroler avr, pada tutorial kali ini saya menggunakan compiler codevision avr. Input dan output bisa digunakan, misalnya kita ingin mengeset PIN.x untuk input sensor jarak dan PIN.y untuk output berupa led dan masih banyak implementasi lainnya .
Nah langsung saja, pada tutorial kali ini saya akan membuat led berjalan/ running led pada mikrokontroler AVR ATMega 128. Saya meggunakan PINC.0, C.1 dan C.2 sebagai output.

PORT.X=0; //set port X sebagai low (0 volt)
PORT.X=1; //set port X sebagai high (5 volt)
misalnya:
PORTC.0=0; //set port C.0 low
PORTC.0=1; //set port C.0 high

pada led kondisi low akan menyebabkan led mati dan kondisi high (5 V) akan menyebabkan led menyala.Setelah kita mendefinisikan port tersebut low/high, maka selanjutnya kita perlu mendefinisikan PIN.X pada port tersebut sebagai input/ output.

DDR.X=0;  //set data direksi sbg input
DDR.X=1;  //set data direksi sbg output

misalnya kita ingin membuat led menyala selama 1 detik maka,
DDRC.0=1;  //set data direksi sbg output
PORTC.0=1; //set port C.0 high
delay_ms (1000);

Itulah dasar-dasar input output, untuk programnya bisa anda kembangkan sendiri.Inilah hasil led berjalan sederhana yang saya buat.


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

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