Minggu, 24 November 2013

Jaringan Syaraf Tiruan menggunakan Visual Basic 6

Jaringan syaraf tiruan merupakan salah satu sistem pemrosesan informasi yang didesain dengan menirukan cara kerja otak manusia dalam menyelesaikan suatu masalah dengan melakukan proses belajar melalui perubahan bobot sinapsisnya.

Kebanyakan buku mungkin hanya menulis teori dari JST (Jaringan Syaraf Tiruan) dan biasanya implementasinya menggunakan Matlab. Yaaa mungkin karena di Matlab sudah ada fungsi untuk Neural Network (JST). Hal ini menjadikan teori yang ada di buku tersebut "seolah olah tidak digunakan" karena kita hanya menggunakan tools yang ada di Matlab. Tanpa  menerapkan secara langsung teorinya. Hal ini menjadikan sesuatu yang menarik jadi kurang menarik.




Program berikut dibuat menggunakan Visual Basic 6 beberapa tahun lalu saat ada teman yang meminta bantuan untuk program Jaringan Syaraf tiruan menggunakan VB 6. Untuk teori tentang JST (Jaringan Syaraf Tiruan) Sy tidak menyertakan di sini. Teorinya bisa di search dan banyak tersedia di blog yg lain.

JST yg digunakan di sini adalah menggunakan metode Backpropagation. Dengan dua output. Ceritanya adalah ingin membuat suatu sistem yang terhubung dengan webcam kemudian gambar yang diperoleh diolah sehingga sistem tersebut bisa membedakan apakah objek di depannya merupakan penghalang atau bukan. Hal ini bisa diterapkan pada sistem robotik. Biasanya sih lebih mudah menggunakan sensor Ultrasonik dari pada menggunakan webcam. Yupp itulah tantangannya menggunakan webcam.

Karena webcam menghasilkan gambar yang tidak secara langsung merepresentasikan besaran jarak dari suatu objek didepannya alias mau jauh atau dekat gak perduli, webcam hanya bertugas menghasilkan frame image.

Baik Sy tidak fokus pada program bagaimana webcam mengambil gambar, jadi Sy CapturePRO untuk fungsi pengambilan gambar (bisa disearch dan didownload waktu itu). Bisa pake yang lain juga kok.

Disini Sy fokus pada program JSTnya. Di sini JST akan memproses crop image dari hasil gambar webcam sebagai input dan menghasilkan dua output sesuai permintaan. Kalo di sini outputnya (0 dan 1) atau (1 dan 0), karena hasil ini akan dibaca oleh perangkat berikutnya untuk mengambil keputusan apakah robot akan belok atau tidak, maka akan lebih mudah jika output di representasikan dengan 0 dan 1.

Sebelum proses training dijalankan maka di set terlebih dahulu Y out yang dikehendaki dan di set juga error yg diinginkan. Kemudian Bobot yang dihasilkan akan disimpan dalam suatu file untuk kemudian pada saat dijalankan (Test) pada sistem tidak perlu lagi melakukan training dan bisa langsung menggunakan bobot yang sudah diperoleh pada saat training JST.

Program ini menggunakan VB.6 dan belum Sy koding ulang di VB.Net. Silahkan disesuaikan sendiri untuk VB.Net.
    
Option Explicit
Dim StopTrain, StopTest As Boolean
Dim Bo2tVTraining(1 To JumNeHid, 0 To JumInp), Bo2tWTraining(1 To JumOut, 0 To JumNeHid) As Double
Dim YoutTraining(1 To JumOut) As Double




Private Sub CmdTraining_Click()
Dim i, j, k, x, y, n As Integer
Dim xInpTrain(1 To JumInp) As Double
''
Dim zHid(1 To JumNeHid) As Double
Dim xv, zw, dw, z_net(1 To JumNeHid), y_net(1 To JumOut) As Double
Dim Iter, MaxIter  As Long
Dim Target(1 To JumOut), Error, MSE, MaxErr, alfa  As Double
Dim deltaOut(1 To JumOut), deltaHidden(1 To JumNeHid), DeltaW(1 To JumOut, 0 To JumNeHid), DeltaV(1 To JumNeHid, 0 To JumInp), Delta_Net(1 To JumNeHid) As Double

TxtMse.Text = ""
TxtIter.Text = ""
CmdTraining.Enabled = False
CmdSave.Enabled = False
'inisialisasi bobot
For j = 1 To JumNeHid
    For i = 0 To JumInp
    Randomize Timer
    Bo2tVTraining(j, i) = Int(Rnd * 2) - Rnd * 1
    Next i
Next j
For k = 1 To JumOut
    For j = 0 To JumNeHid
    Randomize Timer
    Bo2tWTraining(k, j) = Int(Rnd * 2) - Rnd * 1
    Next j
Next k
'normalisasi masukan
n = 0
For x = 1 To 52                 'LbrCropX
    For y = 1 To 44             'LbrCropY
    n = n + 1
    xInpTrain(n) = (InputBiner(x + BtsKiri - 1, y + BtsAtas - 1)) / 255
    Next y
Next x
'======================<<<<<<<<<<<backpropagation>>>>>>>>>>============================

MaxErr = Val(TxtMaxError.Text) '0.0001
MaxIter = Val(TxtMaxEpoch.Text) '1000
alfa = Val(TxtLearnRate.Text) '0.1 'learning rate
Iter = 0
If CmbTarget.ListIndex = 0 Then
        Target(1) = 1
        Target(2) = 0
Else:   Target(1) = 0
        Target(2) = 1
End If
'------------------>>>>>>>>>>>>>>>>>>>>>begin<<<<<<<<<<<<<<<<<<<<----------------------
StopTrain = False
Do
    DoEvents
' -->> forward
    Iter = Iter + 1

    For j = 1 To JumNeHid
        xv = 0
        For i = 1 To JumInp
        xv = xv + (xInpTrain(i) * Bo2tVTraining(j, i))
        Next i
        z_net(j) = Bo2tVTraining(j, 0) + xv
        zHid(j) = f(z_net(j))
    Next j
    Error = 0
    For k = 1 To JumOut
        zw = 0
        For j = 1 To JumNeHid
        zw = zw + (zHid(j) * Bo2tWTraining(k, j))
        Next j
        y_net(k) = Bo2tWTraining(k, 0) + zw
        YoutTraining(k) = f(y_net(k))
        Error = Error + ((Target(k) - YoutTraining(k)) ^ 2)
    Next k
    MSE = Error / JumOut
  
'---------------------------------------->grafik
    MSChart1.RowCount = Iter
    MSChart1.Row = Iter
    MSChart1.RowLabel = Iter
    MSChart1.Column = 1
    MSChart1.Data = MSE
'----------------------------------------->end of grafik

    TxtMse.Text = Format(MSE, "0.00E+00")
    TxtIter.Text = Iter

    If MSE < MaxErr Then Exit Do
' -->> backward
    For k = 1 To JumOut
        deltaOut(k) = (Target(k) - YoutTraining(k)) * df(y_net(k))
    Next k
    For k = 1 To JumOut
        DeltaW(k, 0) = alfa * deltaOut(k) * 1
        For j = 1 To JumNeHid
        DeltaW(k, j) = alfa * deltaOut(k) * zHid(j)
        Next j
    Next k
    For j = 1 To JumNeHid
        dw = 0
        For k = 1 To JumOut
        dw = dw + (deltaOut(k) * Bo2tWTraining(k, j))
        Next k
        Delta_Net(j) = dw
    Next j
    For j = 1 To JumNeHid
        deltaHidden(j) = Delta_Net(j) * df(z_net(j))
    Next j
    For j = 1 To JumNeHid
        DeltaV(j, 0) = alfa * deltaHidden(j) * 1
        For i = 1 To JumInp
        DeltaV(j, i) = alfa * deltaHidden(j) * xInpTrain(i)
        Next i
    Next j
    For k = 1 To JumOut
        For j = 0 To JumNeHid
        Bo2tWTraining(k, j) = Bo2tWTraining(k, j) + DeltaW(k, j)
        Next j
    Next k
    For j = 1 To JumNeHid
        For i = 0 To JumInp
        Bo2tVTraining(j, i) = Bo2tVTraining(j, i) + DeltaV(j, i)
        Next i
    Next j
Loop Until Iter >= MaxIter Or StopTrain = True
'------------------>>>>>>>>>>>>>>>>>>>>>finish<<<<<<<<<<<<<<<<<<<<----------------------
'====================<<<<<<<<<<<end of backpropagation>>>>>>>>>>============================

CmdTraining.Enabled = True
CmdSave.Enabled = True
End Sub



 
Private Sub CmdTest_Click()
Dim Bo2tVTest(1 To JumNeHid, 0 To JumInp, 1 To 10), Bo2tWTest(1 To JumOut, 0 To JumNeHid, 1 To 10) As Double
Dim i, j, k, x, y, n, l, m As Integer
Dim xInpTest(1 To JumInp) As Double
Dim NamaBobot, NamaTarget As String
Dim save As String
Dim bytRed, bytGreen, bytBlue, bytGrey, bytbiner2 As Integer
Dim TargetTest(1 To JumOut, 1 To 10) As Double
''
Dim zHid(1 To JumNeHid) As Double
Dim YoutTest(1 To JumOut) As Double
Dim xv, zw, z_net(1 To JumNeHid), y_net(1 To JumOut) As Double
Dim Error, MSE(1 To 10) As Double
Dim Msex, MinMse As Double
Dim YoutTestAkhir(1 To JumOut) As Integer


CmdTest.Enabled = False
'membaca bobot
For l = 1 To 10
NamaBobot = "\bobot\Sample" & l
NamaTarget = "\OutTraining\Yout" & l
Open App.Path & NamaBobot & "BobotV.txt" For Input As #1
For j = 1 To JumNeHid
    For i = 0 To JumInp
    Input #1, Bo2tVTest(j, i, l)
    Next i
Next j
Close #1

Open App.Path & NamaBobot & "BobotW.txt" For Input As #2
For k = 1 To JumOut
    For j = 0 To JumNeHid
    Input #2, Bo2tWTest(k, j, l)
    Next j
Next k
Close #2

Open App.Path & NamaTarget & ".txt" For Input As #3
For k = 1 To JumOut
    Input #3, TargetTest(k, l)
Next k
Close #3
Next l
'======================<<<<<<<<<<<backpropagation>>>>>>>>>>============================


'------------------>>>>>>>>>>>>>>>>>>>>>begin<<<<<<<<<<<<<<<<<<<<----------------------
StopTest = False
Do Until StopTest = True
    On Error GoTo errorhandler
    save = App.Path & "\Sample.jpg"
    CapturePRO1.FrameFile = save
    CapturePRO1.CaptureFrame
    PicHidden.Refresh
    PicHidden.Picture = LoadPicture(save)
    BitBlt PicPreview.hdc, 0, 0, Lebar, Tinggi, PicHidden.hdc, 0, 0, vbSrcCopy
    n = 0
    For x = BtsKiri To BtsKiri + LbrCropX - 1
        For y = BtsAtas To BtsAtas + LbrCropY - 1
            Pixels(x, y) = PicHidden.Point(x, y)
            bytRed = Pixels(x, y) And &HFF&
            bytGreen = geserkiri((Pixels(x, y) And &HFF00&), 8)
            bytBlue = geserkiri((Pixels(x, y) And &HFF0000), 16)
            bytGrey = (bytRed + bytGreen + bytBlue) / 3
            If bytGrey < 90 Then
                bytbiner2 = 0
            Else: bytbiner2 = 255
            End If
            n = n + 1
            xInpTest(n) = bytbiner2 / 255
        Next y
    Next x
' -->> forward
    DoEvents
    For l = 1 To 10
        For j = 1 To JumNeHid
            xv = 0
            For i = 1 To JumInp
            xv = xv + (xInpTest(i) * Bo2tVTest(j, i, l))
            Next i
            z_net(j) = Bo2tVTest(j, 0, l) + xv
            zHid(j) = f(z_net(j))
        Next j
        Error = 0
        For k = 1 To JumOut
            zw = 0
            For j = 1 To JumNeHid
            zw = zw + (zHid(j) * Bo2tWTest(k, j, l))
            Next j
            y_net(k) = Bo2tWTest(k, 0, l) + zw
            YoutTest(k) = f(y_net(k))
            Error = Error + ((TargetTest(k, l) - YoutTest(k)) ^ 2)
        Next k
        MSE(l) = Error / JumOut
    Next l
  
    MinMse = 1
    For l = 1 To 10
        Msex = MSE(l)
        MinMse = Min(Msex, MinMse)
    Next l
  
    For m = 1 To 10
        If MinMse = MSE(m) Then
            Exit For
        End If
    Next m
    YoutTestAkhir(1) = CInt(TargetTest(1, m))
    YoutTestAkhir(2) = CInt(TargetTest(2, m))
    Open App.Path & "\OutTest\OutTest.Txt" For Output As #4
    For k = 1 To JumOut
        Print #4, YoutTestAkhir(k)
    Next k
    Close #4
  
    TxtOut1.Text = YoutTestAkhir(1)
    TxtOut2.Text = YoutTestAkhir(2)
    TxtError.Text = Format(MinMse, "0.00E+00")
Loop
CmdTest.Enabled = True
Exit Sub
errorhandler:
MsgBox "Maaf koneksi dengan kamera belum berhasil", vbInformation, "Status koneksi"
PicHidden.Refresh
Me.CapturePRO1.Preview = False
CmdConnect.Caption = "Connect"
CmdConnectTraining.Caption = "Connect"
CmdTest.Enabled = True
End Sub


Berikut contoh tampilan sederhananya untuk mode training penentuan bobot (ternyata masih ada print screennya :D)

Dan berikut contoh tampilan untuk mode penggunaan JSTnya
Pengen sih di Run ulang tapi sayangnya gak bisa di Run di VB. Net :'( (sdh gak pake VB 6)


Semoga Bermanfaat..

Signal Source Representation - Thevenin & Norton (Introduction)

Thevenin Representation


V out berbanding lurus dengan R Load. Semakin besar R Load maka V out akan semakin mendekati V Source. 

Hal inilah yg menunjukkan bahwa pada rangkaian pengondisi sinyal mempersyaratkan Z in (impedance input) yg tinggi di bandingkan Z out pada sumber sinyal. Sehingga (bagian) sinyal tegangan sumber bisa semaksimal mungkin diolah dan diteruskan ke bagian berikutnya.

Norton Representation


Perhatikan bahwa i out berbanding lurus dengan R source sehingga semakin besar R source maka i out akan semakin mendekati i source. Perhatikan jg bahwa hal ini berbeda dengan representasi Thevenin (Voltage Representation), pada Thevenin semakin besar R Load maka V out semakin mendekati V Source.

Jumat, 22 November 2013

Belajar Labview Sederhana (Simulasi Lemparan Nilai Dadu)

Labview adalah bahasa pemrograman berbasis diagram, agak bereda dengan bahasa pemrograman yang lain yang berbasis text. Berikut adalah salah satu contoh membuat Simulasi Lemparan Dadu menggunakan Labview.

Tampilan Front Panel:


Berikut Blok Diagramnya:


kondisi Falsenya pakai ini ya:


Nah Blok diagram di atas menggunakan cara manual (karena belum belajar untuk fungsi "Select - Case (Numeric)". :D

Berikut Blok Diagram yang menggunakan "Select - Case". Front Panel masih tetap sama.


Untuk kondisi (block Select - Case) yang lain tinggal disesuaikan incrementnya, ini contohnya untuk kondisi numerik "5":


Selamat berkreasi :)

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

Selasa, 19 November 2013

ARDUINO & LM35DZ & LCD16X2 & RUNNING TEXT

Posting ini adalah tentang menggunakan Arduino (Uno R3) untuk memperoleh temperatur dengan menggunakan sensor LM35DZ. Maaf karena belum lama belajarnya hehe.

Proyek ini menggunkan sensor suhu LM35DZ untuk mendapatkan besaran voltage yang merupakan representasi dari suhu. Kemudian di setting pada suhu tertentu sehingga Led Merah akan menyala pada saat suhu lebih besar dari batas atas dan menyala bila lebih kecil dari batas bawah.

Proyek ini juga bisa disambungkan pada motor DC sehingga motor akan berputar dengan kecepatan tergantung suhu. Karena belum punya motor DC maka Saya ganti dengan Led warna kuning. Led warna kuning akan mati apabila suhu berada dibawah batas bawah dan akan menyala maksimal apabila sama atau lebih besar dari batas atas. Nah jika diantaranya maka Led akan menyala dari redup ke paling terang sesuai nilai suhu yang terdetek sensor.


Berikut sintax untuk mengontrol led:

if(temp>=upperLimit) {
        digitalWrite(ledWarning,HIGH);
        intensity=255;
    }else if(temp>=lowerLimit){
        digitalWrite(ledWarning, LOW);
        intensity=(temp-lowerLimit)*255/(upperLimit-lowerLimit);
    }else{
        digitalWrite(ledWarning, HIGH);
        intensity=0;
    }

analogWrite(ledFading,intensity);

ledFading ==> Led warna kuning
ledWarning ==> Led warna merah

Jangan lupa, untuk Led warna kuning harus menggunakan port PWM ya. Kalo Led Merah boleh di port Digital.

Yang bikin Saya agak bingung adalah gimana cara buat running text (text berjalan) yang jumlah karakternya panjang (maklum masih pemula). Setelah cari referensi sana sini, ada beberapa referensi yang mirip tapi gak sama persis yg Sy harapkan :'(... Inilah yang bikin capek... Ingat running text ini bisa sangat panjang. Karena di LCD16x2 kalo textnya panjang banget akan berantakan baris pertama dan keduanya :'(.. Akhirnya Sy buat sendiri fungsi untuk running text nya :) jadi penasaran sendiri akhirnya.


void runningText(int sizeColLcd, char message[], int row, int timerefresh){
  int textSize=strlen(message);
  char tempLcd[sizeColLcd];
  int tempPos =0;
  int iter;
 
  iter=textSize+sizeColLcd;
 
  for(int i=0; i<=iter; i++){
    if(i<sizeColLcd){
      memcpy(tempLcd, &message[0], i+1);
      lcd.setCursor(sizeColLcd-(i+1),row);
      lcd.print(tempLcd);
    }else {
      memcpy(tempLcd, &message[tempPos], sizeColLcd);
      lcd.setCursor(0,row);
      lcd.print(tempLcd);
      tempPos +=1;
    }
  
    delay(timerefresh);
    
  }
}


Gara-gara "memcpy -- library String.h" jadi puyeng. Yaaaa mau gak mau sih, karena memcpy adalah kunci fungsi yang Sy buat di atas. Dan fungsi runningText di atas adalah versi pertama yang Sy buat. Silahkan dimodif sendiri ya (biar sama-sama belajar) :). Alhamdulillah hasilnya memuaskan.

Sorry kalo bhs inggrisnya kacau.hehe. Karena niatnya sekalian belajar bahasa inggris jadi sintaxnya bahasa inggris... :)

Untuk skema rangkaian standar, silahkan disearch di google. Berikut contoh tampilannya....


Thanks for watching :).............
Gut nite.....
i am Indonesian :)

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....