Présentation
Une histoire détaillée de la façon dont la voiture Arduino, contrôlée par un appareil Android via Bluetooth, a été assemblée à partir de trois moteurs. Dans plusieurs dizaines de paragraphes, j'essaierai d'expliquer autant que possible étape par étape où connecter chacun des fils, comment écrire une application propriétaire et sur quel râteau pour enfants j'ai dû sauter pendant plus d'une semaine.
Un peu sur le niveau, l'auteur et les avertissements
Moi, un auteur, un enfant de 16 à 17 ans d'un village près de Moscou, je suis spécialisé dans l'écriture d'applications Android (et là, c'est plus difficile de graver quelque chose), je décline donc la responsabilité d'une approche optimale pour résoudre les problèmes.
Pratiquement chacune des étapes décrites ci-dessous m'a pris plus que ce qui en valait la peine. C'est probablement pour cette raison que je veux partager mon expérience. Et en même temps, je serai très heureux si vous grondez pour les erreurs et dites-moi pour l'optimisation.
Défi
La tâche la plus simple consiste à faire rouler la voiture contrôlée par Arduino et à remplacer la télécommande par un Android. Mais dans la plupart des moments, j'ai dû réinventer la roue, car aucune solution appropriée n'a été trouvée sur Internet.
Aurez besoin
- Arduino
- Bouclier moteur (dans mon cas deux)
- Bluetooth
- Android
- Fils conventionnels
Base de conception
Le Lego Outdoor Challenger a été pris comme base (en réalité, il a l'air moins pathétique). Tout ce qui reste d'elle: le boîtier (tous les éléments de décoration sont supprimés) et trois moteurs.

La machine avait sa propre carte, mais l'une des tâches impliquait l'universalité: je l'ai fait, d'autres peuvent la répéter. Il a sorti le cerveau, a mis l'Arduino Uno.
Installation Arduino
Pour une raison quelconque, les créateurs n'ont pas fourni d'espace pour l'Arduino, ils l'ont donc fixé aux vis en forant du plastique. Il plaça du contreplaqué sous la planche pour que rien ne soit court-circuité. Il est préférable de glisser quelque chose de plastique sous les vis (un morceau de bouteille), car la planche n'est pas protégée contre les boulons en fer.

Au sommet de la planche, j'ai immédiatement mis deux moteurs shiled, qu'il en soit ainsi. Pour contrôler le second, vous devrez lancer un fil depuis n'importe quel port numérique vers H1 (direction) et le second depuis une broche avec un support de cale (marqué d'un «~», généralement 10, 11) vers E1 (vitesse).

Détermination de l'angle de rotation
Ce n'est étonnamment pas le servo variateur qui répond à la rotation de la machine, mais le moteur ordinaire. Il y a un problème: ce serait bien de ne pas le brûler, car l'angle de rotation est limité, et le moteur peut tourner autant que vous le souhaitez.
L'option avec la méthode Poke disparaît, car à un niveau de batterie différent, la quantité de courant fournie au moteur changera, ce qui conduira à un angle en constante évolution. Il est également impossible de tourner à fond, tôt ou tard les vitesses s'effondreront.
Solution: suivre l'angle à travers le circuit. La photo montre une petite chose, qui est montée près du mécanisme rotatif. Sur la partie qui tourne avec les roues gauche / droite du moteur, une coquille Saint-Jacques avec contacts en fer est fixée.


Principe de fonctionnement: un fil est soudé à chaque ligne (il y en a quatre au total), le bas est connecté au plus (il est toujours serré avec un peigne, voir la photo), les fils restants passent au moins. Lorsque la dent de pétoncle tombe sur la rangée du bas, et sur, disons, la troisième, un court-circuit se produit, le courant circule, cela est remarqué par Arduino.

Grâce aux différentes combinaisons des trois bandes, jusqu'à sept angles peuvent être définis. Par exemple, quand il y a du courant sur toutes les lignes, les roues sont tournées à l'extrême droite, quand il n'y a du courant qu'en haut, les roues sont tournées vers la gauche autant que possible. Le tableau fournit toutes les options.

Angle et code de connexion
Chaque couleur a sa propre couleur: le fond est vert, le premier ci-dessous est rouge, le second est noir et le troisième est blanc. Au stade initial, une maquette et des LED ont été utilisées pour le débogage visuel.

Le schéma de connexion est illustré dans la figure. De plus, nous tirons au vert, les autres nous étirons à moins. Grâce à la résistance installée pour éliminer les interférences et l'absence de court-circuit, connectez les fils aux sorties A0-A2. Ils sont sélectionnés simplement à partir de l'enregistrement d'autres ports.

Le code est fourni avec des commentaires. Nous connectons les broches et les interrogons via digitarRead (). S'il y a une tension, true sera retourné. Ensuite, nous regardons si le résultat signifie que les roues sont dans des positions extrêmes, nous interdisons un nouveau virage dans cette direction.
Une petite astuce: comme des sorties sur 5V et 3,3V seront nécessaires à l'avenir, vous pouvez mettre un plus sur l'une des broches numériques. Avant chaque vérification d'angle, donnez un courant via digitalWrite (whitePin), puis vérifiez l'angle et supprimez le courant.
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); }
Parallélisation des roues de roulement
Initialement, deux moteurs de propulsion sont connectés ensemble. Ils ont été déconnectés pour deux raisons: un virage est plus efficace si les roues tournent dans des directions différentes, et deux moteurs puissants ne tirent pas une planche.
Problème: le blindage du moteur a deux sorties, chacune produisant jusqu'à 2 ampères. Chaque moteur consomme 0,7A. Il semble moins, mais pas à des charges maximales. Disons que la machine est coincée dans le sable ou reposée, le courant monte au-dessus de l'ampère. Pas critique, mais potentiellement dangereux.
Mais il s'est avéré essentiel que la planche chauffe. Quelques minutes et demie après la course, le bouclier moteur se réchauffait et commençait à mal tourner: les courants n'étaient pas les bons, les roues ne patinaient pas, etc.
La solution aux deux problèmes: un moteur connecté à un bouclier moteur, le second à l'autre. Curieusement, cela a aidé. La température a baissé, il n'y a pas de surchauffe. Vous pourriez mettre un radiateur, mais c'est difficile à monter.

Connexion Bluetooth
J'ai utilisé le modèle HC-05, qui jouait une blague fatale. Tous les Bluetooth sont connectés de la même manière: un fil à 3,3 V (parfois, il ne fonctionnait qu'à partir de 5 V), le second à moins, deux autres aux ports 0 et 1 (lecture et envoi, respectivement). Un fil signé par RXD sur Bluetooth est coincé dans TXD Arduino et TXD dans RXD (si vous le mélangez, vous ne verrez pas les données).
Il y a une mise en garde: les ports 0 et 1 sont utilisés par défaut par Serial, à travers lequel l'esquisse est inondée. Autrement dit, alors que le bluetooth est bloqué, le croquis ne sera pas inondé. Il y a deux façons de sortir: retirer le bluetooth pendant le temps de remplissage ou réaffecter les entrées et sorties du bluetooth. La deuxième option est réalisée en deux lignes.
#include <SoftwareSerial.h> \\ SoftwareSerial BTSerial(8, 9); \\ 8 9 0 1
Le piège qui m'a mangé pendant trois jours de travail est la vitesse de communication. Par habitude, j'ai installé 9600 et suis allé essayer. Soit les données ne venaient pas, alors il y avait un désordre de personnages. Et au final la réponse est que le HC-05 communique sur 38400! Faites très attention au fait que dans Setup () j'exécuterai BTSerial.begin (39400), bien que Serial.begin (9600).
Système d'envoi de commandes
L'article devient trop long, je vais donc retirer la considération du code Arduino et Android dans une deuxième partie séparée, et maintenant je vais décrire le principe.
Il y a un joystick sur l'appareil Android (un cercle, dont la mise en œuvre est également dans la deuxième partie). Android en lit les lectures et les convertit en nombres adaptés à l'arduino: la vitesse des pixels se transforme en une valeur de -255 à 255 (négatif - inverse), et détermine également l'angle. J'ai délibérément confié cette tâche au téléphone, car il est beaucoup plus puissant et capable calmement de faire face au calcul de plusieurs centaines de valeurs par seconde.

Après l'installation du socket, les données sont envoyées au format suivant: @ speed # * angle #. @ - indique que les chiffres suivants contiennent la vitesse, # - indique la fin de la valeur de vitesse, * - le début de la valeur d'angle, # - termine l'enregistrement de l'angle. Le cycle est sans fin, les commandes sont envoyées toutes les 100 millisecondes (le nombre optimal est sélectionné). Si rien n'est pressé sur l'androïde, alors rien n'est envoyé.
L'algorithme de réception des données est décrit en détail dans le code d'esquisse. Il a correspondu plus d'une fois et, pour moi, fonctionne parfaitement.
Conclusion de la première partie
Dans cet article, j'ai essayé de divulguer tout ce qui concerne la partie physique de la machine. Très probablement, j'ai raté quelque chose, alors assurez-vous de demander.
Mais le plus intéressant, quant à moi, est resté pour le second - le programme Arduino et l'application Android, la vraie magie s'y passe, du moins pour le jeune moi.
Si vous ne trouvez pas la réponse à une partie et que vous voulez me pousser personnellement dans les lacunes, j'attends - dendolg1@mail.ru ,.
UPD: la deuxième partie est déjà sortie -
habr.com/post/424813