SE3Binome2023-8
Préambule
Ce projet consiste à réaliser une voiture autonome propulsée par deux moteurs pilotés par un Atmega16u4 et un TB6612FNG.
Objectifs
La voiture doit respecter certains critères qui sont:
- Posséder des LEDs en guise de clignotants.
- Pouvoir être alimentée par port USB.
- Pouvoir être alimenté par une batterie.
- Avoir un mode autonome où elle exécute un programme qui la fait avancer et tourner.
- Avoir un mode où elle est commandé par un PC.
- Les deux modes doivent être des programmes différents qu'on téléverse selon le mode qu'on veut.
Étapes
Les différentes tâches à accomplir sont :
- Concevoir un PCB
- Braser les composants
- Programmer la carte en DFU
- Programmer la carte avec la libusb
Concevoir un PCB
KICAD
Le PCB a été conçu sur Kicad. Les schématiques qui étaient déjà fourni sont: les connecteurs USB, ISP, moteurs; l'Atmega et le chargeur. On les ai complété pour qu'ils soient connectés, rajouté les LEDs et le connecteur pour changer de mode d'alimentation.
Fichier du PCB
Le projet peut être retrouvé ici: Fichier:Kicad Voiture.zip
Brasure des composants
Pendant la brasure
La brasure s'est passée sans gros soucis, on est arrivé au bout de la brasure sans avoir à changer de PCB.
On peut toutes fois mentionner le fait d'avoir mis une résistance juste devant le connecteur batterie, qui obstruait le connecteur. On a été contraint de souder le connecteur à l'arrière du PCB.
De même, l'empreinte de la diode D1 a été mal choisie, on a donc décidé de raccorder les deux bornes avec de l'étain en faisant attention dans le futur à ne pas brancher l'USB et la batterie en même temps.
De plus, les résistances R13 et R14 gênaient le bon fonctionnement de la batterie et du chargeur Lipo, par exemple le résistance R13 réduisait la tension délivrée par la batterie, qui devenait trop faible pour alimenter la carte. Pour y remédier, nous avons donc brasé des résistances de 0 ohm.
Le Label Chargement était aussi inutile et même cause de court-circuit, nous avons donc dû couper la piste.
Après la brasure
Après avoir brasé le PCB bloc par bloc en vérifiant si chaque blocs fonctionnent correctement avant de passer au suivant, on a brasé tous les composants, sauf les capacités de découplage C10 et C11, et tout fonctionne.
Nous avons vérifié que la batterie ne chauffe pas lors de la charge et que la LED de charge s'allumait bien
et que la tension à ses bornes avait bien augmenté après la charge.
La charge est très rapide car alimentée avec du 5V pour un batterie de 3,7 V et avec une petite capacité de stockage.
Programmer la carte
La programmation de la carte est composée de 2 parties, la partie programmation en DFU et programmation partie la libusb.
Programmation en DFU
Pour cette partie, nous allons créer un programme qui fait 5 actions :
- Avancer
- Reculer et mettre les feux arrière ( car nous respectons les autres usagers de la route )
- Tourner à droite et mettre les clignotants ( car nous avons encore tous nos points sur nos permis de conduire )
- Tourner à gauche et mettre les clignotants ( car nous respectons le code de la route )
- Allumer toutes les LEDs ( pour savoir si on doit aller passer chez le garagiste )
Tout d'abord, nous avons dû initialiser nos registres, en mettant un 1 pour les Outputs et un 0 pour les Inputs, pour les Inputs on doit rajouter une résistance pour éviter un état de haute impédance en envoyant un 1 avec PORTx.
Ensuite nous avons codé les fonctions qui gèrent les différentes actions, en premier la fonction pour avancer en utilisant les pins In/Out et PWM des moteurs.
Puis vient la fonction pour reculer, nous avons juste modifié les valeurs envoyées dans les pins.
Suivi des fonctions pour aller à gauche et à droite, toujours en utilisant et modifiant les valeurs dans les pins.
Avant de modifier les registres, on utilise la fonction Reset() qui remet les valeurs des registres à l'état initial.
Nous avons utilisé les moteurs en tout ou rien pour simplifier cette partie et pouvoir terminer la partie libusb,
nous nous sommes servis du tableau ci-dessous qui nous donne les valeurs à envoyer dans chaque registre pour faire tourner nos moteurs.
Nous utilisons un bouton Start pour démarrer le programme, on vérifie sa valeur avec PINC>>7
Voici en action les différents programmes dans la voiture :
Et un gros plan sur les LEDs :
Programmation via libusb
Cette partie était la plus compliquée du projet, nous avons tout d'abord récupéré ( par des moyens peu conventionnels ), une base de programme utilisant la libusb que nous avons adapté.
Nous avons inclus nos fichiers de programmation en DFU pour conserver les mêmes fonctions.
Nous avons réutilisé les Descriptor.* de la manette en les réadaptant.
Cette fonction envoie au EndPoint définit les données que l'on veut envoyer jusqu'à 100 envois.
Et d'afficher si le message a bien était reçu.
Dans un premier temps, nous avons décidé de contrôler les moteurs juste avec les données envoyées, puis de rajouter la partie DFU et enfin de stocker les commandes envoyées puis les exécuter lorsque la bonne commande est entrée.
Vidéo de la partie contrôle par commande :
Cette fonction permet lorsqu'une information USB est reçue au EndPoint de la traiter et d'envoyer le morceau de code associé à la donnée reçue dans une liste d'exécution.
Lorsqu'une instruction est envoyé dans la liste, les LEDs s'allument pour le signaler.
Lorsque l'information envoyée contient une valeur supérieure à 4, les commandes de la liste sont exécutées dans l'ordre d'arrivée dans cette dernière.
Dans le cas où aucune information n'est envoyée et le bouton Start est pressé, le programme installé en DFU se lance.
Malheureusement, à cause de notre erreur de conception avec D1, nous ne pouvons pas brancher la batterie et l'USB en même temps, donc nous n'avons pas pu tester cette partie en mode autonome.
Vidéo finale du projet ( en première partie le code DFU et en deuxième partie la partie libusb )
Git
Git :https://archives.plil.fr/itepeli/Premier_systeme_embarque.git
Conclusion du projet
Ce projet nous a permis de consolider ce que nous avons appris du projet manette :
- Conception Kicad
- Brasure
- Programmation par registre
- Programmation par libusb
Finalement, nous avons réussi à concevoir, braser la voiture, ainsi que la programmer par DFU, par libusb, la rendre autonome avec une batterie et intégrer un chargeur pour la batterie.