barney Geschrieben 7. Februar 2013 Geschrieben 7. Februar 2013 Du kannst die Limits festlegen. Im Sourcecode findest Du zwei if Abfragen. Eine limitiert nach unten 0, die Andere nach oben 255. Zitieren
barney Geschrieben 7. Februar 2013 Geschrieben 7. Februar 2013 Externe Links nur für Mitglieder sichtbar besser als die 20 einzustellen ist den unteren Servo Wert anzupassen. Zitieren
Wolf Geschrieben 7. Februar 2013 Geschrieben 7. Februar 2013 Wie kann ich denn die Empfindlichkeit der Lebenderkennung im Sourcecode erhöhen? Hi Sonni, so wie ich das verstanden habe, ist die "Lebenderkennung" normal auf 3 (vermutlich Sekunden). Stelle also die "int PairingLostTrigger = 10" z.B., wenn es Sekunden sind, wie angenommen. Dann musst Du nur einmal eine messbare Bewegung in 10 Sek der 2 momentan abgefragten Achsen des Gyrometers erzeugen und er bleibt gebunden. Viele Grüße, Wolf Zitieren
sonni Geschrieben 7. Februar 2013 Geschrieben 7. Februar 2013 (bearbeitet) Zitat von sonni int PairingLostTrigger = 1000; -> Hatte wir schon zum Anfang diskutiert. Auf eigener Gefahr. Fällt dir der Nunchuk aus der Hand, wird dies erst nach vielen Minuten erkannt. Dein Board wird in der Zwischenzeit zum unkontrollierten Geschoss. Zitat von sonni int PairingSuccessTrigger = 1; -> Das ist eine ganz schlechte Idee. Du gaukelst den Arduino eine Pairing vor. D.h. Ohne das der Empfänger und Nunchuk miteinander Reden, behauptest du die Verbindung wäre da. Dadurch das du den Lost Trigger auf 1000 gestellt hast, kann es Passieren, dass dein Board für viele Minuten die Flucht ergreift. Das würde ich an deiner Stelle wieder auf 0 stellen. Ich denke ich kaufe mir einfach den gleichen chuck wie barney, wenn er mir verrät wo er den gekauft hat^^. @barney Das Problem mit der Rückwärtsfahrt ist gelöst dank deinem tipp mit Der If funktion. Die int Dämpfung setzt den Zeitpunkt ab dem der Regler sein Signal bekommt nur nach hinten. Also y-achsen-wert 127 neutral. Bei Dämpfungswert 50 wird erst ab y-achsen-wert 157 beschleunigt. Bei Dämpfungswert 1 erst ab 128 Bei Dämpfungswert 80 erst ab 187 und so weiter gibt es da noch eine lineare Aufsummierung die man verändern kann um den Anlauf seidiger zu gestalten letztes Problem: diesen Wert auch auf 20 zu bekommen. // Bremsfunktion bei losgelassenen Z Knopf durch zurueckziehen // der X-Achse und unterschreiten des unteren Totpunktes if (nunchuk.zButton == LOW && nunchuk.analogY < UntererTotpunkt){ StellWertMotor = nunchuk.analogY; Gruß Sonni. Ps: heute wurde meine Achse von einem Luftfahrtschweißer sehr schön geschweißt . bearbeitet 7. Februar 2013 von sonni Zitieren
barney Geschrieben 8. Februar 2013 Geschrieben 8. Februar 2013 Ich denke ich kaufe mir einfach den gleichen chuck wie barney, wenn er mir verrät wo er den gekauft hat^^. Nö, wir bringen deinen zum laufen! Die Routine muss universeller sein. Und du bist der Tester Die int Dämpfung setzt den Zeitpunkt ab dem der Regler sein Signal bekommt nur nach hinten. Dämpfung macht was anderes: StellWertMotor=StellWertMotor+((nunchuk.analogY-NeutralstellungYAchse)/Daempfung); Ist so zu verstehen: Der Zahlenwert für den Motorsteller liegt bei 0 bis 255. Der Nunchuk liefert auch einen Wert von 0 bis 255 (theoretisch! typisch 3 bis 245). Würde die Aufsummierung ohne Dämpfung stattfinden, würde bei einer Iteration die Möglichkeit bestehen gleich Vollpower zu haben. Dämpfung (dumm benannt) teilt den Eingangswert des Nunchuck auf einen kleineren Wert. Dieser wird dann bei jeder Iteration dann aufsummiert. Ich hatte den Wert so gewählt, dass wenn man den Nunchuk auf max. vorwärts hält, die Routine erst nach 3 Sekunden den max Wert 255 an den Motorsteller Weiterreicht. Aber nicht als zeitliche Verzögerung sondern als Rampe, die in 3 Sekunden auf den vollen Wert ansteigt (in Bezug auf die Neutralstellung 127). Jetzt die Falle: Wenn du deinen Motorsteller auf verzögerte Beschleunigung eingestellt hast. Treffen leider zwei Dämpfungsroutinen aufeinander. Die Zeitverzögerungsroutine vom Motorsteller und der Arduino Rampe. (Den Spaß hat Chrizz schon hinter sich) :mad: Wie kann man das Problem lösen. Den Motorsteller so einstellen, das er nur eine minimale Verzögerung aufweist. Dann hast du was von der Rampe für den seidigen Motorlauf. gibt es da noch eine lineare Aufsummierung die man verändern kann um den Anlauf seidiger zu gestalten Sollte mit oben beantwortet sein! letztes Problem: diesen Wert auch auf 20 zu bekommen. Alt: if (StellWertMotor <= 0){ StellWertMotor = 0; Für Sonnis Regler Xerun: if (StellWertMotor <= 21){ StellWertMotor = 21; Obwohl ich das unschön finde besser wäre: mymotor.attach(9); -> mymotor.attach(9,600,2400); Der unterste Wert ist default, wenn er nicht gesetzt wird 544. 600 Müsste als unterster Stellwert für deinen Regler reichen, ansonsten leicht anheben! Wenn wir anfangen an jeder Stelle die if-Grenzwerte zu verändern, wird das Programm nicht universell sein. Warnung: Mit jeder seriellen Ausgabe in der Loop Routine verlangsamst du das Programm in der Schleifengeschwindigkeit. Die Werte für Dämpfung usw. bekommen einen neuen Wert. Zitieren
barney Geschrieben 8. Februar 2013 Geschrieben 8. Februar 2013 Nochmal zum Thema Funkabriss: Da Sonnis Nunchuk sich leicht gedämpft verhält muss folgende Routine angepasst werden: accelXAlt = nunchuk.accelX; // Alten Wert des Beschleunigungssensors ablegen nunchuk.update(); // Neue Werte vom Controller holen // Warscheinlichkeitsdetektor Funkabriss if (nunchuk.accelX == accelXAlt){ //Serial.println("Warscheinlichkeitsdetektor Funkabriss"); // Debug //Serial.println(PairingLostCount,DEC); // Debug PairingLostCount++; // Sollte der Schwellwert ueberschritten werden if (PairingLostCount > PairingLostTrigger){ //Serial.println("Warscheinlichkeitsdetektor Trigger ausgeloest"); // Debug digitalWrite(InitReceiverStatusLED,LOW); // Status LED aus PairingStatus = LOW; // Verbindung zun Controller steht nicht } } Es wird nur eine Achse für den Funkabriss ausgewertet. accelXAlt = nunchuk.accelX; // Alten Wert des Beschleunigungssensors ablegen accelXAlt = nunchuk.accelX; // Alten Wert des Beschleunigungssensors X ablegen accelYAlt = nunchuk.accelY; // Alten Wert des Beschleunigungssensors Y ablegen accelZAlt = nunchuk.accelZ; // Alten Wert des Beschleunigungssensors Z ablegen if (nunchuk.accelX == accelXAlt && nunchuk.accelY == accelYAlt && nunchuk.accelZ == accelZAlt) Soll dann bewirken, dass wenn alle Achsen den alten Wert liefern, davon ausgegangen werden darf, dass die Verbindung abgerissen, oder der Nunchuk heruntergefallen ist. Die Empfindlichkeit wurde so deutlich erhöht. Noch an die an die Variablenerweiterung denken: int accelXAlt = 0; // Alter Beschleunigungswert X int accelYAlt = 0; // Alter Beschleunigungswert Y int accelZAlt = 0; // Alter Beschleunigungswert Z Zitieren
barney Geschrieben 8. Februar 2013 Geschrieben 8. Februar 2013 Nächste Falle: Mein Nunchuk neigt dazu, wenn er sehr ruhig gehalten wird, den Beschleunigungssensor "einzufrieren". Alle drei Achsen zeigen recht hartnäckig den letzten Wert an. Ein leichte Bewegung reicht aus, den Sensor wieder zu aktivieren. Um dies hinzu bekommen, müsste ich aber tot auf dem Board zusammenbrechen. So langweilig könnte ich nicht fahren. @Sonni Sonni wurde die Empfindlichkeit jetzt für deinen Nunchuk in Bezug auf die Beschleunigungssensoren gesteigert? Zitieren
sonni Geschrieben 8. Februar 2013 Geschrieben 8. Februar 2013 Hi Barney, genau das war die Falle. Das einfrieren,verharren der Beschleunigungswerte der 3 Achsen nach ca 3 Sekunden. Wenn ich in der Wohung sitze und hier den ganzen Tag experimentiere, dann nervt das schon wenn man mit der Hand wackeln muss. Dann habe ich wohl doch keinen minderwertigen Nunchuck. Das hätte ich aber besser gefunden, da dass nun ein zu umständlich lösbares Problem zu sein scheint. Bei meiner ersten Ausfahrt bin ich auch nicht Tot gewesen aber trotzdem ging das Board öfter aus, also werde ich erst einmal einen neuen Chuck bestellen in der Hoffnung , dass dieser Empfindlicher reagiert und nicht bei Schwankungswerten der 3 Achsen im Bereich von +-5 ,nach 3 Sekunden einfriert. Die Beschleunigungsempfindlichkeit muss ich erst noch uploaden, ich denke dass werde ich nacher noch machen. Wie sieht, dass eigentlich bei dir Aus was fährst du für Boards? Doch sich nichts von der Stange:cornut: Falls du mal Handwerkliche Hilfe benötigst, dann fühle dich bitte genötigt mich zu fragen . Gruß Sonni Zitieren
barney Geschrieben 8. Februar 2013 Geschrieben 8. Februar 2013 Hi Barney, genau das war die Falle. Das einfrieren,verharren der Beschleunigungswerte der 3 Achsen nach ca 3 Sekunden. Wenn ich in der Wohung sitze und hier den ganzen Tag experimentiere, dann nervt das schon wenn man mit der Hand wackeln muss. Dann habe ich wohl doch keinen minderwertigen Nunchuck. Das hätte ich aber besser gefunden, da dass nun ein zu umständlich lösbares Problem zu sein scheint. Bei meiner ersten Ausfahrt bin ich auch nicht Tot gewesen aber trotzdem ging das Board öfter aus, also werde ich erst einmal einen neuen Chuck bestellen in der Hoffnung , dass dieser Empfindlicher reagiert und nicht bei Schwankungswerten der 3 Achsen im Bereich von +-5 ,nach 3 Sekunden einfriert. Die Beschleunigungsempfindlichkeit muss ich erst noch uploaden, ich denke dass werde ich nacher noch machen. Ansatz 1: Ich denke um eine Erweiterung nach, wie z.B. die Bewegung des Joystick mit einzubeziehen. Ansatz2: Ich werde versuchen, direkten Bluetooth Kontakt zum Nunchuk herzustellen. Vielleicht klappt dies ja. Wie sieht, dass eigentlich bei dir Aus was fährst du für Boards? Doch sich nichts von der Stange:cornut: Falls du mal Handwerkliche Hilfe benötigst, dann fühle dich bitte genötigt mich zu fragen . Gruß Sonni Ganz böser wunder Punkt. Mein Board ist derzeit ein Construction Set. Ich packe das Fräsen meiner Motorhalterung derzeit überhaupt nicht. Mein Rad habe ich auch noch nicht abgedreht. Programmieren kann ich auch immer nur für wenige Stunden. Aber das andere Programmierprojekt ist sei Mittwoch abgeschlossen, so das ich mir die Bluetooth Geschichte genauer ansehen kann. Zitieren
sonni Geschrieben 8. Februar 2013 Geschrieben 8. Februar 2013 Hast du eine Zeichnung deiner Motorhalterung? Ich habe zwar nur Zugang zu einer nicht komputergesteuerten Fräsmaschine aber damit kann ich umgehen. Ich bin gerne bereit dir das Teil zu fräsen. Zitieren
barney Geschrieben 8. Februar 2013 Geschrieben 8. Februar 2013 Hi Sonni das klingt super: Externe Links nur für Mitglieder sichtbar schau mal hier rein. Die genauen Maße sende ich dir morgen. Die Rohlinge habe ich auch schon. Momentan habe ich das Programm leicht neu gestaltet und kommentiert. Sollte jetzt besser lesbar sein. Bluetooth habe ich auch schon vorbereitet. Zitieren
barney Geschrieben 9. Februar 2013 Geschrieben 9. Februar 2013 Hi Sonni, ich habe vergessen darauf hinzuweisen, dass sich wenige Pins verändert haben. Besonders der Motor Anschluss. Das Ganze ist dem Bluetooth Modul geschuldet. Zum Nunchuk und Bluetooth: Das sieht nicht gut aus, den Nunchuk direkt per Bluetooth anzusprechen, wenn es überhaupt Bluetooth ist, was der Billigcontroller da sendet oder spricht. Grüße Barney Zitieren
sonni Geschrieben 9. Februar 2013 Geschrieben 9. Februar 2013 Morgen. Ich habe nur Freecad und ich glaube nicht, dass die Zeichnung so aussehen solll wie sie mir angezeigt wird. Ich würde auch mit einem bemaßten Screeshot zurecht kommen. Gruß Sonni Zitieren
barney Geschrieben 9. Februar 2013 Geschrieben 9. Februar 2013 Morgen.Ich habe nur Freecad und ich glaube nicht, dass die Zeichnung so aussehen solll wie sie mir angezeigt wird. Ich würde auch mit einem bemaßten Screeshot zurecht kommen. Gruß Sonni Anbei die Grundplatte. Zitieren
barney Geschrieben 9. Februar 2013 Geschrieben 9. Februar 2013 Zum Nunchuk und Bluetooth: Das sieht nicht gut aus, den Nunchuk direkt per Bluetooth anzusprechen, wenn es überhaupt Bluetooth ist, was der Billigcontroller da sendet oder spricht. Laut den einschlägigen Foren kein Bluetooth! :mad: Zitieren
sonni Geschrieben 9. Februar 2013 Geschrieben 9. Februar 2013 Ich würde dir noch eine Abrundung der Kanten empfehlen ,denn sonst verhackst du dich ganz schnell mit der Moterhalterung, was dir nicht passieren würde wenn sie ein Art Rampe darstellt. gruß Sonni Zitieren
barney Geschrieben 9. Februar 2013 Geschrieben 9. Februar 2013 Hi Sonni, hast du im neuen Programm diese Zeile schon gefunden: mymotor.attach(8,544,2400); // Motorpin zuweisen und unteren und oberen Wert fuer den Stellweg vorgeben Wenn du die 544 auf 600 anhebst sollte es "die nicht unter 20 Wert" Problematik für deinen Xerun nicht mehr geben. Zitieren
barney Geschrieben 9. Februar 2013 Geschrieben 9. Februar 2013 Ich würde dir noch eine Abrundung der Kanten empfehlen ,denn sonst verhackst du dich ganz schnell mit der Moterhalterung, was dir nicht passieren würde wenn sie ein Art Rampe darstellt.gruß Sonni Hatte ich eigentlich auch vor. Aber der Rohling gibt es nicht her. Chrizz lebt mit dieser Halterung recht gut. Aber danke für den Hinweis. Zitieren
sonni Geschrieben 9. Februar 2013 Geschrieben 9. Februar 2013 Externe Links nur für Mitglieder sichtbar kostet nicht die Welt so eine Aluplatte. Ihr schweißt den Motorhalter direkt an nicht? Ich habe dass bei mir noch mit einem Flansch gelöst der wurde angeschweißt und man kann den Motorhalter daran mit 4 Bolzen befestigen. Update: Ich setzte mich nach dem Mittag an das Programm, bin momentan noch mit den Sensoren beschäftigt:o Danke dass du dir die viele Mühe machst und so auf meine Probleme eingehst! Zitieren
barney Geschrieben 9. Februar 2013 Geschrieben 9. Februar 2013 Hallo Sonni, anbei die Halterung, letzter Stand. Danke nochmal. Zitieren
sonni Geschrieben 9. Februar 2013 Geschrieben 9. Februar 2013 (bearbeitet) Hi Sonni, hast du im neuen Programm diese Zeile schon gefunden: mymotor.attach(8,544,2400); // Motorpin zuweisen und unteren und oberen Wert fuer den Stellweg vorgeben Wenn du die 544 auf 600 anhebst sollte es "die nicht unter 20 Wert" Problematik für deinen Xerun nicht mehr geben Leider ist immernoch das Problem, dass die Bremsung bei losgelassenen z-knopf nur bis y-Achsen-wert 20 funktioniert, wenn der wert unterschritten wird, dann wird der Motor wieder freigelassen... Wenn ich allerdings mit der Z-Taste Bremse dann funktioniert es da ich die Zeile // Subroutine fuer die Motorsteuerungvoid Motorsteuerung(){ // Beschleunigen bei gehaltenen Z-Knopf und überschreiten des Oberern Totpunktes if (nunchuk.zButton == HIGH && nunchuk.analogY > ObererTotpunkt){ StellWertMotor=StellWertMotor+((nunchuk.analogY-NeutralstellungYAchse)/Daempfung); if (StellWertMotor >= 180){ StellWertMotor = 180; // obere Grenze fuer den Motorregler } } // Verlangsamen bei gehaltenen Z-Knopf und unterschreiten des UntererTotpunkt else if (nunchuk.zButton == HIGH && nunchuk.analogY < UntererTotpunkt){ StellWertMotor=StellWertMotor+((nunchuk.analogY-NeutralstellungYAchse)/Daempfung); // Auf Wunsch kann die Bremsfunktion hier heraus genommen werden // StellWertMotor <= Leerlauf , StellWertMotor = Leerlauf if (StellWertMotor <= 20){ // negative Werte für den Motorregler sollte es nicht geben StellWertMotor = 20; angepasst habe. kannst du hier etwas verändern? // Bremsfunktion bei losgelassenen Z Knopf durch zurueckziehen // der X-Achse und unterschreiten des unteren Totpunktes if (nunchuk.zButton == LOW && nunchuk.analogY < UntererTotpunkt){ StellWertMotor = nunchuk.analogY; Dass der Stellwert des Motors analog zum Hebelweg bis Wert 21 ist oder so? Die Beschleunigung Setzt auch erst ab y-achsen-wert 177 ein, da sie immer noch durch den Dämpfungswert x (z.B. 50), x+127(neutralstellung y-achse), nach hinten verschoben wird. , da wäre es vlt gut den Hebelweg proportional zum Stellwert des Motors zu nehmen, wie bei der Bremsung ohne Z-Taste und die Zeit, der Addition, der Beschleunigungswerte zu verlangsamen als Dämpfer. Weißt du was ich meine ? Hast du dieselben Erfahrungen mit deinem Motorregler gemacht? gruß sonni bearbeitet 9. Februar 2013 von sonni Zitieren
barney Geschrieben 10. Februar 2013 Geschrieben 10. Februar 2013 Hi Sonni, dein Regler scheint sehr eigen zu sein. Ich bin der Überzeugung, das der obere und untere Totpunkt nicht vom Regler richtig gelernt wird: Damit hast du die direkte Kontrolle über den Nunchuk. Vielleicht klappt das Anlernen dann besser. if (nunchuk.zButton == LOW && nunchuk.analogY < UntererTotpunkt){ StellWertMotor = nunchuk.analogY; } -> if (nunchuk.zButton == LOW){ StellWertMotor = nunchuk.analogY; } Aber bitte damit so nicht herumfahren! zu mymotor.attach(8,544,2400); das Anheben von 544 auf 600 oder 700 hat keine Auswirkung???? Nicht 10 oder 15 als unterster Wert für die Bremse? if (nunchuk.zButton == LOW && nunchuk.analogY < UntererTotpunkt){ StellWertMotor = nunchuk.analogY; if (StellWertMotor <= 21){ // negative Werte für den Motorregler sollte es nicht geben StellWertMotor = 21; // untere Grenze fuer den Motorregler } } Sollte dein Bremsproblem bei direkter Bremse lösen, wenn es mit mymotor.attach nicht klappen sollte. Ich baue meinen Regler heute mal auf. Der Unterschied fängt damit an, dass meiner für Hubschrauber ist und damit keinen Rückwärtsgang kennt. Linearität: Mist ich sehe den Gedankenfehler: Im Quellcode der Servo Lib sehe ich gerade, dass die Werte nicht von 0 bis 255 gehen, sondern 0-180 (Grad) alles über 180 wird auf 180 begrenzt. Damit ergeben sich mehrere Änderungen: #define Leerlauf 127 // Motor Leerlauf -> #define Leerlauf 90 // Motor Leerlauf Hat du schon erkannt (war vorher 255): if (StellWertMotor >= 180){ StellWertMotor = 180; // obere Grenze fuer den Motorregler Ich schreibe das Ganze kurz mal um und poste die neue Version! Zitieren
barney Geschrieben 10. Februar 2013 Geschrieben 10. Februar 2013 Neue Version von 0 bis 180 Grad Zitieren
sonni Geschrieben 10. Februar 2013 Geschrieben 10. Februar 2013 (bearbeitet) Göttlich! // Bremsfunktion bei losgelassenen Z Knopf durch zurueckziehen // der X-Achse und unterschreiten des unteren Totpunktes if (nunchuk.zButton == LOW && nunchuk.analogY < UntererTotpunkt){ // Der Nunchuk liefert einen Bremswert von 127 bis zur 0 runter. Der Motorsteller benötigt aber einen // Winkel unter 90 Grad. nunchuk.analogY - (NeutralstellungYAchse - Leerlauf) liefert einen geeigneten Wert. StellWertMotor = nunchuk.analogY - (NeutralstellungYAchse - Leerlauf); if (StellWertMotor >= Leerlauf){ // Sicherheitsfunktion, damit nicht mit der Bremsfunktion StellWertMotor = Leerlauf; // Beschleunigt wird. Der oberste Wert darf nicht über den Leerlauf liegen } if (StellWertMotor <= 20){ // negative Werte für den Motorregler sollte es nicht geben StellWertMotor = 20; // untere Grenze fuer den Motorregler Jetzt bin ich Glücklich! Das Finde ich sogar noch besser um die Bremse härter zu machen. #define Leerlauf 40 // Motor Leerlauf Linearität:Mist ich sehe den Gedankenfehler: Im Quellcode der Servo Lib sehe ich gerade, dass die Werte nicht von 0 bis 255 gehen, sondern 0-180 (Grad) alles über 180 wird auf 180 begrenzt. Damit ergeben sich mehrere Änderungen: #define Leerlauf 127 // Motor Leerlauf -> #define Leerlauf 90 // Motor Leerlauf Hat du schon erkannt (war vorher 255): if (StellWertMotor >= 180){ StellWertMotor = 180; // obere Grenze fuer den Motorregler Hat sich dadurch nicht verändert, wenn du mal dein Debugprogramm ausführst wo dir gezeigt wird, welche Werte die Achsen bei Knüppelbewegung ausführen, dann siehst du, dass Der Motorstellwert,der dem Regler übermittelt wird, immer um den Dämpfungswert nach hinter verschoben ist auf der Y-Achse. Mich stört es eigentlich auch garnicht, ich bin auch nur manchmal krankhafter Perfektionist Gruß Sonni bearbeitet 10. Februar 2013 von sonni Zitieren
Empfohlene Beiträge
Tritt dem Gespräch bei
Du kannst jetzt posten und dich später registrieren. Wenn du bereits einen Account hast kannst du dich hier anmelden.