SE3Binome2023-8

De projets-se.plil.fr
Révision datée du 13 juin 2024 à 11:00 par Itepeli (discussion | contributions)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à la navigation Aller à la recherche

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.

Schématique du PCB
Fichier SVG de la couche en arrière plan
Capture d'écran du PCB
Fichier SVG de la couche en premier plan

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.

Photo du PCB brasé
Photo de la carte lors du chargement de la batterie


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 )
Fonction d'initialisation des registres


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.

Fonction qui permet d'avancer

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.

Fonction qui permet de reculer




Fonction qui permet d'aller à gauche

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.


Fonction qui permet d'aller à droite
Fonction qui permet de remettre à l'état initial les valeurs des registres


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



Tableau des valeurs à envoyer sur les entrés du TB6612FNG

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.

Fonction d'envoi de données

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 :


Programme qui stocke les commandes envoyé par USB



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.


Fonction contenant la partie DFU


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.