bDesigner

使用firmata(基礎)

一、基本語法部分

  bDesigner的底部(硬體燒錄的部分)指令是根據arduino C所寫的,而且,因為是用指令的方式驅動,因此,可以跟各種程式語言(例如:VB、C#等等)做溝通,進而達到控制的效果。在控制上,有幾個指令要先看一下,這幾個指令其實在arduino C也看的到,其用意就是要讓人在使用時,也複習一下arduino C到底有甚麼重要的東西。PS.取消跨號,改用=是為了結合HTTP

pinMode=pin,mode

  這個指令對應的是arduino C的pinMode(pin, mode),在arduino C的語法中,pin是數位腳位,mode是類型,因此,這個指令也是一樣,在原本的arduino的中,0是INPUT,1是OUTPUT,但是,在撰寫nodeMCU和LinkIt7697的firmata時,打錯了,因此,在這兩個板子1是OUTPUT,但是2卻是INPUT。

digitalRead=pin

        這個指令對應的是arduino C的digitalRead(pin),在arduino C的語法中,pin是數位腳位。

digitalWrite=pin,value

        這個指令對應的是arduino C的 digitalWrite(pin, value),在arduino C的語法中,pin是數位腳位,而value是高電位(HIGH)跟低電位(LOW),分別用0跟1取代!

analogWrite=pin,value

       這個指令對應的是arduino C的 analogWrite(pin, value),在arduino C的語法中,pin是數位腳位,而value是0-255(視你用的硬體)。

analogRead=pin

      這個指令對應的是arduino C的 analogRead(pin),在arduino C的語法中,pin是數位腳位,它會有回傳,回傳的大小,要視你的硬體而訂。

二、VB連LinkIt7697範例

  如果你前面看完那些指令,想要嘗試一下,你可以用arduino IDE的序列埠監視視窗,baud rate是9600,並設定為NL(NewLine),NL可以讓每個指令後面都附帶\n,這樣,就可以用指令的方式去控制,但使用時,請先下載bDessigner 1.7版,bDesigner 1.7版可以在下載區下載,使用前請先點選LinkIt 7697進行燒錄,整個程式的操作說明,可以觀看下面的影片。

影片1、操作影片

三、視窗介面配置

  經過前面的操作影片,我想,你應該熟悉整個程式的運作以及使用,現在,就讓我來教你怎麼樣寫出這樣的一個VB程式。 

圖一、設計介面

      設計界面用了下面的元件:

  • SerialPort (元件)
  • 1. comPort_ComboBox 上方用於顯示電腦有哪些Com Port
  • 2.ComboBox1     數位腳位控制字樣下,用以顯示要做(INPUT、OUTPUT、PWM)那個控制
  • 3.ComboBox2    跟ComboBox5疊合在一起,如果當使用者點選INPUT、OUTPUT、PWM時,
  •         以做切換,但因為LinkIt7697這三個差不多,所以,兩個都設一樣即可
  • 4.ComboBox5    跟ComboBox5疊合在一起,如果當使用者點選INPUT、OUTPUT、PWM時,
  •         以做切換,但因為LinkIt7697這三個差不多,所以,兩個都設一樣即可
  • 5.ComboBox3    在ComboBox2和ComboBox5後面,與TextBox1疊合在一起,如果當使用者                                    點選INPUT時,它就會出現,讓使用者直接點選0(LOW)、1(HIGH)。

  • Button (通用控制項)
  • 1.connect_BTN   用以連線板子用,一定要連線後,才可以使用下面的功能,不然都會失敗!
  • 2.Button1             當使用者點選這個按鈕時,會判斷前面的欄位參數,進而丟出相關指令。
  •         (用於數位腳位)
  • 3.Button2            當使用者點選這個按鈕時,會判斷前面的欄位參數,進而丟出相關指令。
  •         (用於類比腳位)

  • Textbox (通用控制項)
  • 1.TextBox1            顯示數位腳位讀取(digitalRead)的參數
  • 2.TextBox2          顯示類比腳位讀取(analogRead)的參數

  • Label (通用控制項)
  • 這個就不多加介紹,只是用於顯示相關欄位資料

四、程式說明

  這裡有幾點需要特別注意,第一、因為你不知道,目前PIN的狀態是甚麼,因此,當你在使用digitalRead等指令前,請先使用pinMode去確認這個PIN是你要用的狀態,第二、VB的結尾通常不帶有\n,但我們的firmata預設是需要的,因此,每個指令後面都必須帶有& vbNewLine,以確保傳輸出去的指令是帶有\n,第三、這邊要強調的是pinMode的mode在nodeMCU跟LinkIt7697在這兩個板子1是OUTPUT,但是2卻是INPUT,而在arduino uno上則是1代表OUTPUT,0代表INPUT。

  最後,我們展示一下一些相關指令使用:

digitalWrite(以pin10為例)

a = "pinMode=10" & ",1" & vbNewLine

SerialPort1.Write(a)

a = "digitalWrite=10," & ComboBox3.SelectedIndex & vbNewLine

SerialPort1.Write(a)

digitalRead(以pin10為例)

a = "pinMode=10,2" & vbNewLine

SerialPort1.Write(a)

a = "digitalRead=10 & vbNewLine

SerialPort1.Write(a)

TextBox1.Text = SerialPort1.ReadLine()

analogWrite(以pin10為例)

a = "pinMode=10,1" & vbNewLine

SerialPort1.Write(a)

a = "analogWrite=10" & "," & TextBox1.Text & vbNewLine

SerialPort1.Write(a)

analogRead(以A1為例)

a = "analogRead=A1" & vbNewLine

SerialPort1.Write(a)

TextBox2.Text = SerialPort1.ReadLine()

五、程式碼

  下面提供整個程式碼給各位,最後面還有可以下載的連結,如果做不出來,可以參考程式碼,來進行撰寫,不過,最好是可以自己嘗試一下,也不見得要配置的跟我的程式一樣,只要能做出來即可,另外,此程式為基礎指令介紹,之後還會有其他相關指令的介紹。

Imports System

Imports System.IO.Ports

Public Class Form1

Dim comPORT As String

Dim receivedData As String = ""

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

comPORT = ""

For Each sp As String In My.Computer.Ports.SerialPortNames

comPort_ComboBox.Items.Add(sp)

Next

TextBox1.Hide()

ComboBox3.Hide()

End Sub

Private Sub comPort_ComboBox_SelectedIndexChanged(sender As Object, e As EventArgs) Handles comPort_ComboBox.SelectedIndexChanged

If (comPort_ComboBox.SelectedItem <> "") Then

comPORT = comPort_ComboBox.SelectedItem

End If

End Sub

Private Sub connect_BTN_Click(sender As Object, e As EventArgs) Handles connect_BTN.Click

If (connect_BTN.Text = "Connect") Then

If (comPORT <> "") Then

SerialPort1.Close()

SerialPort1.PortName = comPORT

SerialPort1.BaudRate = 9600

SerialPort1.DataBits = 8

SerialPort1.Parity = Parity.None

SerialPort1.StopBits = StopBits.One

SerialPort1.Handshake = Handshake.None

SerialPort1.Encoding = System.Text.Encoding.Default 'very important!

SerialPort1.ReadTimeout = 10000

SerialPort1.Open()

connect_BTN.Text = "Dis-connect"

Timer_LBL.Text = "連接LinkIt7697: ON"

Else

MsgBox("請先選擇一個Com port")

End If

Else

SerialPort1.Close()

connect_BTN.Text = "Connect"

Timer_LBL.Text = "Timer: OFF"

End If

End Sub

Private Sub Timer1_Tick(sender As Object, e As EventArgs)

End Sub

Private Sub RichTextBox1_TextChanged(sender As Object, e As EventArgs)

End Sub

Private Sub Label2_Click(sender As Object, e As EventArgs) Handles Label2.Click

End Sub

Private Sub ComboBox2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox2.SelectedIndexChanged

End Sub

Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged

If ComboBox1.SelectedIndex = 1 Then

ComboBox3.Show()

TextBox1.Hide()

ComboBox2.Show()

ComboBox5.Hide()

ElseIf ComboBox1.SelectedIndex = 0 Or ComboBox1.SelectedIndex = 2 Then

ComboBox3.Hide()

TextBox1.Show()

If ComboBox1.SelectedIndex = 0 Then

ComboBox2.Show()

ComboBox5.Hide()

ElseIf ComboBox1.SelectedIndex = 2 Then

ComboBox2.Hide()

ComboBox5.Show()

End If

End If

End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

Dim a As String

a = "analogRead=" & ComboBox4.SelectedIndex.ToString & vbNewLine

SerialPort1.Write(a)

TextBox2.Text = SerialPort1.ReadLine()

End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

Dim a As String

If ComboBox1.SelectedIndex = 0 Then

a = "pinMode=" & ComboBox2.SelectedIndex.ToString & ",2" & vbNewLine

SerialPort1.Write(a)

a = "digitalRead=" & ComboBox2.SelectedIndex.ToString & vbNewLine

SerialPort1.Write(a)

TextBox1.Text = SerialPort1.ReadLine()

ElseIf ComboBox1.SelectedIndex = 1 Then

a = "pinMode=" & ComboBox2.SelectedIndex.ToString & ",1" & vbNewLine

SerialPort1.Write(a)

a = "digitalWrite=" & ComboBox2.SelectedIndex.ToString & "," & ComboBox3.SelectedIndex & vbNewLine

SerialPort1.Write(a)

ElseIf ComboBox1.SelectedIndex = 2 Then

a = "pinMode=" & ComboBox5.Text & ",1" & vbNewLine

SerialPort1.Write(a)

a = "analogWrite=" & ComboBox5.Text & "," & TextBox1.Text & vbNewLine

SerialPort1.Write(a)

End If

End Sub

Private Sub ComboBox5_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox5.SelectedIndexChanged

End Sub

Private Sub Timer_LBL_Click(sender As Object, e As EventArgs) Handles Timer_LBL.Click

End Sub

End Class

執行

圖二、執行畫面

程式碼下載                                     下載