NXT+ PC + die .NET-Welt - eine Hilfe bei Verwirrungen

Mindstorms und Delphi, Basic...
Läuft etwas nicht? für den NXT

Moderator: Moderatoren

HiTek
Schreibt viel
Schreibt viel
Beiträge: 75
Registriert: 5. Mai 2010 10:46

NXT+ PC + die .NET-Welt - eine Hilfe bei Verwirrungen

Beitragvon HiTek » 19. Jun 2013 09:29

In dem folgenden Beitrag geht es um Hilfe bei Verwirrungen, die durch den Wunsch entstehen, die Grenzen der NXT/NXT-G/NXC-Welt zu überschreiten und eine Kommunikation der Lego-Welt mit selbst erstellten .NET-Programmen auf dem PC zu ermöglichen. Apple- und Linux-Systeme bleiben dabei also zunächst außen vor. Der Wunsch nach Grenzüberschreitung ist dem ein oder anderen vielleicht unverständlich: Wir haben ja einen programmierbaren NXT, mit dem man viel machen und den man gut programmieren kann. Und wir bekommen bald einen neuen EV3, mit dem man noch viel mehr tolle Dinge anstellen kann. Aber nichtsdestotrotz: Wenn man komplexere Programme stricken will, die eine Hochsprache und Rechenpower erfordern, macht der Einsatz eines beigestellten Rechners Sinn. Und es macht auch Sinn, wenn man Datalogging machen und die mit dem NXT erhobenen Daten vielleicht weiter verarbeiten möchte.

So weit so gut. Nun zu den Problemen - sie entstehen in den letzten Monaten durch Halbwissen, das durch den gelegentlichen Gebrauch von .NET-Programmen mit Arduino-Boards entsteht - zumindest bei mir war das so. Und ich weiß aus der Lektüre von Internetseiten auch von anderen Leuten, die in dieselben Fallen getappt und dann verwirrt waren. Was bringt uns NXT-Hobbyisten zur Verzweiflung?

Im folgenden möchte ich mich mit folgenden Fragen beschäftigen:
1. Serielle Kommunikation ist nicht serielle Kommunikation: Unterschiede zwischen dem Geschnatter mit NXT bzw. Arduino
2. Eine Sichtung der angebotenen Bibliotheken
3. Ein kritischer Hinweis zum Gebrauch von NXT-G

1. Serielle Kommunikation ist nicht serielle Kommunikation:
===========================================
.NET-gestählte Arduino-Freunde wissen, wie man einen an einem USB-Port angeschlossenen Arduino findet. Man lege in C# ein Windows-Forms-Programm an, auf dessen Oberfläche sich ein Schließen-Button und eine Combo-Box befinden. Folgender Code hilft dann immer weiter:

Code: Alles auswählen

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.IO;
using System.Threading;

namespace FindAnUsbDevice
{
   
    public partial class frmFindAnUsbDevice : Form
    {
        private SerialPort serialPort;         // COM-Object
        private string comPort;                 // COM-Port String
        private int comPortCount;             // sum of available COM-Ports
        private char CR = (char)13;           // Carriage-Return character   


        public frmFindAnUsbDevice()
        {
            InitializeComponent();
        }

        private void frmFindAnUsbDevice_Load(object sender, EventArgs e)
        {
            // 1. Search for suitable COM-Ports:
            foreach (string s in SerialPort.GetPortNames())
            {
                comPortCount++;
                comboBoxCOMPort.Items.Add(s);
                comboBoxCOMPort.Sorted = true;
            }

            if (comPortCount == 0)
            {
                MessageBox.Show("No COMPort available!", "Error");
            }

            serialPort = new SerialPort();
        }

        // Close the application
        private void btnClose_Click(object sender, EventArgs e)
        {
            if (serialPort.IsOpen)
                serialPort.Close();
            this.Close();
        }


Verbindet man den Arduino mit dem USB-Eingang des Computers und lässt das Programm dann laufen, listet es die verfügbaren Schnittstellen in der Combo-Box auf, zumindest bei mir immer den COM-Port1 und einen weiteren, an dem sich der Arduino befindet. Microcontroller gefunden, Problem erledigt. Und jetzt das Experiment: Nehmt den Arduino vom USB-Port weg, schließt dann den NXT am Computer an und startet dann das C#-Programm neu. Was seht ihr dann? Bei mir und anderen wird nur der COM1 angezeigt. Solltet ihr dann in einem Programm COM1 zur Kommunikation mit dem NXT verwenden wollen, schmiert das Programm ab. Dann geht nichts mehr. Offensichtlich findet also das C#-Programm unseren NXT am USB-Eingang des Rechners nicht.

Was läuft da falsch? Im Internet wird uns doch eingetrichtert: "Eine Kommunikation zwischen PC und NXT ist möglich. Dabei handelt es sich um eine gewöhnliche serielle Kommunikation." Diese Aussage ist für Arduino-halbgebildete Menschen wie mich problematisch. Der Arduino-Uno zum Beispiel unterscheidet sich nämlich in Sachen serielle Kommunikation in einem ganz wesentlichen Punkt von einem NXT: ein Arduino UNO besitzt einen als USB-To-Serial Converter programmierten ATmega16U2, was der NXT so eben nicht hat. Und die Konsequenz dieses Unterschieds besteht darin, dass wir als .NET-Programmierer nicht so einfach mal auf die üblichen Befehle für den Zugriff auf eine serielle Kommunikation setzen können, sondern einen Umweg über den Phantom-Treiber wählen müssen. Das bringt dann weitere Probleme mit sich. "Aber die wurden doch schon alle gelöst oder nicht??? Schließlich gibt es doch verschiedene Lösungen im Internet", werden jetzt manche sagen. Stimmt und stimmt nicht. Aber schauen wir mal weiter.

2. Sichtung der angebotenen Bibliotheken:
==============================
Soweit ich sehe, werden im Internet folgende, teilweise etwas betagte Lösungen für das Kommunikationsproblem angeboten:
a. Aforgenet: http://www.aforgenet.com
b. Monobrick: http://www.monobrick.dk/
c. Mindsqualls: http://www.mindsqualls.net
d. Nexttool http://bricxcc.sourceforge.net/utilities.html

Völlig im Regen stehen bleibt man mit der Lösung a: Bei der Kommunikation über Aforgenet muss man beim Aufbau einer seriellen Verbindung einen COM-Port angeben. Das können wir aber aus den oben genannten Gründen bei der Kommunikation über den USB-Port des Rechners nicht. Man kann die Bibliothek aber natürlich wenn man will bei der Kommunikation über Bluetooth verwenden, weil Bluetooth-Adapter automatisch einen virtuellen COM-Port im PC erstellen. Aber ist es wirklich notwendig, so eine Riesenbibliothek mitzuschleppen? Ich bin hier kritisch.

Das Problem mit der seriellen Kommunikation wird bei b. und c. anders angegangen. Im Hintergrund der Bibliothek wuselt ein mit C/C++ programmierter Wrapper, der eine Bytekommunikation mit dem Fantom-Treiber ermöglichen soll. Um die Verbindung aufzubauen, brauchen solche Wrapper eine GUID. Da jedes Gerät am COM-Port- so die Theorie - eine andere GUID haben sollte, kann ich mein Gerät finden, wenn ich die GUI kenne. Wehe, wenn Lego die GUID des NXT verändern sollte, dann funktionieren b. und c. nicht mehr. (Ich frage mich übrigens, welche GUID der neue EV3 trägt. Bestimmt eine andere!?! Das würde ja bedeuten, dass.... Lassen wir das. Denn das heißt, dass ich meine mühsam mit Mindsqualls und Monobrick erstellten Programme neu machen darf, weil ich an die Wrapper ran muss. Kein Vergnügen für den Ich-hab-von-Wrappern-Keine-Ahnung-Hobbyisten).

Wie dem auch sei: Auch die Lösungen b. und c. haben mich nur teilweise überzeugt: Mit Monobrick soll man zwar Sensoren lesen können, das hat bei mir nur teilweise geklappt. Auf meinem PC kamen unsinnige Werte an. Außerdem laufen beim Absturz eines C#-Programms auf dem Rechner zum Beispiel die an den NXT angeschlossenen Motoren weiter - auch kein Effekt, den man sich immer herbeisehnt - man denke mal, dass manche Leute versuchen, mit dem NXT CNC-Maschinen zu steuern... Mindsqualls funktioniert. Aber hier funktioniert die Motorensteuerung nicht einwandfrei. Wenn ein Motor zum Beispiel 360 Grad rotieren soll, machte er das bei mir einfach nicht. Und dabei benutzte ich nicht ein selbstgestricktes Programm, sondern das Demonstrationsprogramm von der Mindsqualls-Homepage. Bei b. und c. kann man aber sagen, dass ein Austausch über die Mailboxen möglich ist. Und das ist schon mal schön. In nichtzeitkritischen Anwendungen kann man b. und c. also einsetzen.

Kommen wir zu d. Nexttool ist von John Hansen. Sein Name bürgt für Qualität. Und die spiegelt sich in diesem Kommandozeilentool wieder. Man kann die Kommandozeile ja in C# umleiten und Nexttool damit in eigene Anwendungen einbetten. Der Nachteil dieser Lösung ist die Größe des Tools, der Vorteil wohl der, dass John Hansen dieses Tool (hoffentlich) weiter warten wird, so dass das GUID-Problem mit dem neuen EV3 wohl gelöst werden kann. Aber natürlich: Es fordert schon manches Wissen, mit C# die Kommandozeile zu lesen und in die zu schreiben. Bei mangelnden Kenntnisse warten hier weitere Abgründe. Aber das ist hier nicht das Thema.

FAZIT: Nichts ist zu 100% befriedigend. Ich verwende für die die Kommunikation zwischen einem USB-Port des PC und NXT die Mindsqualls-Bibliothek und tausche meine Werte für Sensoren und Motoren über die Mailboxen aus. Direktansteuerung geht bei mir zumindest nicht einwandfrei. Glücklicherweise muss ich keine zeitkritischen Anwendungen schreiben. Denn der Kommunikationsprozess dauert einfach zu lange. Ist Bluetooth hier eine Lösung? Für mich nur eingeschränkt. Ich habe festgestellt, dass ich gelegentlich Schwierigkeiten habe, saubere Bluetooth-Verbindungen zustande zu kriegen. Nach dem erfolgreichen Aufbau einer Verbindung hagelt es Probleme, warum weiß keiner genau... Aber auch das ist nicht das Thema, mit dem ich mich jetzt auseinander setzen will. Bei wem das klappt, der hat einen Vorteil. Man hat nämlich einen sauberen COM-Port zur Verfügung, den man verwenden kann. Und das ist ja auch was.

3. Ein kritischer Hinweis zum Gebrauch von NXT-G:
========================================
Richtig gehend geärgert habe ich mich über die Implementierung des Umgangs der Mailboxen in NXT-G. Es ist für mich einfach nicht nachvollziehbar, dass man mit dem NXT Mailboxen nur lesen kann, wenn sie vom PC mittels Bluetooth befüllt werden. Das ergibt überhaupt keinen Sinn. Bei NXC haben wir mit solchen Einschränkungen nicht zu kämpfen. Da schreibt man folgenden Code und freut sich, dass es funktioniert:

Code: Alles auswählen

#define INBOX 1
#define OUTBOX 0

string request;
string answer;

task main()
{
while(true)
  {
  Wait(10);
  ReceiveMessage(INBOX, true, request);   //wenn man ReceiveMessage true übergibt, wird die Nachricht nach dem Auslesen gelöscht.
  if(StrLen(request)>0)
   {
   answer=StrCat("Hallo, ",request);
   TextOut(0,LCD_LINE1,answer);
   }
 }
}


So weit so gut. Ich hoffe, ich konnte manches erklären und Lösungen aufzeigen. Sollte ich irgend etwas falsch oder irreführend formuliert haben, lasst es mich wissen. Dann korrigiere ich diesen Artikel gerne.

HiTek grüßt

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5352
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: NXT+ PC + die .NET-Welt - eine Hilfe bei Verwirrungen

Beitragvon HaWe » 21. Jun 2013 11:16

dankeschön für den ausführlichen Übersichtsartikel! :D

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5352
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: NXT+ PC + die .NET-Welt - eine Hilfe bei Verwirrungen

Beitragvon HaWe » 24. Sep 2013 10:10

update:

MonoBrick für NET-kompatible Kommunikation z.B. von NXT und EV3 zum PC:
http://www.monobrick.dk/software/monobrick/
http://www.monobrick.dk/guides/monobrick-guide/

vllt sind ja inzwischen einige anfängliche bugs behoben, ansonsten bitte ruhig den Autor anmailen wegen bug reports.
Nach Anders Søborg's eigener Angabe einfach als Kommentar z.B. hier über das Kontaktformular an ihn berichten...:

Anders Søborg hat geschrieben: Place a comment on the page or use the contact form found at http://www.monobrick.dk/about/
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Torsten C
Hilft fleißig mit!!!
Hilft fleißig mit!!!
Beiträge: 61
Registriert: 30. Aug 2013 11:56

Re: NXT+ PC + die .NET-Welt - eine Hilfe bei Verwirrungen

Beitragvon Torsten C » 16. Okt 2013 02:45

"Eine Kommunikation zwischen PC und NXT ist möglich. Dabei handelt es sich um eine gewöhnliche serielle Kommunikation."


Kurze Frage: Ich dachte erst der EV3 hat im Gegensatz zum NXT einen UART. Habe ich was übersehen?

kone
Mindstormsfreund
Mindstormsfreund
Beiträge: 7
Registriert: 4. Sep 2013 10:05

Re: NXT+ PC + die .NET-Welt - eine Hilfe bei Verwirrungen

Beitragvon kone » 20. Okt 2013 13:32

Da ihr hier ja die Profis seid, wenn es um die Kommunikation zwischen NXT/EV3 mit PCs geht, könnt ihr mir vielleicht helfen.

Ich hab mir die Monobrick-Dateien mal zu Testzwecken runtergeladen. Allerdings sind da jetzt nur unterschiedliche Dateien und keine eigentliche Software. Muss ich das über irgendeinen Compiler laufen lassen oder was? Leider ist die Dokumentation auf der monobrick-Seite nich die beste...

HiTek
Schreibt viel
Schreibt viel
Beiträge: 75
Registriert: 5. Mai 2010 10:46

Re: NXT+ PC + die .NET-Welt - eine Hilfe bei Verwirrungen

Beitragvon HiTek » 20. Okt 2013 17:22

Hallo kone,

bei MonoBrick handelt es sich um eine Bibliothek. Wenn man ein Programm für den PC mittels Visual Studio in C# schreibt, dann kann man diese Bibliothek in sein Programm einbinden, um den NXT oder den EV3 zu steuern - so die Theorie. Was du also runtergeladen hast, ist wahrscheinlich kein Programm, sondern die Bibliothek, also ein Bestandteil, das du in ein Programm integrieren kannst. Auf der Seite gibt es aber auch verwendbaren Source-Code, den man direkt mittels Microsoft VisualStudio kompilieren und ausprobieren kann, z.B. hier: http://www.monobrick.dk/software/monobrick/

Herzliche Grüße
HiTek

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5352
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: NXT+ PC + die .NET-Welt - eine Hilfe bei Verwirrungen

Beitragvon HaWe » 21. Okt 2013 07:45

Bei Fragen zu Mono-Brick bitte unbedingt den Autor anmailen, damit der Autor es verbessern kann!
(Er möchte nach eigener Aussage Support nicht über ein Forum machen sondern über die Kontakt-Seite seiner Website)
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E


Zurück zu „sonstige Software und Software-Probleme“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste

Lego Mindstorms EV3, NXT und RCX Forum : Haftungsauschluss