Baseball Scoreboard Ansteuerung via Arduino Mega - NumericUpDown Funktion?

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Wolf_66.

    Baseball Scoreboard Ansteuerung via Arduino Mega - NumericUpDown Funktion?

    Liebe Community,

    ich versuche für unseren Baseball Verein ein Scoreboard zu realisieren. Das Scoreboard selbst wird mit 5 Stk. 7 Segment Anzeigen (selber aus LED Streifen konstruiert und über 5 Stk. 74HC595 Shift Register angesteuert) gebaut und über ein Ardunio Mega angesteuert.

    Ich habe bereits im Internet ein paar kleine VB Programme gefunden und auch erfolgreich getestet wie man das Arduino Board bzw. die LED Streifen einzeln zum leuchten bringt. Soweit so gut. :)

    Am Ende möchte ich gerne ein Programm/Oberfläche haben die es dem Anwender ermöglicht mit einem Maus Click die jeweiligen Anzeigen zu verändern. Es sollen nur Zahlen (Score Heim und Gastmannschaft {0-99} und die Nummer des Innings {max.19}) angezeigt werden. Ich habe bereits erfolgreich einen entsprechenden Form Entwurf erstellt das das Arduino Board über die Com3 ansteuert.

    Beim herumprobieren bin ich auf das NumericUpDown Element gestoßen das sich von der grundlegenden Funktion her perfekt für meine Zwecken anbieten würde.
    Als absoluter VB Anfänger stoße ich aber natürlich schnell an meine Grenzen und wollte hier fragen ob ich die NumericUpDown Funktion dazu verwenden könnte die im Programm jeweils angezeigte bzw. eingestellte Nummer gleichzeitig auf dem Scoreboard auszugeben?
    Ich konnte leider im Internet keine entsprechende Info oder Codes finden und würde mich freuen wenn mich jemand von Euch unterstützen könnte.
    Attached auch ein Screenshot meines Forms (NumericUpDown im HOME Feld) zum besseren Verständnis.

    Danke im Voraus.
    Wolf
    Bilder
    • Scoreboard.JPG

      56,86 kB, 860×456, 136 mal angesehen
    Willkommen im Forum. :thumbup:

    Wolf_66 schrieb:

    die NumericUpDown Funktion
    Im ValueChanged-Event des NumericUpDown-Controls holst Du Dir dessen Value, castest ihn nach Integer und gibst diesen Wert an den Anduro:

    VB.NET-Quellcode

    1. Private Sub NumericUpDown1_ValueChanged(sender As Object, e As EventArgs) Handles NumericUpDown1.ValueChanged
    2. Dim val = CInt(NumericUpDown1.Value)
    3. Anduro.MachWas(val)
    4. End Sub
    Die Anduro-Ansteuerung musst Du naürlich machen, wie Du sie brauchst.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Servus Rod,

    Deine Anleitung war so genial, dass es gleich beim ersten Versuch perfekt funktioniert hat :)
    VB mit deiner Hilfe macht extrem viel Spaß.

    Hier der finale Code den ich letztendlich für die NumericUpDown Funktion verwendet habe um die entsprechende Zahl auf dem Scoreboard anzugeben.

    VB.NET-Quellcode

    1. Private Sub NumericUpDown2_ValueChanged(sender As Object, e As EventArgs) Handles NumericUpDown2.ValueChanged
    2. Dim val = CInt(NumericUpDown1.Value)
    3. SerialPort1.Open()
    4. SerialPort1.Write(val)
    5. SerialPort1.Close()
    6. End Sub


    Nochmals vielen vielen Dank.
    Lg Wolf

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Wolf_66“ ()

    Wolf_66 schrieb:

    VB.NET-Quellcode

    1. SerialPort1.Open()
    macht man üblicherweise einmal in der Form_Load oder einer speziellen Initialisierungs-Routine, ebenso SerialPort1.Close() in der Form_Closing oder einer Close-Routine.
    Damit wird verhindert, dass ein anderes Programm das Port claimen kann, außerdem musst Du da nur noch Deine Befehle senden und ggf. die Antwort abholen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo Rod, liebe Community,

    Nach ein paar Tagen sehr intensiver Recherchen und vielen Versuchen ein Folgeproblem alleine zu lösen schlag ich wieder hier auf und hoffe auf eure Unterstützung.
    Es geht nach wie vor um das Baseball Scoreboard und die NumericUpDown Funktion.
    Mit Rod's Lösung kann ich perfekt ein einzelnes 7 Segment Anzeige ansteuern.
    Wie auf der Scoreboard Grafik oben erkennbar ist verwende ich aber in Summe 3 NumericUpDown Elemente um die Punkte der Heim- und Gegner Mannschaft als auch die Nummer des Spielabschnittes auf dem elektronischen Scoreboard darzustellen.
    Da jedes dieser 7 Segment Anzeigen über einen eigenen Datenpin des Arduinos angesteuert wird benötige ich zusätzlich zu den angezeigten und gesendeten Values der NumericUpDown Funktion einen eindeutigen Indikator (Character?) den ich mit jedem Value Change via SerialPort1.Write(val) Befehl automatisch mitsenden kann um die jeweilige Anzeige bzw. den richtigen Datenpin des Ardunios anzusteuern (Um die richtige Interpretation der Ardunio Software kümmer ich mich selbst..ausser es hat jemand eine Lösung parat).
    Lieben Dank im Voraus
    Wolf

    Wolf_66 schrieb:

    den richtigen Datenpin des Ardunios anzusteuern
    Da formuliere mal bitte eine vollständige und belastbare Aufgabenstellung, damit wir hier nicht in Hick-Hack verfallen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hier die finale Version:

    Hallo Rod,

    sorry das ich nicht präzise genug war. Ich hoffe so ist es verständlicher:
    Das Scoreboard (anbei ein besserer Screenshot des Entwurfs) verfügt über 3 NumericUpDown Elemente (Guest 0-99, Inning 1-19, Home 0-99) und mehrere Checkbox Elemente (Ball, Strike, Out).
    Jedes NumericUpDown und jedes Checkbox Element muss jeweils einen der individuellen Datenpins des Arduino Boards ansteuern.

    Mit deiner Lösung (siehe unten) konnte ich bereits die NummericUpDown Funktion erfolgreich umsetzen. Diese sendet aber nur den reinen Dim val an das Ardunio Board. Wenn ich also den selben Code auch für die beiden anderen NumericUpDown Elemente verwende wird immer nur der selbe Datenpin befeuert weil alle 3 Element nur den Dim Val Code senden. Ein ähnliches Problem hatte ich auch mit den Checkbox Elementen

    VB.NET-Quellcode

    1. Private Sub NumericUpDown1_ValueChanged(sender As Object, e As EventArgs) Handles NumericUpDown1.ValueChanged
    2. Dim val = CInt(NumericUpDown1.Value)
    3. Anduro.MachWas(val)
    4. End Sub


    Für die Checkbox Elemente habe ich bereits eine funktionierende Lösung gefunden (siehe fett markierten Code unten). Jede Checkbox sendet einen individuellen String "<P004ON>" (P= PIN, 004=Pin Nummer, ON für ein und OF für aus) den das Ardunio Board einem fixen Pin (also P005ON für Pin 5, P006ON für Pin 7, usw.)zuordnet und ansteuert. Diese Strings werden mit Start und End Markers(<>) gesendet damit das Arduino effektiver arbeitet.
    Für die Checkboxen wartet das Arduino auf den String und zerlegt ihn mit einem "Serial.PrintIn Command", der genau auf die Zeichenfolge ("receviedChars") hört, in seine Einzelteile (also P, 00x, ON oder OF) die dann je nach String die jeweilige Funktion ausführen.


    VB.NET-Quellcode

    1. ' Ball 3
    2. Private Sub CheckBox7_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox7.CheckedChanged
    3. If CheckBox7.CheckState = CheckState.Checked Then
    4. [b]SerialPort1.Open()
    5. SerialPort1.WriteLine("<P004ON>")
    6. SerialPort1.Close()[/b]
    7. ElseIf CheckBox7.CheckState = CheckState.Unchecked Then
    8. [b]SerialPort1.Open()
    9. SerialPort1.WriteLine("<P004OF>")
    10. SerialPort1.Close()[/b]
    11. End If
    12. End Sub
    13. ' Inning Counter
    14. Private Sub NumericUpDown1_ValueChanged(sender As Object, e As EventArgs) Handles NumericUpDown1.ValueChanged
    15. Dim val = CInt(NumericUpDown1.Value)
    16. SerialPort1.Open()
    17. SerialPort1.WriteLine(val)
    18. SerialPort1.Close()
    19. End Sub


    Deine ursprüngliche Lösung (mit nur einem NumericUpDown Element) habe ich erfolgreich mit folgendem Code ausgeführt:
    SerialPort1.Open()
    SerialPort1.Write(val)
    SerialPort1.Close()
    Das Ardunio empfängt hier den (val) als Decimalzahlen von 0-99, die dann auf Arduino Seite mit einem (Serial.parseInt) Command in sogenannten Switch Cases, wiederum dezimal (0-99), übernommen und verarbeitet werden.
    Je nach Switch Cases Nummer erzeugt das Arduino dann den zugehörigen Binär Code der über "DigitalWrite" und "Shiftout" Befehle an einen Shift Register Chip gesendet wird und die richtigen Segmente der Anzeige auf HIGH stellt, bzw. diese zum leuchten bringt.

    Ich suche nun nach einer Lösung wie ich den (val) der 3 NumericUpDown Elemente gemeinsam mit einem eindeutigen Indikator (so wie bei den CheckBox Strings mit "P") an das Arduino senden kann.
    Dabei ist natürlich wichtig das der (val) unverändert bleibt. Ist es also möglich anstatt nur (val) zu senden, zusätzlich einen Indikator (I oder B oder S) mitzusenden der beim Arduino als z.B. <I(val)> oder <B(val)> ankommt?
    Anhand dieses Indikators könnte ich dann im Arduino die 3 entsprechenden Switch Cases erstellen und damit auch automatisch die jeweiligen Pins ansteuern.

    Ich hoffe, dass diese Aufgabenstellung nun besser ist und bedanke mich im Voraus für deine Zeit.

    Lg
    Wolf

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Wolf_66“ ()

    Wolf_66 schrieb:

    jeweils einen der individuellen Datenpins des Arduino Boards ansteuern
    Was will das Bord haben, um diese 3 Datenpins einzeln anzusteuern?
    Wie sind die Pin-Nummern und Schaltzustände (High-Low) codiert?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Wolf_66 schrieb:

    VB.NET-Quellcode

    1. SerialPort1.Open()
    2. ...
    3. SerialPort1.Close()
    So geht das nicht.
    Das Port wird bei Programmstart geöffnet und bei Programmbeendigung geschlossen.
    Feddich. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo Rod,

    Danke für den Hinweis aber ich denke es gibt da ein Missverständnis.
    Ich habe meinen Beitrag von 12:42 erst vorhin zu Ende geschrieben. Hier hatte ich meine Problematik mit dem Indikator Bedarf vervollständigt.
    Hast du das gesehen ober soll ich es nochmal posten?
    Lg
    Wolf
    Hallo,

    Habe nun mittlerweile auch den SerialPort1.Open und SerialPort1.Close Code jeweils in eine Form1.Load und eine Form1.Closed Private Sub verschoben.
    Das funktioniert bei allen Elementen aber nicht bei meinem NumericUpDown Element. Wenn ich das Programm starte meldet es einen: System.InvalidOperationException {"Der Anschluss ist geschlossen"} Fehler.
    Liegt das daran das ich bei diesem Element einen Minimumwert von 1 (soll auch so sein) eingestellt habe?
    In dem Augenblick wo ich nur beim NumericUpDown Sub das SerialPort1.Open einfüge funktioniert es wieder tadellos.

    lg Wolf

    PS: Zusätzlich zu der offenen NumericUpDown Indikator Thematik ;)

    Wolf_66 schrieb:

    der beim Arduino als z.B. <I(val)> oder <B(val)> ankommt?
    Wer schreibt denn die Software auf der Arduino Seite?
    So lange das alles in einer Hand ist, kannst Du machen, was immer Du willst.
    Kannst Du ggf. mal das Projekt anhängen?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo Rod,

    die Arduino Software habe ich selbst geschrieben und mit getesteten Vorlagen der Arduino Community verbessert.
    Ergo alles in meiner Hand :)
    Anbei wie gewünscht das Projekt als Attachment.

    Danke und lg
    Wolf
    Dateien
    • Pincontol.rar

      (120,82 kB, 118 mal heruntergeladen, zuletzt: )

    Wolf_66 schrieb:

    Attachment
    :D
    Du darfst nicht den String "val" senden, sondern Du musst den numerischen Wert ver Variable val senden.
    Aus

    VB.NET-Quellcode

    1. SerialPort1.WriteLine("<I(val)>")
    machst Du

    VB.NET-Quellcode

    1. SerialPort1.WriteLine(String.Format("<I({0})>", val))
    Der würde nun den String "<I(42)>" auf die Leitung geben.
    Und:
    SerialPort1.Open() bei Programmstart,
    SerialPort1.Close() bei Programmbeendigung.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo Rod,

    Mein Projekt ist abgeschlossen. Ohne deine Unterstützung wäre ich sicher nicht so schnell zum Ziel gekommen.
    Dein letzter Hinweis bezüglich der Formatierung hat mich auf die richtige Spur gesetzt. Anbei der Code den ich letztendlich verwendet habe. Ich musste das Format noch zusätzlich umwandeln um aus dem Value "1" den Value "001" usw. zu machen. So kann ich das Arduino IDE für alle Funktionen sauber mit der selben Value Art versorgen.

    VB.NET-Quellcode

    1. Private Sub NumericUpDown2_ValueChanged(sender As Object, e As EventArgs) Handles NumericUpDown2.ValueChanged
    2. Dim val As String
    3. val = "<I" & Format(NumericUpDown2.Value, "000" & ">")
    4. SerialPort1.Open()
    5. SerialPort1.WriteLine(val)
    6. SerialPort1.Close()
    7. End Sub


    Nochmal herzlichen Dank.
    Lg
    Wolf