Modelle aus Baukasten und Buch Fischertechnik-Roboter mit Arduino

fischertechnik in General
Forumsregeln
Bitte beachte die Forumsregeln!
Bastelklausi
Beiträge: 41
Registriert: 03 Jun 2020, 19:32

Re: Modelle aus Baukasten und Buch Fischertechnik-Roboter mit Arduino

Beitrag von Bastelklausi » 29 Okt 2020, 11:45

Hallo zusammen,

Ich habe in der 433 MHz Funkfernsteuerung die ursprünglich verwendete Bibliothek RCSwitch durch die VirtualWire ersetzt:
#include <Wire.h> // Wire Bibliothek einbinden
#include <VirtualWire.h> // VirtualWire zum Senden einbinden

Die hat den großen Vorteil, dass man z.B. die Übertragungsgeschwindigkeit definieren kann:
vw_setup(600); // Drahtlose Schnittstelle, 600 Bits pro Sekunde
// Daten senden - Pin definieren
vw_set_tx_pin(TXPin);

Ich habe zum Testen 600 Baud genommen. Das klingt zwar langsam, ist aber völlig ausreichend, da nur ein paar Bytes übertragen werden. Je niedriger die Baudrate, desto robuster ist die Funkstrecke gegen Störungen, bzw. erhöht die nutzbare Reichweite.
Man kann zudem eine Datenstruktur anlegen, z.B. wie folgt:
typedef struct txData
{
int TX_ID;
int kommando;
int wert;
};
Wie man sieht, habe ich eine Adresse vorgesehen. Somit kann man mehrere Sender/Empfänger verwenden, in dem man beim Empfänger die TX_ID auswertet.
Das aussenden geht einfach, z.B. wie folgt (Servolenkung):
struct txData payload; // Sendedaten zusammenstellen
payload.TX_ID = TX_ID; // Adresse des Senders
payload.kommando = int('A'); // Kommando
payload.wert =int(steerangle); // Wert
vw_send((uint8_t *)&payload, sizeof(payload)); // Daten senden

Wie sieht es beim Empfänger aus. Hier die Initialisierung:
vw_setup(600); // Drahtlose Schnittstelle, 600 Bits pro Sekunde
vw_set_rx_pin(RX_PIN); // Daten empfangen an Pin
vw_rx_start(); // Start Datenempfang

Der eigentliche Empfang:
// Starte Datenempfang
vw_wait_rx_max(1000);
Der Wert in Klammern ist ein Timeout in ms. Die Auswertung:
// prüfen, ob Daten vorhanden
if (vw_get_message((uint8_t *)&RxData, &rxSize))
{

// prüfen, ob Sender und Empfänger-ID gleich sind
if (RxData.TX_ID == RX_ID){
// Integer-Werte der Sensordaten umwandeln
int k=RxData.kommando;
int w=RxData.wert;
usw.

Bislang habe ich den Empfang nur testweise mit einem Arduino Nano mit 433 MHz Empfänger und Ausgabe auf der seriellen Konsole. Das sieht sehr gut aus. Es gibt keine Werte von 0 zwischendrin. Die Übertragung scheint sehr stabil zu sein. Auch um drei Ecken mit 10 m Abstand gibt es keine Abbrüche.
Als Nächstes baue ich den Empfänger in den Flitzer ein und schau mal, was Motor und Servo machen. Dann gibt es von mir ein Update.

Liebe Grüße
Klaus

Bastelklausi
Beiträge: 41
Registriert: 03 Jun 2020, 19:32

Re: Modelle aus Baukasten und Buch Fischertechnik-Roboter mit Arduino

Beitrag von Bastelklausi » 30 Okt 2020, 13:03

Guten Tag zusammen,

böse Überraschung: die VirtualWire Bibliothek verträgt sich NICHT mit der Servo Bibliothek. Es gab einen Compilerfehler und nach Recherche fand ich heraus, dass beide Bibliotheken den Timer 1 benutzen. Das gibt dann einen Konflikt und der Compiler bricht mit einer Fehlermeldung ab.

Zwar gibt es eine ServoTimer2 Bibliothek, die den Timer 2 benutzt und tatsächlich ist dann der Compilerfehler weg. Aber ACHTUNG!
Die ServoTimer2 Bibliothek verwendet nicht den Servowinkel als Parameter in der write-Funktion, sondern Mikrosekunden.

Auf diesen Pfad wollte ich mich nicht begeben. Daher habe ich schweren Herzens die VirtualWire dann doch durch RCSwitch ersetzt. Damit funktioniert dann der Flitzer. Da ich weiterhin im Empfang sporadisch 0-Werte empfange, habe ich eine Plausibilität für den Servowinkel eingebaut. Der Servo wird garantiert nur mit den Winkeln 60 bis 120 angesteuert. Ein Winkel von 0 könnte für den Servo nicht gut sein.

Dirk, wie sind deine Erfahrungen mit den Empfangswerten aus der RCSwitch?

Noch eine Merkwürdigkeit. Die Hupe lässt sich einschalten, geht aber nicht mehr aus und der Flitzer reagiert auf kein weiteres Kommando. Ich reagiere jetzt auf das 'H' Kommando mit Hupe einschalten und starte einen Timer. Im Programmablauf wird der Timer geprüft und nach Ablauf wird die Hupe abgestellt. Das klappt!

Als nächstes wird das Licht akiviert.

Bis demnächst mit besten Grüßen
Klaus

Benutzeravatar
Dirk Fox
ft:pedia-Herausgeber
Beiträge: 1444
Registriert: 01 Nov 2010, 00:49
Wohnort: Karlsruhe
Kontaktdaten:

Re: Modelle aus Baukasten und Buch Fischertechnik-Roboter mit Arduino

Beitrag von Dirk Fox » 30 Okt 2020, 19:58

Hallo Klaus,

habe Deinen Beitrag erst jetzt gelesen: Mit der VirtualWire-Bibliothek habe ich auch begonnen und bin auf dasselbe Problem mit dem Timer1 gestoßen, daher die Verwendung der RCSwitch-Bibliothek. Die Reichweite habe ich nicht systematisch getestet; das könnte ich einmal nachholen...

Den Hupe-Fehler muss ich versuchen nachzustellen.
Eigentlich sollte sie beim nächsten Betätigen des Joystick-Knopfes wieder ausgehen.

Beste Grüße,
Dirk

Bastelklausi
Beiträge: 41
Registriert: 03 Jun 2020, 19:32

Re: Modelle aus Baukasten und Buch Fischertechnik-Roboter mit Arduino

Beitrag von Bastelklausi » 30 Okt 2020, 22:39

Hallo Dirk,

danke für deine Antwort.

Mit der Reichweite der Fernsteuerung bin ich zufrieden. In der Wohnung klappt es ausgezeichnet. Ich meinte eher, dass nach dem Kommandobuchstaben sporadisch 0 als Wert auftaucht und ob du das eventuell auch registriert hast.

Das mit der Hupe war schon merkwürdig. Ich hatte einige Textoutputs als Debug, leider ohne Hinweis. Nach Drücken der Hupentaste am Sender, nachdem ich mit dem Joystick Switch in den Haltmodus gegangen war, empfing ich 'H1' am Flitzer und die Hupe ging an. Ein weiteres Drücken der Hupentaste hätte ein 'H0' zur Folge gehabt und die Hupe ausschalten müssen. Der Flitzer hat aber keinen Empfang registriert. Nach erneutem Betätigen des Joystick Switch am Sender hätte sich der Flitzer wieder bewegen müssen. Da kam aber auch kein Empfang. Erst nach Reset des Flitzers ging alles wieder bis zu dem Punkt, an dem ich die Hupe auslöste. Ich hatte ein kleines Testprogramm geschrieben, nur zum Auslösen der Hupe und stoppen der Hupe. Das ging einwandfrei. Dann kam ich auf die Idee, mit Empfang des Kommandos 'H', egal wie der Wert dahinter ist, die Hupe auszulösen und einen Timer zu starten. In der Hauptschleife frage ich den Timer ab (mittels millis()) und wenn der abgelaufen ist, schalte ich die Hupe ab. Das klappt ausgezeichnet.

So, die Lampen gehen auch alle. Blinken klappt; Front/Rücklicht gehen automatisch je nach Helligkeit an oder aus. Der Rückfahrscheinwerfer geht bei Rückwärtsfahrt an und bei Vorwärtsfahrt oder Stillstand aus. Das Bremslicht steuere ich auch über einen Timer an, weil es nur kurz flackerte wenn ich die Geschwindigkeit verringere. Es bleibt Timer gesteuert 500 ms an. Sieht besser aus.

Testfahrten durch die Wohnung habe ich einige gemacht. Ist schon echt cool, vor Allem mit der Beleuchtung. Da ich den Encodermotor benutze, ist das Fahrzeug recht langsam, lässt sich dafür aber gut beherrschen.

Als Nächstes wird dann der Tacho eingebaut.

Es ist ein schönes und interessantes Modell, Dirk!

Allen ein schönes Wochenende
Klaus

Anbei Fotos vom Sender und Flitzer (mit Frontscheibe in klar)
IMG_Flitzer_Sender.jpg
IMG_Flitzer_Sender.jpg (124.07 KiB) 642 mal betrachtet
IMG_Flitzer_Sender.jpg
IMG_Flitzer_Sender.jpg (124.07 KiB) 642 mal betrachtet
Dateianhänge
IMG_Flitzer.jpg
IMG_Flitzer.jpg (134.25 KiB) 642 mal betrachtet

Benutzeravatar
Dirk Fox
ft:pedia-Herausgeber
Beiträge: 1444
Registriert: 01 Nov 2010, 00:49
Wohnort: Karlsruhe
Kontaktdaten:

Re: Modelle aus Baukasten und Buch Fischertechnik-Roboter mit Arduino

Beitrag von Dirk Fox » 31 Okt 2020, 12:37

Hallo Klaus,

der Flitzer sieht super aus, vor allem mit den klaren Fensterscheiben! Davon hatte ich nur ein paar alte, trübe...
Und Deine Modifikationen sind klasse.

Das von Dir geschilderte Hupen-Problem schaue ich mir demnächst mal an. Aber Deine Lösung mit dem Timer ist ohnehin viel besser. Bin ich nicht drauf gekommen - und hätte ich gleich so machen sollen. Wenn ich darf, setze ich das als Tipp auf die Webseite (natürlich mit Quelle).

Auch die sporadischen "0"-en nach den Kommandos versuche ich mal zu reproduzieren; mir ist bei meinen Tests kein solcher Effekt aufgefallen.

Das Bremslicht lasse ich beim Einparkassistenten auch länger leuchten; das habe ich im Sketch allerdings erst nach Erscheinen des Buches ergänzt. Es sieht tatsächlich merkwürdig aus, wenn das Bremslicht nur Sekundenbruchteile "flackert". Das ist übrigens ein interessanter Punkt: Bei Elektroautos muss man die starke Bremswirkung des Motors mit einem (länger als die Bremsung selbst leuchtenden) Bremslicht signalisieren, obwohl der Fahrer vielleicht nur den Fuß vom Gaspedal genommen hat. An die Betätigung des Bremspedals - wie beim Verbrennungsmotor - darf man das Bremslicht nicht mehr koppeln... In die nächste Auflage des Buchs kommt ein entsprechender Hinweis :-)

Zum Motor: Der neuere (aktuelle) Encodermotor ist etwas stärker und kleiner untersetzt; den Encoder selbst brauchst Du ja auch nur für die Geschwindigkeitsbestimmung und das eigenständige Einparken. Die Fernsteuerung allein funktioniert auch mit dem "starken schwarzen" (XM) Motor.

Und noch ein Tipp zum Tacho: Da hat letzte Woche einer unserer holländischen Fans einen Bug in meinem Sketch entdeckt - der Encoder-Pin muss im "INPUT_PULLUP"-Mode angesteuert werden. Siehe "Corrigenda" auf der Buch-Webseite.

Viel Spaß weiterhin!
Ich jedenfalls freue mich über weitere Berichte,
herzlicher Gruß,
Dirk

Bastelklausi
Beiträge: 41
Registriert: 03 Jun 2020, 19:32

Re: Modelle aus Baukasten und Buch Fischertechnik-Roboter mit Arduino

Beitrag von Bastelklausi » 01 Nov 2020, 19:33

Hallo Dirk,

danke für die "Blumen". Die klaren Scheiben sind optisch super.
Meine Hupen Lösung kannst du sehr gerne auf die Webseite setzen. Bin gespannt, ob du das Hupenproblem nachvollziehen kannst.

Die sporadischen Nullen hatte ich auch schon in einem anderen Projekt mit der RCSwitch. Ich habe im Garten eine LGB mit beleuchteten Häusern. Damit dass Licht nur im Dunkeln angeht, übernimmt ein Arduino die Lichtsteuerung. Mit einem 433 MHz Sender übertrage ich einige Messwerte an eine Empfangsstation in der Wohnung. Da hatte ich schon die sporadischen Nullen. Daher bin ich auf die Virtual Wire gewechselt und die Fehler waren weg. Aber da brauche ich ja auch kein Servo ;) Bin gespannt, ob du das nachvollziehen kannst.
Dein Hinweis zum Bremslicht bei E-Autos ist interessant. Da hatte ich mir bisher keine Gedanken zu gemacht.
Den Encoder Motor lasse ich im Modell, da ich ihn für den Tacho verwenden möchte. Besten Dank für deinen Tipp zu dem Encoder Pin.

Buch und Kasten machen tatsächlich viel Spaß und weitere Berichte werden folgen.
Liebe Grüße
Klaus

Benutzeravatar
MasterOfGizmo
Beiträge: 1895
Registriert: 30 Nov 2014, 07:44

Re: Modelle aus Baukasten und Buch Fischertechnik-Roboter mit Arduino

Beitrag von MasterOfGizmo » 02 Nov 2020, 18:29

Ein kurzes Störsignal auf der Funkverbindung wird vom UART als Startbit erkannt. Wenn danach keine weitere Störung erfolgt und das Funksignal wieder "Ruhepegel" hat, dann werden acht Nullbits und ein neuntes Stoppbit erkannt. Das ganze ergibt dann ein gültiges Nullbyte.

Edit: Ihr sendet gar nicht mit dem UART .... dann vergesst meinen unqualifizierten Kommentar bitte. Tatsächlich scheint VirtualWire aber ein aufwändigeres Protokoll zu implementieren, was die höhere Robustheit erklärt
Für fischertechnik: Arduino ftDuino http://ftduino.de, Raspberry-Pi ft-HAT http://tx-pi.de/hat

Bastelklausi
Beiträge: 41
Registriert: 03 Jun 2020, 19:32

Re: Modelle aus Baukasten und Buch Fischertechnik-Roboter mit Arduino

Beitrag von Bastelklausi » 03 Nov 2020, 00:14

Hallo MasterOfGizmo,

kein Problem ;)
Ich vermute, dass VirtualWire eine Art Prüfsumme über die Daten ausrechnet und an die Daten anhängt. Der Empfänger berechnet die Prüfsumme über die empfangenen Daten und vergleicht sie mit der empfangenen Prüfsumme. Wenn die Prüfsummen nicht übereinstimmen, wird die empfangene Nachricht verworfen. Auf diese Weise werden Funkstörungen ausgeblendet. Bei Verwendung von RCSwitch müsste man das selber programmieren. Wie gesagt, nur eine Vermutung.

Viele Grüße
Klaus

Pirx
Beiträge: 54
Registriert: 01 Nov 2010, 10:01

Re: Modelle aus Baukasten und Buch Fischertechnik-Roboter mit Arduino

Beitrag von Pirx » 03 Nov 2020, 22:05

Hallo,

passt zwar nicht zum aktuellen Verlauf, aber zur Überschrift.

Hat schon jemand den Plotter in Betrieb? Habe ihn soeben gebaut, funktioniert auch so weit, nur die Position des Motor der horizontalen Achse ist nicht besonders stabil. Nach einiger Zeit dreht er sich, aber nimmt nicht mehr das große Zahnrad mit. Das ist nicht weiter schlimm, kann man sicher verstärken.
Was mich aber doch wundert ist, dass die Motoren so heiß werden. Man kann sie gerade noch anfassen, will sie aber nicht lange festhalten. Habe sie noch nicht gemessen, tippe mal auf 60°.

Ist das normal oder habe ich etwas übersehen? Ich habe das originale Adafruit Motorshield, das ich mit einem separaten Netzteil mit 12 V betreiben. Die Achsen sind beide super leichtgängig.

Viele Grüße
Pirx

Bastelklausi
Beiträge: 41
Registriert: 03 Jun 2020, 19:32

Re: Modelle aus Baukasten und Buch Fischertechnik-Roboter mit Arduino

Beitrag von Bastelklausi » 13 Nov 2020, 17:37

Hallo zusammen,

mit dem Plotter habe ich noch nicht begonnen. Ich werde aber deine Erfahrungen im Hinterkopf behalten, Pirx, und berichten.

Ich hatte den Tacho im Flitzer eingebaut. Der funktioniert sehr gut, aber nur mit der Korrektur, die Dirk auf seiner Website veröffentlich hat:

pinMode(EncoderIRQPin, INPUT_PULLUP);

Statt Momentan- und Durchschnittsgeschwindigkeit per Taster umzuschalten (ist halt nicht so einfach bei laufendem Fahrzeug :lol: ) habe ich einfach eine zeitgesteuerte Umschaltung programmiert (Interval auf 100 ms reduziert):

Vor der loop:
#define Interval 100 // Länge des Messintervalls in ms
int displayvi = 50; // 50 mal Interval für die Anzeigenumschaltung

In der Loop:
if (displayvi > 0) displayvi--; // Counter runterzählen
else displayvi = 50; // Counter rücksetzen
if (displayvi > 20) display.showNumberDec(int(vi)); // Ausgabe Momentangeschwindigkeit auf LED-Display
else if (displayvi > 0) display.showNumberDec(int(va)); // Ausgabe Durchschnittsgeschwindigkeit auf LED-Display

Der Tacho zeigt dann ca. 3 s die Momentan- und 2 s die Durchschnittsgeschwindigkeit an.

Eleganter wäre ein zusätzlicher Taster auf dem Funksender, der das Kommando "T" wie Tacho sendet und auf der Empfängerseite wird das ausgewertet und die Anzeige umgeschaltet.

Schöne Grüße
Klaus

Bastelklausi
Beiträge: 41
Registriert: 03 Jun 2020, 19:32

Re: Modelle aus Baukasten und Buch Fischertechnik-Roboter mit Arduino

Beitrag von Bastelklausi » 22 Nov 2020, 18:17

Guten Abend zusammen,

ich bin mal wieder einen kleinen Schritt weiter gekommen mit dem Flitzer. Habe halt noch viele andere "Projekte" ;)

Im RC-Sender habe ich einen zweiten Taster eingebaut und bei Druck auf diesen wird das Kommando "T" gesendet.
Das Flitzer Programm reagiert auf dieses "T" durch Ein-/Ausschalten des Tempomaten. Als Tempo wird ein Wert vorgegeben und ausschließlich vorwärts gefahren ( ich kenne kein Fahrzeug, das per Tempomat rückwärts fährt ;) ) .
Bei den ersten Tests habe ich ein Prellen beobachtet, mehrfaches Empfangen des "T" Kommandos; obwohl ich im Sender eigentlich eine Entprellung programmiert habe ( while (!digitalRead(...)) ).
Daher akzeptiere ich im Flitzer Programm das "T" Kommando nur nach Ablauf einer Zeitspanne von 1 s. Mit der millis() Funktion geht das prima ohne die delay() Funktion.:

Im Switch..Case Konstrukt zur Auswertung der RC Kommandos:
case 'T':
if (tempoblock == 0) {
tempodelay = millis();
tempoblock = 1;
if (tempomat == 0) {
tempomat = 1;
Backward = false;
Motor->setSpeed(TEMPOMATSpeed); Motor->run(FORWARD);
}
else {
tempomat = 0;
Backward = false;
Motor->setSpeed(0); Motor->run(FORWARD);
}
}
break;

Zeitliches "entprellen":
if ((millis() - tempodelay > TEMPO) && (tempoblock == 1)) tempoblock = 0;

Ist schon cool, per Tastendruck den Tempomaten ein-/ausschalten zu können. Als Nächstes käme die Erweiterung mit Abstandsmessung.

Beste Grüße
Klaus

Antworten