- Akku Tests und Balkonkraftwerk Speicher         
Seite 8 von 8 ErsteErste ... 678
Ergebnis 71 bis 80 von 80

Thema: Mit VB über FTDI Roboter steuern

  1. #71
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    21.05.2012
    Beiträge
    511
    Anzeige

    Powerstation Test
    Na gut ,dann versuch ich es mal . Aber Danke für deine Hilfe und die riesige Geduld (hat mir geholfen )

    Falls ich wichtige Fragen habe melde ich mich aber noch mal.

    - - - Aktualisiert - - -

    Sehe ich das richtig ,dass wenn ich nicht nur Bytes lesen will ,sondern auch Zeichen oder Text ,ich statt "TextBox3.AppendText(Chr(SerialPort1.ReadByte) )" einfach nur "TextBox3.AppendText(Chr(SerialPort1.Read))" schreiben muss ???

    Doch sagt er mir dann das: "Fehler :Fehler bei der Überladungsauflösung, da keine zugreifbare "Read" diese Anzahl von Argumenten akzeptiert "
    Doch weiß ich jetzt nicht ,was das bedeuten soll ??

    Dafür habe ich schon erste Erfolge bei der Steuerung über die Pfeiltasten zu melden. Wenn gewünscht ,kann ich die weiteren Versuche von mir hier zeigen (für andere Anfänger oder so)


    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

    If SerialPort1.BytesToRead > 0 Then
    Do
    TextBox3.AppendText(Chr(SerialPort1.ReadByte))
    TextBox3.ScrollToCaret()
    If SerialPort1.BytesToRead = 0 Then
    Exit Do
    End If
    Loop
    End If

    End Sub

  2. #72
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.09.2004
    Alter
    40
    Beiträge
    647
    Uiuiuiuiuiuiuiuiui

    Bevor du das liest setz dich hin! Du hast ja sooooo ein glück das ich das jetzt selbst brauche, das ichs selbst kaum fassen kann. :-D

    Ich habe eine geile Methode gefunden wie du die Daten per Event von der seriellen Schnittstelle liest! Das ist viiiiiieeeeel besser als es mit einem Timer zu machen.

    Ich versuchs mal Step by Step (rot ist was du einfügen musst das andere steht da nur damit du weisst wohin):

    Code:
    Public Class Form1
        Delegate Sub TextBoxCallback(ByVal text As String)
    Das hier in den Form Load Event
    Code:
            Me.SerialPort1.DtrEnable = True
            Me.SerialPort1.ReceivedBytesThreshold = 1
    Code:
    Private Sub serial_event(sender As Object, e As EventArgs) Handles SerialPort1.DataReceived
            Dim msg As String = Me.SerialPort1.ReadExisting
            Me.ShowText(msg)
        End Sub
    
        Private Sub ShowText(ByVal text As String)
            If Me.TextBox1.InvokeRequired Then
                Dim d As New TextBoxCallback(AddressOf ShowText)
                Me.Invoke(d, New Object() {text})
            Else
                Me.TextBox1.AppendText(text)
                Me.TextBox1.SelectionStart = Me.TextBox1.Text.Length
                Me.TextBox1.ScrollToCaret()
            End If
        End Sub
    End Class
    Damit müsste jetzt in TextBox1 der Text der an der seriellen Schnitte ankommt angezeigt werden.

    Mein MC ist mit Arduino programmiert.

    Code:
    int led = 13;
    long i = 0;
    // the setup routine runs once when you press reset:
    void setup() {                
      // initialize the digital pin as an output.
      Serial.begin(9600);
      pinMode(led, OUTPUT);     
    }
    
    // the loop routine runs over and over again forever:
    void loop() {
      digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
      delay(100);               // wait for a second
      digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
      delay(100);               // wait for a second
      i++;
      Serial.println(i);
    }
    Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]

  3. #73
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    21.05.2012
    Beiträge
    511
    Hallo Leute,
    ich wollte mal wieder hier weitermachen und habe auch nun schon einige Stunden in die Programmierung gesteckt (bevor ich euch wieder mit Fragen nerve), doch bekomme ich keine richtige Kommunikation hin.

    Also ich sage jetzt nochmal, was mein Ziel ist:
    Ich möchte einen Roboter, der über ein serielles Funkmodul am PC hängt und von diesem aus gesteuert werden soll. Dazu möchte ich zunächst über 4 Tasten die Motoren des Roboters steuern. Wenn ich z.B. die Taste Vor drücke soll er so lange Vor fahren, bis ich die Taste nicht mehr drücke.
    Des weiteren möchte ich später auch noch den Status des Roboters abfragen können usw...
    Um diese Funktionen zu bewerkstelligen habe ich mir folgendes überlegt: Ich sende um es für den Anfang möglichst einfach zu halten ein Byte an den Roboter (also 255 Befehle sind möglich). Dieser schaut ab und zu mal in seinen Eingang und sagt ob etwas vorliegt. Wenn etwas vorliegt, soll er dies tun, und ansonsten mit seinem anderen Programm weitermachen.

    Doch habe ich es noch nicht so richtig hinbekommen ein Programm sowohl für den Roboter als auch für den PC zu schreiben.
    Mein Ansatz für den Roboter wäre :

    Code:
    Config Serialin = Buffered , Size = 20
    Config Serialout = Buffered , Size = 1
    Enable Interrupts
    Dim Data_available As Byte
    Dim Adresse As String * 255
    
    Do
      Data_available = Ischarwaiting()
      If Data_available > 0 Then                                'wenn Daten da sind, dann...
        Input Adresse
        Waitms 2
        Print Adresse
      End If
    Loop
    End
    und für den PC:
    Code:
    Private Sub vor_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles vor.MouseDown
            Control.CheckForIllegalCrossThreadCalls = False
            SerialPort1.DiscardOutBuffer()
            adr = 2
            SerialPort1.WriteLine("2" + vbCr)
        End Sub
    
        Private Sub vor_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles vor.MouseUp
            Control.CheckForIllegalCrossThreadCalls = False
            SerialPort1.DiscardOutBuffer()
            adr = 1
            SerialPort1.WriteLine("1" + vbCr)
        End Sub
    Doch das geht nicht so wirklich. Wie würdet ihr das machen ??
    Ich hoffe ihr wollt mir noch helfen, auch wenn das Thema schon älter ist.

    p.s. Danke auch noch mal an DanielSan. (Das habe ich erst jetzt gesehen)

  4. #74
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.09.2004
    Alter
    40
    Beiträge
    647
    Äh ich hab dir doch in Post #72 alles gegeben was du dafür brauchst!?

    Das mit dem Vorwärts fahren wenn eine Taste gedrückt wird würde ich mit Events machen. Also einen Event wenn die Taste gedrückt wird und einen wenn sie wieder losgelassen wird. Dann schickst du bei ButtonDown ein Startzeichen an den Bot und bei ButtonUp ein Stopzeichen. Das hast du ja im Prinzip auch schon so gemacht.
    Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]

  5. #75
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    Code:
    Dim Adresse As String * 255
    Du liest doch nach jeder Schleife wieder ein neues Zeichen ein und das alte verliert dann seine Gültigkeit. Ein Char oder byte wäre hier vollkommen ausreichend.

    Die Maus als Trigger nehmen ist auch nicht wirklich schön. Nimm einfach eine Taste, z.b. Pfeiltasten.

    Außerdem wirst du sicher keine Zeichen vom Roboter empfangen können, solange dein PC-Programm keine Empfangsroutine hat. Es kann entweder das Terminal auf den Port zugreifen oder dein Programm, aber nicht beides!

    mfg

  6. #76
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    21.05.2012
    Beiträge
    511
    Das hast du ja im Prinzip auch schon so gemacht.
    Ja, aber es funktioniert noch nicht richtig.

    Also hier noch mal der Code den ich bis jetzt habe:

    Bascom:
    Code:
    $regfile = "m32def.dat"
    $crystal = 16000000
    $baud = 9600
    $hwstack = 32
    $swstack = 32
    $framesize = 32
    
    Config Portd.7 = Output
    Config Pind.2 = Input                                       ' Signal 1(a) vom RC-Empfänger
    Config Pind.3 = Input                                       ' Signal 2(b) vom RC-Empfänger
    Config Portc.6 = Output                                     'Motor links
    Config Portc.7 = Output                                     'Motor links
    Config Portb.0 = Output                                     'Motor rechts
    Config Portb.1 = Output                                     'Motor rechts
    Config Portd.4 = Output                                     'PWM links
    Config Portd.5 = Output                                     'PWM rechts
    
    Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 8
    
    
    Config Serialin = Buffered , Size = 20
    Config Serialout = Buffered , Size = 1
    
    Enable Interrupts
    
    Dim Data_available As Byte
    Data_available = 0
    Dim Adresse As String * 255
    
    Sound Portd.7 , 400 , 450
    Sound Portd.7 , 400 , 250
    Sound Portd.7 , 400 , 450
    Wait 2
    
    Do
      Data_available = Ischarwaiting()
      If Data_available > 0 Then                                'wenn Daten da sind, dann...
        Input Adresse
        'Print Adresse
      End If
    
      Select Case Adresse
    
        Case "20"
          Portc.6 = 0
          Portc.7 = 1
          Portb.0 = 1
          Portb.1 = 0
          Pwm1a = 500
          Pwm1b = 500
          Print "Vor"
    
    
        Case "30"
          Portc.6 = 1
          Portc.7 = 0
          Portb.0 = 0
          Portb.1 = 1
          Pwm1a = 500
          Pwm1b = 500
          Print "Ruek"
    
    
        Case "40"
          Portc.6 = 1
          Portc.7 = 0
          Portb.0 = 1
          Portb.1 = 0
          Pwm1a = 600
          Pwm1b = 600
          Print "links"
    
    
        Case "50"
          Portc.6 = 0
          Portc.7 = 1
          Portb.0 = 0
          Portb.1 = 1
          Pwm1a = 600
          Pwm1b = 600
          Print "rechts"
    
        Case Else
          Portc.6 = 0
          Portc.7 = 0
          Portb.0 = 0
          Portb.1 = 0
          Pwm1a = 50
          Pwm1b = 50
          Print "Stopp"
    
      End Select
    
    Loop
    End
    Und VB:
    Code:
     Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
            Control.CheckForIllegalCrossThreadCalls = False
            Buffer = (SerialPort1.ReadExisting)
            'Die Textbox heißt Terminal und die Daten werden dort
            'hineinkopiert()
            Term.AppendText(Buffer)
            Term.ScrollToCaret()
        End Sub
    
        Private Sub vor_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles vor.MouseDown
            Control.CheckForIllegalCrossThreadCalls = False
            SerialPort1.DiscardOutBuffer()
            adr = 2
            SerialPort1.WriteLine("20" + vbCr)
        End Sub
    
        Private Sub vor_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles vor.MouseUp
            Control.CheckForIllegalCrossThreadCalls = False
            SerialPort1.DiscardOutBuffer()
            adr = 1
            SerialPort1.WriteLine("10" + vbCr)
        End Sub
    
        Private Sub rüc_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles rüc.MouseDown
            Control.CheckForIllegalCrossThreadCalls = False
            SerialPort1.DiscardOutBuffer()
            adr = 3
            SerialPort1.WriteLine("30" + vbCr)
        End Sub
    
        Private Sub rüc_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles rüc.MouseUp
            Control.CheckForIllegalCrossThreadCalls = False
            SerialPort1.DiscardOutBuffer()
            adr = 1
            SerialPort1.WriteLine("10" + vbCr)
        End Sub
    
        Private Sub lin_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles lin.MouseDown
            Control.CheckForIllegalCrossThreadCalls = False
            SerialPort1.DiscardOutBuffer()
            adr = 4
            SerialPort1.WriteLine("40" + vbCr)
        End Sub
    
        Private Sub lin_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles lin.MouseUp
            Control.CheckForIllegalCrossThreadCalls = False
            SerialPort1.DiscardOutBuffer()
            adr = 1
            SerialPort1.WriteLine("10" + vbCr)
        End Sub
    
        Private Sub rec_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles rec.MouseDown
            Control.CheckForIllegalCrossThreadCalls = False
            SerialPort1.DiscardOutBuffer()
            adr = 5
            SerialPort1.WriteLine("50" + vbCr)
        End Sub
    
        Private Sub rec_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles rec.MouseUp
            Control.CheckForIllegalCrossThreadCalls = False
            SerialPort1.DiscardOutBuffer()
            adr = 1
            SerialPort1.WriteLine("10" + vbCr)
        End Sub
    Das Problem ist jetzt, dass wenn ich den Roboter anschalte, dieser mir sofort eine endlose Reihe Stopp sendet. Sobald ich die Tste vor z.B. drücke fährt er kurz nach vorne und wenn ich jetzt wieder loslasse macht er nichts mehr (also setzt die Stoppreihe nicht fort). Wenn ich jetzt noch mal nach vorne Drücke wird mir nur etwas angezeigt, doch will sich der Roboter nicht mehr bewegen. Warum ?? Außerdem dürfte mir der Roboter gar nicht erst diese Stoppreihe senden, da Data_available ja eigentlich 0 ist, da ich noch nichts vorher gesendet habe. Ich hoffe ich konnte euch das Problem richtig erklären.

    Dabei bräuchte ich nochmal die Hilfe von euch
    Der Einsteiger

    P.s. der Text wurde vor dem von Wsk8 verfasst.
    Also hier noch mal die Antworten dazu:
    Du liest doch nach jeder Schleife wieder ein neues Zeichen ein und das alte verliert dann seine Gültigkeit.
    Genau so will ich es ja.
    Ein Char oder byte wäre hier vollkommen ausreichend.
    Nur hat es damit leider noch weniger funktioniert.
    Die Maus als Trigger nehmen ist auch nicht wirklich schön. Nimm einfach eine Taste, z.b. Pfeiltasten.
    Das würde ich ja auch lieber, aber weiß ich nicht mehr wie man Pfeiltasten abfragt.
    Außerdem wirst du sicher keine Zeichen vom Roboter empfangen können, solange dein PC-Programm keine Empfangsroutine hat.
    Schau mal in diesen Post

  7. #77
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    Das Problem ist jetzt, dass wenn ich den Roboter anschalte, dieser mir sofort eine endlose Reihe Stopp sendet.
    Das ist kein Problem, sondern steht genauso in deinem Code.

    Sobald ich die Tste vor z.B. drücke fährt er kurz nach vorne und wenn ich jetzt wieder loslasse macht er nichts mehr (also setzt die Stoppreihe nicht fort).
    Du solltest auch die Empfangsvariable nach jeder Schleife wieder leeren, damit sich da sicher nichts aufaddiert und wirklich immer nur das letzte, empfangene Zeichen drin ist.

    Genau so will ich es ja.

    Ein Char oder byte wäre hier vollkommen ausreichend.


    Nur hat es damit leider noch weniger funktioniert.
    Wenn du "20" etc sendest, dann ist das auch kein char mehr, sonder 2 char. Wenn du dann sogar noch ein CR sendest, sinds sogar 3 Zeichen.

    mfg

  8. #78
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    21.05.2012
    Beiträge
    511
    Wenn ich nun den Code ausführt und die Taste drücke, zeigt er mir das an:
    Stopp
    Stopp
    Stopp
    Stopp
    Stopp
    Stopp
    20
    Vor
    10
    Stopp
    20
    Stopp
    10
    Stopp
    20
    Stopp
    bei jedem drücken erscheint ein neues:
    10
    Stopp
    20
    Stopp

    Bei dem AVR Code habe ich noch Adresse = "0"
    Data_available = 0
    vor eingefügt.
    Also: Es will einfach nicht so funktionieren. Hat denn einer mal so etwas gemacht und kann mir den Code geben?? Das wäre sehr nett.

  9. #79
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.11.2004
    Beiträge
    451
    Dein Dauter Stopp kommt daher, das die Select Anweisung nicht in der If schleife ist, d.h., bekommst du keine daten wird immer ein stopp gesendet.

    Zu deinem Problem mit dem erkennen der Zeichen.

    Mit Ischarwaiting() frägst du ja nur einen char ab, liest dann aber einen string ein. Dadurch ist nicht sichergestellt, das der ganze String schon übertragen wurde.
    Ein Byteweises Einlesen der Zeichen und dann zu einem String zusammenhängen, würde dir hier helfen.
    Und erst wenn deine String länge festgestellt wurde (2 Zeichen), dann einmal die Select Anweisung ausführen und ansonsten Warten bis Daten gesendet werden.

  10. #80
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    21.05.2012
    Beiträge
    511
    Ich habe jetzt eine Möglichkeit gefunden die recht gut funktioniert Doch darf ich sie hier leider nicht zeigen, da diese aus dem Buch " Roboter selbst bauen" übernommen wurde (leider).
    Ob das was robin in 79 geschrieben hat funktioniert werde ich bei Gelegenheit noch mal prüfen...

Seite 8 von 8 ErsteErste ... 678

Ähnliche Themen

  1. Roboter über internet Website steuern
    Von Mikel36 im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 3
    Letzter Beitrag: 10.12.2008, 18:13
  2. visueller roboter über atmega32 steuern
    Von roboterheld im Forum Vorstellung+Bilder+Ideen zu geplanten eigenen Projekten/Bots
    Antworten: 2
    Letzter Beitrag: 16.11.2007, 19:49
  3. Roboter über PocketPC steuern
    Von wanderer im Forum Elektronik
    Antworten: 9
    Letzter Beitrag: 08.08.2006, 23:50
  4. [ERLEDIGT] Roboter über RS232 steuern
    Von Frischling im Forum Elektronik
    Antworten: 4
    Letzter Beitrag: 01.12.2004, 07:36
  5. Roboter über PC steuern
    Von jens84 im Forum Elektronik
    Antworten: 17
    Letzter Beitrag: 03.07.2004, 11:03

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen