OMower SDK für Radroboter (Open Source, Open Hardware)

Schließlich haben wir das versprochene SDK für das OMower-Projekt veröffentlicht (eine offene Software- und Hardwareplattform für Radroboter auf Basis des 32-Bit-ATSAM3X8E-Controllers mit Entwicklungsunterstützung in Arduino IDE). Der Grad der Software-Fertigstellung ist nicht sehr gut (zum Beispiel gibt es keine Klassen für Stoßfänger-, Regen- und Grassensoren, einige Funktionen sind nicht vollständig getestet), aber selbst in seiner aktuellen Form kann der Roboter mit hoher Genauigkeit über RTK GPS fahren und unterstützt fast alles, was benötigt wird Mäher - Sonare, Kabelumfang, Kompass und GPS-Navigation, Laden von einer Ladestation oder einem Solarpanel.


Mein vorheriger Artikel über das OMower-Projekt

Der SDK-Code und die Kicad-Dateien mit der Schaltung und der Verkabelung der Platine liegen auf dem Github .

Derzeit werden nur zwei Plattformen unterstützt - OMower Board v3 mit Polulu Dual MC33926-Motortreibern und einer Reihe von Arduino Due + IHM12A1-Motortreibern (Testmaschine auf einem kleinen vierrädrigen Chassis). Ardumower-Unterstützung basierend auf Arduino Due kann hinzugefügt werden. Es ist sehr wünschenswert, ein IMU GY-80-Board zu haben, ohne das die Navigation nicht einfach funktioniert (obwohl Sie einen einfachen Mähermann herstellen können, der versehentlich in den Kabelumfang fährt).

In der neuen, vierten Version der Karte ist geplant, eine IMU MPU9250 darauf zu platzieren und einen FRAM-Chip hinzuzufügen, um Benutzereinstellungen zu speichern, die nicht im internen Flash des Controllers enthalten sind (der beim erneuten Laden der Firmware zurückgesetzt wird). Nun, alle Arten von Karten können darin gespeichert werden. Außerdem werde ich wahrscheinlich die Größe der Widerstands- und Kondensatorbaugruppen erhöhen, das Löten des 0402 „am Knie“ mit einem Haartrockner war ein Vergnügen unter dem Durchschnitt und den Platz für die Anschlüsse vergrößern, damit Sie diese mit Klemmen und nicht nur mit Stecknadeln platzieren können.

Der API-Code wird in Form einer Handvoll Klassen (omower - *. H-Dateien) geschrieben, die Sie als Objekte in Ihre Software aufnehmen müssen (und optional alle einschließen können, können Sie nur diejenigen verwenden, die benötigt werden, mit Ausnahme der Basisklassen). Um das Verständnis und Testen zu vereinfachen, wurde OMower_Simple geschrieben , das eine ziemlich große Anzahl von Befehlen ausführt, die über pfodApp von jedem Smartphone aus ausgegeben werden.

Das SDK übernimmt die Kontrolle über alle Funktionen auf niedriger Ebene und arbeitet hauptsächlich mit Unterbrechungen. Dadurch kann der endgültige Softwareprogrammierer Software unabhängig von den spezifischen Details eines bestimmten Roboters und auf sehr kostenlose Weise schreiben (Sie können eine Zustandsmaschine schreiben oder einfach die Startantriebsfunktion aufrufen und warten Sie, bis der Roboter den gewünschten Punkt erreicht hat. Nur die Verfahren zum Aufrufen der Funktionen zum Initialisieren und Steuern der Fahrt des Roboters fallen auf die Schultern des Programmierers (Anweisungen, wohin die Operationen von Sonaren und anderen Sensoren tatsächlich gehen und zu verarbeiten sind).

Zum Anschließen zusätzlicher externer Geräte auf der Karte (und natürlich zur Unterstützung im SDK) gibt es viele externe Anschlüsse. Beispielsweise können Standard-Servoantriebe mit PPM-Eingang bis zu vier Teile anschließen (oder sogar sechs, wenn Sie zwei Motoren ablehnen). Es gibt viele „Standard“ -Sensoren für den Mäher, es gibt bis zu sechs dieser Sonare und vier der Umfangssensoren. In den meisten Fällen wird natürlich nicht so viel benötigt, und ein Teil ihrer Anschlüsse kann zum Anschließen einiger anderer Geräte verwendet werden (fast alle Ausgänge des Mikrocontrollers werden ausgegeben). Der intellektuelle Teil (Verarbeitung von RTK GPS, Konnektivität mit WLAN) wird von Orange PI Zero ausgeführt, das in einem speziellen Anschluss installiert ist.

Ich entschuldige mich im Voraus für die Kurve und den unvollendeten Code an einigen Stellen, ich musste mich mit anderen Projekten befassen, und es kamen viele Schwierigkeiten auf, die ich kaum bewältigen konnte. Aber ich habe viele neue Dinge gelernt, zum Beispiel, dass die Krümmung der Erdellipse an unseren Orten fast 40 Meter beträgt und die Magnetpole der Erde von Jahr zu Jahr mehrere zehn Kilometer wandern (ohne dies zu berücksichtigen, bewegte sich der Roboter mit sehr gekrümmten Linien von Punkt zu Punkt). Manchmal schien es, als würde ich eine Weltraumrakete starten und kein Rasenmähen. :) :)

Als Bonus habe ich auch die Quellen meiner Firmware für das Arduino mit Decawave DW1000 ausgelegt, das ein Mini-Netzwerk dieser Geräte organisiert und es dem Roboter ermöglicht, seinen Standort in Innenräumen zu bestimmen oder wo RTK GPS seine Koordinaten einfach nicht bestimmen kann (mit Unterstützung für eine nahezu unendliche Menge) Tags und Aufteilung in Räume). Diese Firmware ist immer noch sehr, sehr roh, kann aber für jemanden nützlich sein.

Update, ich habe beschlossen, den Artikel mit einer Geschichte darüber zu ergänzen, wie er im Inneren angeordnet ist:

Der SDK-Benutzer muss alle benötigten Objekte ermitteln, die Funktion begin () für alle aufrufen (Hardware-Initialisierung nur einmal), dann die Werte seiner Parameter festlegen (nachdem er sie aus dem Flash gelesen hat oder nur Standardwerte), init () für alle aufrufen (die Funktion kann) Zum Zurücksetzen des Geräts, für das das Objekt verantwortlich ist.) Legen Sie Hook-Funktionen für poll10 / poll20 / poll50 fest (10, 20 und 50 Mal pro Sekunde), von denen aus die entsprechenden poll * () -Funktionen aller verwendeten Objekte aufgerufen werden sollen. Theoretisch war es möglich, all dies im Code des SDK selbst zu automatisieren, aber ich habe mich entschieden, dies nicht zu tun, da zusätzliche Controller-Ressourcen verbraucht werden. Ein Beispiel für die Verwendung, die Sie für OMower_Simple.ino benötigen

Eine der Hauptklassen ist das Motorobjekt (omower-motors.h), das die Motortreiber über seine Funktion poll10 () steuert. Der Benutzer ruft einfach Roll / Move (Drehen und Fahren ohne Navigation) oder RollCourse / MoveCourse (Fahren mit Navigation / Korrektur basierend auf Daten eines untergeordneten Objekts der navThing-Klasse auf, das über die Funktionen readCourseError () den Wert der Abweichung von der gewünschten Fahrtrichtung angibt )

Derivate von navThing sind Objekte der Klassen imu und gps (omower-imu.h und omower-gps.h). Die erste ist für das Lesen und Konvertieren der Kompass- / Beschleunigungsmesser- / Gyroskopdaten in eine bequeme Form verantwortlich (sie gibt die Kompass- und Neigungswerte in Grad auf zwei Achsen an ) Die zweite - verarbeitet GPS-Daten und lenkt das Motorobjekt in die richtige Richtung, wenn Sie über GPS- oder RTK-GPS-Koordinaten fahren müssen (für letztere wird die Korrektur berechnet, wenn sich die Antenne nicht in der Mitte des Roboterkörpers befindet, und die Kurzzeitkorrektur durch Kilometerzählersensoren). Das Anwenderprogramm ist für die Kommunikation mit dem GPS-Empfänger selbst verantwortlich und überträgt NMEA-Zeichenfolgen oder Bereitschaftskoordinaten an das GPS-Objekt.

Das Mähobjekt (omower-mow.h) ist für den Schermotor und dessen Aktuatoraufzug mit einem Schrittmotor (falls vorhanden) verantwortlich. Der Benutzer sagt, mit welcher Geschwindigkeit gedreht und welche Schnitthöhe eingestellt werden soll.

Das pwmServo-Objekt (omower-pwmservo.h) steuert die PWM-A / B / C / D / E / F / G / H-Ausgänge (dies kann aufgrund möglicher Konflikte mit Zeitgebern nicht über andere Bibliotheken erfolgen).

Das Leistungsobjekt (omower-power.h) ist für die Steuerung der Laderegler und die Umwandlung der ADC-Werte in Volt und Ampere verantwortlich, die jeder versteht. Das Anwenderprogramm muss das Auftreten von Spannung an den Ladeelektroden erkennen und die Funktion zum Einschalten des Ladevorgangs aufrufen. Anschließend werden die PWM-Zyklen der Regler entsprechend dem Ladestrom erfasst.

Da die Verwendung von Standard-Arduin Serial * -Objekten die Interrupt-Behandlung unterbrechen kann (siehe unten), gibt es ein serielles Objekt (omower-serial.h) zum Lesen und Übertragen von seriellen Ports. Leider besteht das gleiche Problem bei I2C-Bussen. Sie müssen mit den in due-i2c-blocking.h definierten Funktionen verwendet werden.

Die Funktionen anderer Objekte sind aus ihren Namen ersichtlich. Sie können nur die Kommentare in den Header-Dateien (omower-sonars.h, omower-rtc.h, omower-current * .h, omower-odometry.h usw.) anzeigen.

Nun zu Interrupts auf der untersten Ebene. Das Chassis-Objekt (omower-chassis.h) konfiguriert TIM7 mit 100 Interrupts pro Sekunde. Bei jedem Interrupt werden 12 Kanäle des ADC-Chips MAX11617 gelesen (in ein spezielles Array eingegeben, von dem OMower SDK-Objekte ihre Werte lesen - max11617-adc-scan.h). Bei jeder Sekunde wird ein weicher Interrupt für den Funktionshaken poll50 () generiert, bei jeder fünften - poll20 (), bei jeder zehnten - poll10 (). Sie arbeiten alle asynchron (was praktisch ist, aber die Verwendung des I2C-Busses einschränkt, später plane ich, dort einige Transaktionen / Semaphoren hinzuzufügen).

Der TIM5-Timer ist auch so konfiguriert, dass er Interrupts mit einer Frequenz von 38462 Hertz erzeugt. Von diesem Interrupt werden alle Kanäle des internen ADC-Controllers gelesen und in ein spezielles Array eingegeben (es unterstützt auch die Eingabe jedes empfangenen Werts für den ausgewählten Puffer in den Ringpuffer, was beispielsweise durch die Perimeterklasse erfolgt und diese Abtastwerte später unter Verwendung der Fourier-Transformation filtert).

Um Debugging-Informationen auszugeben, gibt es eine debug () -Funktion mit einer minimalen Priorität für die Anzeige von Nachrichten (das heißt, während das Debugging nicht durchgeführt wird, wird nichts an die Konsole ausgegeben, aber Sie können jederzeit mindestens die maximale Stufe aktivieren, es wird Spam sein). In den Formaten für Debugging-Werte (* printf-Format) werden Gleitkommazahlen unterstützt (im Gegensatz zu Standard-Arduin-Funktionen).

Update: Die neue vierte Version der OMower-Karte, bisher nur eine Schaltung (wartet auf die Herstellung der Leiterplatte). Enthält zusätzlich einen Kompass / Beschleunigungsmesser MPU9250, 128 Kilobyte F-RAM zum Speichern von Einstellungen, Karten, Wegpunkten und anderen Dingen, alle Anschlüsse mit Verriegelungen (Molex 22-11-20x3 / 10-11-20x3, kompatibel mit der alten Version von einem 2.54- Pins), 74HC4050-Logikpegelübersetzer für Sonare und Kilometerzähler, leistungsstärkere 3,3 / 5-Volt-Stromrichter (bis zu drei Ampere), zwei weitere PWM / PPM-Ausgänge an Steckverbindern, separate Leitungen zur unabhängigen Steuerung des zweiten Schrittmotortreibers, mehr Pufferkondensatoren für Stabilität Große SMD-Elemente für eine einfache Montage kleinere Änderungen.


Source: https://habr.com/ru/post/de409515/


All Articles