Étape 4: Le Code
LES BIBLIOTHÈQUES :
Le « SweeperBot » se sert de fil, I2Cdev, TimerOne (pour les interruptions), bibliothèques Adafruit Sensor, HMC5883 et l’écran LCD. Vous pouvez télécharger le fichier Zip, qui contient le code pour l’Arduino et toutes les bibliothèques. Contient également le projet de Bluetooth pour Windows Phone.
LE CODE DE TÉL 8.1 DE WINDOWS :
Le projet qui contrôle le robot via Bluetooth de la Windows Phone est une adaptation de l’exemple disponible sur internet. Elle a été modifiée pour avoir quatre boutons, un pour chaque direction. Haut, bas, gauche et droite. Chaque bouton envoyer une lettre au robot, respectivement U, D, L et R. Lorsque le robot reçoit ces, il fait de la manière suivante :
- U - le robot définira la direction à suivre tout droit vers l’avant ;
- D - le robot se tournent vers le dos et aller tout droit ;
- L - le robot définira la direction à suivre exactement de 90 degrés à gauche d’où il est actuellement « la recherche » ;
- R - le robot définira la direction à suivre exactement 90 degrés à partir d’où il est actuellement « la recherche » ;
La manière dont le robot traite ces commandes peut être modifiée avec le code sur l’Arduino. Il est possible d’ajouter plus de boutons à tourner le robot, ou de l’arrêter ou même à faire revenir en arrière. Ce code est juste un exemple. Il est également possible de faire des programmes semblables à d’autres appareils, tels que les androïdes une pour IOS. La seule chose que vous devez envoyer le robot sont ces lettres - U, D, L ou R.
Pour déployer ce code sur votre Windows Phone, vous aurez besoin de Visual Studio et un téléphone débloqué développeur. Cela peut être fait en suivant les instructions sur ce lien.
LE CODE DE L’ARDUINO :
En résumé, la logique principale du robot est comme suit :
- Distance au plus près de l’objet trouvé dans chacun des capteurs 6 possibles ;
- Comportement des lignes de processus robot et point souhaité direction avec un vecteur X, Y (Cependant, si un message est reçu du smartphone, étape 2 est remplacée par la directive envoyée de l’appareil;)
- Donne boussole numérique la direction le robot va, afin de contrôler ses roues ;
- Informations X', Y' de la boussole est normalisée à l’espace [-1,1] ;
- Produit vectoriel entre le vecteur de direction désirée et réelle direction trouve erreur entre eux ;
- La méthode PID calcule PWM (puissance) pour chaque moteur à courant continu pour les deux roues (2 roues motrices) ;
- Interruption active PWM ;
Comme le projet a évolué, j’ai découvert la bibliothèque standard disponible sur GitHub pour les capteurs à ultrasons étaient contradictoires avec l’activation de PWM des moteurs, car ils ont tous deux utilisaient le même timer. Comme ce projet utilise 5 broches pour configurer le PWM des trois moteurs DC (et cela n’est possible que parce que le balai ne tourne que pour un seul sens) et plus de 7 pour les capteurs, dont le microcontrôleur à constamment vérifier si la lecture a été reçue, ce n’était pas possible d’utiliser le matériel disponible sur internet.
Donc, pour éviter tout conflit, il a été configuré uniquement l’interruption du timer 1. Par le biais de cette interruption, l’Arduino peut vérifier s’il y avait des lectures sur chaque capteur : si pas, il augmente d’une variable pour chacun d’eux, qui va être utilisé comme paramètre pour trouver la distance à l’objet.
Aussi, à l’intérieur de cette interruption, elle lève toute la puissance du moteur. Si il y a eu un certain nombre d’interruptions qui dépasse le nombre de variables PWM_R ou PWM_L, puis il jette zéro puissance à celle donnée à moteur.
Au cours de la boucle principale, le robot reste la recherche d’obstacles et de calcul d’itinéraires pour les éviter, ou changer sa trajectoire. Si le développeur souhaite configurer la méthode de contrôle de champs potentiels, ou changer le comportement du robot, il suffit de travailler à un meilleur fonctionnement de obst(). Les autres parties du programme sont nécessaires et n’avez pas besoin d’être changé. Lorsque le robot reçoit un message par l’intermédiaire de Bluetooth, il arrête en évitant les obstacles et il suffit d’écouter pour les entrées de l’utilisateur.
De toutes les parties du code, tous d'entre eux sont assez basiques, la seule fonction qui est intéressante de prendre note ici, est le readings(). À l’intérieur, le robot obtient la valeur X, Y et Z de la position actuelle sur la boussole numérique. Alors, comment faire que la lecture en quelque chose qui rend le robot sais à quelle direction il est à la recherche ?
Tout d’abord, vous obtenez les valeurs brutes :
Puis vérifier si le robot est sur le plan du droit. Cela peut être de voir si le Z (axe vertical) est la valeur entre une certaine petite plage
Il est maintenant temps pour normaliser les valeurs X et Y d’un espace entre [-1,1], afin de calculer sin() et cos() de ces valeurs.
Nous faisons maintenant vectorOBJ [n] un vecteur bidirectionnelles pointant vers où, sur le plan, nous voulons que le robot d’aller. Ainsi, pour trouver l’erreur entre deux vecteurs, nous devons faire le produit vectoriel entre les deux. La valeur résultante est un autre vecteur, mais perpendiculaire à la fois, pointant vers le haut ou vers le bas, selon son signe.