Frage zur Programmierung vom NXT - AG

Mindstorms im Unterricht. Ideen, Vorstellungen

Moderator: Moderatoren

Benutzeravatar
robofreak
Schreibt super viel
Schreibt super viel
Beiträge: 338
Registriert: 15. Okt 2008 16:22
Wohnort: Österreich/Graz
Kontaktdaten:

Beitragvon robofreak » 15. Sep 2010 15:11

Also bei mir (auch Win7) gehts ganz einfach:

    Bluetooth auf NXT einschalten
    Sichtbarkeit auf NXT einschalten
    auf Bluetooth Icon in taskleiste klicken
    ->Gerät hinzufügen
    NXT auswählen
    Handshake machen (Code der auf NXT angezeigt wird bestätigen und in Computer eingeben
    Warten bis Treiber installiert sind
    Briccx starten und "Search" auswählen (eventuell auch die anderen Optionen, vor allem die BTH:xxxxxxxxx Adressen, durchprobieren)
    Fertig :)


Aber nicht alle Bluetooth-Adapter sind kompatibel mit dem NXT, Liste hier

Ach ja tolle Homepage, aber du könntest vielleicht auch irgendwo das Forum erwähnen und ein bisschen Werbung machen :)
<img src="http://teamandroid.bplaced.net/upload/logo3_small.png" width="150px" border="0px" />

Die Deutsche Rechtschreibung ist Freeware, sprich, du kannst sie kostenlos nutzen. Allerdings ist sie nicht Open Source, d.h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

Diphthong
Schreibt viel
Schreibt viel
Beiträge: 251
Registriert: 17. Aug 2010 15:53
Kontaktdaten:

Beitragvon Diphthong » 30. Sep 2010 17:57

Ja, danke, das mit dem Bluetooth hat funktioniert!
Ich habe mich jetzt sehr lange nicht mehr gemeldet, ich habe aber eine neue Frage:

Code: Alles auswählen

if(SensorUS(IN_4)<ultra-20)

funktioniert. Ich hoffe, dass jeder weiß, worum es geht: Wenn der Ultraschallsensor weniger als ultra-20 (festgelegt6e Variable, die zuvor abgefragt wurde), also theoretisch bei 70 (welche Einheit?) -20=50, also wenn der Ultraschallsensor einen Wert von weniger als 50 hat (ich hoffe, dass auch jeder weiß, warum -20), sollte der Roboter eine bestimmte Sache erledigen, was ist im Moment egal.
Jedenfalls macht er nicht das, was er soll: Er fährt wie zuvor bei jeder kleinsten Abweichung zur Dose (was ja das ist, was er machen soll, nur eben nicht bei jeder Abweichung, sondern bei ultra-20). Wie macht man es so, wie ich es will (also dass er erst bei der Dose abbiegt)!
Das ist sehr umständlich geschrieben, ich hoffe das verstehtjeder, hier ist aber nochmal eine bereits erwähnte Skizze:
Bild
Danke für eure Hilfe schonmal im Vorraus und viele Grüße
Diphthong

Benutzeravatar
robofreak
Schreibt super viel
Schreibt super viel
Beiträge: 338
Registriert: 15. Okt 2008 16:22
Wohnort: Österreich/Graz
Kontaktdaten:

Beitragvon robofreak » 30. Sep 2010 18:20

mach klammern um das ultra-20
also

Code: Alles auswählen

if(SensorUS(IN_4)<(ultra-20))

sonst rechnet er das minus erst nach der Abfrage
<img src="http://teamandroid.bplaced.net/upload/logo3_small.png" width="150px" border="0px" />



Die Deutsche Rechtschreibung ist Freeware, sprich, du kannst sie kostenlos nutzen. Allerdings ist sie nicht Open Source, d.h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

Diphthong
Schreibt viel
Schreibt viel
Beiträge: 251
Registriert: 17. Aug 2010 15:53
Kontaktdaten:

Beitragvon Diphthong » 30. Sep 2010 19:36

robofreak hat geschrieben:mach klammern um das ultra-20
also

Code: Alles auswählen

if(SensorUS(IN_4)<(ultra-20))

sonst rechnet er das minus erst nach der Abfrage

Danke für Deine schnelle Antwort.
Irgendwie funktioniert das nur manchmal. Naja, ich werde das nach den Herbstferien nochmal richtig in der Schule ausprobieren, dann sehen wir weiter!

Diphthong
Schreibt viel
Schreibt viel
Beiträge: 251
Registriert: 17. Aug 2010 15:53
Kontaktdaten:

Beitragvon Diphthong » 1. Okt 2010 14:17

So, ich habe mir jetzt auf dem Fußboden einen mini-Parcours abgeklebt, den der Roboter nahezu perfekt abfährt, auch den letzten Raum!
Es gibt jetzt nurnoch ein einziges Problem: Gibt es irgendeine möglichkeit, die Variable zu löschen? Hier:

Code: Alles auswählen

if(SensorUS(IN_4)<(ultra-17))
             {
               ClearScreen()
               TextOut(0,LCD_LINE6,"Dose gefunden");
               TextOut(0,LCD_LINE7,"US-Sensor:");
               NumOut(0,LCD_LINE8,SensorUS(IN_4));
               Off(OUT_BC);
               RotateMotor(OUT_C,50,575);
               RotateMotor(OUT_BC,50,800);
               RotateMotor(OUT_B,50,620);
             }

Er wiederholt das immer, da die Variable, wenn er im sicheren Bereich angekommen ist, immer neu geprüft wird. Wenn die Variable aber gelöscht wird, kann er nichts überprüfen! Wenn es keine andere Möglichkeit gibt, werde ich die Variable am Ende der RotateMotors einfach nochmal abfragen müssen, dann könnte es aber manchmal Probleme geben!
Danke für eure (Deine :wink: ) Hilfe schonmal im Vorraus und viele Grüße
Diphthong

Benutzeravatar
robofreak
Schreibt super viel
Schreibt super viel
Beiträge: 338
Registriert: 15. Okt 2008 16:22
Wohnort: Österreich/Graz
Kontaktdaten:

Beitragvon robofreak » 1. Okt 2010 14:50

Also wenn ich das richtig verstanden habe, willst du das er wenn er einmal die Dose gefunden hat nie mehr in diese Abfrage (hinfahren) hineinkommt?
Ich würds so machen

Code: Alles auswählen

bool found=true;
......
if((SensorUS(IN_4)<(ultra-17))&&(found))
             {
               ClearScreen()
               TextOut(0,LCD_LINE6,"Dose gefunden");
               TextOut(0,LCD_LINE7,"US-Sensor:");
               NumOut(0,LCD_LINE8,SensorUS(IN_4));
               Off(OUT_BC);
               RotateMotor(OUT_C,50,575);
               RotateMotor(OUT_BC,50,800);
               RotateMotor(OUT_B,50,620);
               found=false;
             }
<img src="http://teamandroid.bplaced.net/upload/logo3_small.png" width="150px" border="0px" />



Die Deutsche Rechtschreibung ist Freeware, sprich, du kannst sie kostenlos nutzen. Allerdings ist sie nicht Open Source, d.h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

Diphthong
Schreibt viel
Schreibt viel
Beiträge: 251
Registriert: 17. Aug 2010 15:53
Kontaktdaten:

Beitragvon Diphthong » 1. Okt 2010 15:48

robofreak hat geschrieben:Also wenn ich das richtig verstanden habe, willst du das er wenn er einmal die Dose gefunden hat nie mehr in diese Abfrage (hinfahren) hineinkommt?
Ich würds so machen

Code: Alles auswählen

bool found=true;
......
if((SensorUS(IN_4)<(ultra-17))&&(found))
             {
               ClearScreen()
               TextOut(0,LCD_LINE6,"Dose gefunden");
               TextOut(0,LCD_LINE7,"US-Sensor:");
               NumOut(0,LCD_LINE8,SensorUS(IN_4));
               Off(OUT_BC);
               RotateMotor(OUT_C,50,575);
               RotateMotor(OUT_BC,50,800);
               RotateMotor(OUT_B,50,620);
               found=false;
             }


Danke, Du bist echt genial! :D
Ich habe jetzt aber noch bei dem Abschnitt, wo er die silberne Linie am Anfang des Raumes erkennt, ein found=true; reingemacht, sonst würde er die Dose ja nie mehr finden, es sei denn, man schaltet das Programm einmal aus und an, oder?
So:

Code: Alles auswählen

if((Sensor(IN_1)LS_SILBER_MIN)&&(Sensor(IN_1)LS_SILBER_MAX))
         {
           found=true;
           ...
          if(SensorUS(IN_4)<(ultra-17)&&(found))
             {
               ClearScreen()
               TextOut(0,LCD_LINE6,"Dose gefunden");
               TextOut(0,LCD_LINE7,"US-Sensor:");
               NumOut(0,LCD_LINE8,SensorUS(IN_4));
               Off(OUT_BC);
               RotateMotor(OUT_C,60,650);
               RotateMotor(OUT_BC,60,1000);
               RotateMotor(OUT_B,60,620);
               found=false;
             }

Wiegesagt nochmal tausend Dank:
http://teamohnename.bplaced.net/wordpress/?p=103

Diphthong
Schreibt viel
Schreibt viel
Beiträge: 251
Registriert: 17. Aug 2010 15:53
Kontaktdaten:

Beitragvon Diphthong » 2. Okt 2010 14:34

Hallo,
ich habe jetzt vor, in das im Moment vorhandene Programm soetwas einzuprogrammieren, dass alles, was passiert, wenn der Roboter den Parcours abfährt, vom Roboter protokolliert wird. Ich habe jetzt das in einem Tutorial gefunden:

Code: Alles auswählen

#define OK LDR_SUCCESS

task main()
{
byte fileHandle;
short fileSize;
short bytesWritten;
string read;
string write;
DeleteFile("Report.txt");
CreateFile("Report.txt", 512, fileHandle);
{
write = "Das ist ein Test!";
WriteLnString(fileHandle,write, bytesWritten);
}
CloseFile(fileHandle);
}


Sobald man das Programm öffnet, löscht der NXT im Dateisystem einen alten Report, erstellt einen neuen und schreibt da rein dann ,,Das ist ein Test!"!
Jetzt wollte ich gerne wissen, ob man auch Werte speichern kann (man kann ja schließlich mit NumOut Werte ausgeben. Auch ganz hilfreich wäre, die diversen Zeiten (also z.B.: ,,Fahre Linie nach für X Minuten. Dose gefunden nach X Minuten." etc.). Das letzte wäre aber erstmal nebensache.
Außerdem würde ich auch gerne wissen, wo man denn bei einer Endlosschleife das

Code: Alles auswählen

CloseFile(fileHandle);

Einbauen soll. Ich hätte es jetzt so gemacht, dass wenn auf dem NXT-Stein eine Taste gedrückt wird (bestenfalls die kleine, dunkelgraue, damit das Programm gleichzeituig beendet wird) dieses CloseFile(fileHandle); gemacht wird. Aber kann man in NXC überhaupt die Tasten im NXT ansprechen?
Und eine Frage noch:
Mussman dieses

Code: Alles auswählen

WriteLnString(fileHandle,write, bytesWritten);

nach jedem write machen?
Vielen, vielen dank für die Hilfe und
viele Grüße
Diphthong

Diphthong
Schreibt viel
Schreibt viel
Beiträge: 251
Registriert: 17. Aug 2010 15:53
Kontaktdaten:

Beitragvon Diphthong » 2. Okt 2010 14:58

So,
ich habe das jetzt mal im Programm eingefügt, wie ich d
dachte, dass das Richtig ist. Aber ohne dem CloseFile(fileHandle);. Das funktioniert eigentlich, er erstellt ein Dokument und schreibt auch, aber wenn man es sich am Ende anguckt, stehtr da nur was von Linie nachfahren, nichts von Dose umfahren, obwohl er das getan hat und ich das auch im Prog habe. Hier mal ein kleiner Ausschnitt aus dem Programm:

Code: Alles auswählen

#define OK LDR_SUCCESS

int ultra;

bool found=true;

task main()
{
  SetSensorLight(IN_1);
  SetSensorLight(IN_2);
  SetSensorTouch(IN_3);
  SetSensorLowspeed(IN_4);
  byte fileHandle;
  short fileSize;
  short bytesWritten;
  string read;
  string write;
  DeleteFile("Report.txt");
  CreateFile("Report.txt", 512, fileHandle);
  while(true)
  {
    if(Sensor(IN_1)LS_SCHWARZ)
    {
      ClearScreen()
      TextOut(0,LCD_LINE1,"Fahre Linie nach");
      write = "Fahre Linie nach; LS1=Schwarz";
      WriteLnString(fileHandle,write, bytesWritten);
      OnRev(OUT_B,55);
      Wait(70);
    }
..........
if(Sensor(IN_3)==1)
        {
          ClearScreen();
          TextOut(0,LCD_LINE2,"Dose wird");
          TextOut(0,LCD_LINE3,"umfahren");
          write = "Dose wird umfahren.";
          WriteLnString(fileHandle,write, bytesWritten);
          RotateMotor(OUT_BC,60,-170);
.............

Und so weiter etc.
Aber er macht wiegesagt nur das im Linie nachfahren Abschnitt. Kann es ein, dass der Roboter mit dem Schreiben nicht mehr hinterher kommt?
Hier ist das geschriebene:
Fahre Linie nach; LS2=Schwarz
Fahre Linie nach; LS2=Schwarz
Fahre Linie nach; LS2=Schwarz
Fahre Linie nach; LS2=Schwarz
Fahre Linie nach; LS2=Schwarz
Fahre Linie nach; LS2=Schwarz
Fahre Linie nach; LS2=Schwarz
Fahre Linie nach; LS2=Schwarz
Fahre Linie nach; LS2=Schwarz
Fahre Linie nach; LS2=Schwarz
Fahre Linie nach; LS2=Schwarz
Fahre Linie nach; LS2=Schwarz
Fahre Linie nach; LS2=Schwarz
Fahre Linie nach; LS2=Schwarz
Fahre Linie nach; LS1=Schwarz
Fahre Linie nach; LS1=Schwarz
Fahre Linie nach

Viele Grüße
Diphthong

Diphthong
Schreibt viel
Schreibt viel
Beiträge: 251
Registriert: 17. Aug 2010 15:53
Kontaktdaten:

Beitragvon Diphthong » 2. Okt 2010 15:42

Äh... Vergesst einfach meine letzten beiden Beiträge, hat sich erledigt! :wink:

Benutzeravatar
robofreak
Schreibt super viel
Schreibt super viel
Beiträge: 338
Registriert: 15. Okt 2008 16:22
Wohnort: Österreich/Graz
Kontaktdaten:

Beitragvon robofreak » 2. Okt 2010 15:47

Diphthong hat geschrieben:Ich habe jetzt aber noch bei dem Abschnitt, wo er die silberne Linie am Anfang des Raumes erkennt, ein found=true; reingemacht, sonst würde er die Dose ja nie mehr finden, es sei denn, man schaltet das Programm einmal aus und an, oder?


Ja so kannst du auch noch nach einem Lack of Progress die Dose wieder finden :)


Mit den ganzen Dateigeschichten habe ich mich in NXC nie beschäftigt, also ich habe keine Ahnung wie das geht, aber im NXC Thread weiss man wahrscheinlich Bescheid ;)

Wenn du die Zeit des Events mitspeichern willst musst du die ganze Zeit einen Timer mitlaufen lassen der wahrscheinlich bald einmal "overflowt" (wie heisst da das deutsche Wort?)

EDIT:Sehe gerade das sich das mit dem Protokoll erledigt hat :) Funktioniert es jetzt oder hast du es aufgegeben ?
<img src="http://teamandroid.bplaced.net/upload/logo3_small.png" width="150px" border="0px" />



Die Deutsche Rechtschreibung ist Freeware, sprich, du kannst sie kostenlos nutzen. Allerdings ist sie nicht Open Source, d.h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

Diphthong
Schreibt viel
Schreibt viel
Beiträge: 251
Registriert: 17. Aug 2010 15:53
Kontaktdaten:

Beitragvon Diphthong » 2. Okt 2010 17:31

Ich habe das mit dem Protokoll erstmal aufgegeben. Ich werde da wahrscheinlich weitermachen, wenn alles andere erledigt ist und der Roboter alles perfekt schafft.

Manchmal ist es so, dass der Roboter bei ener Lücke von der Linie kommt. Wie kann man es halbwegs vernünftig lösen, dass er das bemerkt und von alleine wieder auf die Linie zurückfindet?
Mit if(S1=Schwarz&S2=Schwarz) (ich hoffe, dass ihr (Du) wisst, (weißt,) was gemeint ist ) funktioniert es, aber nur bei bestimmten Kurven, außerdem kann es bei 90° Kurven sein, dass er das dann auch erkennt und dann von der Linie kommt. Das wäre also keine so gute Idee.

Danke für Eure (Deine) Hilfe schonmal im Vorraus und
Viele Grüße
Diphthong

Benutzeravatar
robofreak
Schreibt super viel
Schreibt super viel
Beiträge: 338
Registriert: 15. Okt 2008 16:22
Wohnort: Österreich/Graz
Kontaktdaten:

Beitragvon robofreak » 2. Okt 2010 18:23

Mit zwei Lichtsensoren sehe ich keine Möglichkeit Lücken oder rechtwinklige Kurven zu erkennen.
Der Roboter sollte immer möglichst gerade auf der Linie fahren (mit 2 LS ebenfalls sehr schwierig)
Allerdings habe ich noch bei keinem Wettbewerb gesehen das die volle Länge der Lücken ausgenutzt wurde ohne das vorher eine relativ lange gerade Strecke war.
Was allerdings öfters vorkommt sind Kombinationen aus rechtwinkeligen Kurven und gleich darauf Lücken
<img src="http://teamandroid.bplaced.net/upload/logo3_small.png" width="150px" border="0px" />



Die Deutsche Rechtschreibung ist Freeware, sprich, du kannst sie kostenlos nutzen. Allerdings ist sie nicht Open Source, d.h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

Diphthong
Schreibt viel
Schreibt viel
Beiträge: 251
Registriert: 17. Aug 2010 15:53
Kontaktdaten:

Beitragvon Diphthong » 3. Okt 2010 13:03

Mir ist jetzt schon seit längerer Zeit aufgefallen, dass der Roboter bei schwacher Batterie langsam fährt, was ja auch klar ist. Das liegt daran, dass bei z.B. OnFwd(OUT_X,50); Das 50 eine Prozentangabe ist. Bei schwacher batterie also auch nur 50% der Leistung. Das ist ja irgendwie doof, weil wenn man die Batterie wechselt, es sein kann, dassd er Roboter etwas völlig anderes macht, da 50% jetzt ja sozusagen einen anderen Wert hat.
Gibt es jetzt eine Möglichkeit, dass der Roboter immer, also auch bei schwacher Batterie, gleich schnell fährt?
Mit RotateMotor funktioniert das ja auch nicht 100%ig.
Danke für die Hilfe und
Viele Grüße
Diphthong

Beta Rex
Schreibt ab und zu
Schreibt ab und zu
Beiträge: 21
Registriert: 3. Okt 2010 19:03
Wohnort: Landkreis Vechta
Kontaktdaten:

Beitragvon Beta Rex » 4. Okt 2010 12:08

Ersteinmal zu meiner Wenigkeit: Ich gehöre auch zu der AG und habe z.t. die selben Probleme. Ich werde mich hier einfach mal einmischen :D

Das ist mir auch schon aufgefallen, ich hatte mir mal überlegt, dass der Roboter den Akkustand misst (geht das überhaupt?) und dann auf einen anderen, festgestellten Wert umschaltet. Doch ich bin noch nie dazu gekommen :|

MfG Beta Rex


Zurück zu „Unterricht & AG“

Wer ist online?

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

Lego Mindstorms EV3, NXT und RCX Forum : Haftungsauschluss