Frage zur Programmierung vom NXT - AG

Mindstorms im Unterricht. Ideen, Vorstellungen

Moderator: Moderatoren

Linus
Enorm-Viel-Schreiber
Enorm-Viel-Schreiber
Beiträge: 512
Registriert: 13. Jul 2007 15:50

Beitragvon Linus » 4. Okt 2010 13:25

Versucht mal OnFwdReg mit OUT_REGMODE_SPEED , siehe hier: http://bricxcc.sourceforge.net/nbc/nxcd ... ff41f147f5

Die sogenannte speed regulation versucht, unabhängig von äußeren Einflüssen wie Motor-Belastung, eine konstante Geschwindigkeit zu halten. Wie gut das bei verschiedenen Batteriespannungen klappt, muss man ausprobieren.

Ansonsten kann man immer auch selbst hingehen, die Winkelgeschwindigkeit in Grad pro Sekunde messen, und je nach Ergebnis den Powerwert verändern (simpler Regelkreis). In LeJOS wird z.B. die Geschwindigkeit sowieso immer direkt so angegeben.
RWTH - Mindstorms NXT Toolbox for MATLAB - www.mindstorms.rwth-aachen.de
Beispielvideo mit der Toolbox in Aktion

Linus
Enorm-Viel-Schreiber
Enorm-Viel-Schreiber
Beiträge: 512
Registriert: 13. Jul 2007 15:50

Beitragvon Linus » 4. Okt 2010 13:27

Batteriespannung kriegt man übrigens mit der NXC-Funktion BatteryLevel oder über den direct command GetBatteryLevel.

In NXC gibts noch die Komfort-Funktion BatteryState.
RWTH - Mindstorms NXT Toolbox for MATLAB - www.mindstorms.rwth-aachen.de
Beispielvideo mit der Toolbox in Aktion

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 13:42

ok, könnte man das dann ungefähr so machen? In diesem Beispiel ist motorspeed eine Variable!

Code: Alles auswählen

 if (BatteryLevel) < ? )
   {
   motorspeed + 20
   }


Achja: In welcher Einheit gibt man denn die Spannung in NXC der Batterie an, in Volt?

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

Beitragvon Diphthong » 4. Okt 2010 14:03

Das mit den OnFwdRegmode funktioniert aber nur, wenn man zwei Motoren mit gleichen Geschwindigkeiten hat.
Könnte mir vielleicht jemand erklären, wie man das mit BatteryLevel benutzt? Ich würde das so machen:

Code: Alles auswählen

int motorspeed;

task main()
{
  while(true);
  {
    OnFwd(OUT_BC,motorspeed);
  }
  if(BatteryLevel(<50))
  {
    motorspeed+20;
  }
  else
  {
    motorspeed=50;
  }
}

Da macht BricxCC aber bei

Code: Alles auswählen

if(BatteryLevel(<50))
einen Error:
Line 11: Erros: Preprocessor macro function does not match instance (asm { GetBatteryLevel(__TMPWORD__) __RE

Danke für Eure Hilfe schonmal im Vorraus und viele Grüße
Diphthong

Linus
Enorm-Viel-Schreiber
Enorm-Viel-Schreiber
Beiträge: 512
Registriert: 13. Jul 2007 15:50

Beitragvon Linus » 4. Okt 2010 14:06

Beta Rex hat geschrieben:ok, könnte man das dann ungefähr so machen? In diesem Beispiel ist motorspeed eine Variable!

Code: Alles auswählen

 if (BatteryLevel) < ? )
   {
   motorspeed + 20
   }


Achja: In welcher Einheit gibt man denn die Spannung in NXC der Batterie an, in Volt?

Abgesehen davon, dass dein Code so syntaktisch falsch ist (schau dir die Klammern im if genauer an und überlege dir, was genau mit motorspeed passieren soll), könnte man es im Prinzip ganz simpel so machen.

Ist ein sehr einfacher Ansatz, aber vielleicht besser als gar nichts. Wie immer: Ausprobieren, rumexperimentieren, Ideen suchen, verbessern!


Ansonsten, für die Einheit der Batterie-Spannung: Lies selbst die Hilfe, da steht es drin!
RWTH - Mindstorms NXT Toolbox for MATLAB - www.mindstorms.rwth-aachen.de
Beispielvideo mit der Toolbox in Aktion

Linus
Enorm-Viel-Schreiber
Enorm-Viel-Schreiber
Beiträge: 512
Registriert: 13. Jul 2007 15:50

Beitragvon Linus » 4. Okt 2010 14:10

Diphthong hat geschrieben:Das mit den OnFwdRegmode funktioniert aber nur, wenn man zwei Motoren mit gleichen Geschwindigkeiten hat.

Stimmt nicht, es geht sehr wohl auch für einen Motor.

Du meinst wahrscheinlich OnFwdSync, das ist für zwei Motoren gedacht.


Diphthong hat geschrieben:

Code: Alles auswählen

if(BatteryLevel(<50))
einen Error:
Line 11: Erros: Preprocessor macro function does not match instance (asm { GetBatteryLevel(__TMPWORD__) __RE



Schau dir genau an, was dein If-Statement da machen soll. Schau dir Beispiele aus NXC-Tutorials, NXC-Beispielen, und/oder Büchern an.

Tipp: Dein Fehler hat nichts mit BatteryLevel zu tun, das wäre dir z.B. mit der Sensor-Funktion auch passiert.
RWTH - Mindstorms NXT Toolbox for MATLAB - www.mindstorms.rwth-aachen.de
Beispielvideo mit der Toolbox in Aktion

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

Beitragvon Diphthong » 4. Okt 2010 14:43

Linus hat geschrieben:
Diphthong hat geschrieben:Das mit den OnFwdRegmode funktioniert aber nur, wenn man zwei Motoren mit gleichen Geschwindigkeiten hat.

Stimmt nicht, es geht sehr wohl auch für einen Motor.

Du meinst wahrscheinlich OnFwdSync, das ist für zwei Motoren gedacht.


Diphthong hat geschrieben:

Code: Alles auswählen

if(BatteryLevel(<50))
einen Error:
Line 11: Erros: Preprocessor macro function does not match instance (asm { GetBatteryLevel(__TMPWORD__) __RE



Tipp: Dein Fehler hat nichts mit BatteryLevel zu tun, das wäre dir z.B. mit der Sensor-Funktion auch passiert.

Ah, jetzt seh ichs.
Es müsste ja so ähnlich wie z.B.
if(Sensor(IN_1)<50)
sein. Aber da ich mich wiegesagt mit BatteryLevel in NXC nicht auskenne und auch woanders dazu nichts gefunden habe. weiß ich nicht, wie man das sonst machen könnte... Wenn ichs so mache
if((BatteryLevel)<50)
kommt derselbe Error, nur dann in derselben Zeile (Zeile 9, vorher Zeile 11, was dann ja eigendlich motorspeed+20; wäre?!).
Schau dir genau an, was dein If-Statement da machen soll. Schau dir Beispiele aus NXC-Tutorials, NXC-Beispielen, und/oder Büchern an.

Linus
Enorm-Viel-Schreiber
Enorm-Viel-Schreiber
Beiträge: 512
Registriert: 13. Jul 2007 15:50

Beitragvon Linus » 4. Okt 2010 15:23

Diphthong hat geschrieben:Aber da ich mich wiegesagt mit BatteryLevel in NXC nicht auskenne und auch woanders dazu nichts gefunden habe. weiß ich nicht, wie man das sonst machen könnte...

Wie gesagt, schau in die Hilfe, da steht genau was BatteryLevel macht und wie mans benutzt, und mit Glück ist ein Beispiel dabei!


Diphthong hat geschrieben:Wenn ichs so mache
if((BatteryLevel)<50)
kommt derselbe Error, nur dann in derselben Zeile (Zeile 9, vorher Zeile 11, was dann ja eigendlich motorspeed+20; wäre?!).

Ich hab dich eben schon drauf hingeweisen, dass da mit dem motorspeed was nicht stimmt...

Was kommt dir denn an

Code: Alles auswählen

motorspeed+20;

komisch vor?

Tipp: Wieso funktioniert

Code: Alles auswählen

motorspeed=50;




Abgesehen davon musst du aufpassen, was du in while-Schleifen mit dem ; machst. Und du solltest gucken, wo deine Schleife endet...
RWTH - Mindstorms NXT Toolbox for MATLAB - www.mindstorms.rwth-aachen.de
Beispielvideo mit der Toolbox in Aktion

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

Beitragvon Diphthong » 4. Okt 2010 17:13

Ich habe es jetzt irgendwie im Internet gefunden. So halbwegs. Übrigens: Die Hilfe in BricxCC funktioniert nicht!
Hier der Code:

Code: Alles auswählen

#define BatteryLevel() asm { GetBatteryLevel(__TMPWORD__) __RETURN__ __TMPWORD__ }

int motorspeed=55;

task main()
{
  SetSensorTouch(IN_1);
  while(true)
  {
    if(Sensor(IN_1)==1)
    {
      OnFwd(OUT_BC,motorspeed);
    }
     if((GetBatteryLevel)<75)
     {
        motorspeed=70;
     }
  }
}

So oder so ähnlich sollte es doch theoretisch gehen, aber da kommt jetzt der Fehler:
Line 14: Error: Undefined Identifier GetBatteryLevel

Sorry wenn ich nerve, aber ich möchte das eigentlich gerne hinkriegen!

Linus
Enorm-Viel-Schreiber
Enorm-Viel-Schreiber
Beiträge: 512
Registriert: 13. Jul 2007 15:50

Beitragvon Linus » 4. Okt 2010 20:33

Diphthong hat geschrieben:Ich habe es jetzt irgendwie im Internet gefunden. So halbwegs.

So wird das auf Dauer nichts, denn du musst es selbst verstehen!


Diphthong hat geschrieben:Übrigens: Die Hilfe in BricxCC funktioniert nicht!

Bei mir schon. Dann lad dir BricxCC neu runter und installier es neu.

Ansonsten habe ich den Link zur NXC-Hilfe oben schon mal gepostet. Hier nochmal die Startseite davon: http://bricxcc.sourceforge.net/nbc/nxcd ... index.html


Hier der Code:

Code: Alles auswählen

#define BatteryLevel() asm { GetBatteryLevel(__TMPWORD__) __RETURN__ __TMPWORD__ }


Wo hast du das her, was macht es, wozu brauchst du es?


Naja, wie auch immer, lass das weg. Der Befehl BatteryLevel ist schon definiert, der ist Bestandteil von NXC.


So oder so ähnlich sollte es doch theoretisch gehen, aber da kommt jetzt der Fehler:
Line 14: Error: Undefined Identifier GetBatteryLevel

Sorry wenn ich nerve, aber ich möchte das eigentlich gerne hinkriegen!

Lies die Fehlermeldung. Übersetze sie. Da steht: "Hey, ich weiß nicht was GetBatteryLevel ist". Und, siehe da, die Funktion gibt es ja auch nicht in NXC. Wie sie heißt, haben wir oben schon mal diskutiert.


Abgesehen davon zeigt dein Vergleich "< 75", dass du noch nicht nachgelesen oder ausprobiert hast, welche Größenordnungen bzw. Einheit BatteryLevel hat.


Trau dich, Dinge selbst herauszufinden, nachzulesen oder auszuprobieren, auf Dauer wird es dir sehr viel mehr helfen!


Und zu guter Letzt: Du versuchst hier ja, 2 unterschiedliche Geschwindigkeiten für den Motor zu benutzen, je nach Batteriespannung. das ist zwar erstmal besser als nur 1 feste Geschwindigkeit, wird dir aber insgesamt nicht helfen (2 Stufen sind da halt zu wenig). Es ist ok, das erstmal auszuprobieren. Für was "sinnvolles" / schön funktionierendes muss da aber später was anderes hin. Aber eins nach dem anderen.

Nur, bevor du enttäuscht aufgibst: Auf jeden Fall mal OnFwdReg mit dem SPEED Mode ausprobieren!
RWTH - Mindstorms NXT Toolbox for MATLAB - www.mindstorms.rwth-aachen.de
Beispielvideo mit der Toolbox in Aktion

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

Beitragvon Diphthong » 5. Okt 2010 12:05

Ich habe jetzt das neue BricxCC installiert, die Hilfe funktioniert nun. Wenn ich da dann BatteryLevel eingebe, kommen da unter anderem zwei Beispielprogramme. Beide funktionieren nicht. Da stand irgendwas davon, dass in FormatNum der Fehler ist. Ich habe dann also in der Hilfe nachgeguckt und gesehen, dass ich dafür die Enhanced Firmware 1.28 benötige. Die habe ich dann ehruntergeladen und auf den NXT installiert. Außerdem bei den Einstelleungen in BricxCC ein Häkchen bei ,,Enhanced Firmware" gesetzt. Da ist aber jetzt immernoch der Fehler! Hier ist sind die beiden Codes, die ich ausprobiert habe:

Code: Alles auswählen

task main()
{
   float volts = BatteryLevel() / 1000.0;
   TextOut(0, LCD_LINE2, FormatNum("Battery: %5.3f", volts), true);
   Wait(SEC_4);
}

Code: Alles auswählen

task main()
{
   unsigned int millivolts = BatteryLevel();
   unsigned int int_volts = millivolts / 1000;
   millivolts %= 1000;
   string left = FormatNum("Battery: %d", int_volts);
   string right = FormatNum(".%03d", millivolts);
   TextOut(0, LCD_LINE2, StrCat(left, right), true);
   Wait(SEC_4);
}

Hier mal der Screenshot vom Compile Error:

Bild
Was mache ich falsch? Ich verstehe den Programmcode wohl, aber ich kann den Fehler nicht beheben, wenn ich nicht weiß, was der Fehler ist! :(

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

Beitragvon Diphthong » 5. Okt 2010 12:21

Komisch. Ich habe das jetzt in unser Programm eingebaut (erstmal mit TextOut) und jetzt macht BricxCC keine Compile-Fehler mehr... Naja, ich werde da jetzt erstmal etwas rumprobieren!
Zuletzt geändert von Diphthong am 5. Okt 2010 12:48, insgesamt 1-mal geändert.

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 » 5. Okt 2010 12:44

Diphthong hat geschrieben:Komisch. ich habe das jetzt in unser Programm eingebaut (erstmal mit TextOut) und jetzt macht BricxCC keine Compile-Fehler mehr... Naja, ich werde da jetzt erstmal etwas rumprobieren!


Das lag bestimmt daran, dass du den Codeschnipsel noch nicht als NXC-Datei gespeichert hast, das habe ich auch immer. Denn in NQC scheints nicht zu funktioniern :lol:

MfG Beta Rex

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

Beitragvon Diphthong » 5. Okt 2010 12:45

Heeey,
ich habe es hingekriegt!
So ungefähr muss es aussehen:

Code: Alles auswählen

int motorspeed=60;

task main()
{
    unsigned int millivolts = BatteryLevel();
    unsigned int int_volts = millivolts / 1000;
    millivolts %= 1000;
    string left = FormatNum("Battery: %d", int_volts);
    string right = FormatNum(".%03d", millivolts);
  while(true)
 {
    OnFwd(OUT_BC,motorspeed);
    if(BatteryLevel()<6000)
         {
           motorspeed=65;
         }
          if(BatteryLevel()<5000)
          {
            motorspeed=70;
          }
           if(BatteryLevel()<4000)
           {
             motorspeed=75;
           }
            if(BatteryLevel()<3000)
            {
              motorspeed=80;
            }
             if(BatteryLevel()<2000)
             {
               motorspeed=85;
             }
 }
}

So (ähnlich, natürlich im richtigen Programm eingebaut) sieht es jetzt bei mir aus. Aber ich glaube, dass man es auch ohne so viele if-Abfragen hinbekommen kann. Das ist mir aber eigentlich im Moment egal, falls jemand eine Lösung weiß, kann er sie ja posten!

Linus
Enorm-Viel-Schreiber
Enorm-Viel-Schreiber
Beiträge: 512
Registriert: 13. Jul 2007 15:50

Beitragvon Linus » 5. Okt 2010 13:00

Diphthong hat geschrieben:Heeey,
So (ähnlich, natürlich im richtigen Programm eingebaut) sieht es jetzt bei mir aus. Aber ich glaube, dass man es auch ohne so viele if-Abfragen hinbekommen kann.

Das ist schon ok, so kannst du ruhig erstmal anfangen. Was ich Dir aber empfehlen würde: Rück dein Programm richtig ein. Dadurch verstehst du die Struktur besser. Ist eigentlich ganz einfach: Alles, was zwischen den Klammern { } steht, wird eingerückt.

Du hast durch deine Schreibweise eine tiefe Verschachtelung "vorgegaukelt", die so nicht existiert. So wäre es richtig:

Code: Alles auswählen

int motorspeed=60;

task main()
{
    unsigned int millivolts = BatteryLevel();
    unsigned int int_volts = millivolts / 1000;
    millivolts %= 1000;
    string left = FormatNum("Battery: %d", int_volts);
    string right = FormatNum(".%03d", millivolts);
    while(true)
    {
        OnFwd(OUT_BC,motorspeed);
        if(BatteryLevel()<6000)
        {
            motorspeed=65;
        }
        if(BatteryLevel()<5000)
        {
            motorspeed=70;
        }
        if(BatteryLevel()<4000)
        {
            motorspeed=75;
        }
        if(BatteryLevel()<3000)
        {
            motorspeed=80;
        }
        if(BatteryLevel()<2000)
        {
            motorspeed=85;
        }
    }//end while
}//end task

Ich habe die beiden letzten } mit Kommentaren versehen, damit man sieht, wo genau das } zugehört.
RWTH - Mindstorms NXT Toolbox for MATLAB - www.mindstorms.rwth-aachen.de
Beispielvideo mit der Toolbox in Aktion


Zurück zu „Unterricht & AG“

Wer ist online?

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

Lego Mindstorms EV3, NXT und RCX Forum : Haftungsauschluss