Hilfe bei Robomow RL500 Begrenzungsgeber

Hallo Alexander,
habe die Amplitude jetzt bis zu 3 Volt erhöht,
außerhalb der Schleife ist sie etwas kleiner.
Beim serial Monitor(Analogeingang A0) bekomme
ich keine konstante Zahlen. Mach ich etwas falsch,
denn für eine spätere Regelung sind die sicher nicht
zu gebrauchen.
Wie geht es Dir mit dem Arduino Programm?

Grüße
Heinz
Attachment: https://forum.ardumower.de/data/media/kunena/attachments/1218/2015_1.zip/
 
Zuletzt bearbeitet von einem Moderator:
Hallo Heinz,

das Signal ist ja kein Gleichspannungssignal sondern ein Wechselsignal (Sinus), daher beschreiben ganz schnelle Messungen einen Sinus, etwas langsamere (wie beim Arduino) einen Rechteck. Den Befehl aus der Arduino-Bibliothek (analogRead) kann man nicht einmal als langsam bezeichnen - der ist sogar zu langsam. D.h. man muss direkt auf über die Arduino-Register gehen wenn man den 8000 Hz Rechteck noch mitbekommen möchte.

Ich war davon ausgegangen, dass der Code auf einem Arduino Nano laufen könnte - leider hat der Nano nicht ausreichend Speicher für das relativ lange Robomow RL500 Signal. Daher wird man z.B. zu einem Mega (oder auch Teensy oder Due) greifen müssen. Wenn Du für die Hauptsteuerung sowieso den Ardumower-Code verwendet willst, ist vermutl. Mega oder gleich Due die beste Lösung. Der Due schafft Steuerung und Dekodierung des langen Robomow-Signals gleichzeitig, der Mega vielleicht... (muss man austesten)

Gruss,
Alexander

Nachtrag: damit einem nicht so schnell der Speicher ausgeht, sollte man vermutl. lieber gleich zu einem Arduino Due greifen (der arbeitet übrings mit 3.3V bei den I/O Pins - keine 5V!)
 
Hallo Alexander,
ich wollte die Empfängerschaltung und den Nano auf eine Platine setzen,
um die Verarbeitungszeit der Hauptschaltung zu reduzieren und ein eigenständiges
Modul zu haben. Mit einem Analogausgang und einem Binärausgang (innen/außen)
hätte man schnell auf mehr Empfänger erweitern können.
Sind die von Dir vorgeschlagen Module alle mit 3,3Volt zu betreiben?
Welches Modul müßte ich mir kaufen, um bei dem eigenständigen Modul(5Volt) bleiben
zu können.
Grüße
Heinz
 
Demnach bliebe nur der Arduino Mega als 5V Modul übrig. Die moderneren arbeiten alle mit 3.3V (der Teensy z.B. ist sogar 5V "tolerant"). Der Mega ist nicht besonders flexibel was digitale Signalverarbeitung angeht (z.B. gibt es keine Möglichkeit exakt den ADC mit 8 Khz laufen zu lassen). Zur Not würde es aber damit gehen. Wenn Du sowieso mehrere Boards zusammenschalten willst, würde ich für die Signalverarbeitung den Teensy 3.1 nehmen (https://www.pjrc.com/teensy/).

Für das Ardumower-Projekt hingegen ist es wünschenswert alles mit einem Board zu lösen. Das geht ja auch bereits (mit Arduino Due bzw. Arduino Mega). Wenn man zwischen mehreren Empfängern wechseln möchte, wäre dies auch per Software möglich. Wenn der Empfänger-Code für den RL500 irgendwann für Due+Teensy (ggf. auch Mega) läuft, werden wir den wohl mit ins Projekt einbauen. Dann bedeutet Empfänger wechseln wirklich nichts anderes mehr als ein Klick in der Ardumower Handy-App.
 
Hallo Alexander,
da ich ein Anfänger bin, kann ich überhaupt nicht beurteilen was das Beste ist.
Ich kaufe selbstverständlich das Modul, wo das Programm am leichtesten zu integrieren ist und
Du später die Software im Forum verwenden kannst. Im Shop habe ich das Mega Board 2560 R3 ATmega2560 mit USB Kabel gesehen. Wenn es das richtige ist, bestelle ich es gleich morgen.
Dann könnte ich das Bord gleich mit zwei Schleifenempfängern ausrüsten.
Gib mir bitte Bescheid, ob wir dann das Projekt fortsetzen könnten.

Grüße
Heinz
 
Hallo Heinz,

wenn Du bereit für Experimente bist: lass uns den Due ausprobieren, ob dieser das Hauptprogramm und die Robomow-Empfänger gleichzeitig schafft (das wäre wünschenswert). Müssen dann sehen wie wir mit den 3.3V Pegeln klar kommen.

Wenn Du eine Lösung suchst, bei der zumindest elektrisch alles sofort gehen sollte, nimm den Arduino Mega.

Software-technisch ist es für beide zu lösen - ein einzige Board für Hauptprogramm und Empfänger ist glaube ich für andere einfacher nachzubauen (weniger Boards zu flashen, zu verkabeln etc.). Ein Programm ist auch langfristig besser zu warten als mehrere. Ich kann mir aber auch vorstellen, dass der Due nicht der Weisheit letzter Schluß ist (wenn neue Dinge wie Navigation hinzukommen), und dann nimmt man einfach einen noch schnellere CPU und portiert ein einziges Programm.

Gruss,
Alexander

NACHTRAG: vielleicht sollten wir mit dem Mega anfangen - wenn der es nicht packt, muss man sich mit dem Due "herumschlagen" ... :)
 
Hallo Alexander,
danke für den Ratschlag, da ich totaler Anfänger bin, habe ich mich für das Arduino Mega entschieden und gleich im Shop bestellt.
Ich habe noch ein anderes Problem mit der Empfängerschaltung.
Die Schaltung funktioniert einwandfrei mit dem nochmals verstärkten Signal (s.Bild) , aber wenn ich einen Motor in 40cm Abstand einschalte, wird das Signal sehr stark verfälscht (s.Bild).
Können Deine Programmfilter so etwas abfangen oder muß man das in der Hardware lösen.

Grüße
Heinz
 
Hallo Heinz,

genau das sollen die Filter auch lösen :)

Das kann man hier schön sehen dass es auch bei Störungen funktioniert: http://www.grauonline.de/alexwww/ardumower/filter/filter.html
Einstellen:
Regler "One sample width": 1
Textfeld "Signal samples" (Signalform): Dort das Robomow RL500 Signal aus dem Web Oszilloskop eintragen
Regler "Noise" (Störungen) hochsetzen
Mit Button "Invert" kann man die Position des Roboters (innen/außen) einstellen
Man sieht das Ergebnis des Filters bei "FirstMinMax" abhängig vom Button "Invert" (positiv/negativ).

Oder auch mit einer Spule im Web Oszilloskop direkt ausprobieren: http://www.grauonline.de/alexwww/ardumower/oscilloscope/oscilloscope.html Filter: Matched, Frequency: 16000 Hz, Matched Filter Template: Robomow RL500
Math: FirstMinMax
Und dann Störungen im Abstand von 40cm der Spule verursachen.
 
Hallo Heinz,

anbei ein erster Entwurf (komplett ungetestet) des Robomow RL500 Empfänger-Codes (für Arduino Mega). Leider komme ich erst Anfang der Woche zum Testen. Evtl. kannst Du ja schon mal drüberschauen und versuchen, den Code zu verstehen :)

Gruss,
Alexander

NACHTRAG: das Programm ist so nicht funktionsfähig - ich habe den Matched Filter so nicht zum Laufen bekommen, daher unten weiter eine neue Lösung verfolgt (siehe unten weiter).
perimeter_robomow_rl500.zip

Attachment: https://forum.ardumower.de/data/media/kunena/attachments/905/perimeter_robomow_rl500.zip/
 
Zuletzt bearbeitet von einem Moderator:
Hallo Alexander,
ich kann sowieso noch nicht loslegen, denn meine Bestellung wird wahrscheinlich erst Ende der Woche kommen.
Ich habe das Programm geladen und gesehen, es war mächtig viel Arbeit.
Bis jetzt sind meine Programme mit Bascom geschrieben und muss mich erst einmal Schritt für Schritt einarbeiten.
Um das Programm genau zu verstehen sind noch viele Lerntage notwendig.
Für die Softwareunterstützung kann ich deshalb wenig beitragen.
Wenn die Bestellung angekommen und das Programm geladen ist, werde ich mich wieder bei Dir melden.

Grüße
Heinz
 
Hallo Alexander,
habe gerade das neue Bord bekommen und auch sofort das Programm geladen.
Leider habe ich bei dem seriellen Monitor nur lauter nicht lesbare Zeichen (s.Bild). :(
Wo kann ich einen Fehler machen???
Habe einmal den Analogeingang getestet, bei dem seriellen Monitor kommen die erwarteten Werte an.
Hast Du das Programm schon getestet und wie ist Dein Ergebnis.
Grüße
Heinz
Attachment: https://forum.ardumower.de/data/media/kunena/attachments/1218/Serialmonitor_1.zip/
 
Zuletzt bearbeitet von einem Moderator:
Zuletzt bearbeitet von einem Moderator:
Hallo Alexander,
danke für die schnelle Antwort.
Hast du Dir das Bild angeschaut, ist mit der neuen Datei das gleiche.
Was mache ich hier falsch?????
Grüße
Heinz
 
Hallo Heinz,

bitte versuche einmal das Programm durchzuarbeiten und dabei grob zu verstehen was gemacht wird bevor Du es anwendest - Das hilft ungemein bei der Fehlersuche :)

Dabei wirst Du bemerken dass die Baudrate für den seriellen Port festgelegt wird:

Code:
...
Serial.begin(19200);
...


Daran wird es wohl liegen :)
 
Hallo Alexander,
Du hast recht, bei "Serial.begin(9600);" kommt die richtige Anzeige.
Ich werde jetzt das Programm schrittweise durchgehen und versuchen es
einigermaßen zu verstehen. Wenn ich Erfolg habe(oder nicht) melde ich
mich wieder.
Grüße
Heinz
 
Hallo Heinz,

bin gespannt wie dein Ergebnis aussieht (bei Fragen ruhig fragen, dumme Fragen gibt es ja nicht - nur dumme Antworten :))

Gruss,
Alexander
 
Hallo Alexander,
habe heute viel getestet und komme nicht mehr weiter.
Ich bin momentan bei der Polaritätserkennung und habe für die positiven/negativen Signale zwei Zähler(Posi/Neg) verwendet, wie oft sie bei innerhalb/außerhalb der Schleife registriert werden.
Es ist immer bei Speicher “Neg“ ein größerer Zahlenwert als beim dem „Posi“ Zähler, egal ob die Spule innerhalb oder außenhalb der Schleife ist.
Auf dem Bild kannst Du erkennen, wo ich sie im Programm platziert habe und beim seriellen Monitor sind die Zählerstände zu sehen.
Hättest Du eine Idee, wo ich weiter suchen könnte oder suche ich im verkehrten Programmteil.
Grüße
Heinz
Attachment: https://forum.ardumower.de/data/media/kunena/attachments/1218/Zhler_Ardu.zip/
 
Zuletzt bearbeitet von einem Moderator:
Hallo Heinz,

auf den ersten Blick würde ich sagen: ADC nicht kalibriert :) Wenn man sich das Maximum und Minimum der ADC-Werte ansieht, stellt man bei Dir fest, dass es nicht symmetrisch ist (also Maximum ist nicht in derselben Größenordnung wie absolutes Minimum).

Das liegt wohl daran, dass dein Vorverstärker bei Stille nicht bei 2.5V am Ausgang hat. Du kannst den Wert für "Stille" aber im Code anpassen:


Code:
// ADC offset is substracted from all captured ADC samples (adjust ADC zero value here)
int16_t ADCzero = 517;


Hier einfach mal den Wert verkleinern, z.B. auf 400. Bei Stille (also wenn die Schleife aus ist, sollte bei ADCMin und ADCMax ungefähr 0 erscheinen - dann ist der ADC richtig kalibriert).

Bin gespannt ob es das war :)

Gruss,
Alexander
 
Nachtrag: desweiteren zählen Deine Zähler m.E. nicht die Polarität - die Polarität wird im Code direkt nach einer Stille erfasst (daher die Abfrage, ob vorher Stille gewesen ist ("if (i-lastPeak > 100)..."). Du müsstest einen Block aufmachen und da beides einbauen:


Code:
if (i-lastPeak > 100) {
  // neuer Block
  polarity = 1;
  Posi=Posi + 1;
}


Ohne diesen Block wird Dein Zähler (Posi=Posi+1) ständig erhöht, auch wenn gar keine Stille vorhanden war. D.h. so wie Du es jetzt hast zählst Du pauschal die Flankenwechsel pos. und neg. Die Anzahl der Flankenwechsel muss übrings für pos. und neg. über die Zeit nicht unbedingt identisch sein. Das liegt daran dass man immer nur einen Ausschnitt des (sich wiederholenden) Signals betrachtet.
 
Oben