PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ansteuerung von Arduino Uno mit Visual Basic



Atvilar
17.09.2012, 10:59
Hallo zusammen!

Ich habe seit einiger Zeit die Arduino Uno Platine (Conrad) über die mitgelieferte Software Programmiert (über USB an COM8 ).
Da ich aber eine schöne Bedienoberfläche für meinen stationären Roboter haben möchte, will ich jetzt auf VB umsteigen.
Leider bin ich in sachen Computer nicht gerade ein fachmann und möchte deshalb wissen, wie ich VB und Arduino kommunizieren lassen kann,
bzw. mit welchen Befehlen ich die analogen / digitalen Ports als OUT- / INPUT benutzen kann.
vieleicht habe ich mich nicht verständlich ausgedrückt, könnte an meinem mangelnden wissen liegen. Falls was unklar, bitte einfach melden! ;)
Danke!!

Thegon
17.09.2012, 21:22
Ich kenne mich zwar mit dem Arduino nicht näher aus, doch ich denke, dass man doch sicherlich irgentwie eine UART bzw. RS232 Verbindung herstellen kann (über den USB -> Com Wandler oder so).

In Visual Basic (ich verwende gerne 2008) gibt es das "SerialPort" - Steuerelement, mit diesem kann man sehr einfach auf serielle Ports des Computers zugreifen. Über diverse Eigenschaften kann man Baudrate, Anschlussname, und so weiter einstellen (einfach im Quellcode oder auch mittels Eingabeelemente natürlich)
Und dann kann man mittels des SerialPort1.Write(Array , Startindex, Anzahl von Bytes) sozusagen hinausschieben.

Man müsste dann eben ein Arduino - Programm schreiben, das diese Zahlen, die da über die Serielle Schnittstelle daher kommen (die du dir natürlich selbst ausdenken kannst, im VB - Programm) versteht und entsprechend die Ausgänge schaltet bzw. auch die Eingänge abfragt und an den Computer weitersendet, in VB gibt es dann das "DataRecived" - Ereignis, das ausgelöst wird, wenn Bytes empfangen wurden, diese können dann z.B. mittels
Variable = SerialPort1.ReadByte()
ausgelesen und in anderen Routinen weiterverarbeitet werden, um dann irgentwas "leuchten" zu lassen oder so ;-)

Zu all diesen VB.net - Klassen gibt es eine sehr gute Hilfe und Erklärung von Microsoft, und auch in vielen Tutorials steht viel wissenswertes, da hilft google fast immer ;-)

Mfg Thegon

Atvilar
21.09.2012, 10:15
Hallo,

Woher bekomme ich den quellcode?

"(Array , Startindex, Anzahl von Bytes)" woher habe ich diese Werte?

Du meist also, ich soll zwei Programme schreiben? Einmal in der Arduino Programmiersoftware als eine Art Treiber, und das andre im VB?

Wie mache ich dann das ganze rückwärts, z.b. einen PT 100 auslesen?

Ich weiss, es sind viele Fragen, ich bin ein absoluter Neuling in Sachen Hardwareprogrammierung ohne zurechtgeschnittene Programmierungssoftware... :(

Danke für die rasche Antwort!!

5Volt-Junkie
21.09.2012, 17:24
Man darf das nur vorsichtig wie Treiber verstehen. Mit VB kannst Du Befehle zwischen deinem PC und Arduino hin und her schicken. Wenn Du mit VB ein Befehl an Arduino schickst z.B "linksdrehen" muss der Arduino quasi "wissen" was dieses Befehl bedeutet. Also schreibst Du ein Programm für Arduino, wo drin dem Befehl "linksdrehen" die Antseuerung bestimmter Pins zugewiesen werden. In dem Fall eben die Pins des Motortreibers oder was auch immer.;)

Empfehlung: Arbeite doch erst mal einige Tutorials mit dem Arduino ab.

Was meinst Du mit zurecht geschnittener Software? Arduino IDE ist doch bestens auf das Arduino-Board abgestimmt.

HeXPloreR
21.09.2012, 19:11
Hier hat der Willa was schönes reingestellt. Vielleicht hilft es ja weiter zu finden unter "W" (Wind..s Programm zu Steuer des AVR :

http://www.rn-wissen.de/index.php/Kategorie:Software

Viele Grüße

Atvilar
29.10.2012, 13:14
Hallo!
Mein Ziel ist eigendlich so etwas wie eine automatische Destillatonsanlage für Lboratortiumszwecke zu entwerfen. Der Aduino ist über eine selbst zusammengelötete Verstärkerbox an einem 5-ach Tischverteiler angeschlossen, an dem Kühlwasserventil nd Herd angeschlossen ist. Weiters sollte er über PT 1000 wiederstände verfügen, mit denen er T messen kann und so z.b. Das Heiznest steuern kann. Alles möglichst in Modulbauweise, um bei einem Versuchsumbau Zeit zu sparen.
So hätte ich mir jetzt ein Interface vorgestellt mit Manuell / Automatikbetrieb, wobei ich bei Aout nur noch Kochzeit, T und Kühl T eingeben muss und dann rennt da sding von alleine.
Nebenbei kann ich noch status der Relais abfragen bzw. Die Temperaturen.

Danke für das bsp, doch habe ich kein RS 232 Sondern USB...

Greensiver
29.10.2012, 19:53
Hallo Atvilar!
Also wie ich das jetzt verstanden habe, möchtest du ein Interface in VB.net schreiben, das dier Werte anzeigt und wo du Sachan an deiner Destilationsanlage einstellen kannst. Sozusagen, das Daten rein und Rausfliegen. Im Grunde komunizieren beide Komponenten gut miteinander. Meinermeinung kommt aber Visualbasic immer mehr aus der Mode .... eig schade :(, da das erstellen Grafischer Programme sehr gut gelingt.
Die Comunity in Sachen VB.net mit Arduino ist eher mikrig. Naja egal :) kommen wier zu Sache.

Ich Persöhnlich lerne ambesten durch Lernen by Doing. Ich werd dier erstmal 2 VB.net Beispiele Dranhängen (Ein Einfacher virtueller Lampenschalter und ein Oszi). Ich finde die sind gans gut für den Anfang mit VB.net + Arduino um den Umgang mit Input und Output zu erlernen/testen.


Wenn du Fragen hast, schreib!

Das wars erstmal von mir!

-----
PS: Rechtschreibbung ist immer nochnicht meine Stärke:rolleyes:

_______________
Gruß Green

Atvilar
13.11.2012, 14:44
Hallo

Wenn VB immer mehr aus der mode kommt, welches Programm kommt dann nach?
Gibt es ein anderes Programm (ideal freeware), dass ich zum Ansteuern und visualisieren benutzen kann?

5Volt-Junkie
15.11.2012, 20:27
Wenn VB immer mehr aus der mode kommt, welches Programm kommt dann nach?

Spielt für Dich die Mode so eine große Rolle?
Assembler und Basic/Bascom sind angeblich auch schon lange aus der Mode raus und trotzdem programmieren noch welche damit ziemlich "modische" Sachen. Und zwar nicht nur alte "Hasen" die es eben gelernt haben, weil nichts anderes gab, sondern es gibt auch blutige Anfänger, die mit Assembler, Basic oder eben VB anfangen.
Man wählt die Programmiersprache, die einem am besten liegt und den Verwendungszweck erfüllt. Was bringt einem die "angesagteste" Programmiersprache, wenn es für Deine Zwecke total oversized und unübersichtlich ist?

Also such Dir am besten das aus, was Dir am meisten gefällt. Wenn man sich mit einem Dialekt auskennt, wird der vielleicht notwendige Umstieg nicht sehr kompliziert sein ;)

Atvilar
30.11.2012, 14:48
Hallo

Momentan bin ich doch noch bei VB geblieben... ein Computer hab ich ja noch zum Installieren.. lol
@Greensiver: Genial, danke!! hat mir extrem geholfen, du hast mir den Grundstein gelegt. Habe die Programm um 3 Ports erweitert und aus den Ein- und Ausschaltknopf ein Kästchen zum anhaken gemacht. Das untere Gerüst mit den Knöpfen hab ich verstanden, das obere durchblicke ich noch nicht ganz.. wird aber sicher kommen!!:p
Jetzt geht´s wirklich los! die Programme haben das Grundgerüst, jetzt gets ans eingemachte!

Simmons .NET pdf
19.12.2012, 10:12
Ya, VB wird immer stärker und stärker, sie durch große Menge von Programmierern benutzt wurde, lerne ich möchte einige VB-Code bymyself, so kann euch einige nützliche Informationen bieten.?

Manf
19.12.2012, 22:28
Welche Informationen sollen von wem geboten werden?

Atvilar
12.08.2013, 12:46
Hallo

Hiermit möchte ich gerne das Thema wieder beleben.

Einige Mnate sind vergangen, die ich mit Hardware-spielereien und sonstiges verbracht habe, aber jetzt möchte ich wieder zu dem Projekt zurückfinden.

Da es mir aber einfach an Erfahrung und Wissen fehlt, suche ich nach Freiwilligen (scheinbar werden sie auch verrückt genannt :-b ), die mir bei der Sache helfen.

Mir schwebt so eine Art "Let´s Build" vor, bei dem ich einfach einen Baubericht verfasse und jeder seine Ideen und Spezialgebiete beitragen darf. (kann / muss :p )

Würden sich da ein paar Feiwillige aus den Tefen des Internets erheben?


Ich für meinem Teil würde zumindest sehr dankbar sein...

Danke schon mal

Atvilar

redround
12.08.2013, 13:06
das Problem ist halt schlicht, dass Dein Projekt schon sehr speziell ist und es damit für andere wenig Anreiz gibt, sich zu beteiligen. Grundsätzlich ist die Programmierung einer Software mit grafischer Oberfläche und Kommunikation mit den Controller in VB.NET kein Hexenwerk ... habe ich neulich für ein anderes Projekt erst gemacht. Dabei wären mir jetzt aber keine großartigen Punkt aufgefallen, die man standardisieren und in irgendwelche Libraries packen könnte. Das ist alles immer sehr stark auf das jeweilige Projekt bezogen. Die Basis-Technologien (wie der Zugriff auf die serielle Schnittstelle) sind schon alle im .NET Framework implementiert, so dass es auch da eigentlich nichts mehr allgemeingültiges zu entwickeln gäbe (zumindest ist mir nichts aufgefallen). Damit bleiben mehr oder weniger nur projektbezogene Aufgaben - und da sind wir wieder beim Problem, dass Du halt ein sehr spezielles Projekt vor hast ;-)

Spannender wäre es höchstens, wenn man sich mal Gedanken über ein universelles RN Prozess-Leit- und -Steuer-System Gedanken machen würde ... das ist aber dann schon eher wieder eine Monster-Aufgabe :-)

Atvilar
12.08.2013, 13:37
Ich dachte sowiso daran, wenn ich ein paar kluge Köpfe zusammenkriege, dass man dann das Ganze in Modularbauweise macht.
Sprich dass jeder seine eigenen Sensoren / Aktoren dranhängen kann

zb. ich Destilliere Schnaps, der andere gießt seine Blumen damit.

(beide benötigen die Ansteuerung einer Pumpe, er braucht halt ein Feuchtigkeitssensor, ich ein PT 100)

redround
12.08.2013, 13:51
zum einen würde ich Dir zu einem PT1000 an Stelle des PT100 raten und zum zweiten ist die Anpassung ja vor allem an der Analog-Seite erforderlich. Wenn ich erstmal eine Verstärker-Schaltung habe, die 0 bis Vref liefert, ist es dem Controller ja egal, was dran hängt ;-)

Das Hauptproblem war doch eher auf der PC Seite oder? Und wie gesagt: da steht alles schon mehr oder weniger zur Verfügung. Man könnte wie gesagt höchstens über ein Open Soruce Projekt zur Prozess-Virtualisierung und -Steuerung nachdenken, bei dem man ohne große Programmierung auskommt. Aber das ist wiederrum schon ein recht ambitioniertes Vorhaben.

Atvilar
12.08.2013, 14:04
wenn das alles so einfach ist, kann ich mit deiner Hilfe rechnen?

Ich selbst bin nämlich damit völlig überfordert. Bin halt immer noch ein bluiger Anfänger

Bist du von Arduinoprogrammierkentnisse bewandert?


Wenn ja, könnte ich dich irgendwie dazu erweichen, dass du mir mal ein Beispielprogramm schreibst?

Z.b.

an Arduino ist Relai für Heizspirale (port 1) und Pt 1000 (port 2) angschlossen

Arduino liest Wiederstand aus
sendet es
Visual rechnet in °C um
entscheidet, ob weiter geheizt werden soll
sendet signal an Arduino
schaltet relai durch

wenn das möglich wäre, dann würde mich das sehr freuen. (natürlich mit viiel erklärung, um zu lernen)

Danke

Atvilar

redround
12.08.2013, 14:58
bei Arduino kann ich Dir leider nicht so viel helfen ... aber für VB.NET kann ich Dir ein paar Beispiele liefern, die die Kommuniktion mit der COM-Schnittstelle zeigen wenn Dir das hilft. Auf der Controller-Seite habe ich das bislang immer mit C gemacht. Allerdings gibt es im Netz wohl auch einige Beispiele die die Verwendung von RS232 mit dem Arduino zeigen.

Atvilar
13.08.2013, 07:26
Also bis jetzt habe ich nur das Beispiel (eine Seite zurück -> Link) eine Lampe mit VB schalten und ein Oszi. Der oszi wäre das Interesannt, da da eine Information von Arduino zu VB gschickt wird. Nur habe ich noch nicht ganz begriffen, wie das genau gemacht wird, bzw. wie ich das für einen T pT 1000 (habe übrigends oben nur eine 0 vergessen :rolleyes: ) ummünzen kann....

weil du das jetzt sagst:

Gibt es eine Möglichkeit, direkt Arduino mit C (das ist doch die Sprache von Vb, oder?) anzusteuern?

redround
13.08.2013, 21:19
C und VB sind komplett andere Sprachen, denen auch ein komplett anderer Ansatz zugrunde liegt.

Ich poste hier mal einen Ausschnitt aus dem Code, den ich zuletzt verwendet habe:
Imports System.IO.Ports



Imports System.IO.Ports

Public Class Controller
Private myPort As SerialPort

#Region "implementation of singelton pattern"
Private Shared myInstance As Controller
Public Shared ReadOnly Property Instance() As Controller
Get
If myInstance Is Nothing Then
myInstance = New Controller
End If
Return myInstance
End Get
End Property
#End Region

Public Sub New()
myPort = New SerialPort
With myPort
.PortName = "COM7"
.BaudRate = 9600
.DataBits = 8
.Parity = Parity.None
.StopBits = StopBits.One
.Handshake = Handshake.None
End With
End Sub

Public Sub setPort(ByVal pPort As String)
If myPort.IsOpen Then
myPort.Close()
End If

myPort.PortName = pPort

myPort.Open()
End Sub

Private Function getPort() As SerialPort
If myPort.IsOpen = False Then
myPort.Open()
End If

Return myPort
End Function

#Region "Zeit-Funktionen"
Public Function setTime(ByVal pTime As Date) As String
Dim port As SerialPort

port = getPort()
port.Write("*b" & Chr(pTime.Hour + 50) & Chr(pTime.Minute + 50) & Chr(pTime.Second + 50) & "#")

Return getTime()
End Function

Public Function getTime() As String
Dim ret As Integer
Dim t As String = ""
Dim port As SerialPort

port = getPort()

t = port.ReadExisting
t = ""

port.Write("*a#")

' Prefix der Antwort auslesen
ret = port.ReadChar()
If ret <> Asc("*") Then
Debug.Print("Zeichen: " & Chr(ret))
End If

' Nächstes Byte = Stunde
ret = port.ReadChar()
ret = ret - 50 ' Offset abziehen
t = ret.ToString("00")

' Nächstes Byte = Minute
ret = port.ReadChar()
ret = ret - 50 ' Offset abziehen
t = t & ":" & ret.ToString("00")

' Nächstes Byte = Sekunde
ret = port.ReadChar()
ret = ret - 50 ' Offset abziehen
t = t & ":" & ret.ToString("00")

Return t
End Function

#End Region
End Class




Allerdigs setzt das schon ein wenig Kenntniss in VB voraus. Der Code definiert eine eigene Klasse für die Kommunikation mit dem COM-Port (bei mir defaultmäßig COM7). Die Implementierung als Singelton vereinfacht die spätere Verwendung der Klasse, da man dann nicht immer erst mühsam ein Objekt anlegen muss. Darüber hinaus sollte es auch nur eine einizige Objekt-Instanz geben, die mit der Schnittstelle kommuniziert .. .und auch das wird über das Singelton-Pattern gelöst.

Die new() Prozedur ist der sog. Konstruktor der Klasse. Dieser wird immer aufgerufen, wenn eine Objekt-Instanz aus der Klasse erzeugt wird. In diesem Konstruktor wird der Serielle Port initialisiert. Die hier verwendeten Werte sind mehr oder minder Standard.

Falls der Mikrocontroller mal nicht an COM7 sondern wo anders hängt, kann man das Programm mit Hilfe der setPort Methode auf einen anderen Port konfigurieren.

getPort liefert bei Bedarf das Port-Objekt

setTime zeigt Dir, wie Du eine Zeichenfolge an den Controller schicken kannst. Das Protokoll für die Kommunikation mit dem Controller muss man sich selbst überlegen. Ich hatte für mich festgelegt, dass *b am Beginn einer Zeichenfolge, die ich an den Controller schicke diesem mitteilt, dass die Uhrzeit gesetzt werden soll. Danach werden dann die Stunden, Minuten und Sekunden übertragen. Um Bytes in der Übertragung zu sparen hatte ich mich entschlossen, Charakter-Zeichen zu übertragen. Um dabei nicht in den Bereich der Steuerzeugen zu landen habe ich einen Offset von 50 addiert. Bei meiner Protokoll-Definition hatte ich noch festgelegt, dass jede Zeichenfolge durch das Senden eines Raute-Zeichens abgeschlossen wird. Das sind aber alles vollkommen willkürliche Festlegungen und Du musst für Deine Fälle halt selbst definieren, welche Daten wie ausgetauscht werden sollen.

Die getTime Methode zeigt dann, wie man aus der seriellen Schnittstelle lesen kann. Sollte noch irgendwelcher Müll im Eingangspuffer stehen, lese ich den erst mit ReadExisting aus und schmeiße ihn weg :-) Danach schicke ich die Zeichenfolge "*a#" an den Controller. Das war gemäß meiner Definition die Aufforderung für den Controller, seine Uhrzeit zu übermitteln. Als Antwort schickt mir der Controller dann wieder drei Text-Zeichen, die ebenso wie bei setTime mit einem Offset von 50 versehen sind, um wieder aus dem Bereich der Steuerzeichen zu kommen. Um auf den korrekten Wert zu kommen muss man zuerst den ASCII Wert des Zeichens ermitteln und davon dann 50 abziehen. Der so ermittelte Wert des ersten Zeichens sind die Stunden, der des zweiten sind die Minuten und der des dritten die Sekunden.

Auch wenn der Code auf den ersten Blick recht lang wirkt - die einzelnen Prozeduren sind eigentlich verhältnismäßig kurz und sollten auch ohne große Inline-Kommentare schnell verdeutlichen, wie sie funktionieren. Die größte Schwierigkeit ist bei genauem Betrachten auch weniger die eigenliche Kommunikation zwischen Controller und PC sondern das Festlegen eines geeigneten Protokolls.

Im Prinzip geht es also nur darum, das Port-Objekt zuerst zu initialisieren und dann mit den geeigneten Read / Write Methoden mit dem Controller zu kommunizieren. Welche Methoden zur Verfügung stehen siehst Du hier: http://msdn.microsoft.com/de-de/library/system.io.ports.serialport_members(v=vs.85).aspx Mehr braucht man für den Datentransfer auf PC Seite eigentlich nicht.