PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : adafruit motor shield V1, Ultraschall-Sensor und ferngesteuertes Fahrzeug



discomiller
02.07.2016, 16:37
Hallo zusammen,

ich bin kurz vorm Verzweifeln und für Hilfe dankbar.

Ich möchte einen ferngesteuerten Traktor als Robot mit ultraschall-Sensor umbauen.
Wenn der Traktor ein Hindernis erkennt, soll er rückwärts fahren (und dabei die Lenkung einschlagen)

Hierzu habe ich folgendes gemacht:

Traktor aufgeschraubt und 6 zusätzliche Kabel am RC-Shield verlötet:
2 x an den Frontmotor (das ist scheinbar kein Servo, sondern nur ein normater Motor mit Anschlag)
2 x Heckmotor
1 x GND an die Batteriebox
1 x Spannung (5 x Mignon a 1,5 V =>in Summe 7,5 Volt).

Erste Frage: Ich habe das RC-Shield des Tranktor nicht abgeklemmt.
Kann das so bleiben oder soll ich die Kabel besser kappen, damit ich keine unerwünschten Nebeneffeke habe?

Mein Problem ist nun, dass sich der Traktor aufgrund des Ultraschallsensor seltsam verhält. Ich kann auch keine Logik feststellen.
Mal fährt der Traktor vorwärts, mal rückwärts, mal gar nicht.
Ich vermute, das hat was mit der Spannungsverteilung zu tun; bin mir aber nicht sicher.
Der Traktor bzw. der Ultraschallsensor verhält sich auch anders, wenn ich das USB noch am Arduino habe.


An welche Anschlüsse soll ich 7,5 Volt und das zugehörige GND-Kabel hängen?
An die dafür vorgesehenen Anschlüsse auf dem Motor-Shield oder soll ich den Power-Jack des Arduinos verwenden?
Mal ne doofe Frage nebenbei: Reichen die 7,5 Volt überhaupt aus?
Ohne Umbau müssen die 7,5 Volt ja nur die beiden Motoren und das RC-Shield versorgen.
Nach dem Umbau muss ja noch der Arduino mit seinen 5 Volt und der Ultraschallsensor versorgt werden.
Wenn ich zusätzlich noch eine andere Batterie dran hängen soll, würdet ihr mir bitte auch die PINs mitteilen, wo das dran soll?

Dann muss ich bitte noch wissen, wie ich den GND- und den 5V-Pin des Ultraschallsensor an das Shild anschließe.
Welche PINS des Ultraschallsensor soll ich hier verwenden. Ich habe ein JPG des Ultraschallsensor beigefügt.
Wäre schön, wenn Ihr das markieren könnt.

Bin mal gespannt auf Eure antworten.

Danke, Grüße
Mio

Rabenauge
03.07.2016, 09:49
7.5V reichen.
Geradeso- weniger Spannung sollte der Arduino nicht bekommen, da der verbaute Spannungsregler 2V Differenz braucht, und mit 5V läuft das Ding.
Das Shield ist uralt- und eher keine so gute Wahl. Zum einen kann es ohne Umbau nur 600mA pro Kanal liefern (könnte reichen, weiss ich nicht), und zum anderen belegt es sehr viele Pins- nutzloser Weise. Die neueren Motorshields sind in beidem besser!
Welche Pins noch frei sind, steht in der Doku bei Adafruit, ausm Kopf weiss ich das nicht. Die analogen dürften aber frei sein, die kann man auch als digiltale benutzen (bei den I2C-Pins weiss ich es ziemlich sicher, dass sie nicht genutzt werden). Dort kann also der US-Sensor dran.
Und klar muss das Shield extern mit Strom versorgt werden- wie, kannst du der Doku _auch_ entnehmen.

Die RC-Anlage würd ich auf jeden Fall rausnehmen, beides parallel betreiben geht ganz sicher nicht- und was das Teil macht, wenn es Spannung an den Motorausgängen bekommt, ist nahezu unvorhersehbar. Was gutes bestimmt nich....

discomiller
05.07.2016, 03:52
Hi Sly,

vielen Dankfür Deine Antwort.
Ich habe das RC-Shield abgeklemmt. Resultat: Die Motoren laufen schneller. Nach wie vor aber das seltsame Phänomen mit dem unregelmäßigen Verhalten des Ultraschallsensors. Ich glaube, ich tausche mal das Breadboard (evtl. Chinaschrott) und nehme zusätzlich neue Kabel. Evtl. hilft das. Danke

Viele Grüße
Mio

Rabenauge
06.07.2016, 09:40
Schwer, was zu sagen ohne Schaltplan und Programm zu sehen.
Um "mal eben fix" nen Schaltplan zu zeichnen, eignet sich Fritzing recht gut- sehr viele Arduino-Komponenten sind dort bereits enthalten.

Die üblichen Verdächtigen (HC-SR04) muss man schon bissel clever ansteuern, weil die sonst das gesamte Programm ziemlich lahm legen können.
Wenn du den US-Sensor mittels pulseIn() einliest, definiere unbedingt ein Timeout, sonst wird da nie was fertig. Ich glaub, default war da ne volle Sekunde!
Das Motorshield ist auch etwas- naja, umständlich eben. Hab das Teil auch, aber verstärkt und- schon länger nicht mehr benutzt. Von daher weiss ich jetzt nicht mehr, ob das Interrupt-gesteuert wird.

discomiller
06.07.2016, 18:18
Hi Sly,

Schaltung kann ich Dir bieten.
Ich habe die Schaltung wie in

http://www.instructables.com/id/Arduino-Ultimate-Obstacle-Avoiding-Robot/?ALLSTEPS

Nur habe ich nicht das dort verwendete Chassis mit einem Motor links und einem Motor rechts, sondern einen Motor Hinten und einen Motor vorne. Der vordere Lenker-Motor ist keine Servo, sondern es wurde ein normaler Motor verbaut. Der Motor hat einfach einen Anschlag. Der Motor kann nur ein paar kleine Drehungen links bzw. rechts machen, bis die Lenkung dann am Anschlag ist.

Den Sketch habe ich auch aus o.a. Link runtergeladen.

Den HC-SR04 habe ich auch isoliert getestet. Da funktioniert es.

Meine Vermutung ist: Beim Erkennen eines Hindernis mit dem HC-SR04 werden beide Motoren aktiviert -->
Der Lenkungsmotor schlägt das Lenkrad links ein und der Antriebsmotor fährt rückwärts. Und hier tritt das Phänomen i.d.R. auf, dass dann der HC-SR04 nicht mehr erkennt, dass er sich vom Hindernis wegbewegt.

In der Console sehe ich in meiner Ausgabe immer nur "Hindernis in Entfernen kleiner 15 cm" . Diese Meldung kommt auch, wenn ich den HC-SR04 komplett abklemme.
Daher meine Vermutung, dass der HC-SR04 zu wenig SAFT bekommt, wenn beide Motoren laufen.
Kann das sein, dass dem so ist?


Danke

Grüße
Mario

piggituX
07.07.2016, 11:28
Hi,

ja V1 ist schon was älter, hier die FAQ dazu, dann siehste auch welche Pin bereits belegt sind, bin ich damals auch drauf reingefallen....

https://learn.adafruit.com/adafruit-motor-shield/faq

cYa

Rabenauge
07.07.2016, 17:17
Ja, wär denkbar.
Motoren _immer_ extern versorgen -das Shield gibt das her!
Die HC-SR04 (vor allem die ganz billigen) haben so einige Macken: eine davon ist eben die Spannungsproblematik.

Das Programm da ist übrigens ziemlicher Murks (und, ganz nebenbei, poste es das nächste Mal bitte hier, Instructables, Mediafire- so nötig hab ichs auch nich...).
Es gibt nämlich z.B. _kein_ Timeout für den Sensor! Damit macht der, im ungünstigsten Fall, _eine_ Messung pro Sekunde. Funktioniert bei der hohen Reichweite des HC-SR04 und nem ausreichend langsamen Fahrzeug natürlich, aber Stümperei bleibts.
Da steht, wie man das vernünftig lösen kann: https://www.arduino.cc/en/Reference/PulseIn

pulseIn ist blockierend! Heisst: in der Zeit, in der auf einen Puls gewartet wird (entweder, bis einer rein kommt, oder eben ne volle Sekunde bzw. bis zum festgelegten Timeout) macht das Programm- GAR NICHTS. Gerade das ist der wichtigste Grund, warum da unbedingt ein sinnvolles Timeout eingebaut werden sollte.
Welches sinnvoll ist kannst du dir ausrechnen: Maximalreichweite des Sensors, Schallgeschwindigkeit, Zeit, die die Schallwellen für den doppelten Weg brauchen....dazu etwas Reserve, sonst kann es sein, du empfängst Echos auch noch.

HaWe
07.07.2016, 18:46
diese blockierenden Funktionen sind einer der Gründe, warum ich grundsätzlich Multitasking verwende.

Funktionen, die auf Ergebnisse warten müssen, werden in eigenständige Tasks ausgelagert und können da warten, bis sie schwarz werden - und das übrige Programm läuft auf seinen Zeitscheiben problemlos weiter.

Übrigens machen auch TFT Displays diese Blockierung, daher kommt die Displayausgabe grundsätzlich bei mir auch in eigenständige Tasks.

Für den Arduino Due gibt es die Scheduler lib (kooperatives MT), doch auch für AVRs liegen inzwischen MT Libs vor, teilweise sogar pre-emptiv.


http://forum.arduino.cc/index.php?topic=347188.0
http://www.rtos48.com/