Arduino Serial and VB

LAS26rus
Offline
Зарегистрирован: 29.05.2012

 Небольшой проект взаимодействия Arduino UNO и Visual Basic.

Управление светодиодами и прочими штуками через PC (COM)

 

LAS26rus
Offline
Зарегистрирован: 29.05.2012

Вот само видео: http://youtu.be/zczEG2dIuOI  

Zapek@n
Offline
Зарегистрирован: 16.02.2012

 Здорово. А код покажите для будущих поколений?

Antel
Offline
Зарегистрирован: 10.06.2012

У меня есть связка Arduino + Access работает прекрасно. Access VBA, кому интересно могу поделится

LAS26rus
Offline
Зарегистрирован: 29.05.2012

 Конечно =)
вот 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

 

ourlive
Offline
Зарегистрирован: 26.05.2012

бегущий огонёк проходит три круга, это 2 вложенных цикла. не жалко вам памяти дуины..

а вот с VB есть вопрос, как на VB автоматом выбрать com порт на которой висит дуина? и если дуины нет, то окошко VB сообщило бы об этом и висело в ожидании подключения.

LAS26rus
Offline
Зарегистрирован: 29.05.2012

 Я с вами полностью согласен. код 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

 

ourlive
Offline
Зарегистрирован: 26.05.2012

нет, вы просто строите список портов и вручную выбираете тот на котором дуина. а задача что бы порт был выбран автоматически. при подключении каждой новой дуины, ей назначается новый порт как новому устройству. также на разных компах порты назначаются разные. даже при двух компах  трёх дуинах уже нужно задумываться какой порт правильный для конкретной комбинации.

На мой взгляд оно должно работать так: строится список портов, и после они все последовательно опрашиваются. нашли дуину, подключаемся, не нашли - говорим нет таких. И было бы всё просто, если бы в построенном списке не отображались порты назначенные виртуальным устройствам (для мобильников например). Попытка открыть такой порт где устройство физически отключено - вызывает ошибку.

ГИС Русса например находит GPS модули именно так, нашли модуль, подключились, не нашли, ждём появления модуля...

подозреваю, что ошибки нужно как то перехватывать и обрабатывать, однако такое без подробного примера мне пока не по силам..

dcl
Offline
Зарегистрирован: 02.10.2012

LAS26rus, НЕ РАБОТАЕТ твоя прога со светодиодами!

titov_andrei
titov_andrei аватар
Offline
Зарегистрирован: 04.10.2012

Какой язык програмирования проще использовать для работы с портами, при учёте, что никаких не знаешь? 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

titov_andrei пишет:

Какой язык програмирования проще использовать для работы с портами, при учёте, что никаких не знаешь? 


Язык денег. Берется мешок денег и заказывается код.

titov_andrei
titov_andrei аватар
Offline
Зарегистрирован: 04.10.2012

Puhlyaviy пишет:
titov_andrei пишет:

Какой язык програмирования проще использовать для работы с портами, при учёте, что никаких не знаешь? 

Язык денег. Берется мешок денег и заказывается код.

 

Имеется ввиду в целях обучения - какой проще освоить или проще в готовом коде разобраться?

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

titov_andrei пишет:

Имеется ввиду в целях обучения - какой проще освоить или проще в готовом коде разобраться?

Дык кто же Ваших тараканов вголове знает? Я вот с ассемблера начинал, правда так толку и не добился :) Есть 3 основных группы языков, какая Вам подойдет больше никто кроме Вас сказать не сможет. У Вас вон и на аватарке то-ли зёрнышко кофейное, то-ли 2 Вин Дизеля сверху...

ourlive
Offline
Зарегистрирован: 26.05.2012

titov_andrei пишет:

Имеется ввиду в целях обучения - какой проще освоить или проще в готовом коде разобраться?

С точки зрения обрашения к портам, всё что не ассемблер будет выглядеть приблизительно одинаково, потому как при работе с портами идёт обращение к стандартным ресурсам ОС. Иной вопрос каковы перспективы в дальнейших планах, хотите вы поначитаться данных из порта и крупными буквами написать "данные есть" или построить на их основе несколько трёхмерных графиков... Для первого варианта VB самое то.

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

ourlive пишет:

С точки зрения обрашения к портам, всё что не ассемблер будет выглядеть приблизительно одинаково, потому как при работе с портами идёт обращение к стандартным ресурсам ОС. Иной вопрос каковы перспективы в дальнейших планах, хотите вы поначитаться данных из порта и крупными буквами написать "данные есть" или построить на их основе несколько трёхмерных графиков... Для первого варианта VB самое то.

Для первого варианта - ArduBlock

http://habrahabr.ru/post/240441/

ourlive
Offline
Зарегистрирован: 26.05.2012

JollyBiber пишет:

вого варианта - ArduBlock

Это не для обучения, а для развлечения.

titov_andrei
titov_andrei аватар
Offline
Зарегистрирован: 04.10.2012

ourlive пишет:

titov_andrei пишет:

Имеется ввиду в целях обучения - какой проще освоить или проще в готовом коде разобраться?

С точки зрения обрашения к портам, всё что не ассемблер будет выглядеть приблизительно одинаково, потому как при работе с портами идёт обращение к стандартным ресурсам ОС. Иной вопрос каковы перспективы в дальнейших планах, хотите вы поначитаться данных из порта и крупными буквами написать "данные есть" или построить на их основе несколько трёхмерных графиков... Для первого варианта VB самое то.

Планы - управление устройствами через GUI на ПК/Android.

Почему спрашиваю про лёгкость в освоении, так это для ребёнка 10 лет, который на Python чуть-чуть покодил.

Как последовательно (и, желательно быстро) к портам перейти? Ведь управление только через них? Или можно сразу к Wi-Fi переходить?

art100
Offline
Зарегистрирован: 09.03.2014

бедные ведроиды

сначало их купят говоря вот это то что нужно

а потом чем только их не расковыривают?

народная забава

купи ведроид без кнопок и потом занимайся тем что прикручивай к нему кнопки

Васиком теперь модно ковырять?

Max_Sames
Offline
Зарегистрирован: 23.04.2015

LAS26rus пишет:

 Я с вами полностью согласен. код 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

 

Ругается на  Dim ports As String() = GetPortNames() как исправить???

Salex
Offline
Зарегистрирован: 24.10.2017

Ардуино контролирует нагрев куба по термосопротивлению. Нагрев включаю отсылая "1" с кнопки на VB. При работающем нагреве (пин 12, реле) включаю "Монитор порта" Ардуино, или "Плоттер", чтобы наблюдать рост температуры или график ее - пин 12 отключается!
Как сделать так, чтоб и нагрев был и Монитор или плоттер наблюдать можно было?

b707
Offline
Зарегистрирован: 26.05.2017

Никак, две программы одновременно не могут обращаться к одному порту.  Самое простое - посылать "1" через монитор порта. Чуть сложнее - дописать свою прогу на VB. чтобы она заменяла Монитор.

Salex
Offline
Зарегистрирован: 24.10.2017

Благодарю за разъяснение!