Arduino Serial and VB
- Войдите на сайт для отправки комментариев
Чт, 28/06/2012 - 15:51
Небольшой проект взаимодействия Arduino UNO и Visual Basic.
Управление светодиодами и прочими штуками через PC (COM)
Небольшой проект взаимодействия Arduino UNO и Visual Basic.
Управление светодиодами и прочими штуками через PC (COM)
Вот само видео: http://youtu.be/zczEG2dIuOI
Здорово. А код покажите для будущих поколений?
У меня есть связка Arduino + Access работает прекрасно. Access VBA, кому интересно могу поделится
Конечно =)
вот ARDUINO
int ledPin1 = 9; int ledPin2 = 10; int ledPin3 = 11; int ledPin4 = 12; int ledPin5 = 13; void setup() { Serial.begin(9600); pinMode(ledPin1, OUTPUT); pinMode(ledPin2, OUTPUT); pinMode(ledPin3, OUTPUT); pinMode(ledPin4, OUTPUT); pinMode(ledPin5, OUTPUT); } void loop() { while (Serial.available() == 0); int val = Serial.read() - '0'; if (val == 1) { digitalWrite(ledPin1, HIGH); } if (val == 2) { digitalWrite(ledPin2, HIGH); } if (val == 3) { digitalWrite(ledPin3, HIGH); } if (val == 4) { digitalWrite(ledPin4, HIGH); } if (val == 5) { digitalWrite(ledPin5, HIGH); } if (val == 6) { digitalWrite(ledPin1, HIGH); delay(100); digitalWrite(ledPin1, LOW); digitalWrite(ledPin2, HIGH); delay(100); digitalWrite(ledPin3, HIGH); digitalWrite(ledPin2, LOW); delay(100); digitalWrite(ledPin4, HIGH); digitalWrite(ledPin3, LOW); delay(100); digitalWrite(ledPin5, HIGH); digitalWrite(ledPin4, LOW); delay(100); digitalWrite(ledPin5, LOW); digitalWrite(ledPin1, HIGH); delay(100); digitalWrite(ledPin1, LOW); digitalWrite(ledPin2, HIGH); delay(100); digitalWrite(ledPin3, HIGH); digitalWrite(ledPin2, LOW); delay(100); digitalWrite(ledPin4, HIGH); digitalWrite(ledPin3, LOW); delay(100); digitalWrite(ledPin5, HIGH); digitalWrite(ledPin4, LOW); delay(100); digitalWrite(ledPin5, LOW); digitalWrite(ledPin1, HIGH); delay(100); digitalWrite(ledPin1, LOW); digitalWrite(ledPin2, HIGH); delay(100); digitalWrite(ledPin3, HIGH); digitalWrite(ledPin2, LOW); delay(100); digitalWrite(ledPin4, HIGH); digitalWrite(ledPin3, LOW); delay(100); digitalWrite(ledPin5, HIGH); digitalWrite(ledPin4, LOW); delay(100); digitalWrite(ledPin5, LOW); digitalWrite(ledPin1, HIGH); delay(100); digitalWrite(ledPin1, LOW); digitalWrite(ledPin2, HIGH); delay(100); digitalWrite(ledPin3, HIGH); digitalWrite(ledPin2, LOW); delay(100); digitalWrite(ledPin4, HIGH); digitalWrite(ledPin3, LOW); delay(100); digitalWrite(ledPin5, HIGH); digitalWrite(ledPin4, LOW); delay(100); digitalWrite(ledPin5, LOW); delay(100); digitalWrite(ledPin1, HIGH); digitalWrite(ledPin2, HIGH); digitalWrite(ledPin3, HIGH); digitalWrite(ledPin4, HIGH); digitalWrite(ledPin5, HIGH); delay(100); digitalWrite(ledPin1, LOW); digitalWrite(ledPin2, LOW); digitalWrite(ledPin3, LOW); digitalWrite(ledPin4, LOW); digitalWrite(ledPin5, LOW); delay(100); digitalWrite(ledPin1, HIGH); digitalWrite(ledPin2, HIGH); digitalWrite(ledPin3, HIGH); digitalWrite(ledPin4, HIGH); digitalWrite(ledPin5, HIGH); delay(100); digitalWrite(ledPin1, LOW); digitalWrite(ledPin2, LOW); digitalWrite(ledPin3, LOW); digitalWrite(ledPin4, LOW); digitalWrite(ledPin5, LOW); } else if (val == 0) { digitalWrite(ledPin1, LOW); digitalWrite(ledPin2, LOW); digitalWrite(ledPin3, LOW); digitalWrite(ledPin4, LOW); digitalWrite(ledPin5, LOW); } }VB
Imports System.IO Imports System.IO.Ports Imports System.Threading Public Class Form1 Shared _continue As Boolean Shared _serialPort As SerialPort Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load SerialPort1.Close() SerialPort1.PortName = "com3" 'change com port to match your Arduino port 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! End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click picOn.Visible = True SerialPort1.Open() SerialPort1.Write("1") SerialPort1.Close() End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click picOn.Visible = True SerialPort1.Open() SerialPort1.Write("2") SerialPort1.Close() End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click picOn.Visible = True SerialPort1.Open() SerialPort1.Write("3") SerialPort1.Close() End Sub Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click picOn.Visible = True SerialPort1.Open() SerialPort1.Write("4") SerialPort1.Close() End Sub Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click picOn.Visible = True SerialPort1.Open() SerialPort1.Write("5") SerialPort1.Close() End Sub Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click picOn.Visible = True SerialPort1.Open() SerialPort1.Write("6") SerialPort1.Close() End Sub Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click picOn.Visible = False SerialPort1.Open() SerialPort1.Write("0") SerialPort1.Close() End Sub End Classбегущий огонёк проходит три круга, это 2 вложенных цикла. не жалко вам памяти дуины..
а вот с VB есть вопрос, как на VB автоматом выбрать com порт на которой висит дуина? и если дуины нет, то окошко VB сообщило бы об этом и висело в ожидании подключения.
Я с вами полностью согласен. код Arduino можно упростит и памяти займет (сделал на абум). Больше внимания обращал на VB.
Если я вас понял. Вы хотите чтоб порт автоматически выходил, как тут:
Imports System.IO.Ports.SerialPort Public Class Form1 Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing If SerialPort1.IsOpen Then SerialPort1.Write(ChrW(100)) End If End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Verfügbare Comports suchen Dim ports As String() = GetPortNames() Dim Port As String 'Combobox richtig sortieren ComboBox_Comport.Items.Clear() If ports.Length > 0 Then ' für alle COM-Nr. < 10 ein Leerzeichen einfügen For ii As Integer = 0 To (ports.Length - 1) If CInt(ports(ii).Substring(3)) < 10 Then ports(ii) = "COM " & ports(ii).Substring(3) End If Next Array.Sort(ports) ' das Leerzeichen in "COM x" wieder entfernen For ii As Integer = 0 To (ports.Length - 1) ports(ii) = "COM" & ports(ii).Substring(3).Trim Next End If 'In die Combobox übernehmen For Each Port In ports ComboBox_Comport.Items.Add(Port) Next Port 'Buttons setzen Button_Disconnect.Enabled = False Button_Connect.Enabled = False End Sub Private Sub ComboBox_Comport_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox_Comport.SelectedIndexChanged 'Comport auswählen If ComboBox_Comport.SelectedItem <> "" Then Button_Connect.Enabled = True End If End Sub Private Sub Button_Connect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_Connect.Click 'Comport verbinden Try 'Buttons freigeben-/ sperren Button_Connect.Enabled = False Button_Disconnect.Enabled = True ComboBox_Comport.Enabled = False 'Comport Einstellungen SerialPort1.PortName = ComboBox_Comport.Text SerialPort1.BaudRate = 9600 SerialPort1.Open() Timer1.Enabled = True Catch ex As Exception 'Fehlermeldung MessageBox.Show("Achtung die Schnittstelle konnte nicht geöffnet werden! " + e.ToString _ , "Ausnahmefehler", MessageBoxButtons.OK, MessageBoxIcon.Error) Button_Connect.Enabled = True Button_Disconnect.Enabled = False ComboBox_Comport.Enabled = True End Try End Subнет, вы просто строите список портов и вручную выбираете тот на котором дуина. а задача что бы порт был выбран автоматически. при подключении каждой новой дуины, ей назначается новый порт как новому устройству. также на разных компах порты назначаются разные. даже при двух компах трёх дуинах уже нужно задумываться какой порт правильный для конкретной комбинации.
На мой взгляд оно должно работать так: строится список портов, и после они все последовательно опрашиваются. нашли дуину, подключаемся, не нашли - говорим нет таких. И было бы всё просто, если бы в построенном списке не отображались порты назначенные виртуальным устройствам (для мобильников например). Попытка открыть такой порт где устройство физически отключено - вызывает ошибку.
ГИС Русса например находит GPS модули именно так, нашли модуль, подключились, не нашли, ждём появления модуля...
подозреваю, что ошибки нужно как то перехватывать и обрабатывать, однако такое без подробного примера мне пока не по силам..
LAS26rus, НЕ РАБОТАЕТ твоя прога со светодиодами!
Какой язык програмирования проще использовать для работы с портами, при учёте, что никаких не знаешь?
Какой язык програмирования проще использовать для работы с портами, при учёте, что никаких не знаешь?
Язык денег. Берется мешок денег и заказывается код.
Какой язык програмирования проще использовать для работы с портами, при учёте, что никаких не знаешь?
Имеется ввиду в целях обучения - какой проще освоить или проще в готовом коде разобраться?
Имеется ввиду в целях обучения - какой проще освоить или проще в готовом коде разобраться?
Дык кто же Ваших тараканов вголове знает? Я вот с ассемблера начинал, правда так толку и не добился :) Есть 3 основных группы языков, какая Вам подойдет больше никто кроме Вас сказать не сможет. У Вас вон и на аватарке то-ли зёрнышко кофейное, то-ли 2 Вин Дизеля сверху...
Имеется ввиду в целях обучения - какой проще освоить или проще в готовом коде разобраться?
С точки зрения обрашения к портам, всё что не ассемблер будет выглядеть приблизительно одинаково, потому как при работе с портами идёт обращение к стандартным ресурсам ОС. Иной вопрос каковы перспективы в дальнейших планах, хотите вы поначитаться данных из порта и крупными буквами написать "данные есть" или построить на их основе несколько трёхмерных графиков... Для первого варианта VB самое то.
С точки зрения обрашения к портам, всё что не ассемблер будет выглядеть приблизительно одинаково, потому как при работе с портами идёт обращение к стандартным ресурсам ОС. Иной вопрос каковы перспективы в дальнейших планах, хотите вы поначитаться данных из порта и крупными буквами написать "данные есть" или построить на их основе несколько трёхмерных графиков... Для первого варианта VB самое то.
Для первого варианта - ArduBlock
http://habrahabr.ru/post/240441/
вого варианта - ArduBlock
Это не для обучения, а для развлечения.
Имеется ввиду в целях обучения - какой проще освоить или проще в готовом коде разобраться?
С точки зрения обрашения к портам, всё что не ассемблер будет выглядеть приблизительно одинаково, потому как при работе с портами идёт обращение к стандартным ресурсам ОС. Иной вопрос каковы перспективы в дальнейших планах, хотите вы поначитаться данных из порта и крупными буквами написать "данные есть" или построить на их основе несколько трёхмерных графиков... Для первого варианта VB самое то.
Планы - управление устройствами через GUI на ПК/Android.
Почему спрашиваю про лёгкость в освоении, так это для ребёнка 10 лет, который на Python чуть-чуть покодил.
Как последовательно (и, желательно быстро) к портам перейти? Ведь управление только через них? Или можно сразу к Wi-Fi переходить?
бедные ведроиды
сначало их купят говоря вот это то что нужно
а потом чем только их не расковыривают?
народная забава
купи ведроид без кнопок и потом занимайся тем что прикручивай к нему кнопки
Васиком теперь модно ковырять?
Я с вами полностью согласен. код Arduino можно упростит и памяти займет (сделал на абум). Больше внимания обращал на VB.
Если я вас понял. Вы хотите чтоб порт автоматически выходил, как тут:
Imports System.IO.Ports.SerialPort Public Class Form1 Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing If SerialPort1.IsOpen Then SerialPort1.Write(ChrW(100)) End If End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Verfügbare Comports suchen Dim ports As String() = GetPortNames() Dim Port As String 'Combobox richtig sortieren ComboBox_Comport.Items.Clear() If ports.Length > 0 Then ' für alle COM-Nr. < 10 ein Leerzeichen einfügen For ii As Integer = 0 To (ports.Length - 1) If CInt(ports(ii).Substring(3)) < 10 Then ports(ii) = "COM " & ports(ii).Substring(3) End If Next Array.Sort(ports) ' das Leerzeichen in "COM x" wieder entfernen For ii As Integer = 0 To (ports.Length - 1) ports(ii) = "COM" & ports(ii).Substring(3).Trim Next End If 'In die Combobox übernehmen For Each Port In ports ComboBox_Comport.Items.Add(Port) Next Port 'Buttons setzen Button_Disconnect.Enabled = False Button_Connect.Enabled = False End Sub Private Sub ComboBox_Comport_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox_Comport.SelectedIndexChanged 'Comport auswählen If ComboBox_Comport.SelectedItem <> "" Then Button_Connect.Enabled = True End If End Sub Private Sub Button_Connect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_Connect.Click 'Comport verbinden Try 'Buttons freigeben-/ sperren Button_Connect.Enabled = False Button_Disconnect.Enabled = True ComboBox_Comport.Enabled = False 'Comport Einstellungen SerialPort1.PortName = ComboBox_Comport.Text SerialPort1.BaudRate = 9600 SerialPort1.Open() Timer1.Enabled = True Catch ex As Exception 'Fehlermeldung MessageBox.Show("Achtung die Schnittstelle konnte nicht geöffnet werden! " + e.ToString _ , "Ausnahmefehler", MessageBoxButtons.OK, MessageBoxIcon.Error) Button_Connect.Enabled = True Button_Disconnect.Enabled = False ComboBox_Comport.Enabled = True End Try End SubРугается на
DimportsAsString() = GetPortNames() как исправить???Ардуино контролирует нагрев куба по термосопротивлению. Нагрев включаю отсылая "1" с кнопки на VB. При работающем нагреве (пин 12, реле) включаю "Монитор порта" Ардуино, или "Плоттер", чтобы наблюдать рост температуры или график ее - пин 12 отключается!
Как сделать так, чтоб и нагрев был и Монитор или плоттер наблюдать можно было?
Никак, две программы одновременно не могут обращаться к одному порту. Самое простое - посылать "1" через монитор порта. Чуть сложнее - дописать свою прогу на VB. чтобы она заменяла Монитор.
Благодарю за разъяснение!