đTest 2 Electronique : Boite Noire â
đŻ Objectifs du projet â
Objectifs généraux:
Concevoir une boite capable de collecter et de transmettre les données de vitesse et de position du capteur MPU6050 ;
Créer une station de contrÎle qui reçoit et affiche les données provenant de la boite
Objectifs spécifiques:
- Réaliser des schémas électronique avec KICAD utilisant directement des ATMega328p;
- Designer les PCB pour ensuite les produire.
- Fabriquer votre propre alimentation Ă©lectrique pour alimenter le circuit qui ne devra pas ĂȘtre incluse dans la boĂźte.
- Fabriquer un cube de 7 cm d'arrĂȘt pour reprĂ©senter la boĂźte noire. La face supĂ©rieure du cube devra ĂȘtre ouverte si elle est faite dans un matĂ©riau opaque afin de permettre de voir le circuit Ă l'intĂ©rieur.
- CrĂ©er un bus I2C dont le seul maĂźtre sera le microcontrĂŽleur Ă l'intĂ©rieur du cube. Le capteur (dans le cube) et le microcontrĂŽleur (au niveau de la station de contrĂŽle) devront ĂȘtre les esclaves sur le bus. L'Ă©cran LCD doit ĂȘtre branchĂ© en mode 4 bits.
- Produire une vidéo dans laquelle on verra bouger le cube dans toutes les directions et les informations sur l'écran LCD.
1. Introduction â
Lors du premier test, nous avons dĂ©couvert un capteur particulier alliant les fonctionnalitĂ©s dâun gyroscope et dâun accĂ©lĂ©romĂštre, dont lâusage nous a permis de dĂ©terminer le sens de dĂ©placement et lâaccĂ©lĂ©ration de notre robot collecteur de dĂ©chets en mouvement. Cette fois-ci (pour le test 2), nous nous sommes proposĂ©s de dĂ©terminer des informations plus pertinentes et significatives que les prĂ©cĂ©dentes. Il sâagit de la vitesse de dĂ©placement et de la position spatiale. Ces valeurs, en raison de leur importance, seront collectĂ©es et enregistrĂ©es dans une boĂźte noire, puis affichĂ©es sur une station de contrĂŽle, le tout alimentĂ© par lâalimentation.
2. Architecture du systĂšme â
Notre systĂšme qui se forme de trois sous-systĂšmes principaux qui:
- la Boite Noire
- la Station de contrĂŽle
- lâAlimentation
Il est important de prĂ©ciser que le composant qui est le cĆur mĂȘme du systĂšme est le microcontrĂŽleur ATEMega328p.
PrĂ©sentation de lâATMega 328p â
LâATMega 328p est un microcontrĂŽleur 8 bits de la famille AVR(Advanced Virtual RISC) dĂ©veloppĂ© par Microship qui est beaucoup utilisĂ© dans la rĂ©alisation de projets embarquĂ©s ou juste dans lâapprentissage. Il intĂšgre la technologie picoPower qui offre une consommation ultra faible et des modes de veille Ă faible consommation idĂ©al pour les applications alimentĂ©es par batterie . Câest la version standard mais il en existe une version plus puissante ,le Atmega328 PB et qui est moins compatible avec Arduino mais qui dispose aussi dâun cĆur AVR 8 bits .

SchĂ©ma dâun ATMega 328p
Ici pour notre projet , nous utiliserons un ATMega 328p-PU(voir image ci-dessus ). Câest le mĂȘme microcontrĂŽleur , mais dans un boĂźtier DIP-28 traversant , idĂ©al pour les breadboards et cartes Arduino .Ce boitier dispose de 28 broches traversantes qui assurent sa connexion aux Ă©lĂ©ments du circuit. Il peut ĂȘtre programmĂ© en C ou via lâenvironnement Arduino. Ce composant sera donc le cĆur de notre circuit et va permettre la liaison entre les diffĂ©rents Ă©lĂ©ments du circuit .
Son architecture est la suivante :

SchĂ©ma de lâarchitecture dâun ATMega328p
RĂ©sumĂ© des broches de lâATMega 328p et leurs fonctions
| Broches | Fonction |
|---|---|
| GND | Masse |
| VCC | Alimentation de tous lâATMega en dehors des broches dâentrĂ©es analogiques |
| AVCC | Alimentation des broches analogiques |
| AREF | Reference de tensions pour les conversions analogiques |
| XTAL1,XTAL2 | Horloge externe |
| RESET | Réinitialisation |
| PD0(RX),PD1(TX) | UART (série) |
| PB3,PB4,PB5,PB2 | SPI |
| PC4(SDA),PC5(SCL) | I2C |
| PC0 à PC5 | ADC(entrée analogique) |
| PD3,PD5,PD6,PB1,PB2,PB3 | PWM |
Pour lâutiliser directement(sans carte Arduino) dans notre circuit , on utilisera les composants suivants:
- un quartz de 16MHz entre les broches XTAL1 et XTAL2m qui nous servira dâoscillateur externe;

đ UtilitĂ© : fournit un signal dâhorloge trĂšs stable et prĂ©cis grĂące Ă la vibration de son cristal Ă une frĂ©quence spĂ©cifique (par exemple, 16 MHz).
| Utilité du quartz | Détail |
|---|---|
| Cadencer les instructions | Le quartz fixe la vitesse à laquelle les instructions sont exécutées. |
| Précision temporelle | Pour que les temporisations (ex : delay(), millis()) soient exactes. |
| Communication fiable | Pour que les protocoles comme UART, SPI, I2C fonctionnent correctement. |
| Stabilité du systÚme | Un quartz est bien plus stable que les oscillateurs internes. |
deux condensateurs de 22pF, un entre chaque broche du quartz et la masse GNDÂ ;

đ UtilitĂ©: stabilise le quartz.
- Résistance de 10 kΩ sur la broche RESET;

đ UtilitĂ© : Maintient la broche RESET à l'Ă©tat haut (HIGH) pour Ă©viter les redĂ©marrages intempestifs.
- Condensateur de 100 nF (0.1 ”F) entre VCC et GND (découplage)

đ UtilitĂ©: Supprime les bruits et pics de tension sur lâalimentation du microcontrĂŽleur.
Plus clairement, sans lui dans le circuit, il peut y avoir des comportements alĂ©atoires (bugs, plantages) lors dâune charge soudaine (ex: allumage LED, envoi UART).
- Bouton poussoir

đ UtilitĂ©: rĂ©initialiser lâATMega lorsquâun problĂšme liĂ© au code survient
đŠPrĂ©sentation de la Boite Noire â
La Boite Noire est le sous systĂšme chargĂ©e de collecter, dâenregistrer, et dâenvoyer les donnĂ©es provenant du capteur MPU 6050 Ă la station de contrĂŽle.
đ ïžMatĂ©riel â
- ATMega328p
- MPU6050

đ UtilitĂ©: permet de dĂ©terminer la vitesse de dĂ©placement et la position suivant chaque axe(X,Y,Z)
- LEDs

đ UtilitĂ©: Pour signifier que la boite est effectivement alimentĂ©e.
- Resistance de 220Ω

đ UtilitĂ©: protĂ©ger la LED
đ§đđ Montage â
PrĂ©sentation du schĂ©ma du circuit Kicad du 1er PCB Pour notre 1er circuit, le microprocesseur ATMega en sera le cĆur. Câest Ă lui que seront reliĂ©s les diffĂ©rents composants du circuit et il va servir de maĂźtre. Notre microprocesseur ne disposant pas directement dâun oscillateur interne, il a fallu faire un circuit dâoscillation externe composĂ© de quartz et deux condensateurs de 22pF. Les broches de notre quartz sont Ă©galement reliĂ©es aux broches XTAL1 et XTAL2 de notre microprocesseur. Afin de simplifier au maximum la comprĂ©hension de notre schĂ©ma, des labels XTAL1 et XTAL 2 ont Ă©tĂ© créés et utilisĂ©s. Les labels sont des connexions sans fils qui relient un composant Ă un autre composant sur le schĂ©ma du circuit. Lâonglet de crĂ©ation de label est disponible sur la bande verticale droite de notre environnement Kicad. Câest dâailleurs ce qui est va ĂȘtre privilĂ©giĂ© dans tout notre schĂ©ma par rapport aux fils de connexion classiques.

SchĂ©ma du circuit dâoscillation
**-**AprĂšs il a fallu cĂąbler le circuit de reset qui va nous permettre de rĂ©initialiser notre ATMega en cas de problĂšme avec notre code. Pour le faire, on a utilisĂ© un bouton poussoir qui va nous servir de bouton « reset » qui sera connectĂ© Ă une rĂ©sistance de 10k et un condensateur de 100nF, tout ça pour veiller Ă la sĂ©curitĂ© de notre circuit et Ă la dissipation de la chaleur. Cet ensemble est connectĂ© au label Reset qui est quant Ă lui connectĂ© Ă la broche RESET de notre ATMega , toujours dans la perspective dâĂ©viter au maximum les fils de connexion classiques dans notre schĂ©ma.

Schéma du circuit de Reset
**-**Une LED dâEtat associĂ©e Ă une rĂ©sistance sera Ă©galement utilisĂ©e pour permettre en quelque sorte de notifier si notre circuit est parcouru par un courant comme avec lâarduino. Elle a Ă©tĂ© mise sur la broche D7 de notre microprocesseur.

SchĂ©ma du cĂąblage de la LED dâĂ©tat
-En ce qui concerne la broche dâalimentation de lâATMega, le bus I2C ainsi que le capteur MPU-6050, le choix a Ă©tĂ© portĂ© sur lâutilisation respective dâun connecteur 2 pin, dâun connecteur 4 pin ainsi que dâun connecteur 8 pin que nous avons renommĂ© avec les noms de broches correspondants avec lâĂ©diteur de symbole disponible dans la section outils du menu Kicad. Ces diffĂ©rents circuits ont Ă©tĂ© rĂ©alisĂ©s avec lâajout de rĂ©sistances de 4.7 kΩ sur les broches SDA et SCL. Des labels  SDA et SCL ont Ă©tĂ© créés, toujours dans lâoptique dâune comprĂ©hension facile de notre circuit.

Schéma du circuit du 1er PCB
-Il est important de noter que les broches VCC et GND de nos diffĂ©rents circuits sont connectĂ©s Ă toutes les autres broches du mĂȘme nom sur le schĂ©ma. Câest une caractĂ©ristique intrinsĂšque au logiciel Kicad. đ§LâexĂ©cution du contrĂŽle des rĂšgles Ă©lectriques affiche le message suivant :

En voyant lâinscription 0 erreurs , lâĂ©quipe sâĂ©tait dit que le travail Ă©tait fait (đ)et quâelle pouvait dĂ©jĂ passer au PCB en ignorant les avertissements du logiciel mais ce fut une grossiĂšre erreur de notre part.
AprĂšs les empreintes des diffĂ©rents composants ont Ă©tĂ© assignĂ©es dont le rĂ©capitulatif se trouve sur lâimage suivante :

đźMais lors du passage au PCB, on a obtenu le message suivant :

On a obtenu 12 erreurs lors de la gĂ©nĂ©ration de notre PCB et câest aprĂšs une lecture profonde quâon sâest rendus compte que quand on renommait les connecteurs, ils nâĂ©taient pas directement inclus dans la bibliothĂšque de composants de Kicad. CâĂ©tait comme si on crĂ©ait un Ă©lĂ©ment et quâon lâincluait dans la bibliothĂšque de Kicad, ce que lâon ne pouvait pas faire. En gros, les connecteurs nâĂ©taient pas reconnus par le logiciel, ce qui entraĂźnait leur non connexion aux diffĂ©rents Ă©lĂ©ments sur le PCB. Trois options sâoffraient donc Ă nous :
- Soit on crĂ©ait nos propres connecteurs que lâon allait inclure dans une bibliothĂšque que lâon aurait nous-mĂȘme crĂ©e ;
- Soit on cherchait si ces connecteurs étaient disponibles dans des bibliothÚques en ligne ;
- Ou soit on utilisait simplement les symboles dâorigine non renommĂ©s disponibles dans le logiciel Kicad.
Notre choix sâest donc portĂ© sur la 3Ăšme option et aprĂšs reprise du schĂ©ma on a obtenu le schĂ©ma final suivant :

Schéma final du circuit du 1er PCB
WARNING
Il est important de notifier que les broches non utilisĂ©es de lâATMega ont Ă©tĂ© notifiĂ©es au logiciel grĂące Ă des marqueurs de non connexion sinon on aurait eu des erreurs inutiles par rapport Ă ces broches. Par ailleurs les diffĂ©rents circuits ont Ă©tĂ© mis dans des cadres prĂ©cis et nommĂ©s, toujours pour permettre aux lecteurs une comprĂ©hension totale de notre circuit.
LâexĂ©cution du contrĂŽle des rĂšgles Ă©lectriques sur ce schĂ©ma a permis lâobtention de 0 erreurs ainsi que 0 avertissements comme souhaitĂ©(đ). Le mĂȘme rĂ©sultat a Ă©tĂ© observĂ© lors de ma mise Ă jour du PCB depuis notre schĂ©ma.

AprĂšs actualisation du PCB Ă partir de notre schĂ©ma, on obtenait un 1er PCB oĂč tous les Ă©lĂ©ments Ă©taient collĂ©s lâun Ă lâautre et les fils se chevauchaient.

On voit clairement sur cette image comment les diffĂ©rents composants Ă©taient mĂ©langĂ©s et comment les fils sâentrecoupaient.
Ce nâest quâaprĂšs des heures de rĂ©organisation de tout ce schĂ©ma, de reprise et des tonnes dâerreurs quâon a obtenu notre PCB final : 
Schéma du PCB final de la Boite Noire
Vue 3D du PCB final de la Boite Noire:
Dimensions  :
- 6cmx 6,5cm (taille)
- 0.5mm (0001969 in)
- Grille : 2. 5 mm
- 0.05 mm : épaisseur de la ligne de contour
- 1.6 mm : épaisseur de tout le PCB
RĂ©sultat final â
Image physique de la Boite Noire
đ„ïžPrĂ©sentation de la station de contrĂŽle â
La station de contrÎle est un systÚme qui permettra de suivre en temps réel notre robot à travers la connaissance de sa vitesse et de sa position.
đ ïžMatĂ©riel â
- ATMega328p
- Ecran LCD

đ UtilitĂ©: Afficher les valeurs de position et de vitesses du provenant du capteur
đ§đđ Montage â
Présentation du circuit KiCad du PCB de la station contrÎle
En ce qui concerne le schĂ©ma du circuit de la station de contrĂŽle, on a Ă©galement utilisĂ© un ATMega 328p auquel on a associĂ© le circuit de Reset, le circuit dâoscillation, le circuit de la LED dâalimentation.
Pour notre Ă©cran LCD I2C, on a choisi dâutiliser un connecteur 16 pin quâon a cĂąblĂ© selon le modĂšle suivant :
| LCD Pin | Fonction | Broche Arduino (Digital) | Port ATmega328P | Broche physique ATmega328P |
|---|---|---|---|---|
| 1 | GND | - | - | -GND |
| 2 | VCC (5V) | - | - | -VCC |
| 3 | Vo (contraste) | - | - | -PotentiomĂštre |
| 4 | RS | D12 | PB4 | 18 |
| 5 | RW | GND | -GND | -GND |
| 6 | E | D11 | PB3 | 17 |
| 11 | D4 | D5 | PD5 | 11 |
| 12 | D5 | D4 | PD4 | 6 |
| 13 | D6 | D3 | PD3 | 5 |
| 14 | D7 | D2 | PD2 | 4 |
| 15 | A (LED+) | VCC (via résistance 220Ω) | - | -GND |
| 16 | K (LED-) | GND | - | -GND |

Schéma du montage de la station de contrÎle
Ayant retenu la leçon du montage prĂ©cĂ©dent, on a compris quâil serait inutile de renommer les broches de notre Ă©cran dans notre schĂ©ma donc on lâa laissĂ© sous la forme disponible dans le logiciel Kicad. Ce qui nous a conduits Ă 0 erreurs et 0 avertissements (đ) lors de lâexĂ©cution du contrĂŽle des rĂšgles Ă©lectriques.
Cela nous a permis de gĂ©nĂ©rer le PCB et câest aussi aprĂšs un travail fastidieux quâon a pĂ» rĂ©organiser les fils pour obtenir le rĂ©sultat suivant :

Vue 3D du PCB final:
Les dimensions de ce PCB sont les mĂȘmes que pour le PCB prĂ©cĂ©dent.
RĂ©sultat final â
đPrĂ©sentation de lâalimentation â
đ ïžMatĂ©riel â
- Batterie au mercure de 8V

đ UtilitĂ©: source de tension
- Coupleur
đ UtilitĂ©: associer les batteries en sĂ©rie pour avoir en sortie une tension qui est la somme des tensions
- Régulateur non linéaire de type abaisseur (Buck)(XL4015)

đ UtilitĂ©: conversion de la tension fournie par la source en une tension plus stable(5V adaptĂ©e pour lâATMega328p
- Diode Zener de 5V
đ UtilitĂ©: protĂ©ger au cas oĂč il y a surtension
- Résistance de 1K
đ UtilitĂ©: protĂ©ger au cas oĂč il y a surtension
đ§đđ Montage â
Notre alimentation est une source comme par exemple une batterie à laquelle on a ajouté un régulateur de tension pour maintenir la sortie constante.
Connexions Ă lâintĂ©rieur du systĂšme
Comme point de dĂ©part ,nous allons utiliser comme source de tension, 02 batteries au mercure dâenviron 8 V chacune que nous allons assembler avec un coupleur, soit un total de 16V environ.
Par rapport au rĂ©gulateur non linĂ©aire, il est connectĂ© directement Ă la source pour effectuer la conversion de la tension fournie en entrĂ©e par cette derniĂšre en une tension plus stable, constante de 5V pour alimenter les ATMega des autres sous systĂšmes. Plus prĂ©cisĂ©ment nous faisons usage dâun XL4015 qui est un modĂšle trĂšs particulier capable de prendre entre 3 et 32 volts et de restituer entre 1.5 et 35 volts(ajustable) de tension en sortie.
La diode Zener et la résistance, quant à elles, sont cùblées entre la sortie et le régulateur, de sorte que l'alimentation du circuit soit coupée dÚs que la tension va au-delà de 5V.
Voici une complĂšte de notre alimentation.
Schéma KiCad de l'alimentation sur KICAD

RĂ©sultat final â
Image physique de lâalimentation

âïžMontage final â
Connexions entre les sous systĂšmes
De tout ce qui prĂ©cĂšde, on comprend que le systĂšme entier est lâensemble formĂ© de la boite noire (Premier PCB) , de la station de contrĂŽle (second PCB) et de lâalimentation.
- La Boite Noire et la station de contrÎle communiquent via un bus I2C qui est représenté physiquement par un connecteur 4pin avec des résistances 4.7kOhm sur les SDA et SCL.
- Lâalimentation sert de source directe (sans intermĂ©diaire) Ă la Boite Noire et la station de ContrĂŽle via un connecteur 2pin placĂ© sur la source.
Rendu final physique du systĂšme complet
Difficultés rencontrées et solutions apportées
3. Code â
đCrĂ©ation du bus I2C â
đ§Câest quoi lâI2C? â
LâI2C (prononcĂ© "I deux C" ou "I-squared-C") signifie Inter-Integrated Circuit. Câest un protocole de communication sĂ©rie inventĂ© par Philips (aujourdâhui NXP) pour permettre Ă plusieurs circuits intĂ©grĂ©s (CI) de communiquer entre eux avec seulement deux fils.
đ§ Principes de base de lâI2C â
- Nombre de fils : 2
- SDA (Serial Data Line) : ligne de données
- SCL (Serial Clock Line) : ligne dâhorloge
- Architecture :
- Un maĂźtre (master) contrĂŽle la communication.
- Un ou plusieurs esclaves (slaves) répondent.
- Un seul maĂźtre, plusieurs esclaves possibles sur le mĂȘme bus.
đ§ Fonctionnement gĂ©nĂ©ral â
- Le maĂźtre envoie un signal dâhorloge (SCL) et contrĂŽle le moment oĂč les donnĂ©es (SDA) sont envoyĂ©es ou lues.
- Chaque esclave a une adresse unique (ex : 0x68 pour un MPU6050).
- Le maĂźtre commence par envoyer une adresse dâesclave, puis des ordres ou des demandes de lecture.
- Lâesclave rĂ©pond si lâadresse reçue correspond Ă la sienne.
Explication du code du maĂźtre
âïž 1. ATMega maĂźtre (le principal) â
đ Fonction :
Lit les données du capteur MPU6050 (avec DMP) via I2C.
đ A noter :
Le DMP (Digital Motion Processor) est un processeur embarquĂ© Ă lâintĂ©rieur de certains capteurs comme le MPU6050 (gyroscope + accĂ©lĂ©romĂštre). Il est intĂ©grĂ© pour traiter les donnĂ©es brutes directement dans le capteur, sans trop solliciter le microcontrĂŽleur (Arduino, etc.).
Ce que le DMP fait : â
â Filtrage des donnĂ©es
â Fusion des capteurs (accĂ©lĂ©romĂštre + gyroscope)
â Calcul dâorientation (quaternions, angles dâEuler)
â RĂ©duction du bruit et des erreurs dues Ă la dĂ©rive
â Calcul automatique de la gravitĂ© et orientation
Calcule : accélération réelle, vitesse, position
Transmet ces données (6
float, soit 24 octets) via I2C Ă lâesclave
Code â
/*Inclusion des bibliothÚques nécéssaires*/
#include <Wire.h>
#include "I2Cdev.h"
#include "MPU6050_6Axis_MotionApps20.h"
/*Adresse de l'esclave*/
#define SLAVE_ADDR 0x08
/* CrĂ©ation dâun objet de la classe MPU6050 */
MPU6050 mpu;
/* Variables liées au DMP (Digital Motion Processor) */
bool dmpReady = false; // Drapeau indiquant si le DMP est initialisé
uint8_t devStatus; // Code de retour de l'initialisation du DMP
uint16_t packetSize; // Taille attendue des paquets FIFO DMP
uint16_t fifoCount; // Nombre de bytes actuellement dans le FIFO
uint8_t fifoBuffer[64]; // Tampon de lecture des données DMP
/* Accélérations et gravité */
VectorInt16 accelerationBrut; // Accélération brute (avec gravité)
VectorInt16 accelerationReel; // Accélération réelle (sans gravité)
VectorInt16 accelerationMonde; //Accélération dans le repere terrestre
VectorFloat gravity; // Vecteur gravité calculé à partir du quaternion
Quaternion q; // Quaternion reprĂ©sentant lâorientation absolue
float accelerationX, accelerationY, accelerationZ; // acceleration sans gravite (dans le repere monde)
float vitesseX = 0, vitesseY = 0, vitesseZ = 0; // vitesse en m/s
float positionX = 0, positionY = 0, positionZ = 0; // position en m
const float constAccelGravit = 9.81;
const float sensibiliteAccel = 16384.0;
unsigned long lastTime = 0;
void setup() {
/*Initialisation de la communication serie */
Serial.begin(9600);
/*Initialisation du bus I2C en mode maitre */
Wire.begin();
/*Pause pour stabiliser le bus et les periphériques */
delay(1000);
/*Initialisation du MPU6050 */
mpu.initialize();
/* Verification de la connexion I2C avec le capteur MPU */
while(!mpu.testConnection())
{
Wire.beginTransmission(SLAVE_ADDR);
Wire.write("ERRMPU"); // 6 caractĂšres = 6 octets
Wire.endTransmission();
}
devStatus = mpu.dmpInitialize();//Initialisation du DMP
/* Verification de l'initialisation du DMP */
while(devstatus!=0)
{
Wire.beginTransmission(SLAVE_ADDR);
Wire.write("ERRDMP"); // 6 caractĂšres = 6 octets
Wire.endTransmission();
}
/*Activation du DMP */
mpu.setDMPEnabled(true);
/* DMP est prĂȘt */
dmpReady = true;
/*Récuperation de la taille des paquets de données générés par le DMP */
packetSize = mpu.dmpGetFIFOPacketSize();
lastTime = millis();
}
void loop() {
if (!dmpReady) return; //arrĂȘt de la boucle si le DMP n'est pas prĂȘt
fifoCount = mpu.getFIFOCount();//taille actuelle des données dans la FIFO
/*ArrĂȘt de la boucle si le FIFO ne contient pas de packets complets */
if (fifoCount < packetSize) return;
mpu.getFIFOBytes(fifoBuffer, packetSize);//Lecture d'un paquet complet
/*Calcul de la gravite */
mpu.dmpGetGravity(&gravity, &q);
/*Determination du vecteur accélération brute dans le repere du capteur */
mpu.dmpGetAccel(&accelerationBrut, fifoBuffer);
/*Obtention de l'acceleration sans la gravité dans le repere du capteur */
mpu.dmpGetLinearAccel(&accelerationReel, &accelerationBrut, &gravity);
/*Determination du vecteur acceleration dans le monde reelle(repere fixe) */
mpu.dmpGetLinearAccelInWorld(&accelerationMonde, &accelerationReel, &q);
/*Conversion des donnees brutes d'acceleration en valeurs physiques reelles */
accelerationX = accelerationMonde.x / sensibiliteAccel * constAccelGravit;
accelerationY = accelerationMonde.y / sensibiliteAccel * constAccelGravit;
accelerationZ = accelerationMonde.z / sensibiliteAccel * constAccelGravit;
unsigned long now = millis();
float dt = (now - lastTime) / 1000.0;
lastTime = now;
/*Integration de l'accélération pour obtention de la vitesse */
vitesseX += accelerationX * dt;
vitesseY += accelerationY * dt;
vitesseZ += accelerationZ * dt;
/*Integration de la vitesse pour obtention de la position */
positionX += vitesseX * dt;
positionY += vitesseY * dt;
positionZ += vitesseZ * dt;
/*Envoie des donnees de position et de vitesses (dans cet ordre) Ă l'esclave Ă travers son adresse */
Wire.beginTransmission(SLAVE_ADDR);
Wire.write((byte *)&positionX, 4);
Wire.write((byte *)&positionY, 4);
Wire.write((byte *)&positionZ, 4);
Wire.write((byte *)&vitesseX, 4);
Wire.write((byte *)&vitesseY, 4);
Wire.write((byte *)&vitesseZ, 4);
Wire.endTransmission();
delay(50);
}âïž 2. ATMega esclave (le secondaire) â
đ Fonction :
- Reçoit les données envoyées par le maßtre
- Affiche position (X, Y) et vitesse (X, Y) sur un écran LCD 16x2 en mode 4 bits
Code
#include <Wire.h> //communication I2C
#include <LiquidCrystal.h> //pour contrÎler un écran LCD en mode parallÚle 4 bits
// LCD en mode 4 bits : RS, E, D4, D5, D6, D7
LiquidCrystal lcd(12,11, 5, 4, 3, 2);
// Données reçues
float px = 0, py = 0, pz = 0;
float vx = 0, vy = 0, vz = 0;
void setup() {
/*Configure lâĂ©cran comme LCD 16 colonnes Ă 2 lignes */
lcd.begin(16, 2);
lcd.print("Esclave pret");
/*Initialistion de la communication en mode esclave avec l'adresse 0x08*/
Wire.begin(0x08);
/*Définition de la fonction recevoir() comme handler à appeler quand le maßtre envoie des données I2C */
Wire.onReceive(recevoir);
}
void loop() {
/*Affichage de la position sur la premiere ligne de l'ecran LCD */
lcd.setCursor(0, 0);
lcd.print("Pos:");
lcd.print(px, 1);
lcd.print(":");
lcd.print(py, 1);
lcd.print(":");
lcd.print(pz,1);
/*Affichage de la vitesse sur la 2e ligne de l'ecran */
lcd.setCursor(0, 1);
lcd.print("Vit:");
lcd.print(vx, 1);
lcd.print(":");
lcd.print(vy, 1);
lcd.print(":");
lcd.print(vz, 1);
delay(500);
/*Nettoyage de l'ecran */
lcd.clear();
}
/*Fonction de reception des donnees provenant du maĂźtre */
void recevoir(int n)
{
if (n == 6)
{ // Un message d'erreur de 6 caractĂšres
char msg[7] = {0}; // +1 pour null-terminator
for (int i = 0; i < 6; i++) {
msg[i] = Wire.read();
}
if (strcmp(msg, "ERRMPU") == 0) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Erreur capteur:");
lcd.setCursor(0, 1);
lcd.print("MPU non detecte");
}
else if(strcmp(msg, "ERRDMP") == 0)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Erreur capteur:");
lcd.setCursor(0, 1);
lcd.print("DMP INACTIF");
}
}
else if (n >= 24) //Si la taille des données reçues est au moins 24 octets
{
/*Lecture des 24e premiers octets reçues dans un tableau */
byte buffer[24];
for (int i = 0; i < 24; i++)
{
buffer[i] = Wire.read();
}
/*Recuperation de chaque float dans les bonnes variables */
memcpy(&px, &buffer[0], 4);
memcpy(&py, &buffer[4], 4);
memcpy(&pz, &buffer[8], 4);
memcpy(&vx, &buffer[12], 4);
memcpy(&vy, &buffer[16], 4);
memcpy(&vz, &buffer[20], 4);
}
}4. DifficultĂ©s â
- Difficultés à redisposer les éléments lors de la génération du PCB
- Conflits avec la bibliothÚque Kicad en raison de la modification des noms des connecteurs, ce qui a conduit à une reprise du schéma
- ImpossibilitĂ© dâimpression de notre PCB en raison de la couche manquante, ce qui a conduit Ă lâutilisation dâun veroboard
- Manque de matĂ©riel lors du montage de notre circuit sur le veroboard ProblĂšmes de tension avec lâalimentation en raison de lâutilisation de piles qui se dĂ©chargent
5. CompĂ©tences tirĂ©es de ce test â
- Creation dâun bus I2C
- Design dâun PCB
- CĂąblage dâun LCD en parallĂšle (mode 4bits)
- Comprehension de lâutilisation directe dâun ATMega328p avec dâautres sans arduino.
6. Annexe â
Retrouvez ici les fichiers sources: