danke Sisor für deine Hilfe =)
Werde ich morgen, auch ausprobieren dann bin ich schlauer, wie der Bereich der Potis ist.
Sind ja ganz normale Potis wie man sie aus den PS2 Controllern kennt.
Mfg und gute Nacht =)
Benny
An deiner Stelle würde als erstes ein Testprogramm schreiben, dass einfach nur die Potis des Sender-Arduinos liest und die Werte am Bildschirm ausgibt.
Dann die Werte analysieren: Gehen sie von 0 bis 1023? Ist der Verlauf linear?
Daran kannst du schon sehr viel sehen.
danke Sisor für deine Hilfe =)
Werde ich morgen, auch ausprobieren dann bin ich schlauer, wie der Bereich der Potis ist.
Sind ja ganz normale Potis wie man sie aus den PS2 Controllern kennt.
Mfg und gute Nacht =)
Benny
Hallo zusammen,
also @ Sisor,
ich hab das Test Programm geschrieben und der Serielle Monitor gibt folgendes aus:
bei Joystick Stellung ganz vorne (Vollgas) = 1023
bei Joystick Stellung ganz zurück ( Vollgas Rückwärts) = 0
bei Joystick Mittelstellung ( Neutral ) = 514
Das heist der Joystick ist Linear?
Habe es auch am Roboter ausprobiert, im Prinzip funktioniert es nach dem Tip mit den
...radio.write(data, 8 );...
und
...done = radio.read(msg, 8 );...
ABER:
es ist sehr ruckelig wenn man es so nennen mag ....
Also, ein kleines bisschen den Joystick nach vorn bewegt und der Roboter fährt schon mehr als
halb Gas.
Was kann ich denn dagegen tun?
Hab den wert der Servos schon von 179 auf 255 geändert
Lg Benny
Alles noch mal logisch durchdenken.Was kann ich denn dagegen tun?
Hab den wert der Servos schon von 179 auf 255 geändert
Was für Werte muß der Servo bekommen, damit er weniger stark dreht?
jetzt komm ich durcheinander .....
0 und 180 (179) sind doch die Gradzahlen des Servos oder nicht ?
Ich hab noch nicht verstanden, wie die Servos verbaut sind.
Foto?
Brauchst du den Vollausschlag der Servos?
Willst du, dass sie langsam anlaufen?
Und welchen Wert liefern die Potis in auf der Hälfte zwischen Neutral und Vollausschlag?
Geändert von Sisor (31.03.2014 um 21:27 Uhr)
achso aneinander vorbei geredet
ich hab ja gar keinen Servo, sondern einen Fahrtenregler der Firma SGS Electronic.
Er wird angeschlossen wie zwei Servos, er hat zwei Servo Kabel .....
eins für Vorwärts und Rückwärts und ....
eins für Links und Rechts.
die Fahrtenregler Kurzbeschreibung .....
Der Regler beinhaltet alle Komponenten zur Ansteuerung von zwei Gleichstrommotoren
in einem Kettenfahrzeug. Der integrierte Mischer verzögert beim Lenkungsausschlag die kurveninnenliegende Kette
proportional bis zum Stillstand. Bei stehendem Fahrzeug bewirkt das Betätigen der Lenkung eine proportional steuerbare Drehung „auf dem Teller“.
und hier das PDF Dokument des Reglers:
Anleitung_Regler_TVC-B-30-b.pdf
Was man dem PDF entnehmen kann is das er mit der Pulsweitenregulierung 16 MHZ arbeitet bzw programmiert worden ist!
Und noch zu sagen, es funktioniert ja einwandfrei sogar, das steuern meines Roboters.
Nur halt das bei geringer Neigung des Joystick, schon fast Dreiviertel bzw voll gas gefahren wird.
Und das hätte ich gerne etwas gedämpft bzw sanfter so zu sagen
Mfg Benny
Keine Garantie, dass das so funktioniert wie du willst,
aber theoretisch sollte das klappen.
Folgende Schritte:
1. Sender muss Werte von 0-255 schicken:
2. Empfänger-Code bekommt eine zusätzliche Funktion:Code:...map(analogRead(xPotPin), 0, 1023, 0, 255);...
Hier werden die linearen Werte in eine quadratische Parabel überführt.
3. Und in die loop() statt:Code:... int parabel(int val) { float a = (val - 127) / 13.35; int b = a*a; if (val < 127) b = -b; return b + 90; } ...
schreibst du:Code:...myServo1.write (msg[0]);...
parabel(val) rechnet die Eingangs-Werte von 0-255 so um, dass am Ende Werte zwischen 0 und 180 herauskommen, nur halt nicht linear sondern parabol.Code:...myServo1.write( parabel(msg[0]) );...
okay, das hätte ich jetzt nicht gewusst das es auch als Parabel geht ....
direkt aneinander vorbei geredet nicht :P hab schon immer gewusst das eigentlich zwischen einem
Servo und einem Elektromotor fast kein unterschied besteht weil im Servo ja auch nur ein Elektromotor mit Elektronik
drin steckt.
Dann werde ich es gleich nochmal morgen ausprobieren und wieder berichten obs funktioniert hat.
Wenn ja würd ich mich mega freuen, sollte ja machbar sein das die " Servos " langsamer anlaufen
Vielen Dank nochmal für die Info - währe ich nicht drauf gekommen
Lg Benny
- - - Aktualisiert - - -
in welchen teil muss denn die Zeile mit dem ...
...
int parabel(int val)
...
- - - Aktualisiert - - -Code:#include <Servo.h> #include <SPI.h> #include "RF24.h" Servo myServo1; Servo myServo2; const uint64_t pipe = 0xE8E8F0F0E1LL; RF24 radio(9,10); void setup() { //Serial.begin(9600); // zum Debuggen Kommentarzeichen entfernen // und diesen Arduino über Serial Mointor auslesen myServo1.attach(3); // Pin 3 myServo2.attach(4); // Pin 4 radio.begin(); radio.openReadingPipe(1, pipe); radio.startListening(); } void loop() { if (radio.available()) { bool done = false; int msg[2]; while (!done) { done = radio.read(msg, 8); //myServo1.write (msg[0]); //myServo2.write (msg[1]); myServo1.write ( parabel (msg[0]) ); myServo2.write ( parabel (msg[0]) ); //Serial.println(msg[0]); // zum Debuggen Kommentarzeichen entfernen //Serial.println(msg[1]); } } }
hab es zwischen setup und loop eingefügt und der kompilier meckert nicht !
war das richtig so ? oder muss es in den loop teil ?
Code:#include <Servo.h> #include <SPI.h> #include "RF24.h" Servo myServo1; Servo myServo2; const uint64_t pipe = 0xE8E8F0F0E1LL; RF24 radio(9,10); void setup() { //Serial.begin(9600); // zum Debuggen Kommentarzeichen entfernen // und diesen Arduino über Serial Mointor auslesen myServo1.attach(3); // Pin 3 myServo2.attach(4); // Pin 4 radio.begin(); radio.openReadingPipe(1, pipe); radio.startListening(); } int parabel(int val) { float a = (val - 127) / 13.35; int b = a*a; if (val < 127) b = -b; return b + 90; } void loop() { if (radio.available()) { bool done = false; int msg[2]; while (!done) { done = radio.read(msg, 8); //myServo1.write (msg[0]); //myServo2.write (msg[1]); myServo1.write ( parabel(msg[0]) ); myServo2.write ( parabel(msg[0]) ); //Serial.println(msg[0]); // zum Debuggen Kommentarzeichen entfernen //Serial.println(msg[1]); } } }
Guten Morgen Community,
ich wollte gestern, die Verbindung per NRF24L01+PA+LNA Modul testen,
bin gestern fast verzweifelt, weil es schon funktioniert hat, jetzt auf einmal nicht mehr!
Von der Schaltung hab ich nichts verändert, also Hardware mäßig alles I.O. denke ich mal
Da es am Roboter nicht funktioniert hat, hab ich es nochmal mit zwei Servos probiert,
und siehe da .... mit den Servos funktioniert es auch nicht!
Sie werden echt gut warm und brummen leicht, der Serielle Monitor gibt immer -1 aus!
Dann hab ich aber mein Code ausprobiert, wo ich vorher ohne Funkmodul verwendet habe,
also Servos an den zu Sendenden Arduino angeschlossen um auszuschließen das die neuen
Pottis nicht gehen!
Aber ohne NRF24L01+PA+LNA Modul geht es also sind die Potts schonmal I.O.
Es kann sein das ich vllt im Code ein Fehler habe, da ich ja das mit der Parabeln Werten von " Sisor " ausprobiert habe
und den Wert von 179 des Servos in 255 geändert hab!
Nur jetzt hab ich so lang in den Code geschaut das vllt jemand änderst was auffällt, was mir nicht auffällt.
(Seh vor lauter Bäumen den Wald nicht)
Arduino Code Sender:
Arduino Code Empfänger:Code:#include <SPI.h> #include "RF24.h" const uint64_t pipe = 0xE8E8F0F0E1LL; // Adresse des Übertragungskanals const int xPot1Pin = A1; // Joystick 1 Pin X Achse //const int yPot1Pin = A2; // Joystick 1 Pin Y Achse //const int xPot2Pin = A3; // Joystick 2 Pin X Achse const int yPot2Pin = A2; // Joystick 2 Pin Y Achse // Funkmodul NRF24L01 mit Arduino-Pins verbinden: // SCK -> 13 // MISO -> 12 // MOSI -> 11 // CSN -> 10 // CE -> 9 // SPI-Bus Pins 9 und 10 RF24 radio(9,10); void setup (void) { radio.begin(); radio.openWritingPipe(pipe); // Kanal öffnen } void loop (void) { int data[2]; data[0] = map(analogRead(xPot1Pin), 0, 1023, 255, 0); // liest den Wert des Potentiometers (Wert zwischen 0 und 1023) data[1] = map(analogRead(yPot2Pin), 0, 1023, 255, 0); // und skalierter den Wert (zwischen 0 und 179) für den Servo / Fahrtenregler //data[2] = map(analogRead(xPot2Pin), 0, 1023, 0, 179); //data[3] = map(analogRead(yPot2Pin), 0, 1023, 0, 179); radio.write(data, 8); // Adresse (data) und Länge (4) der zu sendenden Daten }
währe cool wenn mir evtll jemand ein Tipp geben könnte.Code:#include <Servo.h> #include <SPI.h> #include "RF24.h" Servo myServo1; Servo myServo2; const uint64_t pipe = 0xE8E8F0F0E1LL; RF24 radio(9,10); int parabel(int val) { float a = (val - 127) / 13.35; int b = a*a; if (val < 127) b = -b; return b + 90; } void setup() { Serial.begin(9600); // zum Debuggen Kommentarzeichen entfernen // und diesen Arduino über Serial Mointor auslesen myServo1.attach(3); // Pin 3 myServo2.attach(5); // Pin 5 radio.begin(); radio.openReadingPipe(1, pipe); radio.startListening(); } void loop() { if (radio.available()) { bool done = false; int msg[2]; while (!done) { done = radio.read(msg, 8); myServo1.write ( parabel(msg[0]) ); myServo2.write ( parabel(msg[1]) ); Serial.println(msg[0]); // zum Debuggen Kommentarzeichen entfernen Serial.println(msg[1]); } }
Mfg Benny
Lesezeichen