PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zwei Arduino´s drahtlos verbinden ??



Benny1989
12.03.2014, 21:12
Hallo Community,

ich wende mich an euch, mit einer Frage wo ich etwas Unterstützung brauche, weil es für mich Neuland ist!

Ursprungsgedanke: ich möchte mein Roboter ( Fahrtenregler SGS Electronic ) mit dem Arduino und zwei kleinen Joysticks ( aus altem PS2 Controller) steuern.
Habe nach 4 Tagen basteln, hinbekommen, zwei Servus mit Hilfe des beiden Joysticks zu steuern so wie ich es brauche, das hab ich soweit hinbekommen, auch
das ganze in den Roboter zu integrieren und an den Fahrtenregler anzuschließen.

Bild1: Mein Roboter RSL-7 Bild2: Mein Aufbau der Schaltung

27765
27766


Ich bräuchte jetzt ein Tipp wie ich das Drahtlos hinbekomme ???

Ich möchte keinen PC oder LapTop ins spiel bringen. Sondern am liebsten währen mir zwei Arduino´s, da ich mir noch gerne eine Gehäuse mit Display um die Joysticks bauen möchte.
Und mir da Werte des Roboters oder des gleichen an zu zeigen! Also es dürfen Ruhig zwei Arduino´s sein =)

Ist es einfacher das Xbee oder das Wifi Shield zu verwenden ? um mein Vorhaben zu realisieren. Da wo ich fahren möchte ist natürlich auch Wlan vorhanden.

Natürlich hab ich auch vorher versucht zu schauen ob im Forum so etwas schon mal einer gefragt hat, aber die haben alle was anderes vor wie ich, mit PC oder Controller oder so.

Also was würdet ihr Empfehlen um eine Drahtlose Verbindung herzustellen, Xbee leuchtet mir zb garnicht ein wie das funktioniert, weil so wie ich es jetzt habe funktioniert es und
da ich das noch nicht so lange mache und froh bin wie schnell ich es verstanden habe, um eigene Sketche zu schreiben so das es funktioniert :D :D

Nur das Drahtlose ist mir noch ein Rätsel, Kann mir jemand einen hilfreichen Tipp geben ?

Mfg Benny

Stone
12.03.2014, 22:29
Schau dir mal die NRF24L01+ Module an. Sollte für deinen Zweck reichen und kosten nur ein paar € und es gibt ne fertige Arduino lib für.

Gruß Matthias

Benny1989
13.03.2014, 06:55
Hallo Stone,

danke für die schnelle Antwort.
Okay das Modul leuchtet mir etwas ein, das währe dann dieses hier ! richtig ?

http://www.ledsee.com/index.php/sender-a-receiver/1000-meter-nrf24l01--pa--lna-module-detail

wenn ich das richtig verstanden habe, brauche ich zwei mal das NRF24L01+ Modul und noch einen Arduino ??

Kann ich da auch das Arduino Mini Board nehmen als zweites ? oder muss das dass UNO sein was ich schon habe ?

Dann geb ich ehrlich zu, das ich kein Plan hab zwecks dem Anschließen, der Module mit den Arduino´s,
vom Sketch ganz abgesehen -.-

Da bräuchte ich nochmal etwas Hilfestellung und Danke im voraus =)

Mfg Benny

Benny1989
13.03.2014, 10:23
Also die beiden würd ich mir besorgen .....

2x NRF24L01+
http://www.ebay.de/itm/281231129016?ssPageName=STRK:MEWAX:IT&_trksid=p3984.m1423.l2649

und 1x das Arduino Nano, das kommt dann in die selbstgebaute Fernsteuerung und das Arduino Uno wird im Roboter platziert:
http://www.ebay.de/itm/271327979679?ssPageName=STRK:MESINDXX:IT&_trksid=p3984.m1436.l2649

robin
13.03.2014, 10:36
Die nrf24L01 haben gegenüber den fertigen Modulen zwei Nachteile.
- Du hast kein fertiges Shield (nicht zwingend ein Problem)
- Sie benötigen eine 3,3V Versorgungsspannung. Du musst also noch einen kleinen Linearregler mit aufbauen für die Versorgung.

Ist beides nichts weltbewegendes, sollten aber mMn. erwähnt werden.

Zu deinen Fragen:
Ja, du brauchst 2 von denen Modulen. Die gibt es bei ebay zB. deutlich günstiger und auch ohne externe Antenne falls du mit weniger Reichweite leben kannst. Solltest halt darauf achten, dass du keinen aus Honkong erwischst wegen dem langen Versand.

Für den Anschluss brauchst du eine SPI-Schnittstelle, die bietet sowohl das Arduino Mini als auch Uno and Pin 10-13 (steht im Schaltplan). Das sind 4 Pins, die du 1-zu-1 verbinden musst.
MOSI (MasterOut-SlaveIn)
MISO (MasterIn-SlaveOut)
SCK (Clock)
CS bzw. SS (Chip/Slave Select)

Zusätzlich könntest du noch einen Pin für einen Interrupt nutzen, der signalisiert, dass eine neues Ereignis vorliegt (neue Nachricht oder fehlerhaftes senden) und einen um den Chip auszuschalten (CE) Diese sind aber nicht zwingend notwendig.


Ich hab die nrf24l01 selbst schon für ein Projekt genutzt. Sind recht nett, da da sie alles automatisch machen (Checksumme, Acknoledge, ...), wird viel Arbeit abgenommen mit der Funkverbindung.
Sie arbeiten im Übrigen Adressenbasiert und können bis zu 6 Kanäle (Adressen) überwachen, hätten also noch Luft für weiter Roboter oder Module. Könntest zB. auch eines zum Datenloggen an den PC hängen.

PICture
13.03.2014, 10:39
Hallo!

Mein praktischer Tipp wäre für Experimente als Funkverbindung eine Leitung mit bidirektionaler serieller Datenübertragung zu verwenden. Das kann man später durch zwei Transceiver ersetzen und müsste genauso funktionieren. ;)

Benny1989
13.03.2014, 11:38
okay, danke ihr beide für Eure Antworten.

Also das mit dem Verbinden hab ich geschnallt. also was MOSI, MISO, SCK und CS/SS angeht. Praktisch wie Robin erwähnt hat, alle 4 Lins verbinden mit dem nrf24L01+ ! Richtig ??

So aber was ich jetzt noch nicht geschnallt habe ist, wie das in meinem Sketch aussieht ???
Im Sketch steht ja z.B.: pinMode(servo_pin_1, OUTPUT);

wie sage ich jetzt dem Ardiono Nano, das er das über das nrf24L01+ an den Ardiono UNO an Pin 3 schicken soll ( int servo_pin_1 = 3; )
Das leuchtet mir jetzt noch nicht so ein ?

Mfg Benny

robin
13.03.2014, 12:41
Ganz so trivial wie ein einfaches Servo = 3 wird es mit einer Funkverbindung nicht.

Hier mal die Arduino Library mit Erklärung, was wo angeschlossen wird:
http://playground.arduino.cc/InterfacingWithHardware/Nrf24L01#.UyGf4vl5PxU

(Ich hab nicht mit der library gearbeitet, also muss nicht alles 1zu1 reproduzierbar sein)

Für eine Ansteuerung der Servos muss zu allererst eine Funkverbindung zwischen den beiden Modulen aufgebaut werden.
Hierzu muss der nrf24 initialisiert werden, sprich die gleiche Frequenz eingestellt, Adressen vergeben, Datenlänge eingestellt, ... werden.

An den Pins für den NRF24 müsstest du erst einmal nichts ändern, die werden mit dem Aufrufen er init-Funktion in der Nrf-Library eingestellt.

Als nächstes sollten beide Funkmodule als Empfänger konfiguriert werden.

Bis hier hin sollte alles recht gut von der Library abgedeckt werden.

Kommt es jetzt zum Senden von Daten, muss das entsprechende Funkmodul auf Senden umgestellt werden. Und dann können auf einen Rutsch bis zu 32 Byte an Nutzdaten übertragen werden.
Diese 32 Byte kannst du frei nutzen und ein entsprechendes Protokoll aufbauen mit dem die Teilnehmer Kommunizieren.

Also zB. 1 Byte gibt an, ob es Messwerte ("M") oder ein Befehl ("B") ist, der gerade gesendet wurde.
Im 2. Byte dann von welchen Sensor (ID) der Messwert kommt, bzw. welcher Servo (ID) angesprochen werden soll
In den darauf folgenden Bytes dann die entsprechenden Messwerte.

Du könntest auch ein "SERVO1 = 3" als String senden, das ist aber eher kontraproduktiv, weil man zu viel filtern muss bis man weiß, dass es um Servo1 geht.

Es sind auch nur bis zu 32 Byte, du kannst davon also auch nur 4 nutzen.

Wie gesagt, das ist nur ein Beispiel, wie so was aussehen kann.
Hier solltest du dir aber möglichst selber was überlegen, dass am besten zu deiner Aufgabe passt und am auch erweiterbar ist, dein Projekt soll ja wachsen.

Benny1989
13.03.2014, 12:52
okay danke für deine Erklärung, klingt logisch aber auch für ein Neuling etwas Bahnhof weil ich bis jetzt nur normale einfache Porgamme realisiert habe.

Nach etwas einlesen denke ich werd ich es dann mal probieren mein Programm umzuschreiben, da wird bestimmt die ein oder andere Frage noch auftauchen,
genauso kann ich ja bestimmt mal den Sketch dann hier Posten das du Robin evtll mal drüber schaust, das währ lieb, weil wie gesagt noch ist es für mich etwas schwierig,
aber ich geb mein bestes =)

Werde heute dann an der Fernsteuerung weiter arbeiten, und kann ja heute Abend mal Bilder Posten, und könnt gerne Pro oder Contra geben =)
Gebe mir größte mühe =)

Mfg Benny

robin
13.03.2014, 13:26
klar kann ich drüber schauen.

Wenn du noch ein blutiger Anfänger bist, würde ich es aber langsam angehen lassen. Bau dir als erstes das Protokoll und teste es ohne Funkverbindung, sondern mit einem Kabel wie PICture er geschrieben hat.

Die Daten tauscht du dann über die UART Schnittstelle aus (heißt beim Arduino glaub Serial). Am besten im Datenblatt, Internet einlesen, was das ist. Dann musst du zwar erstmal deinem Roboter hinterher laufen, aber es ist bedeutend einfacher zu realisieren als eine Funkverbindung.

Dabei solltest du auch erst mal das ganze mit der Kommunikation und Interaktion zwischen den beiden Mikrocontrollern lernen (zumindest die basics). Falls hier Probleme auftreten, sollten die sich leichter beheben lassen als mit einer Funkverbindung dazwischen.

Wenn das dann soweit klappt, würde ich erst die Funkverbindung angehen. Kabel haben den Vorteil, dass du sie siehst, du kannst die Signale recht einfach messen und auch "verfolgen". Beim Funk hast du mit den Sender/Empfänger einfach noch mehr Fehlermöglichkeiten dazwischen.

Benny1989
13.03.2014, 13:32
naja blutig nicht mehr ganz, also die Schaltungen wo ich möchte bekomme ich hin. =)

ja genau das mit dem erstmal ohne Funk, hab ich im ersten Beitrag oben versucht zu erklären =)
das Programm steht, die Schaltung auch, und funktunieren tut es auch, nur will ich meinem Roboter ja nicht weiter hinterher laufen.

Also es funktioniert so wie ich es will, nur jetzt brauch ich halt eine Funkverbindung, ja werde es langsam angehen lassen, das ich es auch verstehe.

Hier mal der Funktionierende Code ....





#include <Servo.h>


Servo servo_gas_bremse_1; // Servo Aufgabe Gas & Bremse
Servo servo_links_rechts_2; // Servo Aufgabe Links & Rechts

int potpin_links = A1; // Analog Pin für Poti - Gas & Bremse
int servo_pin_1 = 3; // Servo Pin

int potpin_rechts = A2; // Analog Pin für Poti - Links & Rechts
int servo_pin_2 = 5; // Servo Pin

int val; // Variable zum Lesen des Wertes des Analog Pin´s

void setup()
{
servo_gas_bremse_1.attach(servo_pin_1 = 3); // Servo auf Pin 3 setzen
pinMode(servo_pin_1, OUTPUT); // Servo_Pin als Ausgang deklarieren

servo_links_rechts_2.attach(servo_pin_2 = 5); // Servo auf Pin 5 setzen
pinMode(servo_pin_2, OUTPUT); // Servo_Pin als Ausgang deklarieren
}

void loop()
{
val = analogRead(potpin_links); // liest den Wert des Poti´s zwischen 0 und 1023
val = map(val, 0, 1023, 0, 180); // skalieren das der Servo weis, wo 0 und 180 ist
servo_gas_bremse_1.write(val); // Servo auf den Skalierten Wert setzen
delay(15); // 15 mS warten dann wieder abfragen

val = analogRead(potpin_rechts); // liest den Wert des Poti´s zwischen 0 und 1023
val = map(val, 0, 1023, 0, 179); // skalieren das der Servo weis, wo 0 und 180 ist
servo_links_rechts_2.write(val); // Servo auf den Skalierten Wert setzen
delay(15); // 15 mS warten dann wieder abfragen
}



Mfg Benny

robin
13.03.2014, 14:08
Schon klar, dass du zZ. auch schon hinterher rennst, aber mit dem Funk kommt ja auch noch ein zweiter Mikrocontroller (der auch Fehler verursachen kann). Also erst mal mit beiden Mikrocontrollern und Kabel testen und dann auf Funk umbauen.

Du hast da einen Anfängerfehler in deinem Code ;)



void loop() {
val = analogRead(potpin_links); // liest den Wert des Poti´s zwischen 0 und 1023
val = map(val, 0, 1023, 0, 180); // skalieren das der Servo weis, wo 0 und 180 ist
servo_gas_bremse_1.write(val); // Servo auf den Skalierten Wert setzen
delay(15); // 15 mS warten dann wieder abfragen

val = analogRead(potpin_rechts); // liest den Wert des Poti´s zwischen 0 und 1023
val = map(val, 0, 1023, 0, 179); // skalieren das der Servo weis, wo 0 und 180 ist
servo_links_rechts_2.write(val); // Servo auf den Skalierten Wert setzen
delay(15); // 15 mS warten dann wieder abfragen
}


Das Programm wird nach einander abgearbeitet. Also von oben bis unten und erst dann fängt es wieder oben an.
Sprich durch die beiden delays sendest du das Servosignal erst all 30ms(+ 2ms für ein Servo.write + ein bisschen was für den rest des Programms) und nicht wie du es dir vermutlich denkst alle 15ms.

Also entweder nur einmal den delay oder eben bei beiden die halbe Zeit.
Was du auch bedenken solltest, bei dem verwenden der delay Funktion kann der Controller während der gesamten Zeit nichts machen. Hier solltest du dich bei Zeiten mal in das Thema Timer einlesen.
Dann kannst du die Servos über einen Interrupt quasi parallel zu einem Programm ansteuern.

Benny1989
13.03.2014, 14:24
okay, ja das ist mir nicht aufgefallen .... =)

also müsste jedes delay 7,5 haben ??? habe ich das richtig verstanden?

Aber was ich mir auch schon überlegt habe, das ich zwei Arduino Nano´s kaufe, die kosten ja so gut wie nichts
und Platz hab ich für die Nano´s im Roboter sowohl auch in der Fernbedienung.

Das hab ich mir e schon überlegt bzw währe mir lieber, das die zwei Nano´s dann rein die Steuerung des Roboters übernehmen sollen,
und der Uno dann auf dem Roboter andere aufgaben Übernimmt.

Währe doch eine Möglichkeit, die mir ehrlich gesagt besser gefallen würde ??

Benny1989
14.03.2014, 17:25
Hallo Zusammen, Update Fernsteuerung;

habe gestern angefangen, meine Fernsteuerung zu bauen. Habe mein alten PS2 Controller auseinander gebaut und die zwei Joysticks ausgelötet
und wieder auf eine Punkt Platine aufgelötet. Heute bin ich dazugekommen, nachdem ich mir es konstruiert habe und die Fräsprogramme
gemacht habe, die Aussparungen in die Oberschale ein zu fräsen ( Zur Info: Die Box hab ich mir aus meinem Elektriker Laden meines Vertrauens besorgt).
Einmal für das 16x2 Display und zwei mal zwei Durchmesser für die Joysticks.

( Der eine für den Roboter RSL-7 und den Roboter Arm und die beiden Oberen die ich noch aus meinem zweiten Controller auslötet muss, für mein kleinen Roboter)

27776 27777

Morgen werde ich die Kabel anlöten und die Schaltung nochmals testen.

Wie gesagt ohne Funk funktioniert es ja.
Werde am Wochenende auch die beiden Nano´s bestellen und zwei mal das Funkmodul, werde aber das größere Model nehmen, mit externer Antenne!
Gibt nie genug Reichweite und die 30 bis 40 Meter würden momentan reichen, aber irgend wann brauch ich es und dann fange ich wieder an!
Also nehme ich gleich das größere Model =)

Mit freundlichen Grüßen Benny

p.s.: Die Schutzfolie is noch auf dem Display, deswegen sieht es so komisch aus auf Bild 1 =)

Benny1989
15.03.2014, 19:26
Nabend liebe Community,

habe heute die Fernsteuerung fertig gemacht, alles verlötet und angeschlossen.
Habe es auch nochmals am Roboter getestet, funktioniert einwandfrei - also praktisch ohne Funk!

Jetzt hab ich noch zwei Frage:

Frage1:

Wenn ich mir das NRF24L01+ Modul mit 1000 Meter Reichweite kaufe, hat das ja eine Externe Antenne!
Gibt es ein kurzes Kabel? zwischen Modul und Antenne ? Wenn nicht ist das ein wenig blöd in meiner Fernsteuerung
zu verbauen! Wenn es ein kurzes Kabel gäbe oder man das Selbst machen kann währe das perfekt !

Oder meint ihr das Modul mit weniger Reichweite reicht auch?


Frage2:

Zu dem Link den " Robin " gepostet hat, hat da jemand ein anderes Tutorial ? evtll auf deutsch?
Hab nur Englisch sprachige gefunden, da tu ich mir bei sowas kompliziertem schwer =(

Das ich mich da einarbeiten kann um mein Programm dann zu ändern für den Arduino der sendet
und für den Arduino der dann empfängt. Währe mega lieb =)

Mfg Benny und ein schönes Wochenende

Benny1989
17.03.2014, 17:25
Hallo Community,

habe soeben einen Arduino Nano V3.1 bestellt ( Erstmal ein Nano, hab ja noch das UNO, wenns funktioniert
dann hole ich mir noch ein Nano ) und 2x das NRF24L01+ Modul,
ein Arduino Nano Shield zum leichteren Hand haben hab ich mir auch gleich mit dazu bestellt.

Ich habe zwar kein Deutsches Tutorial über das NRF24L01+ Modul gefunden zumindest nicht
wo es um Potentiometer und Servos geht.

Aber ich bin fündig geworden was den Sketch angeht, könnte mir jemand sagen ob ich diesen
so verwenden kann? mir ist nichts aufgefallen bzw einzuwenden!
Vielleicht könnte jemand mit NRF24L01+ Modul Erfahrung mal drüber schaun und mir Feedback geben.

Code für Arduino Nano alias Sender:


// Arduino Nano alias Sender - Version 2

#include <SPI.h>
#include "RF24.h"

int msg[1];

//Контакты от радиомодуля NRF24L01 подключаем к пинамнам -> Arduino

//SCK -> 13//MISO -> 12//MOSI -> 11//CSN -> 10//CE -> 9

// Set up nRF24L01 radio on SPI bus plus pins 9 & 10

RF24 radio(9,10);

const uint64_t pipe = 0xE8E8F0F0E1LL; // адрес канала передачи

int potpin = 0; // analog pin used to connect the potentiometer

int val; // variable to read the value from the analog pin

void setup(void)
{
radio.begin();
radio.openWritingPipe(pipe); // Открываем канал передачи
}

void loop(void)
{
val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023)
val = map(val, 0, 1023, 0, 179); // scale it to use it with the servo (value between 0 and 180)

msg[0] = val;

radio.write(msg, 1);
}


Code für Arduino Nano alias Empfänger:


// Arduino Nano alias Sender - Version 2

#include <SPI.h>
#include "RF24.h"

int msg[1];

//Контакты от радиомодуля NRF24L01 подключаем к пинамнам -> Arduino

//SCK -> 13//MISO -> 12//MOSI -> 11//CSN -> 10//CE -> 9

// Set up nRF24L01 radio on SPI bus plus pins 9 & 10

RF24 radio(9,10);

const uint64_t pipe = 0xE8E8F0F0E1LL; // адрес канала передачи

int potpin = 0; // analog pin used to connect the potentiometer

int val; // variable to read the value from the analog pin

void setup(void)
{
radio.begin();
radio.openWritingPipe(pipe); // Открываем канал передачи
}

void loop(void)
{
val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023)
val = map(val, 0, 1023, 0, 179); // scale it to use it with the servo (value between 0 and 180)

msg[0] = val;

radio.write(msg, 1);
}

Währe nett wenn mir jemand weiter helfen könnte =)

Mfg Benny

Benny1989
22.03.2014, 20:17
Hat keiner einen Rat ?
bzw. ob das so ein Code währe wo ich brauche ?

Habe immer noch kein Tutorial gefunden wo in deutscher Sprache.

gibt ja noch andere Drahtlose Verbindungen!
Wie sieht es denn mit Xbee oder Wifi aus?

Ist das so viel komplizierter als Funk?
Wobei das ja nicht so kompliziert sein kann, ich möchte ja nur mit meinen zwei Joystick´s
zwei Servos ( mein Fahrtenregler von SGS ) ansteuern.

Und ich hab ja mein Code schon, und ausgiebig getestet auch schon, nur möchte ich nicht
unbedingt meinem Roboter hinter her laufen ;-)

Bitte nochmals um Hilfestellung und allen ein schönes Wochenende

Mfg Benny

Sisor
22.03.2014, 22:15
Du hast 2x den (identischen) Sendercode gepostet. Der von dir gepostete Code sieht schlüssig aus.

Übersetzt und bearbeitet:

// Arduino Nano alias Sender - Sisor's Version

#include <SPI.h>
#include "RF24.h"

const uint64_t pipe = 0xE8E8F0F0E1LL; // Adresse des Übertragungskanals
const int potPin = 0; // Potentiometer-Pin

// 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 potValue = analogRead(potPin); // liest den Wert des Potentiometers (Wert zwischen 0 und 1023)
int scaledValue = map(potValue, 0, 1023, 0, 179); // skalierter Wert (zwischen 0 und 179) für den Servo

radio.write(&scaledValue, 1); // Adresse (&scaledValue) und Länge (1) der zu sendenden Daten
}

Benny1989
22.03.2014, 22:25
hey, danke für deine Antwort


ups, is mir garnicht aufgefallen, hier der Empfänger Code:



// Arduino Nano alias Empfänger - Version 2

#include <Servo.h>
#include <SPI.h>
#include "RF24.h"

Servo myservo; // create servo object to control a servo

//Контакты от радиомодуля NRF24L01 подключаем к пинамнам -> Arduino

//SCK -> 13//MISO -> 12//MOSI -> 11//CSN -> 10//CE -> 9

// Set up nRF24L01 radio on SPI bus plus pins 9 & 10

RF24 radio(9,10);

const uint64_t pipe = 0xE8E8F0F0E1LL; // адрес канала

int msg[1];

void setup()

{

// Serial.begin(9600);

myservo.attach(3); // attaches the servo on pin 3 to the servo object

radio.begin();

radio.openReadingPipe(1,pipe); // Открываем один из 6-ти каналов приема

radio.startListening(); // Начинаем слушать эфир
}

void loop()

{
if (radio.available())
{

bool done = false;
while (!done)
{

done = radio.read(msg, 1);

myservo.write (msg[0]);

//Serial.println(msg[0]);

}

}

}

Ist der Code aber schon für zwei Joystick´s / Potis ?
Weil ja nur einmal:

const int potPin = 0

drin steht.

Ansogst leuchtet es mir ein was du geändert hast.
Schade das es kein Deutsches Tutorial gibt ......

Sisor
22.03.2014, 22:40
Der Code ist leicht modifizierbar für (fast) beliebig viele zu sendende Daten.

Code für 2 Potis:


// Arduino Nano alias Sender - Sisor's Version

#include <SPI.h>
#include "RF24.h"

const uint64_t pipe = 0xE8E8F0F0E1LL; // Adresse des Übertragungskanals
const int xPotPin = 0; // Potentiometer-Pins
const int yPotPin = 1;

// 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(xPotPin), 0, 1023, 0, 179);
data[1] = map(analogRead(yPotPin), 0, 1023, 0, 179);

radio.write(data, 2); // Adresse (data) und Länge (2) der zu sendenden Daten
}

Benny1989
22.03.2014, 22:44
okay leuchtet auch ein....

Danke für deine Hilfe,

kannst du mir noch verraten, wie es mit dem Empfänger Code aussieht?
Passt der?

Also an dem die zwei Servus bzw der Fahrtenregler hängt?

Sisor
22.03.2014, 23:10
So könnte das dann aussehen:


// Arduino Nano alias Empfänger - Sisor's Version

#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, 2);
myServo1.write (msg[0]);
myServo2.write (msg[1]);
//Serial.println(msg[0]); // zum Debuggen Kommentarzeichen entfernen
//Serial.println(msg[1]);
}
}
}

Benny1989
23.03.2014, 00:21
Okay das sieht doch mal sehr gut aus, so verstehe ich es wenigstens mit deinen Kommentaren.

Montag oder Dienstag sollten die NRF24L01 Module da sein, dann kann ich es testen.
Werde dann berichten ob es funktioniert hat.

Danke Sisor für deine Hilfe, echt klasse =)

Mfg Benny

- - - Aktualisiert - - -

also wenn ich es richtig verstanden habe,

müsste der Code für 4 servos, wie folgt aussehen:




// Arduino Nano alias Empfänger - Benny´s 4 Servo´s Version

#include <Servo.h>
#include <SPI.h>
#include "RF24.h"

Servo myServo1;
Servo myServo2;
Servo myServo3;
Servo myServo4;
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
myServo3.attach(5); // Pin 5
myServo4.attach(6); // Pin 6
radio.begin();

radio.openReadingPipe(1, pipe);
radio.startListening();
}

void loop()
{
if (radio.available())
{
bool done = false;
int msg[4];
while (!done)
{
done = radio.read(msg, 4);
myServo1.write (msg[0]);
myServo2.write (msg[1]);
myServo3.write (msg[2]);
myServo4.write (msg[3]);

//Serial.println(msg[0]); // zum Debuggen Kommentarzeichen entfernen
//Serial.println(msg[1]);
}
}
}



- - - Aktualisiert - - -

Ist die folgende Schaltung richtig?

Wenn ich es richtig verstanden habe mit dem verkabeln sollte es dann so aussehen?

27822

Stromversorgung für die Arduinos fehlen, aber die kann man sich ja denken ;)
Wenn die Joysticks nicht richtig verkabelt sind, ist nicht schlimm, ich weis an den
realen Joysticks wo die beiden analogen Ausgänge sind bzw wo ich die an Pin A0 und Pin A1 anschließen muss.

Sollte doch so richtig sein? und die Servos sind natürlich die beiden Anschlusskabel des Fahrtenreglers ;)

Sisor
23.03.2014, 11:02
Ich würde es so machen:

...
void loop()
{
if (radio.available())
{
bool done = false;
int msg[4];
while (!done)
{
done = radio.read(msg, 4);
}
myServo1.write (msg[0]);
myServo2.write (msg[1]);
myServo3.write (msg[2]);
myServo4.write (msg[3]);
}
}

Benny1989
23.03.2014, 11:13
okay,

was bewirkt das ? das der Satz:

done = radio.read(msg, 4);

jetzt in {} klammer alleine steht?

wobei ich ja vorerst e nur zwei Servos habe also einen Fahrtenregler ...

Das Schaltbild passt auch soweit oder ? werd es heute nochmal auf eine
Platine zeichnen und nicht mit den BreadBoard´s

Sisor
23.03.2014, 11:26
okay,

was bewirkt das ? das der Satz:

done = radio.read(msg, 4);

jetzt in {} klammer alleine steht?

Aus der RF24.h:

/**
* Read the payload
*
* Return the last payload received
*
* The size of data read is the fixed payload size, see getPayloadSize()
*
* @note I specifically chose 'void*' as a data type to make it easier
* for beginners to use. No casting needed.
*
* @param buf Pointer to a buffer where the data should be written
* @param len Maximum number of bytes to read into the buffer
* @return True if the payload was delivered successfully false if not
*/
bool read( void* buf, uint8_t len );

Also: Erst wenn ein Daten-Paket empfangen wurde gehts weiter.

Schaltung sieht ok aus.

Benny1989
23.03.2014, 11:35
ups okay, also kann ich es auch bei nur zwei servos genau so machen das .... done = radio.read(msg, 4); ... alleine in {} klammern steht .... oder ?

supi dann kann ich die Schaltung so aufbauen und warte nur noch auf die Funkmodule ...

Benny1989
28.03.2014, 14:24
ich hätte mal eine Technische Frage,
und zwar zu meinen NRF24L01 Modulen mit externer Antenne!

Gibt es ein Verbindungskabel ? zwischen Modul und Antenne ?
Denn da wo ich gerne die Antenne hätte, hab ich unter umständen kein Platz für das Modul
und der Arduino mit meinem NRF24L01 Shield ist auch an ganz anderer Stelle.

Hier nochmal ein Bild von dem Modul mit der Antenne.

27881

Über einen kleinen Tipp währe ich dankbar =)

Mfg Benny

Stone
28.03.2014, 15:03
Ja, gibts. Einfach nach SMA-Verlängerungskabel suchen. Bei den 2,4 GHz-Modulen kann man auch einfach W-Lan Zubehör verwenden.

Gruß Matthias

Benny1989
28.03.2014, 18:19
Hey, danke für den Tip, meintest du so etwas hier ?

http://www.reichelt.de/LAN-WL-AK-RSRK-1/3/index.html?&ACTION=3&LA=446&ARTICLE=53101&artnr=LAN+WL-AK-RSRK-1&SEARCH=SMA+Kabel

Lg Benny

Stone
28.03.2014, 21:30
Ja, die Frage ist nur ob bei dem Modul eine SMA oder SMA-R Stecker verwenden wird.


Gruß Matthias

Benny1989
28.03.2014, 21:35
ja das hab ich mir heute mittag auch gedacht .....

ich weis auch nicht wo der unterschied der beiden arten ist?
Vllt hat das ja schonmal jemand gemacht und kann mir berichten?

wenn nicht beide kaufen und ausprobieren mit einem der beiden muss es ja funktionieren oder ?

Stone
28.03.2014, 22:57
Bei SMA hat die Antenne den Stecker-Pin und bei SMA-R hat die Antenne die Buchse. Beide Kabel kaufen geht natürlich sind ja nicht so teuer.

Edit:
http://www.ebay.de/itm/NRF24L01-PA-LNA-Wireless-2-4GHz-Modul-Module-Antenna-Antenne-Transceiver-AR-/301043685140?pt=Wissenschaftliche_Ger%C3%A4te&hash=item46179a1714
Hier sieht es nach einem SMA aus

Gruß Matthias

Benny1989
29.03.2014, 20:59
@ Sisor,

eine Frage kann es sein das in dem Code evtll im Empfänger Code ein Fehler ist?

Heute sind doch die NRF24L01 Module gekommen, hab alles angeschlossen,
aber es funktioniert nur ein Servo nicht beide.
Wenn ich aber ein Servo einstecke, und zwar der erste (xPot1Pin auf A1 ) der geht
der andere Servo geht nicht?

Wenn ich jetzt die beiden Servos bzw die Analog Pins am Arduino Sender ..... dann geht der andere nicht !

Das deutet doch auf ein Anschluß Fehler hin oder ?
Habe aber den ganzen Abend geschaut woran es liegt!

Was mir auch noch aufgefallen ist wenn beide servos angeschlossen sind .... zucken beide ein wenig,
und wie gesagt wenn nur der besagte Servo also Analog 1 angeschlossen ist geht der eine Servo.

Hast du mir nochmals ein kleinen Tip?

Lg Benny

- - - Aktualisiert - - -

Nochmal als kurzen Nachtrag, wenn ich die beiden Analog Pins also A1 und A2 tausche gehen doch beide Servos.

Sprich abwechselt gehen sie wenn ich es immer nur mit einem probiere.

Wenn ich beide einstecke, dann zucken sie nur so leicht.
Jetzt weis ich nicht, ob es Hard oder Software ist :P

Soll ich nochmal beide Code´s posten wo ich jetzt tatsächlich auf den Arduinos habe?
Vllt hab ich was übersehen!

Sisor
29.03.2014, 21:08
Das hört sich doch schon mal gut an.

Jetzt weis ich nicht, ob es Hard oder Software ist :P
Das kannst du überprüfen. Häng den Empfänger-Arduino per USB an deinen Rechner und lass dir mit Serial.print die empfangenen Werte im Serial-Monitor der Arduino-IDE ausgeben. Dann kannst du sehen, womit die Servos wertemäßig gefüttert werden.

Benny1989
29.03.2014, 21:18
okay ja das hab ich gemacht

27890

da saust die ganze zeit 88 und -31743 durch
immer die beiden zahlen die ganze zeit

- - - Aktualisiert - - -

okay nochmal ein Nachtrag ..... der eine servo funkt, da zeigt der Serielle Monitor 0 oder 88 oder 179 je nach Stellung

aber der andere Servo keine Funktion .....

Sisor
29.03.2014, 21:20
Theoretisch sollten diese Werte die Potistellungen des Senderarduinos repräsentieren. Getestet?

Benny1989
29.03.2014, 21:52
ja bei dem einen potz gehts ( 0 - 88 - 179 )
und bei dem zweiten servo gehts nicht!

ich bin mir aber ziemlich sicher das es nicht die Schaltung ist da alles so steckt wie es soll.

Also Poti´s bei A1 und A2 und Servos bei Pin 3 und Pin 4.

Weil wie gesagt wenn ich die beiden Analog Pins tausche, geht halt der andere Servo der vorher nicht ging und der Servo wo vorher
ging geht nicht mehr, also kanns ja eigentlich ned an der Schaltung liegen. oder ?

- - - Aktualisiert - - -

hab auch mal den myServo Pin von 4 auf 5 geändert weil Pin5 ja ein PWM ist aber auch keine Funktion :(

Sisor
29.03.2014, 21:53
Nein, das Problem wohl softwareseitig.
Ich glaube hiermit klappts:

Sender ändern:
...radio.write(data, 2 );...
wird zu:
...radio.write(data, 8 );...

Empfänger ändern:
...done = radio.read(msg, 2 );...
wird zu:
...done = radio.read(msg, 8 );...

Benny1989
29.03.2014, 22:04
du bist der beste :D :D

habs in (´8 statt 2 geändert .... und jetzt gehts mit den servos, so das ich es morgen am Roboter testen kann.

Was hat das 8 jetzt bewirkt in der Zeile ?

wir haben doch nur 2 datenpakete zu senden, und nicht 8 ?

Sisor
29.03.2014, 22:13
Ein int besteht aus 4 byte. Du willst zwei int senden, also 8 Byte.
Jetzt sendest du allerdings einen Haufen Nullen durch die Gegend.
Nicht schlimm, aber leicht zu optimieren.
Kannst ja selber mal versuchen.
( statt int byte benutzen, mit map() den analogRead-Wert auf 8Bit begrenzen).

Benny1989
29.03.2014, 22:18
okay das kann ich gerne mal probieren kann dann berichten obs geklappt hat.

eine andre frage, wenn ich jetzt die poti Bewegung rumdrehen möchte, also wenn er
Vorwärts fährt statt Rückwärts oder umgedreht.

Muss ich dann einfach aus:
data[0] = map(analogRead(xPot1Pin), 0, 1023, 0, 179);

das hier machen ?
data[0] = map(analogRead(xPot1Pin), 179, 1023, 0, 0);

oder wie kann man so etwas herum drehen ?

Sisor
29.03.2014, 22:23
data[0] = map(analogRead(xPot1Pin), 0, 1023, 179, 0);

Kannst du hier (http://arduino.cc/en/Reference/Map) nachlesen.

Benny1989
29.03.2014, 22:26
ah okay, danke für den Link ...

eine Frage noch zu eben, wenn ich jetzt 4 Servos hätte also alle 4 Bewegungen der Potis benutzen,
hab ich ja 4 int´s sprich 16 Byte.

muss ich dann die beiden Werte 8 auf 16 setzten? also den wert wo wir aus 2, 8 gemacht haben?

Sisor
29.03.2014, 22:32
void loop (void)
{
byte data[4];
data[0] = map(analogRead(xPotPin), 0, 1023, 0, 255);
data[1] = map(analogRead(yPotPin), 0, 1023, 0, 255);
data[2] = map(analogRead(aPotPin), 0, 1023, 0, 255);
data[3] = map(analogRead(bPotPin), 0, 1023, 0, 255);

radio.write(data, 4); // Adresse (data) und Länge (4) der zu sendenden Daten
}

Benny1989
29.03.2014, 22:36
achso okay?
so wie du ja letzt schon geschrieben hast, mit (data, 4);

dachte eben nur weil wir das ja grad geändert hatten, das dass dann damit zusammen hängt das man das immer er weigern muss.

Hast du das nur so geschrieben? oder wieso steht in deinem Code 255 ? - ich verwende ja 179!
Das hart nichts zur Folge?, frage lieber nach :D

Sisor
29.03.2014, 22:39
Gegenfrage: Warum hast du denn an besagter Stelle 179 geschrieben?

Benny1989
29.03.2014, 22:42
grins

weil damals in dem Beispiel, Servos anzusteuern ...

val = map(val, 0, 1023, 0, 179);

... stand,

deswegen :)
und
weil das doch die Grad Zahlen sind von den Servos, 0 und 180 Grad.

Sisor
29.03.2014, 22:57
Also:
Ein AnalogIn liefert Werte zwischen 0 und 1023 (10 Bit).
Aber ein PWM-Ausgang kann nur Werte zwischen 0 und 255 ausgeben (8 Bit).
Der Befehl
byte wert = map(analogRead(Pin), 0, 1023, 0, 255);
dient im einfachten Fall als Umrechner zwischen beiden Werten.


Soweit die Theorie. In der Praxis muss man halt gucken, ob die Poti-Schaltung tatsächlich den ganzen Bereich von 0 bis 5V abbildet.

Und welche Werte dann am Ausgang tatsächlich gebraucht werden. Wenn dein Servo-MaxWert 179 sein soll, dann setzt du natürlich den ein.

Benny1989
29.03.2014, 23:01
okay, danke für deine Erklärung, lieb von dir =)
Dient also als Umrechner.

Ich wollte e schauen den wert morgen am Roboter auszuprobieren, also 255 zu verwenden.

Weil bei dem Wert 179 für die servos, regieren die Potis was ich habe nur fast nichts oder fast alles.
Also, garnicht fahren oder Vollgas und das is ja nicht so schön.
Sollte schon etwas geschmeidiger sein, das hab ich grad eben bei den Servos gesehen.

Kann es sein, das es mit "255" besser ist? bzw sensibler ist was die potis angeht ?

Sisor
29.03.2014, 23:14
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.

Benny1989
29.03.2014, 23:21
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

Benny1989
31.03.2014, 19:16
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

Sisor
31.03.2014, 20:54
Was kann ich denn dagegen tun?
Hab den wert der Servos schon von 179 auf 255 geändert
Alles noch mal logisch durchdenken.
Was für Werte muß der Servo bekommen, damit er weniger stark dreht?

Benny1989
31.03.2014, 20:58
jetzt komm ich durcheinander .....

0 und 180 (179) sind doch die Gradzahlen des Servos oder nicht ?

Sisor
31.03.2014, 21:21
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?

Benny1989
31.03.2014, 21:30
achso aneinander vorbei geredet :D :D

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:

27913

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

Sisor
31.03.2014, 22:25
Keine Garantie, dass das so funktioniert wie du willst,
aber theoretisch sollte das klappen.

Folgende Schritte:

1. Sender muss Werte von 0-255 schicken:

...map(analogRead(xPotPin), 0, 1023, 0, 255);...

2. Empfänger-Code bekommt eine zusätzliche Funktion:
Hier werden die linearen Werte in eine quadratische Parabel überführt.


...
int parabel(int val)
{
float a = (val - 127) / 13.35;
int b = a*a;
if (val < 127) b = -b;
return b + 90;
}
...


3. Und in die loop() statt:


...myServo1.write (msg[0]);...
schreibst du:


...myServo1.write( parabel(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.

Benny1989
31.03.2014, 22:48
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 :D

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)
...


#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]);
}
}
}

- - - Aktualisiert - - -

hab es zwischen setup und loop eingefügt und der kompilier meckert nicht !

war das richtig so ? oder muss es in den loop teil ?


#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]);
}
}
}

Benny1989
12.04.2014, 08:26
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:

#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
}

Arduino Code Empfänger:

#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]);
}
}


währe cool wenn mir evtll jemand ein Tipp geben könnte.

Mfg Benny

Sisor
12.04.2014, 10:37
Sie werden echt gut warm und brummen leicht, der Serielle Monitor gibt immer -1 aus!
Der Empfänger empfängt nichts (-1). Verkabelung und Kontakte überprüfen.

Dieser Code funzt:

Sender:

...
void loop (void)
{
byte data[2];
data[0] = map(analogRead(xPot1Pin), 0, 1023, 255, 0);
data[1] = map(analogRead(yPot2Pin), 0, 1023, 255, 0);
radio.write(data, 2);
}

Empfänger:

#include <Servo.h>
#include <SPI.h>
#include "RF24.h"

Servo myServo1;
Servo myServo2;
const uint64_t pipe = 0xE8E8F0F0E1LL;

RF24 radio(9,10);

byte parabel(byte val)
{
float a = (val - 128) / 13.45;
byte 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;
byte msg[2];
while (!done)
{
done = radio.read(msg, 2);
}

//_DEBUG:
Serial.print("Wert 1: ");
Serial.print(msg[0]);
Serial.print(" / ");
Serial.print(parabel(msg[0]));
Serial.print(" Wert 2: ");
Serial.print(msg[1]);
Serial.print (" / ");
Serial.println(parabel(msg[1]));
//_END_DEBUG

myServo1.write ( parabel(msg[0]) );
myServo2.write ( parabel(msg[1]) );
}
}
Wie du siehst, wird der Motor erst gesteuert, wenn auch Daten empfangen wurden.
Und ich hab die Datentypen getauscht, Byte statt Integer, weil die 8 Bit eines Byte ausreichen bzw. die restlichen Nullen des Integer überflüssig sind. -> Code effizienter.

Benny1989
12.04.2014, 10:55
Okay Danke Sisor;

ich habe heute mittag zeit es zu testen und kann dann anschließend wieder berichten,

ich muss nur schauen zwecks der Verkabelung, wobei ich ja nichts geändert hatte an der Verkabelung

Benny1989
13.04.2014, 15:23
So ich kann nur positives Berichten ....

die Code Änderung von Integer auf Byte hat funktioniert .... :)
Genau so wie Sisor´s Parabel Umprogrammierung extrem geil funktioniert hat.

Der Roboter reagiert genau richtig auf die Potti´s, so das ein schönes Fahrbild entsteht ....

Also das mit der Parabel war Gold richtig und ebenso Gold wert :)
Die NRF2401L+PA+LNA Module arbeiten sauber und ich konnte mal ein reichweiten Test von
400 Metern durchführen ohne Störung und jegliches Zucken. Das ist für den Mäheinsatz in unserem
Garten mehr als ausreichend.

Ich bedanke mich für eure Tipps und Sisor´s Hilfe beim Code und die geniale Idee mit der Parabel ..... echt super.
Ich hab ja noch weitere Ideen ... da kann ich die ganzen Info´s gut verwenden =)

Mfg Benny

Sisor
13.04.2014, 16:03
So ich kann nur positives Berichten ....

die Code Änderung von Integer auf Byte hat funktioniert .... :)
Genau so wie Sisor´s Parabel Umprogrammierung extrem geil funktioniert hat.

Der Roboter reagiert genau richtig auf die Potti´s, so das ein schönes Fahrbild entsteht ....

Also das mit der Parabel war Gold richtig und ebenso Gold wert :)
Die NRF2401L+PA+LNA Module arbeiten sauber und ich konnte mal ein reichweiten Test von
400 Metern durchführen ohne Störung und jegliches Zucken. Das ist für den Mäheinsatz in unserem
Garten mehr als ausreichend.

Ich bedanke mich für eure Tipps und Sisor´s Hilfe beim Code und die geniale Idee mit der Parabel ..... echt super.
Ich hab ja noch weitere Ideen ... da kann ich die ganzen Info´s gut verwenden =)

Mfg Benny

Freut mich. :)Wenn du zufrieden und fertig mit dem Projekt bist, kannst du es ja mal als Ganzes vorstellen. Ich glaube nämlich, dass so ein Mähroboter-Projekt viele Nachahmer haben könnte.:cool:

Nochmal zur 'Parabel':
27981
Für Mathe-Freaks: Es handelt sich um eine in den Wertebereich von 0-180 eingepasste Parabel 2.Ordnung, wobei der linke Teil nach unten gespiegelt ist.

byte parabel(byte val)
{
float a = (val - 128) / 13.45;
byte b = a*a;
if (val < 128) b = -b;
return b + 90;
}
Wie man sieht, werden Werte von 0 - 255 von der Funktion als Eingabewerte erwartet. Der Bereich um 127 repräsentiert hierbei die Ruhelage oder Mittelstellung des Joystickpotis. Die Funktion beruhigt den diesen Mittelstellungsbereich und rechnet gleichzeitig auf den vom Fahrtenregler erwarteten Wertebereich zwischen 0 und 180 um.

Benny1989
13.04.2014, 16:14
ja wenn der RSL-7 fertig ist werde ich ihn mal vorstellen.
Habe gestern 1h damit gemäht.
Werde die reifen jetzt noch optimieren, ich hab schon neue mit wesentlich mehr Profil bestellt,
da die Traktion nicht so war wie ich es mir mit den jetzigen Reifen vorgestellt hatte.

Ich muss auch mal meine Fernsteuerung vorstellen, mit den Display, und dem LED Bargraphen ....
Wo es in meinen anderen Themen drum ging mit den Schieberegistern, ist echt toll geworden.

Ich hab noch so paar Ideen unter anderem ein kleineren Roboter mit Kettenantrieb, ein Servo Roboterarm der
den kleinen von dem großen auf den Boden hebt.

Also noch jede Mänge vor .... =)

Das mit der Parabel ist echt eine geniale Geschichte, zumindest für meine Zwecke, bzw kann das ja jeder anwenden
der sanftere Servobewegungen braucht!

Benny1989
11.05.2014, 13:16
Hallo Community,

könntet ihr euch nochmals meine beiden Code´s anschauen?
folgendes, ich hab meine Schaltung komplett mit neuen Kabeln ausgestattet und jetzt funkt es ned mehr :(

Das Gas also Vorwärts und Rückwärts geht aber die Lenkung nicht?
Ich hab aber extra immer eins nach dem anderen getauscht das ich ja nicht was falsch mach.

Wenn ich im Sender Code ....

data[1] = map(analogRead(yPot2Pin), 0, 1023, 255, 0);

die 255 mit der 0 tausche bekommt mein Fahrtenregler kein Signal mehr ....
Ich hab aber eigentlich am Code nichts geändert.

Nur hab ich jetzt schon drei Tage lang so viel zeit an Kabel kontrollieren und Code kontrollieren verbracht
das ich jetzt vor lauter Bäumen den Wald nicht mehr sehe, wenn ihr wisst was ich meine !

Vllt könnt ihr mal drüber schaun ob doch wo ein Fehler drin ist! Danke im Voraus.

Sender:



#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 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)
{
byte 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 255) für den Servo / Fahrtenregler

radio.write(data, 2); // Adresse (data) und Länge (2) der zu sendenden Daten
}



Empfänger:




#include <Servo.h>
#include <SPI.h>
#include "RF24.h"

Servo myServo1;
Servo myServo2;
const uint64_t pipe = 0xE8E8F0F0E1LL;

RF24 radio(9,10);

byte parabel(byte val)
{
float a = (val - 128) / 13.45;
byte 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(5); // Pin 3
myServo2.attach(6); // Pin 5
radio.begin();

radio.openReadingPipe(1, pipe);
radio.startListening();
}


void loop()
{
if (radio.available())
{
bool done = false;
byte msg[2];
while (!done)
{
done = radio.read(msg, 2);
}

/*
//_DEBUG:
Serial.print("Wert 1: ");
Serial.print(msg[0]);
Serial.print(" / ");
Serial.print(parabel(msg[0]));
Serial.print(" Wert 2: ");
Serial.print(msg[1]);
Serial.print (" / ");
Serial.println(parabel(msg[1]));
//_END_DEBUG
*/

myServo1.write ( parabel(msg[0]) );
myServo2.write ( parabel(msg[1]) );
}
}

Sisor
11.05.2014, 13:37
Das mal überprüfen:
Empfänger:


void setup()
{
//Serial.begin(9600); // zum Debuggen Kommentarzeichen entfernen
// und diesen Arduino über Serial Mointor auslesen
myServo1.attach(5); // Pin 3
myServo2.attach(6); // Pin 5
...
}

Ansonsten siehts ok aus.

Benny1989
11.05.2014, 13:43
ja grins wollte es grade noch bearbeiten und ändern!
denn ich hab die Pins am Empfänger Arduino geändert um zu testen.

wie gesagt sehr komisch ist wenn ich die Lenkbewegung umdrehen möchte, sagt mir der Fahrtenregler das er kein Signal bekommt.

also von

data[1] = map(analogRead(yPot2Pin), 0, 1023, 255, 0);

in

data[1] = map(analogRead(yPot2Pin), 0, 1023, 0, 255);

Aber dann bleibt mir nichts anderes übrig als nochmals alle Kabel zu checken,
wenn ihr wissen wollt, wie die ganze Geschichte aussieht, könnt ihr meine neue Homepage besuchen,
da sind schon jede Mänge Bilder in der " Roboter RSL-7 " Galerie drin.
Die Seite ist noch im Aufbau aber ich mach Stück für Stück =)

p.s. Hab jetzt auch den Fahrtenregler getauscht, in der Galerie ist noch der Alte zu sehen

Sisor
11.05.2014, 14:12
wie gesagt sehr komisch ist wenn ich die Lenkbewegung umdrehen möchte, sagt mir der Fahrtenregler das er kein Signal bekommt.
...


An deiner Stelle würde ich:
- im Fahrtenregler-Datenblatt schauen, wann bzw warum der Fahrtenregler auf 'kein Signal' schaltet
- wieder mit dem Arduino-Monitor (DEBUG-Teile im Code entkommentieren) schauen, was der Empfänger-Arduino ausspuckt
- evtl. Pins wechseln bzw. auf Funktion (Multimeter - Spannungsmessung) überprüfen

Benny1989
11.05.2014, 14:14
Okay das ne gute Idee. Werde mal schauen was der ausgibt. Dann weis ich bescheid

Benny1989
15.05.2014, 18:41
Naben liebe Community,

dann will ich mal wieder berichten, also es lag daran das es nicht funktioniert hat, weil der Joystick kein Signal mehr von sich gab!
Komisch ich hab ja nichts mit ihm gemacht, ich hab nur den Fahrtenregler getauscht!

Hier der Link vom alten Fahrtenregler und alten Joystick:
http://www.sgs-electronic.com/index.php?page=shop.product_details&flypage=flypage.tpl&product_id=50&category_id=7&option=com_virtuemart&Itemid=1&lang=de&vmcchk=1&Itemid=1
http://www.exp-tech.de/Shields/Seeed-Studio-Grove-Thumb-Joystick.html

Hier der Link vom neuen Fahrtenregler und neuen Joystick:
http://www.sgs-electronic.com/index.php?page=shop.product_details&flypage=flypage.tpl&product_id=53&category_id=7&option=com_virtuemart&Itemid=1&lang=de
http://www.exp-tech.de/Shields/Sonstige/Analog-2-axis-Thumb-Joystick-with-Select-Button-Breakout-Board.html

Also das Problem ist hiermit geklärt wieso die Lenkung nicht ging, das der alte Joystick hobs ist!
Habe dann drei andere ausprobiert! Mit denen ging es! waren alle drei Dreh Pottis.

Was ich jetzt noch für Schmerzen habe, das ich mit dem neuen Joystick wieder das Phänomen habe,
das der Joystick Seher empfindlich ist! und das trotz der Parabel von Sisor!
Also wenn man den Joystick ganz ganz wenig (zb) nach rechts bewegt, macht der Roboter das auch,
wenn man bisschen mehr nach rechts drück, dann hat er den Vollen Lenkausschlag.

Ich sag mal so, also nur 10% von den 50% von der Rechtsbewegung wird benutzt!

@ Sisor

Mal eine Frage ich hab gesehen das du mal dein Post von der Parabel geändert hast, es gibt
jetzt folgende beiden Versionen in dem Thema hier:

Version1:


int parabel(int val)
{
float a = (val - 127) / 13.35;
int b = a*a;
if (val < 127) b = -b;
return b + 90;
}


Version2:


byte parabel(byte val)
{
float a = (val - 128) / 13.45;
byte b = a*a;
if (val < 127) b = -b;
return b + 90;
}


Aktuell hab ich Version 1 im Arduino Code stehen!

Kannst du mir nochmal ein Ratschlag geben was die beiden Versionen zu bedeuten haben?
Bzw, wieso du den einen Post in Version 2 geändert hast?

zusätzliche Frage zur Parabel: Die Parabel gilt aber schon für so zu sagen beide "Servos" also den Fahrtenregler?
Weil das Vorwärts/Rückwerts ist einwandfrei, wenns so in der Lenkung währe, währe optimal.
Was ich auch noch sagen muss mit dem Dreh Potti ist das ned der Fall, da kann man schön Lenken und gefühlvoll Lenken.

Mfg Benny

Sisor
15.05.2014, 22:00
Naben zurück!

Neue Hardware, neues Glück!

Bzw. neue Hardware, neue Tests...
-Wie reagiert der Fahrtenregler (links/rechts), bei welchen Werten lenkt er wie stark?
-Wie reagiert der Joystick, Mittelwert, Werte dazwischen?

Versuch mal, die 'parabel'-Funktion nur auf vor- bzw. rückwärts anzuwenden, vielleicht ist das schon alles...
Oder links/rechts nur auf 0-180 mappen anstatt parabel.

Die Änderung in der Funktion 'parabel' bewirkt nur eine kleine Mittelwertänderung. Das kannst du alles mit dem Arduino-Monitor testen.

Benny1989
15.05.2014, 22:30
Ja das stimmt. Neue Hardware neues Glück.
Der Fahrtenregler is echt ein Hammer Teil.

Am Wochenende kann ich mir bisschen zeit nehmen zum testen und berichten.
Da hab ich ned dran gedacht mal zu schauen was der joystick für Werte ausgibt.

Zum anwenden nur für Vor und zurück muss ich da nur das MAP weg löschen also so?





data[0] = (analogRead(xPot1Pin), 0, 1023, 255, 0);




Währe das richtig ?

Sisor
15.05.2014, 22:34
Zum anwenden nur für Vor und zurück muss ich da nur das MAP weg löschen also so?
NEIN! Hast du überhaupt verstanden, was das Programm macht? Scheint mir nicht so...

Daher kurze Zusammenfassung:
-Arduino-Board misst Spannungen an den analogen Eingängen (Joysticks) und gibt den Bereich von 0 bis 5 V in 1024 Schritten (10 Bit) weiter
-Senderprg. wandelt die 10 Bit Zahl in eine 8 Bit Zahl (0-255)
-Senderprg. sendet die Daten als 2 Bytes pro Zyklus über Funk an Empfänger
-Empfängerprg. nimmt die 8 Bit Zahl, verarbeitet diese über die Funktion 'parabel' so, dass die Joystick-Mittellage (ehemals um 512, dann 128 ) nun der des Fahrtenreglers (um 90) angepasst werden
-zusätzlich bewirkt die parabel-Funktion eine Beruhigung um diese Mittellage, sodass kleine Joystickänderungen fast keinen Effekt haben, große aber den vollen Bereich (0-180) abdecken.

Benny1989
15.05.2014, 22:38
Ja hab's grade gemerkt.

Code:
...myServo1.write (msg[0]);...
schreibst du:
Code:
...myServo1.write( parabel(msg[0]) );...

Hier im Empfänger Code muss wieder die Parabel raus - so stimmt es dann oder

Sisor
15.05.2014, 22:53
myServo1.write ( parabel(msg[0]) );
->
myServo1.write ( msg[0] ); // !Werte zwischen 0 und 255
bzw.
myServo1.write ( map(msg[0], 0, 255, 0, 180) ); // !Werte zwischen 0 und 180

Benny1989
15.05.2014, 23:02
Okay danke sisor für deine Erklärung echt top.

Hab das nur im Sender Code vertauscht. Bzw im Falschen Code geschaut.

Ich werd das mal probieren und mal schauen was der Joystick ausgibt
Und es euch natürlich wissen lassen :)

Kann ja sein wie du sagst das es dann schon hinhaut. Habe für Vorwärts und
Rückwärts diesen 10K Potti verwendet das ich ned immer beim mähen den Joystick
Heben muss. Das gibt Krämpfe >.< im Daumen

http://www.exp-tech.de/Sensoren/Seeedstudio-Grove---Schieberegler.html

Benny1989
21.05.2014, 19:38
Naben liebe Community,

ich hab heute Zeit gefunden, die Werte des neuen Joysticks für die Lenkung auszulesen.

Also:

für Vorwärts & Rückwärts, für das der Schiebepotentiometer zuständig ist, geht einwandfrei:
das heist, er geht sehr sensibel dank der Parabel, der Wert 0 / 0 mit Schieber ganz oben und der
Wert 255 / 179 mit Schieber ganz unten

Nun zum Joystick:

denn Joystick ganz nach Links gedrückt gibt er den Wert 255 / 179 und ganz nach Rechts gibt er
den Wert 0 / 0 aus.
Jetzt aber zu dem Problem, was auch das etwas unsanfte Fahrbild verursacht.

Die beiden oben beschriebenen Werte von 0 /0 und 255 / 179 sind schon nach 1/4 Joystick Bewegung erreicht.
Das heist, Wenn man ihn nur etwas nach Links bewegt, erreicht er nach 1/4 der Strecke schon den Wert 255 / 179 aus.
Die restliche Strecke von 3/4 passiert nichts sprich gibt er immer noch 255 / 179 aus und in die andere Richtung natürlich für den
anderen Wert!

Jetzt meine Frage:
Wie kann ich das lösen, die Parabel, bzw den Code so ändern, das der wert von 255 / 179 erst erreicht wird wenn man den
Joystick ganz nach Links drückt erreicht wird?

Was ich auch noch gereichten kann, in den drei Tagen, wo ich mit einem Drehpotentiometer gefahren bin, wo ich den Joystick noch nicht hatte
den neuen, war das Phänomen nicht!

28271

Das habe ich getestet mit dem Drehpotentiometer aus meinem Arduino Starterkit! Es sind aber beides 10K Potts so steht es auf beiden drauf.
Könnte mir da jemand einen Ratschlag geben?

Mfg Benny

cdk
22.05.2014, 00:56
Du solltest Dir erstmal einen Überblick verschaffen welche ROHDATEN vom Joystick ausgegeben werden, also die Werte VOR einer Softwareanpassung. Welche Werte gibt er in den Extremstellungen aus? Bei welcher Hebelstellung werden diese Extremwerte erreicht - wirklich erst am jeweiligen Anschlag oder bereits vorher?

Sisor
22.05.2014, 07:26
Wie kann ich das lösen, die Parabel, bzw den Code so ändern, das der wert von 255 / 179 erst erreicht wird wenn man den
Joystick ganz nach Links drückt erreicht wird?
Softwaremäßig: Gar nicht!
Grund: Es wird nur in einem geringen Bereich der Joystick-Bewegung in eine messbare Spannungsänderung erzeugt.
Anders gesagt: Der Joystick gibt (deiner Beschreibung nach) nach 1/4 der Bewegung keine Informationen weiter, die softwaremäßig erfassbar wären.
Oder noch anders: Der Joystick ist für dein Vorhaben ungeeignet.

Benny1989
22.05.2014, 08:09
@CDK

Die Daten hab ich ja ausgelesen. Die Werte hab ich ja oben beschrieben.

@Sisor

Hmmmm, ja das hab ich befürchtet. :((((

Welchen Joystick kann ich den dann benutzen ?

Ist halt so das ich schon gerne ein Joystick für die Lenkung hätte.
Zur Not würde ich kein Drehpoti für die Lenkung als Ersatz nehmen. Sondern
Halt wie für Vorwärts und Rückwärts das Schiebepotentiometer.

Wenn es nicht änderst geht. Werd ich es wohl mit dem Schiebebotentiometer
Machen müssen oder wenn ich noch ein geeignetes Drehpoti finde nehme ich das.

Aber wie gesagt ein Joystick wo allein auf mittelstellung geht währe mir lieber.

Habt ihr noch ein Hardware Tipp für mich? Und danke an eure beiden Antworten.

MfG Benny

Sisor
22.05.2014, 13:38
Ich kann nur einen NICHT empfehlen: Keyes_SJoys.
Um Ruhelage passiert nichts, dann beschränkt sich der Regelweg auf einen kleinen Bereich und ab etwa halber Joystickauslenkung ist dann schon der Endwert erreicht - Schrott!

Benny1989
06.07.2014, 13:39
Hallo liebe Leute,

wollte heute noch mal nachfragen, wegen meinem Lenk Problem meines Roboter´s.

Wie schon mit Sisor besprochen, das diese (PS2) Joysticks nicht wirklich die gewünscht Lenkung erbringen.

Was sehr schade ist, da die (PS2) Joysticks sehr gut in meiner Fernsteuerung zu verbauen sind und Hardware
technisch die Teile echt gut finde.

Also nochmal die Frage gibt es wirklich keine Lösung die Teile software technisch zu verwenden?

Meine Lösung momentan ist ein Drehpoti ( siehe Bilder )

2855628557

Mit dem Dreh Pott kann man zwar sanft Lenken, Aber den Robi zu steuern im Gelände is nicht wirklich das wäre !!!

Ich habe jetzt drei mal damit den Rasen gemäht und wie gesagt nicht wirklich gut! Also sehr schwer zu fahren und zu manövrieren.


Eine andere Lösung währe ein USB Joystick!

28558

Also meine letzte Idee währe das Schiebe Potentiometer ( Vorwärts und Rückwärts ) und das Dreh Potentiometer (Links und Rechts )
durch den Joystick zu ersetzen, denn in dem Joystick ja auch nur Potentiometer drin sind.

Nur meine Frage jetzt meint ihr das dass mit dem USB Joystick ein anderes Lenkverhalten wie das mit dem PS2 Joystick aufweist?

eure Meinung würde mich dringlich interessieren

Brauch ich ein spezielles Shield um den Joystick mit dem Arduino zu verbinden?
Oder gibt es auch eine andere Möglichkeit?
Ist die USB-B Buchse am Arduino nur für die Strom Versorgung ?
oder kann man den Joystick auch an diese Buchse anschließen ? Strom bekommt er
ja vom Akku über die Buchse neben an!

Mfg Benny

Benny1989
07.07.2014, 20:12
Die Idee was ich hätte, was wahrscheinlich am besten in meine bestehende Schaltung / Verkabelung passen würde,
wenn ich den Joystick öffne und die Potts und Knöpfe wo drin verbaut sind, direkt anzapfe ohne den USB zu verwenden.
Ist evtll bissle primitiv, aber so weis ich was ich mache und muss nicht lange fragen!

Die Frage ist nur ob diese Potis, zumindest der Lenk Poti den gewünschten Effekt erbringen!

Aber wahrscheinlich einfach ausprobieren so teuer war der Joystick auch nicht!
Oder was meint ihr?

Mfg Benny

Rabenauge
08.07.2014, 09:56
Einzig sinnvolle Lösung. Du kannst aber auch einfach mal reinschauen, die Potis ausmessen und dann ausrechnen, ob sie passen.
Sind nur Spannungsteiler, die aus gegebener Spannung runterregeln, idealerweise möglichst feinfühlig (wobei ich da von nem PC-Joystick auch keine Wunder erwarten würde).
Diese Daumenjoysticks funktionieren übrigens schon feinfühlig-nur sind die eben für kurze Wege ausgelegt, damit man sich den Daumen nich ausrenkt.

Benny1989
08.07.2014, 10:21
Danke für deinen Tip!

Würde es ich welche geben mit weiteren Wegen?
Von daher währe mir der Große Joystick schon lieber!

Finde es etwas bescheiden dann so einen weiten weg vorgeben also Hardware Technisch
und dann Software Technisch nur ein ganz kleinen weg!

Sisor´s Parapel is ja eine sehr gute Idee wo ich auch nie drauf gekommen währe!
Für die Vorwärts & Rückwärts Bewegung funzt es ja - sehr weiche Bewegungen möglich,
aber auch weil es ein Schiebepotentiometer ist und kein PS2 Joystick!

Mfg Benny

Rabenauge
08.07.2014, 14:55
Bedien das Ding mal so wie es gedacht ist: mitm Daumen!
Dann wirst du die Wege genau richtig finden-vor allem, weil die Teile ja üblicherweise noch in nem Gehäuse stecken.
Ich selber hab viele RC-Modelle und kenne Leute, die auch da mit "Daumensticks" steuern: grauenhaft. Präzise wird das nie, reicht für Kinderspielzeug.
Was _dir_ vielleicht auch hilft: nimm mal den komischen Plastikbutton runter (bei meinen, von Sainsmart ist der nur aufgesteckt), und verlängere den Stift darunter, so dass du nen längeren Knüppel hast (bei RC-Anlagen kann man die Steuerknüppel auch nur in der Länge verstellen)- das sollte schon was bringen.
Kannst ja zum probieren einfach mal nen Trinkhalm oder irgendwas drüber schieben.

Und: nee-ich kann dir keinen anderen empfehlen (hab irgendwo noch nen seeeehr alten PC-Joystick, der richtig gut war, werd den aber jetzt weder suchen noch probieren)- was nicht passt, wird passend gemacht.

Der Weg hat übrigens mit der Software rein gar nix zu tun: die Potis sind nichts weiter als Spannungsteiler. Und wenn das Ding eben bei fünf Grad Ausschlag nix (messbares) mehr teilt, kann die Software da auch nichts für.
Kannst du ausprobieren: las dir mal die eingelesenen Werte der analogen Pins von dem Ding ausgeben (roh)- dann siehst du dass die Software damit absolut nix zu tun hat.
Oder nimmst du irgendeine Bibliothek für den Kram??
Falls ja: lass den Quatsch, das geht per Hand auch.

Benny1989
10.07.2014, 08:25
Guten Morgen,

erstmal Danke Rabenauge für dein Tip,

ich bin gestern dazu gekommen meinen USB Joystick zu zerlegen und so zu präparieren das ich Ihn in meine Fernsteuerung einbauen kann.
( BZW hab ihn noch ned ganz fest eingebaut war gestern nur mal zum testen )

Das Ergebnis hab ich euch als vild festgehalten:

28584

Anschließend nachdem die löterei vollendet war, hab ich es an meinem Roboter getestet:

Und ich war mega erstaunt! Ich bin mit dem Fahrverhalten sowie mit dem Lenk verhalten - hoch zu frieden!
War wirklich HAPPY - man kann ganz sanft Gas geben - genau so wie sehr sanft lenken!

Das Beste ist beim Lenkausschlag - das der Lenkausschlag erst erreicht ist wenn man den Joystick ganz nach
links oder rechts bewegt. Das gleiche für die Vorwärts und Rückwärts Bewegung.

Also war es genau Richtig, es einfach mal auszuprobieren ... denn so bin ich hoch zufrieden!

Werde heute oder morgen, auch nochmal ein Video einstellen, dann könnt ihr es euch selbst anschauen =)


Mfg Benny

Feuerring
18.07.2016, 10:56
Werde heute oder morgen, auch nochmal ein Video einstellen, dann könnt ihr es euch selbst anschauen =)

Bin auch neugierig ... hast Du schon ein Video hochgeladen ?