Tampilkan postingan dengan label Interfacing. Tampilkan semua postingan
Tampilkan postingan dengan label Interfacing. Tampilkan semua postingan

Senin, 13 April 2015

Cara mengakses Serial Port menggunakan Matlab pada Linux Ubuntu 14.04 (Kasus komunikasi dgn Arduino)

Pada postingan sebelumnya Sy mencoba komunikasi dgn Arduino melalui Serial Port melalui Visual Basic. Kali ini Sy mencoba share tentang cara komunikasi Serial Port melalui Matlab di Linux Ubuntu 14.04.

Berikut adalah perintah yang umum digunakan pada Matlab untuk komunikasi melalui Serial Port.

%untuk inisialisasi Serial Port.
s = serial(portname,'BaudRate',baudrate,'terminator', 'LF');
%untuk membuka koneksi Serial Port
fopen(s);

%untuk kirim perintah ke mikro melalui Serial Port
perintah=char(strcat(frekuensi, {' '}, num2str(i) , {' '} , num2str(j)));   %Hanya contoh perintah
fprintf(s,perintah);   %untuk menulis perintah melalui Serial Port

%untuk membaca data melalui Serial Port
readbuffer=fscanf(s);

%untuk menutup koneksi apabila sudah selesai
fclose(s);
delete(s);
clear s;

Baris perintah (command) di atas akan bisa langsung digunakan pada OS berbasis windows dgn memasukkan portname='COM1' atau port yang lain.

Namun ternyata pada saat Sy coba dgn OS Ubuntu 14.04 dgn portname yang aktif adalah '/dev/ttyACM0' ternyata pada saat fopen(s) komunikasi tidak berhasil dan tampil kesalahan pada console Matlab. Bikin panik aja, apalagi saat saat genting.haha.. 



Setelah searching kesana kemari ternyata pada Matlab under Ubuntu, nama Portname harus diberi alias. Caranya dengan menambahkan kode berikut (termasuk tanda '-')

-Dgnu.io.rxtx.SerialPorts=/dev/ttyS0:/dev/ttyS1:/dev/ttyS2:/dev/ttyS3:/dev/ttyS4:/dev/ttyS5:/dev/USB0:/dev/USB1:/dev/USB2:/dev/USB3:/dev/USB4:/dev/USB5:/dev/ttyACM0:/dev/ttyACM1:/dev/ttyACM2:/dev/ttyACM3:/dev/ttyACM4:/dev/ttyACM5

kemudian disimpan dalam file bernama java.opts dan disimpan kedalam direktori aktif Matlab. Biasanya alamat direktori aktifnya adalah

/usr/local/MATLAB/R2012b/bin/glnxa64/

dengan catatan gnlxa64 adalah untuk 64 bit. Silahkan dicek lagi jika berbeda. Jangan lupa merestart aplikasi Matlab supaya bisa berfungsi. Alhamdulillah Serial Port sdh bisa terkoneksi.



















Rabu, 17 September 2014

Signal Generator (DDS AD9850) dan Frekuensi Meter dan Kontrol Frekuensi dari Serial Monitor

Ini adalah posting lanjutan dari Signal Signal Generator DDS A9850 dan Frekuensi Meter . Dengan Saya tambahkan bagian untuk dapat merubah frekuensi secara serial melalui serial monitor pada Arduino sehingga frekuensi dapat diatur lebih fleksibel tanpa bolak balik upload program. 

Berikut definisi variable yang perlu ditambahkan pada source code sebelumnya:

float buff_data;
String buff_string = "";
char buff_char;
 

Berikut modifikasi souce code (pengganti) yang berada pada bagian void loop(). Sedangkan yang lain masih tetap sama dengan source code sebelumnya.

void loop()
{
       
        //lcd.clear();
       
        //cek perintah serial
        while(Serial.available()) {
        buff_char = Serial.read();
        buff_string.concat(buff_char);    //menggabungkan variabel buff_char ke variable buff_string
        }
       
        //merubah tipe data string ke float (tipe data float = double)
        char buf[buff_string.length()];
        buff_string.toCharArray(buf,buff_string.length()+1);
        float buff_data=atof(buf);  //buff_data akan nol pada loop berikutnya jika tidak ada perintah

                                    //(karena buff_string dikosongkan "" diakhir loop)
       
        //cek jika ada permintaan perubahan frekuensi 
        if (buff_data>0) sendFrequency(buff_data);
      
        Serial.print(freq_cek);
        Serial.print(" ");
        Serial.println(freq_satuan);
        lcd.setCursor(0,0);   
        lcd.print("Freq DDS AD9850");
        lcd.setCursor(0,1);   
        lcd.print("Freq= ");
        lcd.print(freq_cek);
        lcd.print(" ");
        lcd.print(freq_satuan);
        //delay(500);
       
        buff_string="";
}



Berikut adalah screenshot hasil modifikasi dengan source code di atas:

Contoh Hasil pada Serial Monitor


Beberapa referensi utama:
http://www.instructables.com/id/Arduino-Timer-Interrupts/?ALLSTEPS
http://www.ad7c.com/projects/ad9850-dds-vfo/

http://letsmakerobots.com/content/how-convert-strings-double
http://stackoverflow.com/questions/5697047/convert-serial-read-into-a-useable-string-using-arduino 

Sabtu, 12 April 2014

Pemrograman Keypad 3x4 pada AVR 128 menggunakan Code Vision

Bismillah..
Berawal dari mencoba mempraktekkan teori cara kerja (scan) pembacaan keypad, sehingga Sy bisa share hasilnya disini. :)

Salah satu perangkat yang sering dibutuhkan pada aplikasi mikrokontroler adalah kemampuan berinteraksi dengan pengguna peralatan tersebut. Salah satu cara berinteraksi dengan pengguna adalah dengan menggunakan keypad. Di sini akan kita pelajari tentang pemrograman keypad 3x4 pada mikrokontroler AVR128 dengan menggunakan Code Vision.

Berikut adalah contoh gambar fisik keypad yang sering digunakan:

Keypad tersebut memiliki konfigurasi internal berupa skema berbentuk matrix baris (ROW) dan kolom (COL) sebagai berikut:

Pada mikrokontroler setiap COLOM keypad akan dihubungkan dengan pin "output" mikrokontroler. Sedangkan pada setiap ROW keypad akan dihubungkan dengan pin "input" mikrokontroler.

Salah satu cara untuk membaca data dari matrix keypad adalah dengan teknik scanning, dimana baris atau kolom selalu discan untuk mendeteksi tombol yang ditekan. Caranya yaitu dengan memberikan status ‘0’ (low) pada salah satu pin COL (dan yg lain kondisi HIGH) secara bergantian, lalu pin ROW dideteksi apakah ada salah satunya yang berkondisi ‘0’ (low). Berikut ilustrasi urutan scaning dan pembacaan keypad:
  1. Apabila Kolom 1 diberi logika ‘0’, kolom kedua dan kolom ketiga diberi logika ‘1’ maka program akan mengecek tombol 1, 4, 7, dan *, sehingga apabila salah satu baris berlogika '0' maka ada tombol yang ditekan.
     
  2. Apabila Kolom 2 diberi logika ‘0’, kolom pertama dan kolom ketiga diberi logika ‘1’ maka program akan mengecek tombol 2, 5, 8, dan 0, sehingga apabila salah satu baris berlogika '0' maka ada tombol yang ditekan.
  3. Apabila Kolom 3 diberi logika ‘0’, kolom pertama dan kolom kedua diberi logika ‘1’ maka program akan mengecek tombol 3, 6, 9, dan #, sehingga apabila salah satu baris berlogika '0' maka ada tombol yang ditekan.
Cara ini dilakukan secara terus menerus sehingga setiap kali keypad ditekan maka akan langsung terdeteksi posisi tombol yang ditekan.

Kali ini Sy akan mencontohkan pemrograman keypad dan menampilkannya pada LCD 16x2 sehingga mudah mengecek tombol yang ditekan. LCD Sy hubungkan dengan PORTC sedangkan Keypad Sy hubungkan dengan PORTE, dengan konfigurasi keypad sebagai Berikut

row1 -> PINE.0 
row2 ->PINE.1
row3 ->PINE.2
row4 ->PINE.3
col1 ->PINE.6
col2 ->PINE.5
col3 ->PINE.4

Berikut skema proteusnya

Pada program kali ini Sy membuat procedure bernama keypad(), yang kemudian prosedur keypad() tersebut akan dieksekusi oleh Timer0 secara terus menerus dan akan mengupdate posisi tombol yg ditekan (bila ada). Penggunaan Timer ini cukup penting karena Timer bisa bekerja secara paralel dengan program utama pada mikrokontroler itu sendiri. (Tolong dicross cek apabila salah).

Berikut adalah coding untuk konfigurasinya:

#include <alcd.h>
#include <stdio.h>

unsigned char text[16],nilai_keypad; /*kalo ada yg tdk sesuai pada saat awal sebelum ada tombol yg ditekan maka perlu inisialisasi nilai_keypad=13 (angka diluar range angka yang benar)*/
 
// Port E initialization
// Func7=In Func6=Out Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=In
// State7=T State6=0 State5=0 State4=0 State3=P State2=P State1=P State0=P
PORTE=0x0F;
DDRE=0x70;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 10000.000 kHz
// Mode: Normal top=0xFF
// OC0 output: Disconnected
ASSR=0x00;
TCCR0=0x01;
TCNT0=0x00;
OCR0=0x00;
 
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x02;

ETIMSK=0x00;
// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTC Bit 0
// RD - PORTC Bit 2
// EN - PORTC Bit 1
// D4 - PORTC Bit 4
// D5 - PORTC Bit 5
// D6 - PORTC Bit 6
// D7 - PORTC Bit 7
// Characters/line: 16
lcd_init(16);

// Global enable interrupts
#asm("sei")
 
Program Procedure keypad()

unsigned char keypad(){
    unsigned char x,i,j;  
    bit y;
    x=0b01000000;
    for (i=0;i<3;i++) {
        PORTE =~((x>>i) & 0x70);
        for (j=0;j<4;j++) {
            y=(PINE >> j) & 0x1;
            if(y==0) return((i+1)+(3*j));  
            //rumus ini untuk menentukan posisi sesuai baris dan kolom
        }
    }
}

Scaning keypad() pada Timer0 supaya dilakukan scan terus menerus

// Timer 0 output compare interrupt service routine
interrupt [TIM0_COMP] void timer0_comp_isr(void)
{
// Place your code here
nilai_keypad=keypad();
}

Program utama sekaligus mengecek apakah benar nilai_keypad selalu discan oleh Timer0

while (1)
    {
        // Place your code here
        lcd_gotoxy(0,0);
        lcd_putsf("* Program Utama ");
        lcd_gotoxy(0,0);
        lcd_putsf("**--Cek--**     ");
        //mengecek apakah nilai_keypad selalu update
        lcd_gotoxy(0,1);
        if(nilai_keypad<10){
            sprintf(text,"%u",nilai_keypad);
            lcd_puts(text);}
        else if(nilai_keypad==10) lcd_putsf("*");
        else if(nilai_keypad==11) lcd_putsf("0");
        else if(nilai_keypad==12) lcd_putsf("#");
      }
 

Alhamdulillah akhirnya berhasil jg menerapkan teori keypad ini.. hehe simple tapi harus teliti memang..

Catatan: Procedure keypad() bisa dieksekusi langsung di program utama tanpa menggunakan Timer. Sy hanya mengetes kinerja Timer saja..

Jumat, 22 November 2013

Belajar interface serial menggunakan Visual Basic .Net (2012)

Ok, langsung saja Sy akan share bagaimana cara komunikasi menggunakan serial port dengan Visual Basic 2012. Codingnya Sy buat dengan mengacu dari beberapa referensi yg Sy peroleh, dengan modifikasi seperlunya.

Program ini Sy buat karena Sy ingin komunikasikan Arduino dengan VB 2012.

Berikut Contoh desain formnya ya:




Public Class Form1

    Dim readBuffer As String

    Private Sub SendBtn_Click(sender As Object, e As EventArgs) Handles SendBtn.Click
        Try
            SerialPort1.Write(TextBox1.Text + Environment.NewLine)

            TextBox3.AppendText(">" + TextBox1.Text + Environment.NewLine)
            TextBox3.ScrollToCaret()

            TextBox1.Text = String.Empty

        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim portName() As String
        Dim i As Integer

        Try
            portName = System.IO.Ports.SerialPort.GetPortNames()
            For i = 0 To i >= (portName.Length)
                ComList.Items.Add(portName(i))
            Next i

            ComList.SelectedText = ComList.Items(0)
            disBtn.Enabled = False
        Catch ex As Exception
            MsgBox("Belum Ada Serial Port Aktif, Silahkan Cek Koneksi Serial Anda")
        End Try
    Private Sub ConBtn_Click(sender As Object, e As EventArgs) Handles ConBtn.Click
        If SerialPort1.IsOpen Then
            SerialPort1.Close()
        End If

        Try
            With SerialPort1
                .PortName = ComList.Text
                .BaudRate = 9600
                .Parity = IO.Ports.Parity.None
                .DataBits = 8
                .StopBits = IO.Ports.StopBits.One
                .Open()
            End With
            Label1.Text = ComList.Text + " Connected"
            ConBtn.Enabled = False
            disBtn.Enabled = True

        Catch ex As Exception
            MsgBox(ex.ToString)

        End Try
    End Sub

    Private Sub disBtn_Click(sender As Object, e As EventArgs) Handles disBtn.Click
        Try
            SerialPort1.DiscardInBuffer() 'mengosongkan input buffer
            SerialPort1.Close()
            ConBtn.Enabled = True
            disBtn.Enabled = False
            Label1.Text = "  Disconnected"
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub
    ''' <summary>
    ''' async read on secondary thread
    ''' </summary>
    Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, _
                                         ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) _
                                         Handles SerialPort1.DataReceived
        If SerialPort1.IsOpen Then
            Try
                readBuffer = SerialPort1.ReadLine()
                'data to UI thread
                Me.Invoke(New EventHandler(AddressOf DoUpdate))
            Catch ex As Exception
                MsgBox("read " & ex.Message)
            End Try
        End If
    End Sub

    ''' <summary>
    ''' update received string in UI
    ''' ini subrutine tambahan
    ''' </summary>

    Public Sub DoUpdate(ByVal sender As Object, ByVal e As System.EventArgs)
        Dim temp As Decimal
        temp = CInt(readBuffer) / 1024 * 5 * 100
        TextBox2.Text = Int(temp)
        TextBox4.Text = CInt(readBuffer)

    End Sub

End Class


Jangan lupa dihubungkan dulu port serialnya dengan mirkrokontrol sehingga akan terdetek port yang aktif. Untuk kode mikrokontrolernya Sy menggunakan Arduino. Bisa pakai kode di example nya. Untuk komunikasi serial.

Selamat berkreasi :)

Sumber referensi:
http://students.netindonesia.net/blogs/sapikuda/archive/2012/07/25/membuat-program-koneksi-ke-plc-menggunakan-c.aspx

http://code.msdn.microsoft.com/windowsdesktop/SerialPort-Sample-in-VBNET-fb040fb2

http://msdn.microsoft.com/en-us/library/vstudio/s2dy91zy.aspx

Cara mengetahui ip address raspberry atau perangkat lain yg terhubung pada wifi yg sama

1. Install nmap [jika belum ada]: sudo apt install nmap 2. Cek ip address komputer (yg akses ke wifi yang sama): ip addr misal hasilnya 192....