Einführung
Eine detaillierte Geschichte darüber, wie das Arduino-Auto, das von einem Android-Gerät über Bluetooth gesteuert wird, aus drei Motoren zusammengesetzt wurde. In mehreren Dutzend Absätzen werde ich versuchen, Schritt für Schritt so viel wie möglich zu erklären, wo die einzelnen Drähte angeschlossen werden, wie eine proprietäre Anwendung geschrieben wird und auf welchen Kinderharken ich mehr als eine Woche lang springen musste.
Ein bisschen über Level, Autor und Warnungen
Ich, ein Autor, ein Kind zwischen 16 und 17 Jahren aus einem Dorf in der Nähe von Moskau, habe mich auf das Schreiben von Android-Anwendungen spezialisiert (und dort ist es schwieriger, etwas zu verbrennen). Deshalb übernehme ich die Verantwortung für einen optimalen Ansatz zur Lösung von Problemen.
Praktisch jeder der unten beschriebenen Schritte hat mich mehr gekostet, als es die Zeit wert wäre. Wahrscheinlich aus diesem Grund möchte ich meine Erfahrungen teilen. Gleichzeitig freue ich mich sehr, wenn Sie nach Fehlern schimpfen und mich zur Optimierung auffordern.
Herausforderung
Die einfachste Aufgabe besteht darin, das Arduino-gesteuerte Auto zum Fahren zu bringen und die Fernbedienung durch ein Android-Gerät zu ersetzen. Aber in den meisten Momenten musste ich das Rad neu erfinden, weil im Internet keine geeignete Lösung gefunden wurde.
Wird brauchen
- Arduino
- Motor Shield (in meinem Fall zwei)
- Bluetooth
- Android
- Herkömmliche Drähte
Designbasis
Der Lego Outdoor Challenger wurde als Basis genommen (in Wirklichkeit sieht er weniger erbärmlich aus). Alles, was von ihr übrig bleibt: der Koffer (alle Dekorationselemente werden entfernt) und drei Motoren.

Die Maschine hatte ein eigenes Board, aber eine der Aufgaben implizierte Universalität: Ich habe es getan, andere können es wiederholen. Er holte das Gehirn heraus und setzte den Arduino Uno ein.
Arduino Installation
Aus irgendeinem Grund stellten die Schöpfer dem Arduino keinen Platz zur Verfügung, deshalb befestigten sie ihn durch Bohren von Kunststoff an den Schrauben. Er legte Sperrholz unter das Brett, damit nichts kurzgeschlossen wurde. Es ist besser, etwas Plastik unter die Schrauben (ein Stück Flasche) zu schieben, da die Platte nicht vor Eisenbolzen geschützt ist.

Oben auf dem Brett habe ich sofort zwei Motorscheiben angebracht, also sei es. Um den zweiten zu steuern, müssen Sie einen Draht von einem beliebigen digitalen Anschluss nach H1 (Richtung) und den zweiten von einem Stift mit einer Unterlegscheibe (gekennzeichnet mit einem „~“, normalerweise 10, 11) nach E1 (Geschwindigkeit) werfen.

Bestimmung des Drehwinkels
Es ist überraschenderweise nicht der Servoantrieb, der auf die Drehung der Maschine reagiert, sondern der gewöhnliche Motor. Es gibt ein Problem: Es wäre schön, es nicht zu verbrennen, da der Drehwinkel begrenzt ist und der Motor so viel drehen kann, wie Sie möchten.
Die Option mit der Poke-Methode verschwindet, da sich bei einem anderen Batteriestand die dem Motor zugeführte Strommenge ändert, was zu einem sich ständig ändernden Winkel führt. Es ist auch unmöglich, bis zum Anschlag zu drehen, früher oder später bröckeln die Zahnräder.
Lösung: Verfolgen Sie den Winkel durch die Schaltung. Das Foto zeigt ein kleines Ding, das in der Nähe des Drehmechanismus montiert ist. An dem Teil, der sich mit den Rädern vom Motor nach links / rechts dreht, ist eine Jakobsmuschel mit Eisenkontakten angebracht.


Funktionsprinzip: An jede Leitung wird ein Draht gelötet (es gibt insgesamt vier), der Boden ist mit dem Plus verbunden (es wird immer mit einem Kamm geklemmt, siehe Bild), die restlichen Drähte gehen auf Minus. Wenn der Jakobsmuschelzahn in die unterste Reihe fällt und beispielsweise in der dritten Reihe ein Kurzschluss auftritt und Strom fließt, wird dies von Arduino bemerkt.

Dank der verschiedenen Kombinationen der drei Bänder können bis zu sieben Winkel definiert werden. Wenn beispielsweise auf allen Leitungen Strom vorhanden ist, werden die Räder ganz nach rechts gedreht. Wenn nur oben Strom vorhanden ist, werden die Räder so weit wie möglich nach links gedreht. Die Tabelle enthält alle Optionen.

Verbindungswinkel und Code
Jede Farbe hat ihre eigene Farbe: Die Unterseite ist grün, die erste unten ist rot, die zweite ist schwarz und die dritte ist weiß. In der Anfangsphase wurden Steckbrett und LEDs zum visuellen Debuggen verwendet.

Das Anschlussdiagramm ist in der Abbildung dargestellt. Außerdem ziehen wir zu Grün, die anderen strecken wir zu Minus. Schließen Sie die Drähte über den installierten Widerstand an die Ausgänge A0-A2 an, um Störungen und das Fehlen von Kurzschlüssen zu vermeiden. Sie werden einfach aus dem Speichern anderer Ports ausgewählt.

Der Code wird mit Kommentaren angegeben. Wir verbinden Pins und fragen sie über digitarRead () ab. Wenn Spannung anliegt, wird true zurückgegeben. Als nächstes schauen wir, ob das Ergebnis bedeutet, dass sich die Räder in extremen Positionen befinden. Wir verbieten eine weitere Drehung in diese Richtung.
Ein kleiner Trick: Da in Zukunft Ausgänge mit 5 V und 3,3 V benötigt werden, können Sie einen Pluspunkt auf einen der digitalen Pins setzen. Geben Sie vor jeder Winkelprüfung einen Strom durch digitalWrite (whitePin), überprüfen Sie dann den Winkel und entfernen Sie den Strom.
int speedTurn = 180; // , 0 255 // int pinRed = A0; int pinWhite = A1; int pinBlack = A2; int pinAngleStop = 12; // , , // void setup() { // pinMode(pinRed, INPUT); pinMode(pinBlack, INPUT); pinMode(pinWhite, INPUT); // pinMode(pinAngleStop, OUTPUT); // , pinMode(angleDirection, OUTPUT); pinMode(angleSpeed, OUTPUT); Serial.begin(9600); } // loop(), void turn(int angle) { digitalWrite(pinAngleStop, HIGH); // , delay(5); // , "" if(angle > 149) { if( digitalRead(pinWhite) == HIGH && digitalRead(pinBlack) == LOW && digitalRead(pinBlack) == LOW) { // , , // return; } // , digitalWrite(angleDirection, HIGH); analogWrite(angleSpeed, speedTurn); } else if (angle < 31) { if(digitalRead(pinRed) == HIGH && digitalRead(pinBlack) == HIGH && digitalRead(pinWhite) == HIGH) { // , , // return; } // , digitalWrite(angleDirection, LOW); analogWrite(angleSpeed, speedTurn); } digitalWrite(pinAngleStop, LOW); // delay(5); }
Parallelisierung von Laufrädern
Zunächst sind zwei Antriebsmotoren miteinander verbunden. Sie wurden aus zwei Gründen getrennt: Eine Drehung ist effektiver, wenn die Räder in verschiedene Richtungen durchdrehen und zwei leistungsstarke Motoren nicht an einem Brett ziehen.
Problem: Die Motorabschirmung hat zwei Ausgänge, von denen jeder bis zu 2 Ampere erzeugt. Jeder Motor frisst 0,7A. Es scheint weniger, aber nicht bei maximaler Belastung. Nehmen wir an, die Maschine steckt im Sand oder ruht sich aus, der Strom steigt über das Ampere. Nicht kritisch, aber potenziell gefährlich.
Es stellte sich jedoch als kritisch heraus, dass sich das Board erwärmt. Minuten und eine halbe Stunde nach dem Rennen erwärmte sich das Motorschild und begann hässlich zu arbeiten: Die Ströme wurden nicht richtig zugeführt, die Räder drehten nicht und so weiter.
Die Lösung für beide Probleme: Ein Motor ist mit einem Motorschild verbunden, der zweite mit dem anderen. Seltsamerweise hat es geholfen. Die Temperatur ist gesunken, es gibt keine Überhitzung. Sie könnten einen Kühler einsetzen, aber die Montage ist schwierig.

Bluetooth-Verbindung
Ich habe das Modell HC-05 verwendet, das einen fatalen Witz spielte. Alle Bluetooth-Geräte sind auf die gleiche Weise verbunden: Ein Kabel mit 3,3 V (manchmal begann es erst ab 5 V zu arbeiten), das zweite mit Minus, zwei weitere an Port 0 und 1 (Lesen bzw. Senden). Ein von RXD auf Bluetooth signiertes Kabel steckt in TXD Arduino und TXD in RXD fest (wenn Sie es verwechseln, werden die Daten nicht angezeigt).
Es gibt eine Einschränkung: Die Ports 0 und 1 werden standardmäßig von Serial verwendet, wodurch die Skizze überflutet wird. Das heißt, während das Bluetooth nicht funktioniert, wird die Skizze nicht überflutet. Es gibt zwei Möglichkeiten: Nehmen Sie das Bluetooth für die Zeit des Füllens heraus oder weisen Sie die Ein- und Ausgänge des Bluetooth neu zu. Die zweite Option wird in zwei Zeilen ausgeführt.
#include <SoftwareSerial.h> \\ SoftwareSerial BTSerial(8, 9); \\ 8 9 0 1
Die Falle, die mich drei Arbeitstage lang aufgefressen hat, ist die Geschwindigkeit der Kommunikation. Aus Gewohnheit habe ich 9600 installiert und es versucht. Entweder kamen die Daten nicht, dann gab es ein Durcheinander von Charakteren. Und am Ende lautet die Antwort, dass der HC-05 auf 38400 kommuniziert! Achten Sie genau darauf, dass ich in Setup () BTSerial.begin (39400) ausführen werde, obwohl Serial.begin (9600).
Befehlssendesystem
Der Artikel wird zu lang, daher werde ich die Betrachtung des Arduino- und Android-Codes in einem separaten zweiten Teil herausnehmen und nun das Prinzip beschreiben.
Auf dem Android-Gerät befindet sich ein Joystick (ein Kreis, dessen Implementierung sich ebenfalls im zweiten Teil befindet). Android liest die Messwerte daraus und wandelt sie in für Arduino geeignete Zahlen um: Die Geschwindigkeit von Pixeln wird zu einem Wert von -255 bis 255 (negativ - umgekehrt) und bestimmt auch den Winkel. Ich habe diese Aufgabe bewusst dem Telefon übertragen, da es viel leistungsfähiger ist und die Berechnung von mehreren hundert Werten pro Sekunde ruhig bewältigen kann.

Nach der Installation des Sockets werden die Daten im folgenden Format gesendet: @ speed # * angle #. @ - zeigt an, dass die folgenden Ziffern die Geschwindigkeit enthalten, # - gibt das Ende des Geschwindigkeitswertes an, * - den Anfang des Winkelwerts, # - beendet die Aufzeichnung des Winkels. Der Zyklus ist endlos, Befehle werden alle 100 Millisekunden gesendet (die optimale Anzahl wird ausgewählt). Wenn auf dem Android nichts gedrückt wird, wird nichts gesendet.
Der Datenempfangsalgorithmus ist im Skizzencode ausführlich beschrieben. Er hat mehr als einmal korrespondiert und funktioniert für mich perfekt.
Abschluss des ersten Teils
In diesem Artikel habe ich versucht, alles offenzulegen, was sich auf den physischen Teil der Maschine bezieht. Höchstwahrscheinlich habe ich etwas verpasst, also fragen Sie unbedingt.
Aber das interessanteste, was mich betrifft, blieb für das zweite - das Arduino-Programm und die Android-Anwendung, dort ist echte Magie los, zumindest für das junge Ich.
Wenn Sie die Antwort auf einen Teil nicht finden und mich persönlich in Mängel stürzen möchten, warte ich - dendolg1@mail.ru,.
UPD: Der zweite Teil ist bereits erschienen -
habr.com/post/424813