<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
		<id>https://projets-ima.plil.fr/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rfarault</id>
		<title>Wiki de Projets IMA - Contributions de l’utilisateur [fr]</title>
		<link rel="self" type="application/atom+xml" href="https://projets-ima.plil.fr/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rfarault"/>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php/Sp%C3%A9cial:Contributions/Rfarault"/>
		<updated>2026-05-14T02:33:26Z</updated>
		<subtitle>Contributions de l’utilisateur</subtitle>
		<generator>MediaWiki 1.29.2</generator>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91453</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91453"/>
				<updated>2023-05-09T22:26:43Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : /* Programme du robot */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Résumé'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
[[Fichier: SegwayRobot.jpg|200px|right|thumb|Exemple de robot similaire au notre]]&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
L'intégralité de notre programme est disponible sur le dépôt git à l'adresse: https://gitlab.com/remi_farault/self-balanced-robot&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Présentation générale'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==🌏Contexte==&lt;br /&gt;
Les moyens de transport actuels reposent principalement sur le principe du robot à deux roues, c'est la raison pour laquelle l'étude de celui ci s'avère importante, en effet l'étude   &lt;br /&gt;
de sa conception et son contrôle va nous permettre de développer des outils innovants qui pourraient potentiellement intéresser des sociétés de transport .&lt;br /&gt;
&lt;br /&gt;
==🎯Objectif==&lt;br /&gt;
&lt;br /&gt;
Notre objectif principal est de commander le robot, de là interviennent d'autres objectifs tel que la stabilité ,développer un code robuste qui assure cette fonctionnalité et aussi le contrôler pour réaliser des fonctionnalités de déplacement et d'éviter des obstacles . Des objectifs secondaires sont de créer un site web à travers lequel nous allons mener toutes les opérations de contrôle .&lt;br /&gt;
&lt;br /&gt;
==🔍Expression du besoin==&lt;br /&gt;
&lt;br /&gt;
Un robot autoéquilibré à deux roues est un type de robot qui peut se maintenir en équilibre sur deux roues sans tomber. Pour réaliser cette fonctionnalité, le robot utilise un ensemble de capteurs, d'algorithmes de contrôle et de moteurs pour ajuster sa position en temps réel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Self_balanc_bt.png|400px|Bete a corne SBR]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le diagramme interacteurs permet en fait de visualiser les fonctions services assurées par le système &lt;br /&gt;
&lt;br /&gt;
[[Fichier:341702419_560921119358434_1016673599353874396_n_(1).png|400px|DGI SBR]]    [[Fichier:Btacorne.png |500px|DGI SBR|right]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Réalisations et Résultats'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
[[Fichier: seg.jpg|200px|left|thumb|Exemple de commande désirée]]&lt;br /&gt;
&lt;br /&gt;
Après mis en place notre stratégie de gestion de projet en s6 à travers le diagramme de GANTT et le cahier de charges fonctionnels, nous nous sommes focalisés sur l'étude technique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: progg.png|300px|right|thumb|Organisation de notre programme]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, étudier à travers des outils automatiques la stabilité du robot en faisant appel à des modèles théoriques et pratiques et commencer par un raisonnement par niveaux, d'abord le niveau 1 du moteur à courant continu et les équations correspondantes puis le niveau 2 assurant la stabilité du robot directement, on avait la possibilité de passer directement au niveau 2 à travers le modèle du pendule inversé et les équations qui en découlent sauf que celui-ci ne nous permettra pas de revenir au niveau 1 et asservir le moteur à travers les codeurs incrémentales ,la deuxième partie consistait à réaliser les codes informatiques en s'appuyant sur les structures de données en C vues l'année dernière et conduire un même raisonnement(par niveaux) s'appuyant d'abord sur les codes sources correspondants à la génération d'un signal PWM pour les deux moteurs avec un rapport cyclique modifiable, et aussi les codes sources correspondants à la gestion des moteurs, en effet, ceux-ci tournent  dans un sens ou dans un autre ou ne tournent pas en fonction de la variable in1 et in2  pour faire tourner les moteurs .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Avr.png|100px|left|thumb|Compilateur utilisé]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cependant, nous avons rencontré quelques problèmes en automatique notamment pour trouver des valeurs des constantes théoriques pour les références du moteur entre les mains, ce qui nous a obligé à prendre des valeurs issues d'autres applications, nous avons rencontré aussi quelques problèmes choisir une modélisation parmi celles qui sont disponibles sur Internet .&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Etude Automatique'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Avant de programmer notre système sur la carte Arduino, nous avons également créé une simulation complète de notre système robotisé sur SIMULINK. Cependant, avant cela, nous avons dû déterminer les équations qui régissent notre système en trouvant les matrices d'inertie de chaque composant de notre robot, à savoir la masse transportée par le robot (M), le châssis constitué de deux plateaux et de la motorisation (les piliers et leur inertie ont été négligés car leur masse est très faible), ainsi que les roues (roue droite et roue gauche). Vous trouverez ci-dessous les matrices d'inertie que nous avons obtenues pour chaque composant.&lt;br /&gt;
&lt;br /&gt;
'''Masse M :'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatM.png|200px|thumb|left|Matrice de la masse M]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients seront notés dans la suite pour simplifier : AM,BM,CM &lt;br /&gt;
&lt;br /&gt;
'''Chassis:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatB.png|800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AH,BH,CH &lt;br /&gt;
&lt;br /&gt;
'''Roue gauche:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrg.png |600px|Matrice de RG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
'''Roue droite:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrd.png |600px|Matrice RD]]&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
Ci-dessous un paramétrage de notre système : Chaque angle détermine un repère&lt;br /&gt;
&lt;br /&gt;
Le repère R0 est supposé galliléen.&lt;br /&gt;
&lt;br /&gt;
Le repère R1 est en rotation  ,appelé angle de virage par rapport à R0.&lt;br /&gt;
&lt;br /&gt;
Le repère R2 est en rotation  ,appelé angle d’inclinaison du châssis par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R3 est en rotation  ,appelé angle d’inclinaison arrière-avant de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R4 est en rotation ,appelé angle d’inclinaison droite-gauche de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:param.png |800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
l’angle de consigne est de 0deg,nous employons un PID pour corriger l’angle de mesure,à sa sortie,on aura une tension W(p).Les blocs Km et W(p) assurent le passage tension-&amp;gt;couple-&amp;gt;angle ,il faut ensuite retirer  pour ne garder que l’angle d’inclinaison du châssis  .Km=0.0125N.m.V-1(d’après la datasheet du moteur)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bcle.png |800px|Asservissement]]                                                             [[Fichier:Matuu.png|right|800px|Asservissement]]      &lt;br /&gt;
&lt;br /&gt;
Les équations obtenues sont les suivantes (Le détail des calculs a été précisé dans le Rapport): &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eq nnlin.png |500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après linéarisation : Considérer l'approximations des petits angles pour le sinus et cosinus,et négliger aussi la vitesse angulaire quadratique devant la vitesse angulaire,nous obtenons : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eqlin.png |300px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crbe.png|600px|Courbe]]&lt;br /&gt;
&lt;br /&gt;
On obtient une courbe avec un bon temps de réponse, un léger dépassement et une stabilité .Le système est régulé de manière efficace, capable de répondre rapidement et précisément aux perturbations tout en maintenant une position d'équilibre stable.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mat3d.png|500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Environnement de developpement'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Notre microcontrolleur étant une Arduino Uno, nous aurions pu utiliser le framework ''Arduino'' donnant accès à un IDE intégrant les outils pour compiler et flasher le code, ainsi qu'une multitude de bibliothèques haut niveaux très simples d'utilisation et plutôt performantes, permettant de programmer notre robot en simplement quelques dizaines de lignes de code.&lt;br /&gt;
&lt;br /&gt;
Cependant, l'Arduino est simplement une carte de prototypage intégrant un microcontrôleur ''AVR Atmega 328p''. &lt;br /&gt;
Les microcontroleurs AVR disposent d'une grande communauté, et il existe de nombreux outils nécessaires au developpement sur ces cartes.&lt;br /&gt;
Afin d'avoir un meilleur contrôle sur notre projet, et surtout d'en tirer un maximum de compétences, nous avons donc décidés de programmer notre robot directement en C en utilisant les outils AVR:&lt;br /&gt;
&lt;br /&gt;
- '''avr-gcc''': compilateur open-source portant toutes les fonctionnalités du langage C standard sur les microcontroleurs AVR.&lt;br /&gt;
Seul, son utilisation est quasiment impossible et demande trop de travail en programmation bas-niveau.&lt;br /&gt;
&lt;br /&gt;
- '''avr-libc''': implémentation basé sur le compilateur avr-gcc de la bibliothèque standard du langage C.&lt;br /&gt;
Cette bibliothèque permet donc d'utiliser les fonctions et structures standards du C (IO, maths, chaines de caractères), mais elle intègre également un mapping mémoire de tous les registres de l'atmega, ainsi qu'un mécanisme pour programmer des interruptions.&lt;br /&gt;
&lt;br /&gt;
- '''avr-objcopy''': ce programme en ligne de commande formate le binaire obtenu en format utilisable par les AVR&lt;br /&gt;
&lt;br /&gt;
- '''avr-dude''': ce programme en ligne de commande permet de flasher via une interface USB-série un microcontroleur AVR présent sur une carte Arduino.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc developpé un '''Makefile''' utilisant tous ces outils, constituant un environnement de developpement très efficace pour notre projet. Ce Makefile est disponible sur notre gitlab.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Programme du robot'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''PWM'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
La première étape consistait à commander nos moteurs DC, afin de poser les bases de notre&lt;br /&gt;
asservissement bas niveau. Ces moteurs sont contrôlés par le driver de moteurs, utilisant des signaux logiques pour définir l’état d’un moteur et des signaux '''PWM''' pour définir la vitesse de&lt;br /&gt;
rotation. La génération de signaux PWM sur AVR se fait en utilisant les '''timers''' en mode PWM.&lt;br /&gt;
Tout simplement, nous avons un registre compteur 16 bits incrémenté périodiquement, et une valeur&lt;br /&gt;
maximale définie par le registre ''ICRx''. Nous utilisons ensuite les registres ''OCRnx'' contenant une&lt;br /&gt;
valeur inférieure au maximum. &lt;br /&gt;
Lorsque le compteur atteint la valeur contenue dans OCRnx, il&lt;br /&gt;
inverse la valeur logique de sortie du pin ''OCnx''. Ainsi, nous pouvons modifier instantanément la&lt;br /&gt;
valeur d’OCRnx afin de modifier le rapport cyclique de notre signal. Ce rapport cyclique est ensuite&lt;br /&gt;
directement proportionnel à la vitesse de rotation du moteur associé. &lt;br /&gt;
La fréquence du signal est définie par la période d’incrémentation du compteur et par la valeur maximale ICRx.&lt;br /&gt;
Pour notre composant, nous pouvions utiliser une fréquence allant jusqu’à plusieurs kHz. Cette&lt;br /&gt;
fréquence n’a aucun impact sur la rotation du moteur. Nous avons donc choisis 20 kHz.&lt;br /&gt;
Nous avons définis la '''init_pwm''' pour configurer les registres nécessaires, et la fonction&lt;br /&gt;
'''generate_pwm''' pour modifier le rapport cyclique de nos deux signaux PWM avec la valeur&lt;br /&gt;
souhaitée.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Encodeurs'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Une fois nos moteurs pouvant tourner à une vitesse voulue, nous avons du trouver un moyen de&lt;br /&gt;
mesurer leurs vitesses effectives afin de réaliser une boucle d’asservissement. Pour cela, nous avons&lt;br /&gt;
utilisés les encodeurs optiques disponibles sur nos moteurs DC. &lt;br /&gt;
Ces encodeurs envoient sur leur broches un front-montant à chaque tour de la roue codeuse reliée au moteurs (ayant une vitesse&lt;br /&gt;
proportionnelle à celle du moteur). En détectant ces fronts montant, nous pouvons donc compter le&lt;br /&gt;
nombre de tours du moteur pendant un intervalle de temps défini, puis déterminer la vitesse réelle&lt;br /&gt;
du moteur.&lt;br /&gt;
Pour détecter les fronts montant, nous utilisons l’interface '''Pin Change Interrupt''' de l’Atmega. Cette&lt;br /&gt;
interface exécute une interruption logicielle à chaque changement d’état logique du pin associé.&lt;br /&gt;
Dans notre cas, nous devons ensuite observé l’état précédent de la sortie et l’état actuel pour&lt;br /&gt;
déterminer si on est bien en présence d’un front montant. Une fois le front montant détecté, cette&lt;br /&gt;
interruption incrémente ensuite le compteur de tours.&lt;br /&gt;
Ce compteur est ensuite utilisé pour calculer la vitesse de rotation puis remis à zéro pour la mesure&lt;br /&gt;
suivante.&lt;br /&gt;
Dans notre cas, nous réalisons cette mesure à une fréquence d’environ 244 Hz, dans une autre&lt;br /&gt;
fonction d’interruption qu’on détaillera plus loin.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Angle'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Notre boucle de régulation principale a besoin d’une mesure de l’angle d’inclinaison du robot sur&lt;br /&gt;
son axe vertical perpendiculaire à celui de déplacement. Cette mesure s’effectue via le '''MPU6050'''.&lt;br /&gt;
Ce composant fonctionne via le protocole '''i2c''', protocole de communication simple utilisé par la&lt;br /&gt;
plupart des systèmes électroniques. Ce protocole étant bas niveau, il existe de nombreuses&lt;br /&gt;
bibliothèques implémentés en C permettant son utilisation. De plus, le MPU6050 est un composant&lt;br /&gt;
très complet et complexe, afin d’en récupérer l’angle, il faut d’abord amorcer une communication&lt;br /&gt;
i2c puis configurer certains des ses registres, afin ensuite de pouvoir lire les registres contenant la&lt;br /&gt;
mesure de l’angle selon l’axe désiré. Afin de conserver un code efficace et concis, nous avons&lt;br /&gt;
également décidés d’utiliser une bibliothèque faisant office de « '''driver''' » pour ce composant,&lt;br /&gt;
intégrant des fonctions d’initialisation et de lecture des mesures faites par ce gyroscope.&lt;br /&gt;
Nous obtenons donc la valeur de l’angle en degrés, comprise entre 0 et 360.Dans notre cas, nous souhaitions obtenir une valeur comprise entre -180 et 180, car seule la valeur&lt;br /&gt;
absolue et le sens de l’inclinaison nous intéresse, nous avons donc appliqués une correction de cette&lt;br /&gt;
valeur.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Interruption principale'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Lors de implémentation d’un asservissement automatique via un microcontrôleur, la puissance de&lt;br /&gt;
calcul finie impose que les commandes des actionneurs et les mesures des capteurs doivent être&lt;br /&gt;
réalisées périodiquement. Pour cela, nous pouvons utiliser une '''routine d’interruption''' qui s’exécute à&lt;br /&gt;
chaque ''overflow'' d’un compteur, via l’interface des '''timers''' de l’atmega. Dans notre cas, cette&lt;br /&gt;
interruption correspond à la fonction principale de notre programme. Nous avons réglés sa&lt;br /&gt;
fréquence à 244Hz, en divisant le fréquence de base de 16MHz avec un '''prescaler''' de 256 (plus une&lt;br /&gt;
deuxième division par 256 du à la taille du registre timer de 8 bits).&lt;br /&gt;
Cette interruption vient d’abord remettre a zéro les compteurs des encodeurs et récupérer la vitesse&lt;br /&gt;
des deux moteurs.&lt;br /&gt;
Ensuite, elle effectue les calculs nécessaires à la régulation de l’angle, mais également de la vitesse&lt;br /&gt;
linéaire et de la rotation du robot.&lt;br /&gt;
Chaque paramètre à réguler est corrigé par un régulateur PID de coefficients différents via la&lt;br /&gt;
fonction '''pid()'''.&lt;br /&gt;
Enfin, nous obtenons une commande à envoyer aux moteurs, qui actionnent notre robot de la&lt;br /&gt;
manière souhaitée.&lt;br /&gt;
Le code de notre système est disponible sur nôtre dépôt gitlab également.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Gestion de projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Durant ces trois semestres, la gestion de projet est un des domaines où nous avons le plus de difficultés, mais également un de ceux dans lequel nous avons le plus appris. &lt;br /&gt;
&lt;br /&gt;
Voici notre Diagramme de Gantt previsionnel réalisé au S6&lt;br /&gt;
[[Fichier:Gt.png|400px|thumb|left|texte descriptif]]&lt;br /&gt;
&lt;br /&gt;
D'abord trois, nous nous sommes retrouvés à deux dès le deuxième semestre, et nous avons donc du modifier l'organisation prévue pour la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons au final plus ou moins suivis ce diagramme previsionnel, à quelques choses près.&lt;br /&gt;
&lt;br /&gt;
En travaillant à deux, nous avons du trouvé un moyen d'avancer efficacement.&lt;br /&gt;
L'un de nous étant en filière SA (Systemes Autonomes) et l'autre en filière SC (Systemes Communicants), la répartition des taches informatiques et automatiques était donc simplifiée.&lt;br /&gt;
&lt;br /&gt;
Cependant, nous avons donc du réussir à expliquer et à mettre en relation chacune de nos parties, en s'améliorant sur la partie communication.&lt;br /&gt;
Pour cela, au début de chaque séance, nous commencions par faire le point sur l'avancement globale et propre à chacun.&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous nous répartitions les taches communes aux différentes parties.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous échangions sur les taches respectives à nos deux parties afin de pouvoir les faire coincider le moment venu, et il est arrivé plusieurs fois que l'on s'aide réciproquement chacun sur la partie de l'autre.&lt;br /&gt;
&lt;br /&gt;
Globalement, cela a été positif car nous avons pu tous les deux sortir de notre zone de confort et apprendre beaucoup dans différents domaines.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme outils, nous utilisions donc git et gitlab pour la gestion de code et google drive pour le partage de documents.&lt;br /&gt;
&lt;br /&gt;
Nous avons préferés travailler un maximum en présentiel, d'un accord commun.&lt;br /&gt;
&lt;br /&gt;
== Semestre 6 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/22''' &lt;br /&gt;
&lt;br /&gt;
Séance de découverte du sujet de notre projet.&lt;br /&gt;
&lt;br /&gt;
Recherche de l'existant &lt;br /&gt;
&lt;br /&gt;
Réalisation de recherches sur leurs différentes utilisations.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/22''' &lt;br /&gt;
&lt;br /&gt;
Début de création du diagramme de Gantt .&lt;br /&gt;
&lt;br /&gt;
Réalisation d'une étude du besoin.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du marché : Recherche des robots similaires.&lt;br /&gt;
&lt;br /&gt;
Commencer à prendre en main le robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 22/03/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de l'étude de marché.&lt;br /&gt;
&lt;br /&gt;
Etude des opportunités.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 29/03/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'étude du marché.&lt;br /&gt;
&lt;br /&gt;
Commencer à rédiger le cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 05/04/22''' &lt;br /&gt;
&lt;br /&gt;
Commencer la rédaction du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 26/04/22''' &lt;br /&gt;
&lt;br /&gt;
Bilan du semestre.&lt;br /&gt;
&lt;br /&gt;
Etude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Etude des risques.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 03/05/22''' &lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude des risques.&lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Finalisation du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
== Semestre 7 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 10/10/22'''&lt;br /&gt;
&lt;br /&gt;
Commencement de l'étude technique des encodeurs . &lt;br /&gt;
Recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du changement de la carte arduino pour ajouter des nouvelles fonctionnalités : connexion Wifi, fréquence microprocesseur plus élevé,..&lt;br /&gt;
Test des encodeurs moteur DC : validé .&lt;br /&gt;
Poursuite de recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude de génération des signaux PWM&lt;br /&gt;
&lt;br /&gt;
Test sur Matlab Simulink des boucles d'asservissement issues des robots similaires .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/11/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation des signaux PWM du robot.&lt;br /&gt;
&lt;br /&gt;
Calcul de la fonction de transfert issue de la boucle.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/11/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du fonctionnement du gyroscope et des autres composants pour programmer le robot .  &lt;br /&gt;
&lt;br /&gt;
Séparation du travail a effectuer pour le robot entre une boucle du moteur DC(niveau 1) et une boucle du niveau supérieur(niveau 2) pour asservir l'angle d'inclinaison du robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/11/22''' &lt;br /&gt;
&lt;br /&gt;
Modification et amélioration du diagramme de Gantt pour le S7 et le S8.&lt;br /&gt;
&lt;br /&gt;
Avancée de la modélisation de la boucle du niveau 1 .&lt;br /&gt;
&lt;br /&gt;
Diagramme de Gantt S7-S8&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/11/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation de la boucle du niveau inférieur sur Matlab/Simulink et récupération des résultats sur le scope .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/12/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie informatique et avancement de la partie automatique .&lt;br /&gt;
Programmation de la liaison série pour débugger les sorties de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/12/22''' &lt;br /&gt;
&lt;br /&gt;
Début de rédaction du rapport pour le S7&lt;br /&gt;
&lt;br /&gt;
== Semestre 8 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/01/23''' &lt;br /&gt;
&lt;br /&gt;
Recherches pour le gyroscope . &lt;br /&gt;
Test des encodeurs .&lt;br /&gt;
Communication sur les attentes du semestre s8 ,les fautes à éviter pour rebondir par rapport au retard S7 &lt;br /&gt;
Mise à niveau pour comprendre les aspects techniques de la partie informatique pour pouvoir travailler ensemble sur les résultats du S8 .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/01/23''' &lt;br /&gt;
&lt;br /&gt;
- Suppression des structures de données pour avancer plus rapidement sur les résultats du semestre s8 .&lt;br /&gt;
&lt;br /&gt;
- Recherches pour la programmation des interruptions PCINT . &lt;br /&gt;
&lt;br /&gt;
- Recherche sur la doc technique pour faire l'initialisation des interruptions externes . &lt;br /&gt;
&lt;br /&gt;
- Recherche de la modélisation en 3D de notre robot pour trouver les paramètres PID de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/02/23''' &lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons :&lt;br /&gt;
&lt;br /&gt;
Modification du code des encodeurs et test sur les moteurs DC . &lt;br /&gt;
&lt;br /&gt;
Poursuite de recherche de l'existant pour trouver le code du gyroscope .&lt;br /&gt;
&lt;br /&gt;
Mise à jour du git .&lt;br /&gt;
&lt;br /&gt;
Début du calcul des matrices d'inertie de chaque solide.&lt;br /&gt;
&lt;br /&gt;
Recherche du code des régulateurs.&lt;br /&gt;
&lt;br /&gt;
Avancement sur la gestion de projet .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/02/23'''&lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons essayé de récupérer les résultats des tests électronique de l'oscilloscope effectués dans les salles d'électronique .&lt;br /&gt;
&lt;br /&gt;
Le code des encodeurs marchent ,la liaison série affiche exactement la vitesse de la consigne :les Régulateurs implémentés correspondent bien à notre applications.&lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation de la partie informatique du gyroscope : Objectif : récupération de l'angle d'inclinaison sur la liaison série avec la meilleure précision possible .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/02/23''' &lt;br /&gt;
&lt;br /&gt;
Fin du calcul des matrices d'inertie . &lt;br /&gt;
&lt;br /&gt;
Paramétrage de notre robot pour avoir la visibilité sur les configurations possibles d'avoir(en virage, ligne droite),en précisant les angles d'inclinaison et es repères associés . &lt;br /&gt;
&lt;br /&gt;
Poursuite de programmation des régulateurs par niveaux en utilisant le code précédemment implémenté pour les encodeurs .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/23''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation du modèle en 3D de notre robot pour essayer de l'autoéquilibrer en utilisant les PIDS issues de l'autotune par rapport à nos préférences(stabilité,temps de réponse,dépassement,précision). &lt;br /&gt;
&lt;br /&gt;
Nous avons testé le robot en l'alimentant par le biai la liaison USB ! et enregistrement des résultats .  &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie automatique en trouvant toutes les équations nécessaires à notre modèle .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/23''' &lt;br /&gt;
&lt;br /&gt;
Réalisations de cette séance :&lt;br /&gt;
&lt;br /&gt;
Test du robot pour se stabiliser sur le sol en applicant plusieurs . &lt;br /&gt;
&lt;br /&gt;
Faire tous les calculs des dimensions géométriques de notre robot et test de la boucle d'asservissement avec les deux niveaux sur Matlab Simulink avec nos préférences de stabilité, temps de réponse,précision,dépassement .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/23''' &lt;br /&gt;
&lt;br /&gt;
Absence justifiée .&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91452</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91452"/>
				<updated>2023-05-09T21:13:34Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : /* Programme du robot */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Résumé'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
[[Fichier: SegwayRobot.jpg|200px|right|thumb|Exemple de robot similaire au notre]]&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
L'intégralité de notre programme est disponible sur le dépôt git à l'adresse: https://gitlab.com/remi_farault/self-balanced-robot&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Présentation générale'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==🌏Contexte==&lt;br /&gt;
Les moyens de transport actuels reposent principalement sur le principe du robot à deux roues, c'est la raison pour laquelle l'étude de celui ci s'avère importante, en effet l'étude   &lt;br /&gt;
de sa conception et son contrôle va nous permettre de développer des outils innovants qui pourraient potentiellement intéresser des sociétés de transport .&lt;br /&gt;
&lt;br /&gt;
==🎯Objectif==&lt;br /&gt;
&lt;br /&gt;
Notre objectif principal est de commander le robot, de là interviennent d'autres objectifs tel que la stabilité ,développer un code robuste qui assure cette fonctionnalité et aussi le contrôler pour réaliser des fonctionnalités de déplacement et d'éviter des obstacles . Des objectifs secondaires sont de créer un site web à travers lequel nous allons mener toutes les opérations de contrôle .&lt;br /&gt;
&lt;br /&gt;
==🔍Expression du besoin==&lt;br /&gt;
&lt;br /&gt;
Un robot autoéquilibré à deux roues est un type de robot qui peut se maintenir en équilibre sur deux roues sans tomber. Pour réaliser cette fonctionnalité, le robot utilise un ensemble de capteurs, d'algorithmes de contrôle et de moteurs pour ajuster sa position en temps réel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Self_balanc_bt.png|400px|Bete a corne SBR]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le diagramme interacteurs permet en fait de visualiser les fonctions services assurées par le système &lt;br /&gt;
&lt;br /&gt;
[[Fichier:341702419_560921119358434_1016673599353874396_n_(1).png|400px|DGI SBR]]    [[Fichier:Btacorne.png |500px|DGI SBR|right]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Réalisations et Résultats'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
[[Fichier: seg.jpg|200px|left|thumb|Exemple de commande désirée]]&lt;br /&gt;
&lt;br /&gt;
Après mis en place notre stratégie de gestion de projet en s6 à travers le diagramme de GANTT et le cahier de charges fonctionnels, nous nous sommes focalisés sur l'étude technique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: progg.png|300px|right|thumb|Organisation de notre programme]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, étudier à travers des outils automatiques la stabilité du robot en faisant appel à des modèles théoriques et pratiques et commencer par un raisonnement par niveaux, d'abord le niveau 1 du moteur à courant continu et les équations correspondantes puis le niveau 2 assurant la stabilité du robot directement, on avait la possibilité de passer directement au niveau 2 à travers le modèle du pendule inversé et les équations qui en découlent sauf que celui-ci ne nous permettra pas de revenir au niveau 1 et asservir le moteur à travers les codeurs incrémentales ,la deuxième partie consistait à réaliser les codes informatiques en s'appuyant sur les structures de données en C vues l'année dernière et conduire un même raisonnement(par niveaux) s'appuyant d'abord sur les codes sources correspondants à la génération d'un signal PWM pour les deux moteurs avec un rapport cyclique modifiable, et aussi les codes sources correspondants à la gestion des moteurs, en effet, ceux-ci tournent  dans un sens ou dans un autre ou ne tournent pas en fonction de la variable in1 et in2  pour faire tourner les moteurs .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Avr.png|100px|left|thumb|Compilateur utilisé]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cependant, nous avons rencontré quelques problèmes en automatique notamment pour trouver des valeurs des constantes théoriques pour les références du moteur entre les mains, ce qui nous a obligé à prendre des valeurs issues d'autres applications, nous avons rencontré aussi quelques problèmes choisir une modélisation parmi celles qui sont disponibles sur Internet .&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Etude Automatique'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Avant de programmer notre système sur la carte Arduino, nous avons également créé une simulation complète de notre système robotisé sur SIMULINK. Cependant, avant cela, nous avons dû déterminer les équations qui régissent notre système en trouvant les matrices d'inertie de chaque composant de notre robot, à savoir la masse transportée par le robot (M), le châssis constitué de deux plateaux et de la motorisation (les piliers et leur inertie ont été négligés car leur masse est très faible), ainsi que les roues (roue droite et roue gauche). Vous trouverez ci-dessous les matrices d'inertie que nous avons obtenues pour chaque composant.&lt;br /&gt;
&lt;br /&gt;
'''Masse M :'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatM.png|200px|thumb|left|Matrice de la masse M]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients seront notés dans la suite pour simplifier : AM,BM,CM &lt;br /&gt;
&lt;br /&gt;
'''Chassis:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatB.png|800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AH,BH,CH &lt;br /&gt;
&lt;br /&gt;
'''Roue gauche:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrg.png |600px|Matrice de RG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
'''Roue droite:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrd.png |600px|Matrice RD]]&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
Ci-dessous un paramétrage de notre système : Chaque angle détermine un repère&lt;br /&gt;
&lt;br /&gt;
Le repère R0 est supposé galliléen.&lt;br /&gt;
&lt;br /&gt;
Le repère R1 est en rotation  ,appelé angle de virage par rapport à R0.&lt;br /&gt;
&lt;br /&gt;
Le repère R2 est en rotation  ,appelé angle d’inclinaison du châssis par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R3 est en rotation  ,appelé angle d’inclinaison arrière-avant de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R4 est en rotation ,appelé angle d’inclinaison droite-gauche de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:param.png |800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
l’angle de consigne est de 0deg,nous employons un PID pour corriger l’angle de mesure,à sa sortie,on aura une tension W(p).Les blocs Km et W(p) assurent le passage tension-&amp;gt;couple-&amp;gt;angle ,il faut ensuite retirer  pour ne garder que l’angle d’inclinaison du châssis  .Km=0.0125N.m.V-1(d’après la datasheet du moteur)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bcle.png |800px|Asservissement]]                                                             [[Fichier:Matuu.png|right|800px|Asservissement]]      &lt;br /&gt;
&lt;br /&gt;
Les équations obtenues sont les suivantes (Le détail des calculs a été précisé dans le Rapport): &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eq nnlin.png |500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après linéarisation : Considérer l'approximations des petits angles pour le sinus et cosinus,et négliger aussi la vitesse angulaire quadratique devant la vitesse angulaire,nous obtenons : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eqlin.png |300px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crbe.png|600px|Courbe]]&lt;br /&gt;
&lt;br /&gt;
On obtient une courbe avec un bon temps de réponse, un léger dépassement et une stabilité .Le système est régulé de manière efficace, capable de répondre rapidement et précisément aux perturbations tout en maintenant une position d'équilibre stable.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mat3d.png|500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Environnement de developpement'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Notre microcontrolleur étant une Arduino Uno, nous aurions pu utiliser le framework ''Arduino'' donnant accès à un IDE intégrant les outils pour compiler et flasher le code, ainsi qu'une multitude de bibliothèques haut niveaux très simples d'utilisation et plutôt performantes, permettant de programmer notre robot en simplement quelques dizaines de lignes de code.&lt;br /&gt;
&lt;br /&gt;
Cependant, l'Arduino est simplement une carte de prototypage intégrant un microcontrôleur ''AVR Atmega 328p''. &lt;br /&gt;
Les microcontroleurs AVR disposent d'une grande communauté, et il existe de nombreux outils nécessaires au developpement sur ces cartes.&lt;br /&gt;
Afin d'avoir un meilleur contrôle sur notre projet, et surtout d'en tirer un maximum de compétences, nous avons donc décidés de programmer notre robot directement en C en utilisant les outils AVR:&lt;br /&gt;
&lt;br /&gt;
- '''avr-gcc''': compilateur open-source portant toutes les fonctionnalités du langage C standard sur les microcontroleurs AVR.&lt;br /&gt;
Seul, son utilisation est quasiment impossible et demande trop de travail en programmation bas-niveau.&lt;br /&gt;
&lt;br /&gt;
- '''avr-libc''': implémentation basé sur le compilateur avr-gcc de la bibliothèque standard du langage C.&lt;br /&gt;
Cette bibliothèque permet donc d'utiliser les fonctions et structures standards du C (IO, maths, chaines de caractères), mais elle intègre également un mapping mémoire de tous les registres de l'atmega, ainsi qu'un mécanisme pour programmer des interruptions.&lt;br /&gt;
&lt;br /&gt;
- '''avr-objcopy''': ce programme en ligne de commande formate le binaire obtenu en format utilisable par les AVR&lt;br /&gt;
&lt;br /&gt;
- '''avr-dude''': ce programme en ligne de commande permet de flasher via une interface USB-série un microcontroleur AVR présent sur une carte Arduino.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc developpé un '''Makefile''' utilisant tous ces outils, constituant un environnement de developpement très efficace pour notre projet. Ce Makefile est disponible sur notre gitlab.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Programme du robot'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:diag_class_pj10.png]]&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''PWM'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
La première étape consistait à commander nos moteurs DC, afin de poser les bases de notre&lt;br /&gt;
asservissement bas niveau. Ces moteurs sont contrôlés par le driver de moteurs, utilisant des signaux logiques pour définir l’état d’un moteur et des signaux '''PWM''' pour définir la vitesse de&lt;br /&gt;
rotation. La génération de signaux PWM sur AVR se fait en utilisant les '''timers''' en mode PWM.&lt;br /&gt;
Tout simplement, nous avons un registre compteur 16 bits incrémenté périodiquement, et une valeur&lt;br /&gt;
maximale définie par le registre ''ICRx''. Nous utilisons ensuite les registres ''OCRnx'' contenant une&lt;br /&gt;
valeur inférieure au maximum. &lt;br /&gt;
Lorsque le compteur atteint la valeur contenue dans OCRnx, il&lt;br /&gt;
inverse la valeur logique de sortie du pin ''OCnx''. Ainsi, nous pouvons modifier instantanément la&lt;br /&gt;
valeur d’OCRnx afin de modifier le rapport cyclique de notre signal. Ce rapport cyclique est ensuite&lt;br /&gt;
directement proportionnel à la vitesse de rotation du moteur associé. &lt;br /&gt;
La fréquence du signal est définie par la période d’incrémentation du compteur et par la valeur maximale ICRx.&lt;br /&gt;
Pour notre composant, nous pouvions utiliser une fréquence allant jusqu’à plusieurs kHz. Cette&lt;br /&gt;
fréquence n’a aucun impact sur la rotation du moteur. Nous avons donc choisis 20 kHz.&lt;br /&gt;
Nous avons définis la '''init_pwm''' pour configurer les registres nécessaires, et la fonction&lt;br /&gt;
'''generate_pwm''' pour modifier le rapport cyclique de nos deux signaux PWM avec la valeur&lt;br /&gt;
souhaitée.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Encodeurs'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Une fois nos moteurs pouvant tourner à une vitesse voulue, nous avons du trouver un moyen de&lt;br /&gt;
mesurer leurs vitesses effectives afin de réaliser une boucle d’asservissement. Pour cela, nous avons&lt;br /&gt;
utilisés les encodeurs optiques disponibles sur nos moteurs DC. &lt;br /&gt;
Ces encodeurs envoient sur leur broches un front-montant à chaque tour de la roue codeuse reliée au moteurs (ayant une vitesse&lt;br /&gt;
proportionnelle à celle du moteur). En détectant ces fronts montant, nous pouvons donc compter le&lt;br /&gt;
nombre de tours du moteur pendant un intervalle de temps défini, puis déterminer la vitesse réelle&lt;br /&gt;
du moteur.&lt;br /&gt;
Pour détecter les fronts montant, nous utilisons l’interface '''Pin Change Interrupt''' de l’Atmega. Cette&lt;br /&gt;
interface exécute une interruption logicielle à chaque changement d’état logique du pin associé.&lt;br /&gt;
Dans notre cas, nous devons ensuite observé l’état précédent de la sortie et l’état actuel pour&lt;br /&gt;
déterminer si on est bien en présence d’un front montant. Une fois le front montant détecté, cette&lt;br /&gt;
interruption incrémente ensuite le compteur de tours.&lt;br /&gt;
Ce compteur est ensuite utilisé pour calculer la vitesse de rotation puis remis à zéro pour la mesure&lt;br /&gt;
suivante.&lt;br /&gt;
Dans notre cas, nous réalisons cette mesure à une fréquence d’environ 244 Hz, dans une autre&lt;br /&gt;
fonction d’interruption qu’on détaillera plus loin.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Angle'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Notre boucle de régulation principale a besoin d’une mesure de l’angle d’inclinaison du robot sur&lt;br /&gt;
son axe vertical perpendiculaire à celui de déplacement. Cette mesure s’effectue via le '''MPU6050'''.&lt;br /&gt;
Ce composant fonctionne via le protocole '''i2c''', protocole de communication simple utilisé par la&lt;br /&gt;
plupart des systèmes électroniques. Ce protocole étant bas niveau, il existe de nombreuses&lt;br /&gt;
bibliothèques implémentés en C permettant son utilisation. De plus, le MPU6050 est un composant&lt;br /&gt;
très complet et complexe, afin d’en récupérer l’angle, il faut d’abord amorcer une communication&lt;br /&gt;
i2c puis configurer certains des ses registres, afin ensuite de pouvoir lire les registres contenant la&lt;br /&gt;
mesure de l’angle selon l’axe désiré. Afin de conserver un code efficace et concis, nous avons&lt;br /&gt;
également décidés d’utiliser une bibliothèque faisant office de « '''driver''' » pour ce composant,&lt;br /&gt;
intégrant des fonctions d’initialisation et de lecture des mesures faites par ce gyroscope.&lt;br /&gt;
Nous obtenons donc la valeur de l’angle en degrés, comprise entre 0 et 360.Dans notre cas, nous souhaitions obtenir une valeur comprise entre -180 et 180, car seule la valeur&lt;br /&gt;
absolue et le sens de l’inclinaison nous intéresse, nous avons donc appliqués une correction de cette&lt;br /&gt;
valeur.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Interruption principale'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Lors de implémentation d’un asservissement automatique via un microcontrôleur, la puissance de&lt;br /&gt;
calcul finie impose que les commandes des actionneurs et les mesures des capteurs doivent être&lt;br /&gt;
réalisées périodiquement. Pour cela, nous pouvons utiliser une '''routine d’interruption''' qui s’exécute à&lt;br /&gt;
chaque ''overflow'' d’un compteur, via l’interface des '''timers''' de l’atmega. Dans notre cas, cette&lt;br /&gt;
interruption correspond à la fonction principale de notre programme. Nous avons réglés sa&lt;br /&gt;
fréquence à 244Hz, en divisant le fréquence de base de 16MHz avec un '''prescaler''' de 256 (plus une&lt;br /&gt;
deuxième division par 256 du à la taille du registre timer de 8 bits).&lt;br /&gt;
Cette interruption vient d’abord remettre a zéro les compteurs des encodeurs et récupérer la vitesse&lt;br /&gt;
des deux moteurs.&lt;br /&gt;
Ensuite, elle effectue les calculs nécessaires à la régulation de l’angle, mais également de la vitesse&lt;br /&gt;
linéaire et de la rotation du robot.&lt;br /&gt;
Chaque paramètre à réguler est corrigé par un régulateur PID de coefficients différents via la&lt;br /&gt;
fonction '''pid()'''.&lt;br /&gt;
Enfin, nous obtenons une commande à envoyer aux moteurs, qui actionnent notre robot de la&lt;br /&gt;
manière souhaitée.&lt;br /&gt;
Le code de notre système est disponible sur nôtre dépôt gitlab également.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Gestion de projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Durant ces trois semestres, la gestion de projet est un des domaines où nous avons le plus de difficultés, mais également un de ceux dans lequel nous avons le plus appris. &lt;br /&gt;
&lt;br /&gt;
Voici notre Diagramme de Gantt previsionnel réalisé au S6&lt;br /&gt;
[[Fichier:Gt.png|400px|thumb|left|texte descriptif]]&lt;br /&gt;
&lt;br /&gt;
D'abord trois, nous nous sommes retrouvés à deux dès le deuxième semestre, et nous avons donc du modifier l'organisation prévue pour la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons au final plus ou moins suivis ce diagramme previsionnel, à quelques choses près.&lt;br /&gt;
&lt;br /&gt;
En travaillant à deux, nous avons du trouvé un moyen d'avancer efficacement.&lt;br /&gt;
L'un de nous étant en filière SA (Systemes Autonomes) et l'autre en filière SC (Systemes Communicants), la répartition des taches informatiques et automatiques était donc simplifiée.&lt;br /&gt;
&lt;br /&gt;
Cependant, nous avons donc du réussir à expliquer et à mettre en relation chacune de nos parties, en s'améliorant sur la partie communication.&lt;br /&gt;
Pour cela, au début de chaque séance, nous commencions par faire le point sur l'avancement globale et propre à chacun.&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous nous répartitions les taches communes aux différentes parties.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous échangions sur les taches respectives à nos deux parties afin de pouvoir les faire coincider le moment venu, et il est arrivé plusieurs fois que l'on s'aide réciproquement chacun sur la partie de l'autre.&lt;br /&gt;
&lt;br /&gt;
Globalement, cela a été positif car nous avons pu tous les deux sortir de notre zone de confort et apprendre beaucoup dans différents domaines.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme outils, nous utilisions donc git et gitlab pour la gestion de code et google drive pour le partage de documents.&lt;br /&gt;
&lt;br /&gt;
Nous avons préferés travailler un maximum en présentiel, d'un accord commun.&lt;br /&gt;
&lt;br /&gt;
== Semestre 6 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/22''' &lt;br /&gt;
&lt;br /&gt;
Séance de découverte du sujet de notre projet.&lt;br /&gt;
&lt;br /&gt;
Recherche de l'existant &lt;br /&gt;
&lt;br /&gt;
Réalisation de recherches sur leurs différentes utilisations.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/22''' &lt;br /&gt;
&lt;br /&gt;
Début de création du diagramme de Gantt .&lt;br /&gt;
&lt;br /&gt;
Réalisation d'une étude du besoin.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du marché : Recherche des robots similaires.&lt;br /&gt;
&lt;br /&gt;
Commencer à prendre en main le robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 22/03/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de l'étude de marché.&lt;br /&gt;
&lt;br /&gt;
Etude des opportunités.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 29/03/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'étude du marché.&lt;br /&gt;
&lt;br /&gt;
Commencer à rédiger le cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 05/04/22''' &lt;br /&gt;
&lt;br /&gt;
Commencer la rédaction du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 26/04/22''' &lt;br /&gt;
&lt;br /&gt;
Bilan du semestre.&lt;br /&gt;
&lt;br /&gt;
Etude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Etude des risques.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 03/05/22''' &lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude des risques.&lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Finalisation du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
== Semestre 7 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 10/10/22'''&lt;br /&gt;
&lt;br /&gt;
Commencement de l'étude technique des encodeurs . &lt;br /&gt;
Recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du changement de la carte arduino pour ajouter des nouvelles fonctionnalités : connexion Wifi, fréquence microprocesseur plus élevé,..&lt;br /&gt;
Test des encodeurs moteur DC : validé .&lt;br /&gt;
Poursuite de recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude de génération des signaux PWM&lt;br /&gt;
&lt;br /&gt;
Test sur Matlab Simulink des boucles d'asservissement issues des robots similaires .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/11/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation des signaux PWM du robot.&lt;br /&gt;
&lt;br /&gt;
Calcul de la fonction de transfert issue de la boucle.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/11/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du fonctionnement du gyroscope et des autres composants pour programmer le robot .  &lt;br /&gt;
&lt;br /&gt;
Séparation du travail a effectuer pour le robot entre une boucle du moteur DC(niveau 1) et une boucle du niveau supérieur(niveau 2) pour asservir l'angle d'inclinaison du robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/11/22''' &lt;br /&gt;
&lt;br /&gt;
Modification et amélioration du diagramme de Gantt pour le S7 et le S8.&lt;br /&gt;
&lt;br /&gt;
Avancée de la modélisation de la boucle du niveau 1 .&lt;br /&gt;
&lt;br /&gt;
Diagramme de Gantt S7-S8&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/11/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation de la boucle du niveau inférieur sur Matlab/Simulink et récupération des résultats sur le scope .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/12/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie informatique et avancement de la partie automatique .&lt;br /&gt;
Programmation de la liaison série pour débugger les sorties de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/12/22''' &lt;br /&gt;
&lt;br /&gt;
Début de rédaction du rapport pour le S7&lt;br /&gt;
&lt;br /&gt;
== Semestre 8 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/01/23''' &lt;br /&gt;
&lt;br /&gt;
Recherches pour le gyroscope . &lt;br /&gt;
Test des encodeurs .&lt;br /&gt;
Communication sur les attentes du semestre s8 ,les fautes à éviter pour rebondir par rapport au retard S7 &lt;br /&gt;
Mise à niveau pour comprendre les aspects techniques de la partie informatique pour pouvoir travailler ensemble sur les résultats du S8 .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/01/23''' &lt;br /&gt;
&lt;br /&gt;
- Suppression des structures de données pour avancer plus rapidement sur les résultats du semestre s8 .&lt;br /&gt;
&lt;br /&gt;
- Recherches pour la programmation des interruptions PCINT . &lt;br /&gt;
&lt;br /&gt;
- Recherche sur la doc technique pour faire l'initialisation des interruptions externes . &lt;br /&gt;
&lt;br /&gt;
- Recherche de la modélisation en 3D de notre robot pour trouver les paramètres PID de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/02/23''' &lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons :&lt;br /&gt;
&lt;br /&gt;
Modification du code des encodeurs et test sur les moteurs DC . &lt;br /&gt;
&lt;br /&gt;
Poursuite de recherche de l'existant pour trouver le code du gyroscope .&lt;br /&gt;
&lt;br /&gt;
Mise à jour du git .&lt;br /&gt;
&lt;br /&gt;
Début du calcul des matrices d'inertie de chaque solide.&lt;br /&gt;
&lt;br /&gt;
Recherche du code des régulateurs.&lt;br /&gt;
&lt;br /&gt;
Avancement sur la gestion de projet .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/02/23'''&lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons essayé de récupérer les résultats des tests électronique de l'oscilloscope effectués dans les salles d'électronique .&lt;br /&gt;
&lt;br /&gt;
Le code des encodeurs marchent ,la liaison série affiche exactement la vitesse de la consigne :les Régulateurs implémentés correspondent bien à notre applications.&lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation de la partie informatique du gyroscope : Objectif : récupération de l'angle d'inclinaison sur la liaison série avec la meilleure précision possible .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/02/23''' &lt;br /&gt;
&lt;br /&gt;
Fin du calcul des matrices d'inertie . &lt;br /&gt;
&lt;br /&gt;
Paramétrage de notre robot pour avoir la visibilité sur les configurations possibles d'avoir(en virage, ligne droite),en précisant les angles d'inclinaison et es repères associés . &lt;br /&gt;
&lt;br /&gt;
Poursuite de programmation des régulateurs par niveaux en utilisant le code précédemment implémenté pour les encodeurs .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/23''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation du modèle en 3D de notre robot pour essayer de l'autoéquilibrer en utilisant les PIDS issues de l'autotune par rapport à nos préférences(stabilité,temps de réponse,dépassement,précision). &lt;br /&gt;
&lt;br /&gt;
Nous avons testé le robot en l'alimentant par le biai la liaison USB ! et enregistrement des résultats .  &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie automatique en trouvant toutes les équations nécessaires à notre modèle .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/23''' &lt;br /&gt;
&lt;br /&gt;
Réalisations de cette séance :&lt;br /&gt;
&lt;br /&gt;
Test du robot pour se stabiliser sur le sol en applicant plusieurs . &lt;br /&gt;
&lt;br /&gt;
Faire tous les calculs des dimensions géométriques de notre robot et test de la boucle d'asservissement avec les deux niveaux sur Matlab Simulink avec nos préférences de stabilité, temps de réponse,précision,dépassement .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/23''' &lt;br /&gt;
&lt;br /&gt;
Absence justifiée .&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:Diag_class_pj10.png&amp;diff=91451</id>
		<title>Fichier:Diag class pj10.png</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:Diag_class_pj10.png&amp;diff=91451"/>
				<updated>2023-05-09T21:13:07Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91450</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91450"/>
				<updated>2023-05-09T21:12:20Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : /* Programme du robot */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Résumé'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
[[Fichier: SegwayRobot.jpg|200px|right|thumb|Exemple de robot similaire au notre]]&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
L'intégralité de notre programme est disponible sur le dépôt git à l'adresse: https://gitlab.com/remi_farault/self-balanced-robot&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Présentation générale'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==🌏Contexte==&lt;br /&gt;
Les moyens de transport actuels reposent principalement sur le principe du robot à deux roues, c'est la raison pour laquelle l'étude de celui ci s'avère importante, en effet l'étude   &lt;br /&gt;
de sa conception et son contrôle va nous permettre de développer des outils innovants qui pourraient potentiellement intéresser des sociétés de transport .&lt;br /&gt;
&lt;br /&gt;
==🎯Objectif==&lt;br /&gt;
&lt;br /&gt;
Notre objectif principal est de commander le robot, de là interviennent d'autres objectifs tel que la stabilité ,développer un code robuste qui assure cette fonctionnalité et aussi le contrôler pour réaliser des fonctionnalités de déplacement et d'éviter des obstacles . Des objectifs secondaires sont de créer un site web à travers lequel nous allons mener toutes les opérations de contrôle .&lt;br /&gt;
&lt;br /&gt;
==🔍Expression du besoin==&lt;br /&gt;
&lt;br /&gt;
Un robot autoéquilibré à deux roues est un type de robot qui peut se maintenir en équilibre sur deux roues sans tomber. Pour réaliser cette fonctionnalité, le robot utilise un ensemble de capteurs, d'algorithmes de contrôle et de moteurs pour ajuster sa position en temps réel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Self_balanc_bt.png|400px|Bete a corne SBR]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le diagramme interacteurs permet en fait de visualiser les fonctions services assurées par le système &lt;br /&gt;
&lt;br /&gt;
[[Fichier:341702419_560921119358434_1016673599353874396_n_(1).png|400px|DGI SBR]]    [[Fichier:Btacorne.png |500px|DGI SBR|right]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Réalisations et Résultats'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
[[Fichier: seg.jpg|200px|left|thumb|Exemple de commande désirée]]&lt;br /&gt;
&lt;br /&gt;
Après mis en place notre stratégie de gestion de projet en s6 à travers le diagramme de GANTT et le cahier de charges fonctionnels, nous nous sommes focalisés sur l'étude technique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: progg.png|300px|right|thumb|Organisation de notre programme]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, étudier à travers des outils automatiques la stabilité du robot en faisant appel à des modèles théoriques et pratiques et commencer par un raisonnement par niveaux, d'abord le niveau 1 du moteur à courant continu et les équations correspondantes puis le niveau 2 assurant la stabilité du robot directement, on avait la possibilité de passer directement au niveau 2 à travers le modèle du pendule inversé et les équations qui en découlent sauf que celui-ci ne nous permettra pas de revenir au niveau 1 et asservir le moteur à travers les codeurs incrémentales ,la deuxième partie consistait à réaliser les codes informatiques en s'appuyant sur les structures de données en C vues l'année dernière et conduire un même raisonnement(par niveaux) s'appuyant d'abord sur les codes sources correspondants à la génération d'un signal PWM pour les deux moteurs avec un rapport cyclique modifiable, et aussi les codes sources correspondants à la gestion des moteurs, en effet, ceux-ci tournent  dans un sens ou dans un autre ou ne tournent pas en fonction de la variable in1 et in2  pour faire tourner les moteurs .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Avr.png|100px|left|thumb|Compilateur utilisé]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cependant, nous avons rencontré quelques problèmes en automatique notamment pour trouver des valeurs des constantes théoriques pour les références du moteur entre les mains, ce qui nous a obligé à prendre des valeurs issues d'autres applications, nous avons rencontré aussi quelques problèmes choisir une modélisation parmi celles qui sont disponibles sur Internet .&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Etude Automatique'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Avant de programmer notre système sur la carte Arduino, nous avons également créé une simulation complète de notre système robotisé sur SIMULINK. Cependant, avant cela, nous avons dû déterminer les équations qui régissent notre système en trouvant les matrices d'inertie de chaque composant de notre robot, à savoir la masse transportée par le robot (M), le châssis constitué de deux plateaux et de la motorisation (les piliers et leur inertie ont été négligés car leur masse est très faible), ainsi que les roues (roue droite et roue gauche). Vous trouverez ci-dessous les matrices d'inertie que nous avons obtenues pour chaque composant.&lt;br /&gt;
&lt;br /&gt;
'''Masse M :'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatM.png|200px|thumb|left|Matrice de la masse M]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients seront notés dans la suite pour simplifier : AM,BM,CM &lt;br /&gt;
&lt;br /&gt;
'''Chassis:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatB.png|800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AH,BH,CH &lt;br /&gt;
&lt;br /&gt;
'''Roue gauche:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrg.png |600px|Matrice de RG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
'''Roue droite:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrd.png |600px|Matrice RD]]&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
Ci-dessous un paramétrage de notre système : Chaque angle détermine un repère&lt;br /&gt;
&lt;br /&gt;
Le repère R0 est supposé galliléen.&lt;br /&gt;
&lt;br /&gt;
Le repère R1 est en rotation  ,appelé angle de virage par rapport à R0.&lt;br /&gt;
&lt;br /&gt;
Le repère R2 est en rotation  ,appelé angle d’inclinaison du châssis par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R3 est en rotation  ,appelé angle d’inclinaison arrière-avant de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R4 est en rotation ,appelé angle d’inclinaison droite-gauche de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:param.png |800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
l’angle de consigne est de 0deg,nous employons un PID pour corriger l’angle de mesure,à sa sortie,on aura une tension W(p).Les blocs Km et W(p) assurent le passage tension-&amp;gt;couple-&amp;gt;angle ,il faut ensuite retirer  pour ne garder que l’angle d’inclinaison du châssis  .Km=0.0125N.m.V-1(d’après la datasheet du moteur)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bcle.png |800px|Asservissement]]                                                             [[Fichier:Matuu.png|right|800px|Asservissement]]      &lt;br /&gt;
&lt;br /&gt;
Les équations obtenues sont les suivantes (Le détail des calculs a été précisé dans le Rapport): &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eq nnlin.png |500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après linéarisation : Considérer l'approximations des petits angles pour le sinus et cosinus,et négliger aussi la vitesse angulaire quadratique devant la vitesse angulaire,nous obtenons : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eqlin.png |300px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crbe.png|600px|Courbe]]&lt;br /&gt;
&lt;br /&gt;
On obtient une courbe avec un bon temps de réponse, un léger dépassement et une stabilité .Le système est régulé de manière efficace, capable de répondre rapidement et précisément aux perturbations tout en maintenant une position d'équilibre stable.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mat3d.png|500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Environnement de developpement'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Notre microcontrolleur étant une Arduino Uno, nous aurions pu utiliser le framework ''Arduino'' donnant accès à un IDE intégrant les outils pour compiler et flasher le code, ainsi qu'une multitude de bibliothèques haut niveaux très simples d'utilisation et plutôt performantes, permettant de programmer notre robot en simplement quelques dizaines de lignes de code.&lt;br /&gt;
&lt;br /&gt;
Cependant, l'Arduino est simplement une carte de prototypage intégrant un microcontrôleur ''AVR Atmega 328p''. &lt;br /&gt;
Les microcontroleurs AVR disposent d'une grande communauté, et il existe de nombreux outils nécessaires au developpement sur ces cartes.&lt;br /&gt;
Afin d'avoir un meilleur contrôle sur notre projet, et surtout d'en tirer un maximum de compétences, nous avons donc décidés de programmer notre robot directement en C en utilisant les outils AVR:&lt;br /&gt;
&lt;br /&gt;
- '''avr-gcc''': compilateur open-source portant toutes les fonctionnalités du langage C standard sur les microcontroleurs AVR.&lt;br /&gt;
Seul, son utilisation est quasiment impossible et demande trop de travail en programmation bas-niveau.&lt;br /&gt;
&lt;br /&gt;
- '''avr-libc''': implémentation basé sur le compilateur avr-gcc de la bibliothèque standard du langage C.&lt;br /&gt;
Cette bibliothèque permet donc d'utiliser les fonctions et structures standards du C (IO, maths, chaines de caractères), mais elle intègre également un mapping mémoire de tous les registres de l'atmega, ainsi qu'un mécanisme pour programmer des interruptions.&lt;br /&gt;
&lt;br /&gt;
- '''avr-objcopy''': ce programme en ligne de commande formate le binaire obtenu en format utilisable par les AVR&lt;br /&gt;
&lt;br /&gt;
- '''avr-dude''': ce programme en ligne de commande permet de flasher via une interface USB-série un microcontroleur AVR présent sur une carte Arduino.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc developpé un '''Makefile''' utilisant tous ces outils, constituant un environnement de developpement très efficace pour notre projet. Ce Makefile est disponible sur notre gitlab.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Programme du robot'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:diag_class.jpg]]&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''PWM'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
La première étape consistait à commander nos moteurs DC, afin de poser les bases de notre&lt;br /&gt;
asservissement bas niveau. Ces moteurs sont contrôlés par le driver de moteurs, utilisant des signaux logiques pour définir l’état d’un moteur et des signaux '''PWM''' pour définir la vitesse de&lt;br /&gt;
rotation. La génération de signaux PWM sur AVR se fait en utilisant les '''timers''' en mode PWM.&lt;br /&gt;
Tout simplement, nous avons un registre compteur 16 bits incrémenté périodiquement, et une valeur&lt;br /&gt;
maximale définie par le registre ''ICRx''. Nous utilisons ensuite les registres ''OCRnx'' contenant une&lt;br /&gt;
valeur inférieure au maximum. &lt;br /&gt;
Lorsque le compteur atteint la valeur contenue dans OCRnx, il&lt;br /&gt;
inverse la valeur logique de sortie du pin ''OCnx''. Ainsi, nous pouvons modifier instantanément la&lt;br /&gt;
valeur d’OCRnx afin de modifier le rapport cyclique de notre signal. Ce rapport cyclique est ensuite&lt;br /&gt;
directement proportionnel à la vitesse de rotation du moteur associé. &lt;br /&gt;
La fréquence du signal est définie par la période d’incrémentation du compteur et par la valeur maximale ICRx.&lt;br /&gt;
Pour notre composant, nous pouvions utiliser une fréquence allant jusqu’à plusieurs kHz. Cette&lt;br /&gt;
fréquence n’a aucun impact sur la rotation du moteur. Nous avons donc choisis 20 kHz.&lt;br /&gt;
Nous avons définis la '''init_pwm''' pour configurer les registres nécessaires, et la fonction&lt;br /&gt;
'''generate_pwm''' pour modifier le rapport cyclique de nos deux signaux PWM avec la valeur&lt;br /&gt;
souhaitée.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Encodeurs'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Une fois nos moteurs pouvant tourner à une vitesse voulue, nous avons du trouver un moyen de&lt;br /&gt;
mesurer leurs vitesses effectives afin de réaliser une boucle d’asservissement. Pour cela, nous avons&lt;br /&gt;
utilisés les encodeurs optiques disponibles sur nos moteurs DC. &lt;br /&gt;
Ces encodeurs envoient sur leur broches un front-montant à chaque tour de la roue codeuse reliée au moteurs (ayant une vitesse&lt;br /&gt;
proportionnelle à celle du moteur). En détectant ces fronts montant, nous pouvons donc compter le&lt;br /&gt;
nombre de tours du moteur pendant un intervalle de temps défini, puis déterminer la vitesse réelle&lt;br /&gt;
du moteur.&lt;br /&gt;
Pour détecter les fronts montant, nous utilisons l’interface '''Pin Change Interrupt''' de l’Atmega. Cette&lt;br /&gt;
interface exécute une interruption logicielle à chaque changement d’état logique du pin associé.&lt;br /&gt;
Dans notre cas, nous devons ensuite observé l’état précédent de la sortie et l’état actuel pour&lt;br /&gt;
déterminer si on est bien en présence d’un front montant. Une fois le front montant détecté, cette&lt;br /&gt;
interruption incrémente ensuite le compteur de tours.&lt;br /&gt;
Ce compteur est ensuite utilisé pour calculer la vitesse de rotation puis remis à zéro pour la mesure&lt;br /&gt;
suivante.&lt;br /&gt;
Dans notre cas, nous réalisons cette mesure à une fréquence d’environ 244 Hz, dans une autre&lt;br /&gt;
fonction d’interruption qu’on détaillera plus loin.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Angle'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Notre boucle de régulation principale a besoin d’une mesure de l’angle d’inclinaison du robot sur&lt;br /&gt;
son axe vertical perpendiculaire à celui de déplacement. Cette mesure s’effectue via le '''MPU6050'''.&lt;br /&gt;
Ce composant fonctionne via le protocole '''i2c''', protocole de communication simple utilisé par la&lt;br /&gt;
plupart des systèmes électroniques. Ce protocole étant bas niveau, il existe de nombreuses&lt;br /&gt;
bibliothèques implémentés en C permettant son utilisation. De plus, le MPU6050 est un composant&lt;br /&gt;
très complet et complexe, afin d’en récupérer l’angle, il faut d’abord amorcer une communication&lt;br /&gt;
i2c puis configurer certains des ses registres, afin ensuite de pouvoir lire les registres contenant la&lt;br /&gt;
mesure de l’angle selon l’axe désiré. Afin de conserver un code efficace et concis, nous avons&lt;br /&gt;
également décidés d’utiliser une bibliothèque faisant office de « '''driver''' » pour ce composant,&lt;br /&gt;
intégrant des fonctions d’initialisation et de lecture des mesures faites par ce gyroscope.&lt;br /&gt;
Nous obtenons donc la valeur de l’angle en degrés, comprise entre 0 et 360.Dans notre cas, nous souhaitions obtenir une valeur comprise entre -180 et 180, car seule la valeur&lt;br /&gt;
absolue et le sens de l’inclinaison nous intéresse, nous avons donc appliqués une correction de cette&lt;br /&gt;
valeur.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Interruption principale'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Lors de implémentation d’un asservissement automatique via un microcontrôleur, la puissance de&lt;br /&gt;
calcul finie impose que les commandes des actionneurs et les mesures des capteurs doivent être&lt;br /&gt;
réalisées périodiquement. Pour cela, nous pouvons utiliser une '''routine d’interruption''' qui s’exécute à&lt;br /&gt;
chaque ''overflow'' d’un compteur, via l’interface des '''timers''' de l’atmega. Dans notre cas, cette&lt;br /&gt;
interruption correspond à la fonction principale de notre programme. Nous avons réglés sa&lt;br /&gt;
fréquence à 244Hz, en divisant le fréquence de base de 16MHz avec un '''prescaler''' de 256 (plus une&lt;br /&gt;
deuxième division par 256 du à la taille du registre timer de 8 bits).&lt;br /&gt;
Cette interruption vient d’abord remettre a zéro les compteurs des encodeurs et récupérer la vitesse&lt;br /&gt;
des deux moteurs.&lt;br /&gt;
Ensuite, elle effectue les calculs nécessaires à la régulation de l’angle, mais également de la vitesse&lt;br /&gt;
linéaire et de la rotation du robot.&lt;br /&gt;
Chaque paramètre à réguler est corrigé par un régulateur PID de coefficients différents via la&lt;br /&gt;
fonction '''pid()'''.&lt;br /&gt;
Enfin, nous obtenons une commande à envoyer aux moteurs, qui actionnent notre robot de la&lt;br /&gt;
manière souhaitée.&lt;br /&gt;
Le code de notre système est disponible sur nôtre dépôt gitlab également.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Gestion de projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Durant ces trois semestres, la gestion de projet est un des domaines où nous avons le plus de difficultés, mais également un de ceux dans lequel nous avons le plus appris. &lt;br /&gt;
&lt;br /&gt;
Voici notre Diagramme de Gantt previsionnel réalisé au S6&lt;br /&gt;
[[Fichier:Gt.png|400px|thumb|left|texte descriptif]]&lt;br /&gt;
&lt;br /&gt;
D'abord trois, nous nous sommes retrouvés à deux dès le deuxième semestre, et nous avons donc du modifier l'organisation prévue pour la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons au final plus ou moins suivis ce diagramme previsionnel, à quelques choses près.&lt;br /&gt;
&lt;br /&gt;
En travaillant à deux, nous avons du trouvé un moyen d'avancer efficacement.&lt;br /&gt;
L'un de nous étant en filière SA (Systemes Autonomes) et l'autre en filière SC (Systemes Communicants), la répartition des taches informatiques et automatiques était donc simplifiée.&lt;br /&gt;
&lt;br /&gt;
Cependant, nous avons donc du réussir à expliquer et à mettre en relation chacune de nos parties, en s'améliorant sur la partie communication.&lt;br /&gt;
Pour cela, au début de chaque séance, nous commencions par faire le point sur l'avancement globale et propre à chacun.&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous nous répartitions les taches communes aux différentes parties.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous échangions sur les taches respectives à nos deux parties afin de pouvoir les faire coincider le moment venu, et il est arrivé plusieurs fois que l'on s'aide réciproquement chacun sur la partie de l'autre.&lt;br /&gt;
&lt;br /&gt;
Globalement, cela a été positif car nous avons pu tous les deux sortir de notre zone de confort et apprendre beaucoup dans différents domaines.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme outils, nous utilisions donc git et gitlab pour la gestion de code et google drive pour le partage de documents.&lt;br /&gt;
&lt;br /&gt;
Nous avons préferés travailler un maximum en présentiel, d'un accord commun.&lt;br /&gt;
&lt;br /&gt;
== Semestre 6 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/22''' &lt;br /&gt;
&lt;br /&gt;
Séance de découverte du sujet de notre projet.&lt;br /&gt;
&lt;br /&gt;
Recherche de l'existant &lt;br /&gt;
&lt;br /&gt;
Réalisation de recherches sur leurs différentes utilisations.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/22''' &lt;br /&gt;
&lt;br /&gt;
Début de création du diagramme de Gantt .&lt;br /&gt;
&lt;br /&gt;
Réalisation d'une étude du besoin.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du marché : Recherche des robots similaires.&lt;br /&gt;
&lt;br /&gt;
Commencer à prendre en main le robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 22/03/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de l'étude de marché.&lt;br /&gt;
&lt;br /&gt;
Etude des opportunités.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 29/03/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'étude du marché.&lt;br /&gt;
&lt;br /&gt;
Commencer à rédiger le cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 05/04/22''' &lt;br /&gt;
&lt;br /&gt;
Commencer la rédaction du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 26/04/22''' &lt;br /&gt;
&lt;br /&gt;
Bilan du semestre.&lt;br /&gt;
&lt;br /&gt;
Etude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Etude des risques.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 03/05/22''' &lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude des risques.&lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Finalisation du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
== Semestre 7 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 10/10/22'''&lt;br /&gt;
&lt;br /&gt;
Commencement de l'étude technique des encodeurs . &lt;br /&gt;
Recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du changement de la carte arduino pour ajouter des nouvelles fonctionnalités : connexion Wifi, fréquence microprocesseur plus élevé,..&lt;br /&gt;
Test des encodeurs moteur DC : validé .&lt;br /&gt;
Poursuite de recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude de génération des signaux PWM&lt;br /&gt;
&lt;br /&gt;
Test sur Matlab Simulink des boucles d'asservissement issues des robots similaires .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/11/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation des signaux PWM du robot.&lt;br /&gt;
&lt;br /&gt;
Calcul de la fonction de transfert issue de la boucle.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/11/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du fonctionnement du gyroscope et des autres composants pour programmer le robot .  &lt;br /&gt;
&lt;br /&gt;
Séparation du travail a effectuer pour le robot entre une boucle du moteur DC(niveau 1) et une boucle du niveau supérieur(niveau 2) pour asservir l'angle d'inclinaison du robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/11/22''' &lt;br /&gt;
&lt;br /&gt;
Modification et amélioration du diagramme de Gantt pour le S7 et le S8.&lt;br /&gt;
&lt;br /&gt;
Avancée de la modélisation de la boucle du niveau 1 .&lt;br /&gt;
&lt;br /&gt;
Diagramme de Gantt S7-S8&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/11/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation de la boucle du niveau inférieur sur Matlab/Simulink et récupération des résultats sur le scope .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/12/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie informatique et avancement de la partie automatique .&lt;br /&gt;
Programmation de la liaison série pour débugger les sorties de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/12/22''' &lt;br /&gt;
&lt;br /&gt;
Début de rédaction du rapport pour le S7&lt;br /&gt;
&lt;br /&gt;
== Semestre 8 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/01/23''' &lt;br /&gt;
&lt;br /&gt;
Recherches pour le gyroscope . &lt;br /&gt;
Test des encodeurs .&lt;br /&gt;
Communication sur les attentes du semestre s8 ,les fautes à éviter pour rebondir par rapport au retard S7 &lt;br /&gt;
Mise à niveau pour comprendre les aspects techniques de la partie informatique pour pouvoir travailler ensemble sur les résultats du S8 .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/01/23''' &lt;br /&gt;
&lt;br /&gt;
- Suppression des structures de données pour avancer plus rapidement sur les résultats du semestre s8 .&lt;br /&gt;
&lt;br /&gt;
- Recherches pour la programmation des interruptions PCINT . &lt;br /&gt;
&lt;br /&gt;
- Recherche sur la doc technique pour faire l'initialisation des interruptions externes . &lt;br /&gt;
&lt;br /&gt;
- Recherche de la modélisation en 3D de notre robot pour trouver les paramètres PID de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/02/23''' &lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons :&lt;br /&gt;
&lt;br /&gt;
Modification du code des encodeurs et test sur les moteurs DC . &lt;br /&gt;
&lt;br /&gt;
Poursuite de recherche de l'existant pour trouver le code du gyroscope .&lt;br /&gt;
&lt;br /&gt;
Mise à jour du git .&lt;br /&gt;
&lt;br /&gt;
Début du calcul des matrices d'inertie de chaque solide.&lt;br /&gt;
&lt;br /&gt;
Recherche du code des régulateurs.&lt;br /&gt;
&lt;br /&gt;
Avancement sur la gestion de projet .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/02/23'''&lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons essayé de récupérer les résultats des tests électronique de l'oscilloscope effectués dans les salles d'électronique .&lt;br /&gt;
&lt;br /&gt;
Le code des encodeurs marchent ,la liaison série affiche exactement la vitesse de la consigne :les Régulateurs implémentés correspondent bien à notre applications.&lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation de la partie informatique du gyroscope : Objectif : récupération de l'angle d'inclinaison sur la liaison série avec la meilleure précision possible .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/02/23''' &lt;br /&gt;
&lt;br /&gt;
Fin du calcul des matrices d'inertie . &lt;br /&gt;
&lt;br /&gt;
Paramétrage de notre robot pour avoir la visibilité sur les configurations possibles d'avoir(en virage, ligne droite),en précisant les angles d'inclinaison et es repères associés . &lt;br /&gt;
&lt;br /&gt;
Poursuite de programmation des régulateurs par niveaux en utilisant le code précédemment implémenté pour les encodeurs .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/23''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation du modèle en 3D de notre robot pour essayer de l'autoéquilibrer en utilisant les PIDS issues de l'autotune par rapport à nos préférences(stabilité,temps de réponse,dépassement,précision). &lt;br /&gt;
&lt;br /&gt;
Nous avons testé le robot en l'alimentant par le biai la liaison USB ! et enregistrement des résultats .  &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie automatique en trouvant toutes les équations nécessaires à notre modèle .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/23''' &lt;br /&gt;
&lt;br /&gt;
Réalisations de cette séance :&lt;br /&gt;
&lt;br /&gt;
Test du robot pour se stabiliser sur le sol en applicant plusieurs . &lt;br /&gt;
&lt;br /&gt;
Faire tous les calculs des dimensions géométriques de notre robot et test de la boucle d'asservissement avec les deux niveaux sur Matlab Simulink avec nos préférences de stabilité, temps de réponse,précision,dépassement .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/23''' &lt;br /&gt;
&lt;br /&gt;
Absence justifiée .&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91449</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91449"/>
				<updated>2023-05-09T21:07:13Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Résumé'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
[[Fichier: SegwayRobot.jpg|200px|right|thumb|Exemple de robot similaire au notre]]&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
L'intégralité de notre programme est disponible sur le dépôt git à l'adresse: https://gitlab.com/remi_farault/self-balanced-robot&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Présentation générale'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==🌏Contexte==&lt;br /&gt;
Les moyens de transport actuels reposent principalement sur le principe du robot à deux roues, c'est la raison pour laquelle l'étude de celui ci s'avère importante, en effet l'étude   &lt;br /&gt;
de sa conception et son contrôle va nous permettre de développer des outils innovants qui pourraient potentiellement intéresser des sociétés de transport .&lt;br /&gt;
&lt;br /&gt;
==🎯Objectif==&lt;br /&gt;
&lt;br /&gt;
Notre objectif principal est de commander le robot, de là interviennent d'autres objectifs tel que la stabilité ,développer un code robuste qui assure cette fonctionnalité et aussi le contrôler pour réaliser des fonctionnalités de déplacement et d'éviter des obstacles . Des objectifs secondaires sont de créer un site web à travers lequel nous allons mener toutes les opérations de contrôle .&lt;br /&gt;
&lt;br /&gt;
==🔍Expression du besoin==&lt;br /&gt;
&lt;br /&gt;
Un robot autoéquilibré à deux roues est un type de robot qui peut se maintenir en équilibre sur deux roues sans tomber. Pour réaliser cette fonctionnalité, le robot utilise un ensemble de capteurs, d'algorithmes de contrôle et de moteurs pour ajuster sa position en temps réel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Self_balanc_bt.png|400px|Bete a corne SBR]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le diagramme interacteurs permet en fait de visualiser les fonctions services assurées par le système &lt;br /&gt;
&lt;br /&gt;
[[Fichier:341702419_560921119358434_1016673599353874396_n_(1).png|400px|DGI SBR]]    [[Fichier:Btacorne.png |500px|DGI SBR|right]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Réalisations et Résultats'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
[[Fichier: seg.jpg|200px|left|thumb|Exemple de commande désirée]]&lt;br /&gt;
&lt;br /&gt;
Après mis en place notre stratégie de gestion de projet en s6 à travers le diagramme de GANTT et le cahier de charges fonctionnels, nous nous sommes focalisés sur l'étude technique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: progg.png|300px|right|thumb|Organisation de notre programme]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, étudier à travers des outils automatiques la stabilité du robot en faisant appel à des modèles théoriques et pratiques et commencer par un raisonnement par niveaux, d'abord le niveau 1 du moteur à courant continu et les équations correspondantes puis le niveau 2 assurant la stabilité du robot directement, on avait la possibilité de passer directement au niveau 2 à travers le modèle du pendule inversé et les équations qui en découlent sauf que celui-ci ne nous permettra pas de revenir au niveau 1 et asservir le moteur à travers les codeurs incrémentales ,la deuxième partie consistait à réaliser les codes informatiques en s'appuyant sur les structures de données en C vues l'année dernière et conduire un même raisonnement(par niveaux) s'appuyant d'abord sur les codes sources correspondants à la génération d'un signal PWM pour les deux moteurs avec un rapport cyclique modifiable, et aussi les codes sources correspondants à la gestion des moteurs, en effet, ceux-ci tournent  dans un sens ou dans un autre ou ne tournent pas en fonction de la variable in1 et in2  pour faire tourner les moteurs .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Avr.png|100px|left|thumb|Compilateur utilisé]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cependant, nous avons rencontré quelques problèmes en automatique notamment pour trouver des valeurs des constantes théoriques pour les références du moteur entre les mains, ce qui nous a obligé à prendre des valeurs issues d'autres applications, nous avons rencontré aussi quelques problèmes choisir une modélisation parmi celles qui sont disponibles sur Internet .&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Etude Automatique'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Avant de programmer notre système sur la carte Arduino, nous avons également créé une simulation complète de notre système robotisé sur SIMULINK. Cependant, avant cela, nous avons dû déterminer les équations qui régissent notre système en trouvant les matrices d'inertie de chaque composant de notre robot, à savoir la masse transportée par le robot (M), le châssis constitué de deux plateaux et de la motorisation (les piliers et leur inertie ont été négligés car leur masse est très faible), ainsi que les roues (roue droite et roue gauche). Vous trouverez ci-dessous les matrices d'inertie que nous avons obtenues pour chaque composant.&lt;br /&gt;
&lt;br /&gt;
'''Masse M :'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatM.png|200px|thumb|left|Matrice de la masse M]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients seront notés dans la suite pour simplifier : AM,BM,CM &lt;br /&gt;
&lt;br /&gt;
'''Chassis:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatB.png|800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AH,BH,CH &lt;br /&gt;
&lt;br /&gt;
'''Roue gauche:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrg.png |600px|Matrice de RG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
'''Roue droite:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrd.png |600px|Matrice RD]]&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
Ci-dessous un paramétrage de notre système : Chaque angle détermine un repère&lt;br /&gt;
&lt;br /&gt;
Le repère R0 est supposé galliléen.&lt;br /&gt;
&lt;br /&gt;
Le repère R1 est en rotation  ,appelé angle de virage par rapport à R0.&lt;br /&gt;
&lt;br /&gt;
Le repère R2 est en rotation  ,appelé angle d’inclinaison du châssis par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R3 est en rotation  ,appelé angle d’inclinaison arrière-avant de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R4 est en rotation ,appelé angle d’inclinaison droite-gauche de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:param.png |800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
l’angle de consigne est de 0deg,nous employons un PID pour corriger l’angle de mesure,à sa sortie,on aura une tension W(p).Les blocs Km et W(p) assurent le passage tension-&amp;gt;couple-&amp;gt;angle ,il faut ensuite retirer  pour ne garder que l’angle d’inclinaison du châssis  .Km=0.0125N.m.V-1(d’après la datasheet du moteur)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bcle.png |800px|Asservissement]]                                                             [[Fichier:Matuu.png|right|800px|Asservissement]]      &lt;br /&gt;
&lt;br /&gt;
Les équations obtenues sont les suivantes (Le détail des calculs a été précisé dans le Rapport): &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eq nnlin.png |500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après linéarisation : Considérer l'approximations des petits angles pour le sinus et cosinus,et négliger aussi la vitesse angulaire quadratique devant la vitesse angulaire,nous obtenons : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eqlin.png |300px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crbe.png|600px|Courbe]]&lt;br /&gt;
&lt;br /&gt;
On obtient une courbe avec un bon temps de réponse, un léger dépassement et une stabilité .Le système est régulé de manière efficace, capable de répondre rapidement et précisément aux perturbations tout en maintenant une position d'équilibre stable.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mat3d.png|500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Environnement de developpement'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Notre microcontrolleur étant une Arduino Uno, nous aurions pu utiliser le framework ''Arduino'' donnant accès à un IDE intégrant les outils pour compiler et flasher le code, ainsi qu'une multitude de bibliothèques haut niveaux très simples d'utilisation et plutôt performantes, permettant de programmer notre robot en simplement quelques dizaines de lignes de code.&lt;br /&gt;
&lt;br /&gt;
Cependant, l'Arduino est simplement une carte de prototypage intégrant un microcontrôleur ''AVR Atmega 328p''. &lt;br /&gt;
Les microcontroleurs AVR disposent d'une grande communauté, et il existe de nombreux outils nécessaires au developpement sur ces cartes.&lt;br /&gt;
Afin d'avoir un meilleur contrôle sur notre projet, et surtout d'en tirer un maximum de compétences, nous avons donc décidés de programmer notre robot directement en C en utilisant les outils AVR:&lt;br /&gt;
&lt;br /&gt;
- '''avr-gcc''': compilateur open-source portant toutes les fonctionnalités du langage C standard sur les microcontroleurs AVR.&lt;br /&gt;
Seul, son utilisation est quasiment impossible et demande trop de travail en programmation bas-niveau.&lt;br /&gt;
&lt;br /&gt;
- '''avr-libc''': implémentation basé sur le compilateur avr-gcc de la bibliothèque standard du langage C.&lt;br /&gt;
Cette bibliothèque permet donc d'utiliser les fonctions et structures standards du C (IO, maths, chaines de caractères), mais elle intègre également un mapping mémoire de tous les registres de l'atmega, ainsi qu'un mécanisme pour programmer des interruptions.&lt;br /&gt;
&lt;br /&gt;
- '''avr-objcopy''': ce programme en ligne de commande formate le binaire obtenu en format utilisable par les AVR&lt;br /&gt;
&lt;br /&gt;
- '''avr-dude''': ce programme en ligne de commande permet de flasher via une interface USB-série un microcontroleur AVR présent sur une carte Arduino.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc developpé un '''Makefile''' utilisant tous ces outils, constituant un environnement de developpement très efficace pour notre projet. Ce Makefile est disponible sur notre gitlab.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Programme du robot'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''PWM'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
La première étape consistait à commander nos moteurs DC, afin de poser les bases de notre&lt;br /&gt;
asservissement bas niveau. Ces moteurs sont contrôlés par le driver de moteurs, utilisant des signaux logiques pour définir l’état d’un moteur et des signaux '''PWM''' pour définir la vitesse de&lt;br /&gt;
rotation. La génération de signaux PWM sur AVR se fait en utilisant les '''timers''' en mode PWM.&lt;br /&gt;
Tout simplement, nous avons un registre compteur 16 bits incrémenté périodiquement, et une valeur&lt;br /&gt;
maximale définie par le registre ''ICRx''. Nous utilisons ensuite les registres ''OCRnx'' contenant une&lt;br /&gt;
valeur inférieure au maximum. &lt;br /&gt;
Lorsque le compteur atteint la valeur contenue dans OCRnx, il&lt;br /&gt;
inverse la valeur logique de sortie du pin ''OCnx''. Ainsi, nous pouvons modifier instantanément la&lt;br /&gt;
valeur d’OCRnx afin de modifier le rapport cyclique de notre signal. Ce rapport cyclique est ensuite&lt;br /&gt;
directement proportionnel à la vitesse de rotation du moteur associé. &lt;br /&gt;
La fréquence du signal est définie par la période d’incrémentation du compteur et par la valeur maximale ICRx.&lt;br /&gt;
Pour notre composant, nous pouvions utiliser une fréquence allant jusqu’à plusieurs kHz. Cette&lt;br /&gt;
fréquence n’a aucun impact sur la rotation du moteur. Nous avons donc choisis 20 kHz.&lt;br /&gt;
Nous avons définis la '''init_pwm''' pour configurer les registres nécessaires, et la fonction&lt;br /&gt;
'''generate_pwm''' pour modifier le rapport cyclique de nos deux signaux PWM avec la valeur&lt;br /&gt;
souhaitée.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Encodeurs'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Une fois nos moteurs pouvant tourner à une vitesse voulue, nous avons du trouver un moyen de&lt;br /&gt;
mesurer leurs vitesses effectives afin de réaliser une boucle d’asservissement. Pour cela, nous avons&lt;br /&gt;
utilisés les encodeurs optiques disponibles sur nos moteurs DC. &lt;br /&gt;
Ces encodeurs envoient sur leur broches un front-montant à chaque tour de la roue codeuse reliée au moteurs (ayant une vitesse&lt;br /&gt;
proportionnelle à celle du moteur). En détectant ces fronts montant, nous pouvons donc compter le&lt;br /&gt;
nombre de tours du moteur pendant un intervalle de temps défini, puis déterminer la vitesse réelle&lt;br /&gt;
du moteur.&lt;br /&gt;
Pour détecter les fronts montant, nous utilisons l’interface '''Pin Change Interrupt''' de l’Atmega. Cette&lt;br /&gt;
interface exécute une interruption logicielle à chaque changement d’état logique du pin associé.&lt;br /&gt;
Dans notre cas, nous devons ensuite observé l’état précédent de la sortie et l’état actuel pour&lt;br /&gt;
déterminer si on est bien en présence d’un front montant. Une fois le front montant détecté, cette&lt;br /&gt;
interruption incrémente ensuite le compteur de tours.&lt;br /&gt;
Ce compteur est ensuite utilisé pour calculer la vitesse de rotation puis remis à zéro pour la mesure&lt;br /&gt;
suivante.&lt;br /&gt;
Dans notre cas, nous réalisons cette mesure à une fréquence d’environ 244 Hz, dans une autre&lt;br /&gt;
fonction d’interruption qu’on détaillera plus loin.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Angle'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Notre boucle de régulation principale a besoin d’une mesure de l’angle d’inclinaison du robot sur&lt;br /&gt;
son axe vertical perpendiculaire à celui de déplacement. Cette mesure s’effectue via le '''MPU6050'''.&lt;br /&gt;
Ce composant fonctionne via le protocole '''i2c''', protocole de communication simple utilisé par la&lt;br /&gt;
plupart des systèmes électroniques. Ce protocole étant bas niveau, il existe de nombreuses&lt;br /&gt;
bibliothèques implémentés en C permettant son utilisation. De plus, le MPU6050 est un composant&lt;br /&gt;
très complet et complexe, afin d’en récupérer l’angle, il faut d’abord amorcer une communication&lt;br /&gt;
i2c puis configurer certains des ses registres, afin ensuite de pouvoir lire les registres contenant la&lt;br /&gt;
mesure de l’angle selon l’axe désiré. Afin de conserver un code efficace et concis, nous avons&lt;br /&gt;
également décidés d’utiliser une bibliothèque faisant office de « '''driver''' » pour ce composant,&lt;br /&gt;
intégrant des fonctions d’initialisation et de lecture des mesures faites par ce gyroscope.&lt;br /&gt;
Nous obtenons donc la valeur de l’angle en degrés, comprise entre 0 et 360.Dans notre cas, nous souhaitions obtenir une valeur comprise entre -180 et 180, car seule la valeur&lt;br /&gt;
absolue et le sens de l’inclinaison nous intéresse, nous avons donc appliqués une correction de cette&lt;br /&gt;
valeur.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Interruption principale'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Lors de implémentation d’un asservissement automatique via un microcontrôleur, la puissance de&lt;br /&gt;
calcul finie impose que les commandes des actionneurs et les mesures des capteurs doivent être&lt;br /&gt;
réalisées périodiquement. Pour cela, nous pouvons utiliser une '''routine d’interruption''' qui s’exécute à&lt;br /&gt;
chaque ''overflow'' d’un compteur, via l’interface des '''timers''' de l’atmega. Dans notre cas, cette&lt;br /&gt;
interruption correspond à la fonction principale de notre programme. Nous avons réglés sa&lt;br /&gt;
fréquence à 244Hz, en divisant le fréquence de base de 16MHz avec un '''prescaler''' de 256 (plus une&lt;br /&gt;
deuxième division par 256 du à la taille du registre timer de 8 bits).&lt;br /&gt;
Cette interruption vient d’abord remettre a zéro les compteurs des encodeurs et récupérer la vitesse&lt;br /&gt;
des deux moteurs.&lt;br /&gt;
Ensuite, elle effectue les calculs nécessaires à la régulation de l’angle, mais également de la vitesse&lt;br /&gt;
linéaire et de la rotation du robot.&lt;br /&gt;
Chaque paramètre à réguler est corrigé par un régulateur PID de coefficients différents via la&lt;br /&gt;
fonction '''pid()'''.&lt;br /&gt;
Enfin, nous obtenons une commande à envoyer aux moteurs, qui actionnent notre robot de la&lt;br /&gt;
manière souhaitée.&lt;br /&gt;
Le code de notre système est disponible sur nôtre dépôt gitlab également.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Gestion de projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Durant ces trois semestres, la gestion de projet est un des domaines où nous avons le plus de difficultés, mais également un de ceux dans lequel nous avons le plus appris. &lt;br /&gt;
&lt;br /&gt;
Voici notre Diagramme de Gantt previsionnel réalisé au S6&lt;br /&gt;
[[Fichier:Gt.png|400px|thumb|left|texte descriptif]]&lt;br /&gt;
&lt;br /&gt;
D'abord trois, nous nous sommes retrouvés à deux dès le deuxième semestre, et nous avons donc du modifier l'organisation prévue pour la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons au final plus ou moins suivis ce diagramme previsionnel, à quelques choses près.&lt;br /&gt;
&lt;br /&gt;
En travaillant à deux, nous avons du trouvé un moyen d'avancer efficacement.&lt;br /&gt;
L'un de nous étant en filière SA (Systemes Autonomes) et l'autre en filière SC (Systemes Communicants), la répartition des taches informatiques et automatiques était donc simplifiée.&lt;br /&gt;
&lt;br /&gt;
Cependant, nous avons donc du réussir à expliquer et à mettre en relation chacune de nos parties, en s'améliorant sur la partie communication.&lt;br /&gt;
Pour cela, au début de chaque séance, nous commencions par faire le point sur l'avancement globale et propre à chacun.&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous nous répartitions les taches communes aux différentes parties.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous échangions sur les taches respectives à nos deux parties afin de pouvoir les faire coincider le moment venu, et il est arrivé plusieurs fois que l'on s'aide réciproquement chacun sur la partie de l'autre.&lt;br /&gt;
&lt;br /&gt;
Globalement, cela a été positif car nous avons pu tous les deux sortir de notre zone de confort et apprendre beaucoup dans différents domaines.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme outils, nous utilisions donc git et gitlab pour la gestion de code et google drive pour le partage de documents.&lt;br /&gt;
&lt;br /&gt;
Nous avons préferés travailler un maximum en présentiel, d'un accord commun.&lt;br /&gt;
&lt;br /&gt;
== Semestre 6 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/22''' &lt;br /&gt;
&lt;br /&gt;
Séance de découverte du sujet de notre projet.&lt;br /&gt;
&lt;br /&gt;
Recherche de l'existant &lt;br /&gt;
&lt;br /&gt;
Réalisation de recherches sur leurs différentes utilisations.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/22''' &lt;br /&gt;
&lt;br /&gt;
Début de création du diagramme de Gantt .&lt;br /&gt;
&lt;br /&gt;
Réalisation d'une étude du besoin.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du marché : Recherche des robots similaires.&lt;br /&gt;
&lt;br /&gt;
Commencer à prendre en main le robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 22/03/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de l'étude de marché.&lt;br /&gt;
&lt;br /&gt;
Etude des opportunités.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 29/03/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'étude du marché.&lt;br /&gt;
&lt;br /&gt;
Commencer à rédiger le cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 05/04/22''' &lt;br /&gt;
&lt;br /&gt;
Commencer la rédaction du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 26/04/22''' &lt;br /&gt;
&lt;br /&gt;
Bilan du semestre.&lt;br /&gt;
&lt;br /&gt;
Etude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Etude des risques.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 03/05/22''' &lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude des risques.&lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Finalisation du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
== Semestre 7 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 10/10/22'''&lt;br /&gt;
&lt;br /&gt;
Commencement de l'étude technique des encodeurs . &lt;br /&gt;
Recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du changement de la carte arduino pour ajouter des nouvelles fonctionnalités : connexion Wifi, fréquence microprocesseur plus élevé,..&lt;br /&gt;
Test des encodeurs moteur DC : validé .&lt;br /&gt;
Poursuite de recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude de génération des signaux PWM&lt;br /&gt;
&lt;br /&gt;
Test sur Matlab Simulink des boucles d'asservissement issues des robots similaires .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/11/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation des signaux PWM du robot.&lt;br /&gt;
&lt;br /&gt;
Calcul de la fonction de transfert issue de la boucle.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/11/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du fonctionnement du gyroscope et des autres composants pour programmer le robot .  &lt;br /&gt;
&lt;br /&gt;
Séparation du travail a effectuer pour le robot entre une boucle du moteur DC(niveau 1) et une boucle du niveau supérieur(niveau 2) pour asservir l'angle d'inclinaison du robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/11/22''' &lt;br /&gt;
&lt;br /&gt;
Modification et amélioration du diagramme de Gantt pour le S7 et le S8.&lt;br /&gt;
&lt;br /&gt;
Avancée de la modélisation de la boucle du niveau 1 .&lt;br /&gt;
&lt;br /&gt;
Diagramme de Gantt S7-S8&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/11/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation de la boucle du niveau inférieur sur Matlab/Simulink et récupération des résultats sur le scope .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/12/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie informatique et avancement de la partie automatique .&lt;br /&gt;
Programmation de la liaison série pour débugger les sorties de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/12/22''' &lt;br /&gt;
&lt;br /&gt;
Début de rédaction du rapport pour le S7&lt;br /&gt;
&lt;br /&gt;
== Semestre 8 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/01/23''' &lt;br /&gt;
&lt;br /&gt;
Recherches pour le gyroscope . &lt;br /&gt;
Test des encodeurs .&lt;br /&gt;
Communication sur les attentes du semestre s8 ,les fautes à éviter pour rebondir par rapport au retard S7 &lt;br /&gt;
Mise à niveau pour comprendre les aspects techniques de la partie informatique pour pouvoir travailler ensemble sur les résultats du S8 .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/01/23''' &lt;br /&gt;
&lt;br /&gt;
- Suppression des structures de données pour avancer plus rapidement sur les résultats du semestre s8 .&lt;br /&gt;
&lt;br /&gt;
- Recherches pour la programmation des interruptions PCINT . &lt;br /&gt;
&lt;br /&gt;
- Recherche sur la doc technique pour faire l'initialisation des interruptions externes . &lt;br /&gt;
&lt;br /&gt;
- Recherche de la modélisation en 3D de notre robot pour trouver les paramètres PID de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/02/23''' &lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons :&lt;br /&gt;
&lt;br /&gt;
Modification du code des encodeurs et test sur les moteurs DC . &lt;br /&gt;
&lt;br /&gt;
Poursuite de recherche de l'existant pour trouver le code du gyroscope .&lt;br /&gt;
&lt;br /&gt;
Mise à jour du git .&lt;br /&gt;
&lt;br /&gt;
Début du calcul des matrices d'inertie de chaque solide.&lt;br /&gt;
&lt;br /&gt;
Recherche du code des régulateurs.&lt;br /&gt;
&lt;br /&gt;
Avancement sur la gestion de projet .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/02/23'''&lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons essayé de récupérer les résultats des tests électronique de l'oscilloscope effectués dans les salles d'électronique .&lt;br /&gt;
&lt;br /&gt;
Le code des encodeurs marchent ,la liaison série affiche exactement la vitesse de la consigne :les Régulateurs implémentés correspondent bien à notre applications.&lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation de la partie informatique du gyroscope : Objectif : récupération de l'angle d'inclinaison sur la liaison série avec la meilleure précision possible .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/02/23''' &lt;br /&gt;
&lt;br /&gt;
Fin du calcul des matrices d'inertie . &lt;br /&gt;
&lt;br /&gt;
Paramétrage de notre robot pour avoir la visibilité sur les configurations possibles d'avoir(en virage, ligne droite),en précisant les angles d'inclinaison et es repères associés . &lt;br /&gt;
&lt;br /&gt;
Poursuite de programmation des régulateurs par niveaux en utilisant le code précédemment implémenté pour les encodeurs .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/23''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation du modèle en 3D de notre robot pour essayer de l'autoéquilibrer en utilisant les PIDS issues de l'autotune par rapport à nos préférences(stabilité,temps de réponse,dépassement,précision). &lt;br /&gt;
&lt;br /&gt;
Nous avons testé le robot en l'alimentant par le biai la liaison USB ! et enregistrement des résultats .  &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie automatique en trouvant toutes les équations nécessaires à notre modèle .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/23''' &lt;br /&gt;
&lt;br /&gt;
Réalisations de cette séance :&lt;br /&gt;
&lt;br /&gt;
Test du robot pour se stabiliser sur le sol en applicant plusieurs . &lt;br /&gt;
&lt;br /&gt;
Faire tous les calculs des dimensions géométriques de notre robot et test de la boucle d'asservissement avec les deux niveaux sur Matlab Simulink avec nos préférences de stabilité, temps de réponse,précision,dépassement .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/23''' &lt;br /&gt;
&lt;br /&gt;
Absence justifiée .&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91448</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91448"/>
				<updated>2023-05-09T21:06:34Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : /* Gestion de projet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Résumé'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
[[Fichier: SegwayRobot.jpg|200px|right|thumb|Exemple de robot similaire au notre]]&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
L'intégralité de notre programme est disponible sur le dépôt git à l'adresse: https://gitlab.com/remi_farault/self-balanced-robot&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Présentation générale'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==🌏Contexte==&lt;br /&gt;
Les moyens de transport actuels reposent principalement sur le principe du robot à deux roues, c'est la raison pour laquelle l'étude de celui ci s'avère importante, en effet l'étude   &lt;br /&gt;
de sa conception et son contrôle va nous permettre de développer des outils innovants qui pourraient potentiellement intéresser des sociétés de transport .&lt;br /&gt;
&lt;br /&gt;
==🎯Objectif==&lt;br /&gt;
&lt;br /&gt;
Notre objectif principal est de commander le robot, de là interviennent d'autres objectifs tel que la stabilité ,développer un code robuste qui assure cette fonctionnalité et aussi le contrôler pour réaliser des fonctionnalités de déplacement et d'éviter des obstacles . Des objectifs secondaires sont de créer un site web à travers lequel nous allons mener toutes les opérations de contrôle .&lt;br /&gt;
&lt;br /&gt;
==🔍Expression du besoin==&lt;br /&gt;
&lt;br /&gt;
Un robot autoéquilibré à deux roues est un type de robot qui peut se maintenir en équilibre sur deux roues sans tomber. Pour réaliser cette fonctionnalité, le robot utilise un ensemble de capteurs, d'algorithmes de contrôle et de moteurs pour ajuster sa position en temps réel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Self_balanc_bt.png|400px|Bete a corne SBR]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le diagramme interacteurs permet en fait de visualiser les fonctions services assurées par le système &lt;br /&gt;
&lt;br /&gt;
[[Fichier:341702419_560921119358434_1016673599353874396_n_(1).png|400px|DGI SBR]]    [[Fichier:Btacorne.png |500px|DGI SBR|right]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Réalisations et Résultats'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
[[Fichier: seg.jpg|200px|left|thumb|Exemple de commande désirée]]&lt;br /&gt;
&lt;br /&gt;
Après mis en place notre stratégie de gestion de projet en s6 à travers le diagramme de GANTT et le cahier de charges fonctionnels, nous nous sommes focalisés sur l'étude technique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: progg.png|300px|right|thumb|Organisation de notre programme]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, étudier à travers des outils automatiques la stabilité du robot en faisant appel à des modèles théoriques et pratiques et commencer par un raisonnement par niveaux, d'abord le niveau 1 du moteur à courant continu et les équations correspondantes puis le niveau 2 assurant la stabilité du robot directement, on avait la possibilité de passer directement au niveau 2 à travers le modèle du pendule inversé et les équations qui en découlent sauf que celui-ci ne nous permettra pas de revenir au niveau 1 et asservir le moteur à travers les codeurs incrémentales ,la deuxième partie consistait à réaliser les codes informatiques en s'appuyant sur les structures de données en C vues l'année dernière et conduire un même raisonnement(par niveaux) s'appuyant d'abord sur les codes sources correspondants à la génération d'un signal PWM pour les deux moteurs avec un rapport cyclique modifiable, et aussi les codes sources correspondants à la gestion des moteurs, en effet, ceux-ci tournent  dans un sens ou dans un autre ou ne tournent pas en fonction de la variable in1 et in2  pour faire tourner les moteurs .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Avr.png|100px|left|thumb|Compilateur utilisé]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cependant, nous avons rencontré quelques problèmes en automatique notamment pour trouver des valeurs des constantes théoriques pour les références du moteur entre les mains, ce qui nous a obligé à prendre des valeurs issues d'autres applications, nous avons rencontré aussi quelques problèmes choisir une modélisation parmi celles qui sont disponibles sur Internet .&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Etude Automatique'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Avant de programmer notre système sur la carte Arduino, nous avons également créé une simulation complète de notre système robotisé sur SIMULINK. Cependant, avant cela, nous avons dû déterminer les équations qui régissent notre système en trouvant les matrices d'inertie de chaque composant de notre robot, à savoir la masse transportée par le robot (M), le châssis constitué de deux plateaux et de la motorisation (les piliers et leur inertie ont été négligés car leur masse est très faible), ainsi que les roues (roue droite et roue gauche). Vous trouverez ci-dessous les matrices d'inertie que nous avons obtenues pour chaque composant.&lt;br /&gt;
&lt;br /&gt;
'''Masse M :'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatM.png|200px|thumb|left|Matrice de la masse M]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients seront notés dans la suite pour simplifier : AM,BM,CM &lt;br /&gt;
&lt;br /&gt;
'''Chassis:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatB.png|800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AH,BH,CH &lt;br /&gt;
&lt;br /&gt;
'''Roue gauche:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrg.png |600px|Matrice de RG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
'''Roue droite:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrd.png |600px|Matrice RD]]&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
Ci-dessous un paramétrage de notre système : Chaque angle détermine un repère&lt;br /&gt;
&lt;br /&gt;
Le repère R0 est supposé galliléen.&lt;br /&gt;
&lt;br /&gt;
Le repère R1 est en rotation  ,appelé angle de virage par rapport à R0.&lt;br /&gt;
&lt;br /&gt;
Le repère R2 est en rotation  ,appelé angle d’inclinaison du châssis par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R3 est en rotation  ,appelé angle d’inclinaison arrière-avant de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R4 est en rotation ,appelé angle d’inclinaison droite-gauche de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:param.png |800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
l’angle de consigne est de 0deg,nous employons un PID pour corriger l’angle de mesure,à sa sortie,on aura une tension W(p).Les blocs Km et W(p) assurent le passage tension-&amp;gt;couple-&amp;gt;angle ,il faut ensuite retirer  pour ne garder que l’angle d’inclinaison du châssis  .Km=0.0125N.m.V-1(d’après la datasheet du moteur)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bcle.png |800px|Asservissement]]                                                             [[Fichier:Matuu.png|right|800px|Asservissement]]      &lt;br /&gt;
&lt;br /&gt;
Les équations obtenues sont les suivantes (Le détail des calculs a été précisé dans le Rapport): &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eq nnlin.png |500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après linéarisation : Considérer l'approximations des petits angles pour le sinus et cosinus,et négliger aussi la vitesse angulaire quadratique devant la vitesse angulaire,nous obtenons : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eqlin.png |300px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crbe.png|600px|Courbe]]&lt;br /&gt;
&lt;br /&gt;
On obtient une courbe avec un bon temps de réponse, un léger dépassement et une stabilité .Le système est régulé de manière efficace, capable de répondre rapidement et précisément aux perturbations tout en maintenant une position d'équilibre stable.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mat3d.png|500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Environnement de developpement'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Notre microcontrolleur étant une Arduino Uno, nous aurions pu utiliser le framework ''Arduino'' donnant accès à un IDE intégrant les outils pour compiler et flasher le code, ainsi qu'une multitude de bibliothèques haut niveaux très simples d'utilisation et plutôt performantes, permettant de programmer notre robot en simplement quelques dizaines de lignes de code.&lt;br /&gt;
&lt;br /&gt;
Cependant, l'Arduino est simplement une carte de prototypage intégrant un microcontrôleur ''AVR Atmega 328p''. &lt;br /&gt;
Les microcontroleurs AVR disposent d'une grande communauté, et il existe de nombreux outils nécessaires au developpement sur ces cartes.&lt;br /&gt;
Afin d'avoir un meilleur contrôle sur notre projet, et surtout d'en tirer un maximum de compétences, nous avons donc décidés de programmer notre robot directement en C en utilisant les outils AVR:&lt;br /&gt;
&lt;br /&gt;
- '''avr-gcc''': compilateur open-source portant toutes les fonctionnalités du langage C standard sur les microcontroleurs AVR.&lt;br /&gt;
Seul, son utilisation est quasiment impossible et demande trop de travail en programmation bas-niveau.&lt;br /&gt;
&lt;br /&gt;
- '''avr-libc''': implémentation basé sur le compilateur avr-gcc de la bibliothèque standard du langage C.&lt;br /&gt;
Cette bibliothèque permet donc d'utiliser les fonctions et structures standards du C (IO, maths, chaines de caractères), mais elle intègre également un mapping mémoire de tous les registres de l'atmega, ainsi qu'un mécanisme pour programmer des interruptions.&lt;br /&gt;
&lt;br /&gt;
- '''avr-objcopy''': ce programme en ligne de commande formate le binaire obtenu en format utilisable par les AVR&lt;br /&gt;
&lt;br /&gt;
- '''avr-dude''': ce programme en ligne de commande permet de flasher via une interface USB-série un microcontroleur AVR présent sur une carte Arduino.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc developpé un '''Makefile''' utilisant tous ces outils, constituant un environnement de developpement très efficace pour notre projet. Ce Makefile est disponible sur notre gitlab.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Programme du robot'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''PWM'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
La première étape consistait à commander nos moteurs DC, afin de poser les bases de notre&lt;br /&gt;
asservissement bas niveau. Ces moteurs sont contrôlés par le driver de moteurs, utilisant des signaux logiques pour définir l’état d’un moteur et des signaux '''PWM''' pour définir la vitesse de&lt;br /&gt;
rotation. La génération de signaux PWM sur AVR se fait en utilisant les '''timers''' en mode PWM.&lt;br /&gt;
Tout simplement, nous avons un registre compteur 16 bits incrémenté périodiquement, et une valeur&lt;br /&gt;
maximale définie par le registre ''ICRx''. Nous utilisons ensuite les registres ''OCRnx'' contenant une&lt;br /&gt;
valeur inférieure au maximum. &lt;br /&gt;
Lorsque le compteur atteint la valeur contenue dans OCRnx, il&lt;br /&gt;
inverse la valeur logique de sortie du pin ''OCnx''. Ainsi, nous pouvons modifier instantanément la&lt;br /&gt;
valeur d’OCRnx afin de modifier le rapport cyclique de notre signal. Ce rapport cyclique est ensuite&lt;br /&gt;
directement proportionnel à la vitesse de rotation du moteur associé. &lt;br /&gt;
La fréquence du signal est définie par la période d’incrémentation du compteur et par la valeur maximale ICRx.&lt;br /&gt;
Pour notre composant, nous pouvions utiliser une fréquence allant jusqu’à plusieurs kHz. Cette&lt;br /&gt;
fréquence n’a aucun impact sur la rotation du moteur. Nous avons donc choisis 20 kHz.&lt;br /&gt;
Nous avons définis la '''init_pwm''' pour configurer les registres nécessaires, et la fonction&lt;br /&gt;
'''generate_pwm''' pour modifier le rapport cyclique de nos deux signaux PWM avec la valeur&lt;br /&gt;
souhaitée.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Encodeurs'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Une fois nos moteurs pouvant tourner à une vitesse voulue, nous avons du trouver un moyen de&lt;br /&gt;
mesurer leurs vitesses effectives afin de réaliser une boucle d’asservissement. Pour cela, nous avons&lt;br /&gt;
utilisés les encodeurs optiques disponibles sur nos moteurs DC. &lt;br /&gt;
Ces encodeurs envoient sur leur broches un front-montant à chaque tour de la roue codeuse reliée au moteurs (ayant une vitesse&lt;br /&gt;
proportionnelle à celle du moteur). En détectant ces fronts montant, nous pouvons donc compter le&lt;br /&gt;
nombre de tours du moteur pendant un intervalle de temps défini, puis déterminer la vitesse réelle&lt;br /&gt;
du moteur.&lt;br /&gt;
Pour détecter les fronts montant, nous utilisons l’interface '''Pin Change Interrupt''' de l’Atmega. Cette&lt;br /&gt;
interface exécute une interruption logicielle à chaque changement d’état logique du pin associé.&lt;br /&gt;
Dans notre cas, nous devons ensuite observé l’état précédent de la sortie et l’état actuel pour&lt;br /&gt;
déterminer si on est bien en présence d’un front montant. Une fois le front montant détecté, cette&lt;br /&gt;
interruption incrémente ensuite le compteur de tours.&lt;br /&gt;
Ce compteur est ensuite utilisé pour calculer la vitesse de rotation puis remis à zéro pour la mesure&lt;br /&gt;
suivante.&lt;br /&gt;
Dans notre cas, nous réalisons cette mesure à une fréquence d’environ 244 Hz, dans une autre&lt;br /&gt;
fonction d’interruption qu’on détaillera plus loin.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Angle'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Notre boucle de régulation principale a besoin d’une mesure de l’angle d’inclinaison du robot sur&lt;br /&gt;
son axe vertical perpendiculaire à celui de déplacement. Cette mesure s’effectue via le '''MPU6050'''.&lt;br /&gt;
Ce composant fonctionne via le protocole '''i2c''', protocole de communication simple utilisé par la&lt;br /&gt;
plupart des systèmes électroniques. Ce protocole étant bas niveau, il existe de nombreuses&lt;br /&gt;
bibliothèques implémentés en C permettant son utilisation. De plus, le MPU6050 est un composant&lt;br /&gt;
très complet et complexe, afin d’en récupérer l’angle, il faut d’abord amorcer une communication&lt;br /&gt;
i2c puis configurer certains des ses registres, afin ensuite de pouvoir lire les registres contenant la&lt;br /&gt;
mesure de l’angle selon l’axe désiré. Afin de conserver un code efficace et concis, nous avons&lt;br /&gt;
également décidés d’utiliser une bibliothèque faisant office de « '''driver''' » pour ce composant,&lt;br /&gt;
intégrant des fonctions d’initialisation et de lecture des mesures faites par ce gyroscope.&lt;br /&gt;
Nous obtenons donc la valeur de l’angle en degrés, comprise entre 0 et 360.Dans notre cas, nous souhaitions obtenir une valeur comprise entre -180 et 180, car seule la valeur&lt;br /&gt;
absolue et le sens de l’inclinaison nous intéresse, nous avons donc appliqués une correction de cette&lt;br /&gt;
valeur.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Interruption principale'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Lors de implémentation d’un asservissement automatique via un microcontrôleur, la puissance de&lt;br /&gt;
calcul finie impose que les commandes des actionneurs et les mesures des capteurs doivent être&lt;br /&gt;
réalisées périodiquement. Pour cela, nous pouvons utiliser une '''routine d’interruption''' qui s’exécute à&lt;br /&gt;
chaque ''overflow'' d’un compteur, via l’interface des '''timers''' de l’atmega. Dans notre cas, cette&lt;br /&gt;
interruption correspond à la fonction principale de notre programme. Nous avons réglés sa&lt;br /&gt;
fréquence à 244Hz, en divisant le fréquence de base de 16MHz avec un '''prescaler''' de 256 (plus une&lt;br /&gt;
deuxième division par 256 du à la taille du registre timer de 8 bits).&lt;br /&gt;
Cette interruption vient d’abord remettre a zéro les compteurs des encodeurs et récupérer la vitesse&lt;br /&gt;
des deux moteurs.&lt;br /&gt;
Ensuite, elle effectue les calculs nécessaires à la régulation de l’angle, mais également de la vitesse&lt;br /&gt;
linéaire et de la rotation du robot.&lt;br /&gt;
Chaque paramètre à réguler est corrigé par un régulateur PID de coefficients différents via la&lt;br /&gt;
fonction '''pid()'''.&lt;br /&gt;
Enfin, nous obtenons une commande à envoyer aux moteurs, qui actionnent notre robot de la&lt;br /&gt;
manière souhaitée.&lt;br /&gt;
Le code de notre système est disponible sur nôtre dépôt gitlab également.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Bilan'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 6 :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 7 :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 8 :'''&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Gestion de projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Durant ces trois semestres, la gestion de projet est un des domaines où nous avons le plus de difficultés, mais également un de ceux dans lequel nous avons le plus appris. &lt;br /&gt;
&lt;br /&gt;
Voici notre Diagramme de Gantt previsionnel réalisé au S6&lt;br /&gt;
[[Fichier:Gt.png|400px|thumb|left|texte descriptif]]&lt;br /&gt;
&lt;br /&gt;
D'abord trois, nous nous sommes retrouvés à deux dès le deuxième semestre, et nous avons donc du modifier l'organisation prévue pour la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons au final plus ou moins suivis ce diagramme previsionnel, à quelques choses près.&lt;br /&gt;
&lt;br /&gt;
En travaillant à deux, nous avons du trouvé un moyen d'avancer efficacement.&lt;br /&gt;
L'un de nous étant en filière SA (Systemes Autonomes) et l'autre en filière SC (Systemes Communicants), la répartition des taches informatiques et automatiques était donc simplifiée.&lt;br /&gt;
&lt;br /&gt;
Cependant, nous avons donc du réussir à expliquer et à mettre en relation chacune de nos parties, en s'améliorant sur la partie communication.&lt;br /&gt;
Pour cela, au début de chaque séance, nous commencions par faire le point sur l'avancement globale et propre à chacun.&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous nous répartitions les taches communes aux différentes parties.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous échangions sur les taches respectives à nos deux parties afin de pouvoir les faire coincider le moment venu, et il est arrivé plusieurs fois que l'on s'aide réciproquement chacun sur la partie de l'autre.&lt;br /&gt;
&lt;br /&gt;
Globalement, cela a été positif car nous avons pu tous les deux sortir de notre zone de confort et apprendre beaucoup dans différents domaines.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme outils, nous utilisions donc git et gitlab pour la gestion de code et google drive pour le partage de documents.&lt;br /&gt;
&lt;br /&gt;
Nous avons préferés travailler un maximum en présentiel, d'un accord commun.&lt;br /&gt;
&lt;br /&gt;
== Semestre 6 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/22''' &lt;br /&gt;
&lt;br /&gt;
Séance de découverte du sujet de notre projet.&lt;br /&gt;
&lt;br /&gt;
Recherche de l'existant &lt;br /&gt;
&lt;br /&gt;
Réalisation de recherches sur leurs différentes utilisations.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/22''' &lt;br /&gt;
&lt;br /&gt;
Début de création du diagramme de Gantt .&lt;br /&gt;
&lt;br /&gt;
Réalisation d'une étude du besoin.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du marché : Recherche des robots similaires.&lt;br /&gt;
&lt;br /&gt;
Commencer à prendre en main le robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 22/03/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de l'étude de marché.&lt;br /&gt;
&lt;br /&gt;
Etude des opportunités.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 29/03/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'étude du marché.&lt;br /&gt;
&lt;br /&gt;
Commencer à rédiger le cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 05/04/22''' &lt;br /&gt;
&lt;br /&gt;
Commencer la rédaction du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 26/04/22''' &lt;br /&gt;
&lt;br /&gt;
Bilan du semestre.&lt;br /&gt;
&lt;br /&gt;
Etude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Etude des risques.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 03/05/22''' &lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude des risques.&lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Finalisation du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
== Semestre 7 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 10/10/22'''&lt;br /&gt;
&lt;br /&gt;
Commencement de l'étude technique des encodeurs . &lt;br /&gt;
Recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du changement de la carte arduino pour ajouter des nouvelles fonctionnalités : connexion Wifi, fréquence microprocesseur plus élevé,..&lt;br /&gt;
Test des encodeurs moteur DC : validé .&lt;br /&gt;
Poursuite de recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude de génération des signaux PWM&lt;br /&gt;
&lt;br /&gt;
Test sur Matlab Simulink des boucles d'asservissement issues des robots similaires .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/11/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation des signaux PWM du robot.&lt;br /&gt;
&lt;br /&gt;
Calcul de la fonction de transfert issue de la boucle.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/11/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du fonctionnement du gyroscope et des autres composants pour programmer le robot .  &lt;br /&gt;
&lt;br /&gt;
Séparation du travail a effectuer pour le robot entre une boucle du moteur DC(niveau 1) et une boucle du niveau supérieur(niveau 2) pour asservir l'angle d'inclinaison du robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/11/22''' &lt;br /&gt;
&lt;br /&gt;
Modification et amélioration du diagramme de Gantt pour le S7 et le S8.&lt;br /&gt;
&lt;br /&gt;
Avancée de la modélisation de la boucle du niveau 1 .&lt;br /&gt;
&lt;br /&gt;
Diagramme de Gantt S7-S8&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/11/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation de la boucle du niveau inférieur sur Matlab/Simulink et récupération des résultats sur le scope .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/12/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie informatique et avancement de la partie automatique .&lt;br /&gt;
Programmation de la liaison série pour débugger les sorties de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/12/22''' &lt;br /&gt;
&lt;br /&gt;
Début de rédaction du rapport pour le S7&lt;br /&gt;
&lt;br /&gt;
== Semestre 8 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/01/23''' &lt;br /&gt;
&lt;br /&gt;
Recherches pour le gyroscope . &lt;br /&gt;
Test des encodeurs .&lt;br /&gt;
Communication sur les attentes du semestre s8 ,les fautes à éviter pour rebondir par rapport au retard S7 &lt;br /&gt;
Mise à niveau pour comprendre les aspects techniques de la partie informatique pour pouvoir travailler ensemble sur les résultats du S8 .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/01/23''' &lt;br /&gt;
&lt;br /&gt;
- Suppression des structures de données pour avancer plus rapidement sur les résultats du semestre s8 .&lt;br /&gt;
&lt;br /&gt;
- Recherches pour la programmation des interruptions PCINT . &lt;br /&gt;
&lt;br /&gt;
- Recherche sur la doc technique pour faire l'initialisation des interruptions externes . &lt;br /&gt;
&lt;br /&gt;
- Recherche de la modélisation en 3D de notre robot pour trouver les paramètres PID de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/02/23''' &lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons :&lt;br /&gt;
&lt;br /&gt;
Modification du code des encodeurs et test sur les moteurs DC . &lt;br /&gt;
&lt;br /&gt;
Poursuite de recherche de l'existant pour trouver le code du gyroscope .&lt;br /&gt;
&lt;br /&gt;
Mise à jour du git .&lt;br /&gt;
&lt;br /&gt;
Début du calcul des matrices d'inertie de chaque solide.&lt;br /&gt;
&lt;br /&gt;
Recherche du code des régulateurs.&lt;br /&gt;
&lt;br /&gt;
Avancement sur la gestion de projet .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/02/23'''&lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons essayé de récupérer les résultats des tests électronique de l'oscilloscope effectués dans les salles d'électronique .&lt;br /&gt;
&lt;br /&gt;
Le code des encodeurs marchent ,la liaison série affiche exactement la vitesse de la consigne :les Régulateurs implémentés correspondent bien à notre applications.&lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation de la partie informatique du gyroscope : Objectif : récupération de l'angle d'inclinaison sur la liaison série avec la meilleure précision possible .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/02/23''' &lt;br /&gt;
&lt;br /&gt;
Fin du calcul des matrices d'inertie . &lt;br /&gt;
&lt;br /&gt;
Paramétrage de notre robot pour avoir la visibilité sur les configurations possibles d'avoir(en virage, ligne droite),en précisant les angles d'inclinaison et es repères associés . &lt;br /&gt;
&lt;br /&gt;
Poursuite de programmation des régulateurs par niveaux en utilisant le code précédemment implémenté pour les encodeurs .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/23''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation du modèle en 3D de notre robot pour essayer de l'autoéquilibrer en utilisant les PIDS issues de l'autotune par rapport à nos préférences(stabilité,temps de réponse,dépassement,précision). &lt;br /&gt;
&lt;br /&gt;
Nous avons testé le robot en l'alimentant par le biai la liaison USB ! et enregistrement des résultats .  &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie automatique en trouvant toutes les équations nécessaires à notre modèle .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/23''' &lt;br /&gt;
&lt;br /&gt;
Réalisations de cette séance :&lt;br /&gt;
&lt;br /&gt;
Test du robot pour se stabiliser sur le sol en applicant plusieurs . &lt;br /&gt;
&lt;br /&gt;
Faire tous les calculs des dimensions géométriques de notre robot et test de la boucle d'asservissement avec les deux niveaux sur Matlab Simulink avec nos préférences de stabilité, temps de réponse,précision,dépassement .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/23''' &lt;br /&gt;
&lt;br /&gt;
Absence justifiée .&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91447</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91447"/>
				<updated>2023-05-09T21:06:13Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : /* Gestion de projet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Résumé'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
[[Fichier: SegwayRobot.jpg|200px|right|thumb|Exemple de robot similaire au notre]]&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
L'intégralité de notre programme est disponible sur le dépôt git à l'adresse: https://gitlab.com/remi_farault/self-balanced-robot&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Présentation générale'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==🌏Contexte==&lt;br /&gt;
Les moyens de transport actuels reposent principalement sur le principe du robot à deux roues, c'est la raison pour laquelle l'étude de celui ci s'avère importante, en effet l'étude   &lt;br /&gt;
de sa conception et son contrôle va nous permettre de développer des outils innovants qui pourraient potentiellement intéresser des sociétés de transport .&lt;br /&gt;
&lt;br /&gt;
==🎯Objectif==&lt;br /&gt;
&lt;br /&gt;
Notre objectif principal est de commander le robot, de là interviennent d'autres objectifs tel que la stabilité ,développer un code robuste qui assure cette fonctionnalité et aussi le contrôler pour réaliser des fonctionnalités de déplacement et d'éviter des obstacles . Des objectifs secondaires sont de créer un site web à travers lequel nous allons mener toutes les opérations de contrôle .&lt;br /&gt;
&lt;br /&gt;
==🔍Expression du besoin==&lt;br /&gt;
&lt;br /&gt;
Un robot autoéquilibré à deux roues est un type de robot qui peut se maintenir en équilibre sur deux roues sans tomber. Pour réaliser cette fonctionnalité, le robot utilise un ensemble de capteurs, d'algorithmes de contrôle et de moteurs pour ajuster sa position en temps réel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Self_balanc_bt.png|400px|Bete a corne SBR]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le diagramme interacteurs permet en fait de visualiser les fonctions services assurées par le système &lt;br /&gt;
&lt;br /&gt;
[[Fichier:341702419_560921119358434_1016673599353874396_n_(1).png|400px|DGI SBR]]    [[Fichier:Btacorne.png |500px|DGI SBR|right]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Réalisations et Résultats'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
[[Fichier: seg.jpg|200px|left|thumb|Exemple de commande désirée]]&lt;br /&gt;
&lt;br /&gt;
Après mis en place notre stratégie de gestion de projet en s6 à travers le diagramme de GANTT et le cahier de charges fonctionnels, nous nous sommes focalisés sur l'étude technique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: progg.png|300px|right|thumb|Organisation de notre programme]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, étudier à travers des outils automatiques la stabilité du robot en faisant appel à des modèles théoriques et pratiques et commencer par un raisonnement par niveaux, d'abord le niveau 1 du moteur à courant continu et les équations correspondantes puis le niveau 2 assurant la stabilité du robot directement, on avait la possibilité de passer directement au niveau 2 à travers le modèle du pendule inversé et les équations qui en découlent sauf que celui-ci ne nous permettra pas de revenir au niveau 1 et asservir le moteur à travers les codeurs incrémentales ,la deuxième partie consistait à réaliser les codes informatiques en s'appuyant sur les structures de données en C vues l'année dernière et conduire un même raisonnement(par niveaux) s'appuyant d'abord sur les codes sources correspondants à la génération d'un signal PWM pour les deux moteurs avec un rapport cyclique modifiable, et aussi les codes sources correspondants à la gestion des moteurs, en effet, ceux-ci tournent  dans un sens ou dans un autre ou ne tournent pas en fonction de la variable in1 et in2  pour faire tourner les moteurs .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Avr.png|100px|left|thumb|Compilateur utilisé]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cependant, nous avons rencontré quelques problèmes en automatique notamment pour trouver des valeurs des constantes théoriques pour les références du moteur entre les mains, ce qui nous a obligé à prendre des valeurs issues d'autres applications, nous avons rencontré aussi quelques problèmes choisir une modélisation parmi celles qui sont disponibles sur Internet .&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Etude Automatique'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Avant de programmer notre système sur la carte Arduino, nous avons également créé une simulation complète de notre système robotisé sur SIMULINK. Cependant, avant cela, nous avons dû déterminer les équations qui régissent notre système en trouvant les matrices d'inertie de chaque composant de notre robot, à savoir la masse transportée par le robot (M), le châssis constitué de deux plateaux et de la motorisation (les piliers et leur inertie ont été négligés car leur masse est très faible), ainsi que les roues (roue droite et roue gauche). Vous trouverez ci-dessous les matrices d'inertie que nous avons obtenues pour chaque composant.&lt;br /&gt;
&lt;br /&gt;
'''Masse M :'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatM.png|200px|thumb|left|Matrice de la masse M]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients seront notés dans la suite pour simplifier : AM,BM,CM &lt;br /&gt;
&lt;br /&gt;
'''Chassis:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatB.png|800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AH,BH,CH &lt;br /&gt;
&lt;br /&gt;
'''Roue gauche:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrg.png |600px|Matrice de RG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
'''Roue droite:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrd.png |600px|Matrice RD]]&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
Ci-dessous un paramétrage de notre système : Chaque angle détermine un repère&lt;br /&gt;
&lt;br /&gt;
Le repère R0 est supposé galliléen.&lt;br /&gt;
&lt;br /&gt;
Le repère R1 est en rotation  ,appelé angle de virage par rapport à R0.&lt;br /&gt;
&lt;br /&gt;
Le repère R2 est en rotation  ,appelé angle d’inclinaison du châssis par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R3 est en rotation  ,appelé angle d’inclinaison arrière-avant de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R4 est en rotation ,appelé angle d’inclinaison droite-gauche de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:param.png |800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
l’angle de consigne est de 0deg,nous employons un PID pour corriger l’angle de mesure,à sa sortie,on aura une tension W(p).Les blocs Km et W(p) assurent le passage tension-&amp;gt;couple-&amp;gt;angle ,il faut ensuite retirer  pour ne garder que l’angle d’inclinaison du châssis  .Km=0.0125N.m.V-1(d’après la datasheet du moteur)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bcle.png |800px|Asservissement]]                                                             [[Fichier:Matuu.png|right|800px|Asservissement]]      &lt;br /&gt;
&lt;br /&gt;
Les équations obtenues sont les suivantes (Le détail des calculs a été précisé dans le Rapport): &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eq nnlin.png |500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après linéarisation : Considérer l'approximations des petits angles pour le sinus et cosinus,et négliger aussi la vitesse angulaire quadratique devant la vitesse angulaire,nous obtenons : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eqlin.png |300px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crbe.png|600px|Courbe]]&lt;br /&gt;
&lt;br /&gt;
On obtient une courbe avec un bon temps de réponse, un léger dépassement et une stabilité .Le système est régulé de manière efficace, capable de répondre rapidement et précisément aux perturbations tout en maintenant une position d'équilibre stable.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mat3d.png|500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Environnement de developpement'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Notre microcontrolleur étant une Arduino Uno, nous aurions pu utiliser le framework ''Arduino'' donnant accès à un IDE intégrant les outils pour compiler et flasher le code, ainsi qu'une multitude de bibliothèques haut niveaux très simples d'utilisation et plutôt performantes, permettant de programmer notre robot en simplement quelques dizaines de lignes de code.&lt;br /&gt;
&lt;br /&gt;
Cependant, l'Arduino est simplement une carte de prototypage intégrant un microcontrôleur ''AVR Atmega 328p''. &lt;br /&gt;
Les microcontroleurs AVR disposent d'une grande communauté, et il existe de nombreux outils nécessaires au developpement sur ces cartes.&lt;br /&gt;
Afin d'avoir un meilleur contrôle sur notre projet, et surtout d'en tirer un maximum de compétences, nous avons donc décidés de programmer notre robot directement en C en utilisant les outils AVR:&lt;br /&gt;
&lt;br /&gt;
- '''avr-gcc''': compilateur open-source portant toutes les fonctionnalités du langage C standard sur les microcontroleurs AVR.&lt;br /&gt;
Seul, son utilisation est quasiment impossible et demande trop de travail en programmation bas-niveau.&lt;br /&gt;
&lt;br /&gt;
- '''avr-libc''': implémentation basé sur le compilateur avr-gcc de la bibliothèque standard du langage C.&lt;br /&gt;
Cette bibliothèque permet donc d'utiliser les fonctions et structures standards du C (IO, maths, chaines de caractères), mais elle intègre également un mapping mémoire de tous les registres de l'atmega, ainsi qu'un mécanisme pour programmer des interruptions.&lt;br /&gt;
&lt;br /&gt;
- '''avr-objcopy''': ce programme en ligne de commande formate le binaire obtenu en format utilisable par les AVR&lt;br /&gt;
&lt;br /&gt;
- '''avr-dude''': ce programme en ligne de commande permet de flasher via une interface USB-série un microcontroleur AVR présent sur une carte Arduino.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc developpé un '''Makefile''' utilisant tous ces outils, constituant un environnement de developpement très efficace pour notre projet. Ce Makefile est disponible sur notre gitlab.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Programme du robot'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''PWM'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
La première étape consistait à commander nos moteurs DC, afin de poser les bases de notre&lt;br /&gt;
asservissement bas niveau. Ces moteurs sont contrôlés par le driver de moteurs, utilisant des signaux logiques pour définir l’état d’un moteur et des signaux '''PWM''' pour définir la vitesse de&lt;br /&gt;
rotation. La génération de signaux PWM sur AVR se fait en utilisant les '''timers''' en mode PWM.&lt;br /&gt;
Tout simplement, nous avons un registre compteur 16 bits incrémenté périodiquement, et une valeur&lt;br /&gt;
maximale définie par le registre ''ICRx''. Nous utilisons ensuite les registres ''OCRnx'' contenant une&lt;br /&gt;
valeur inférieure au maximum. &lt;br /&gt;
Lorsque le compteur atteint la valeur contenue dans OCRnx, il&lt;br /&gt;
inverse la valeur logique de sortie du pin ''OCnx''. Ainsi, nous pouvons modifier instantanément la&lt;br /&gt;
valeur d’OCRnx afin de modifier le rapport cyclique de notre signal. Ce rapport cyclique est ensuite&lt;br /&gt;
directement proportionnel à la vitesse de rotation du moteur associé. &lt;br /&gt;
La fréquence du signal est définie par la période d’incrémentation du compteur et par la valeur maximale ICRx.&lt;br /&gt;
Pour notre composant, nous pouvions utiliser une fréquence allant jusqu’à plusieurs kHz. Cette&lt;br /&gt;
fréquence n’a aucun impact sur la rotation du moteur. Nous avons donc choisis 20 kHz.&lt;br /&gt;
Nous avons définis la '''init_pwm''' pour configurer les registres nécessaires, et la fonction&lt;br /&gt;
'''generate_pwm''' pour modifier le rapport cyclique de nos deux signaux PWM avec la valeur&lt;br /&gt;
souhaitée.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Encodeurs'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Une fois nos moteurs pouvant tourner à une vitesse voulue, nous avons du trouver un moyen de&lt;br /&gt;
mesurer leurs vitesses effectives afin de réaliser une boucle d’asservissement. Pour cela, nous avons&lt;br /&gt;
utilisés les encodeurs optiques disponibles sur nos moteurs DC. &lt;br /&gt;
Ces encodeurs envoient sur leur broches un front-montant à chaque tour de la roue codeuse reliée au moteurs (ayant une vitesse&lt;br /&gt;
proportionnelle à celle du moteur). En détectant ces fronts montant, nous pouvons donc compter le&lt;br /&gt;
nombre de tours du moteur pendant un intervalle de temps défini, puis déterminer la vitesse réelle&lt;br /&gt;
du moteur.&lt;br /&gt;
Pour détecter les fronts montant, nous utilisons l’interface '''Pin Change Interrupt''' de l’Atmega. Cette&lt;br /&gt;
interface exécute une interruption logicielle à chaque changement d’état logique du pin associé.&lt;br /&gt;
Dans notre cas, nous devons ensuite observé l’état précédent de la sortie et l’état actuel pour&lt;br /&gt;
déterminer si on est bien en présence d’un front montant. Une fois le front montant détecté, cette&lt;br /&gt;
interruption incrémente ensuite le compteur de tours.&lt;br /&gt;
Ce compteur est ensuite utilisé pour calculer la vitesse de rotation puis remis à zéro pour la mesure&lt;br /&gt;
suivante.&lt;br /&gt;
Dans notre cas, nous réalisons cette mesure à une fréquence d’environ 244 Hz, dans une autre&lt;br /&gt;
fonction d’interruption qu’on détaillera plus loin.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Angle'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Notre boucle de régulation principale a besoin d’une mesure de l’angle d’inclinaison du robot sur&lt;br /&gt;
son axe vertical perpendiculaire à celui de déplacement. Cette mesure s’effectue via le '''MPU6050'''.&lt;br /&gt;
Ce composant fonctionne via le protocole '''i2c''', protocole de communication simple utilisé par la&lt;br /&gt;
plupart des systèmes électroniques. Ce protocole étant bas niveau, il existe de nombreuses&lt;br /&gt;
bibliothèques implémentés en C permettant son utilisation. De plus, le MPU6050 est un composant&lt;br /&gt;
très complet et complexe, afin d’en récupérer l’angle, il faut d’abord amorcer une communication&lt;br /&gt;
i2c puis configurer certains des ses registres, afin ensuite de pouvoir lire les registres contenant la&lt;br /&gt;
mesure de l’angle selon l’axe désiré. Afin de conserver un code efficace et concis, nous avons&lt;br /&gt;
également décidés d’utiliser une bibliothèque faisant office de « '''driver''' » pour ce composant,&lt;br /&gt;
intégrant des fonctions d’initialisation et de lecture des mesures faites par ce gyroscope.&lt;br /&gt;
Nous obtenons donc la valeur de l’angle en degrés, comprise entre 0 et 360.Dans notre cas, nous souhaitions obtenir une valeur comprise entre -180 et 180, car seule la valeur&lt;br /&gt;
absolue et le sens de l’inclinaison nous intéresse, nous avons donc appliqués une correction de cette&lt;br /&gt;
valeur.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Interruption principale'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Lors de implémentation d’un asservissement automatique via un microcontrôleur, la puissance de&lt;br /&gt;
calcul finie impose que les commandes des actionneurs et les mesures des capteurs doivent être&lt;br /&gt;
réalisées périodiquement. Pour cela, nous pouvons utiliser une '''routine d’interruption''' qui s’exécute à&lt;br /&gt;
chaque ''overflow'' d’un compteur, via l’interface des '''timers''' de l’atmega. Dans notre cas, cette&lt;br /&gt;
interruption correspond à la fonction principale de notre programme. Nous avons réglés sa&lt;br /&gt;
fréquence à 244Hz, en divisant le fréquence de base de 16MHz avec un '''prescaler''' de 256 (plus une&lt;br /&gt;
deuxième division par 256 du à la taille du registre timer de 8 bits).&lt;br /&gt;
Cette interruption vient d’abord remettre a zéro les compteurs des encodeurs et récupérer la vitesse&lt;br /&gt;
des deux moteurs.&lt;br /&gt;
Ensuite, elle effectue les calculs nécessaires à la régulation de l’angle, mais également de la vitesse&lt;br /&gt;
linéaire et de la rotation du robot.&lt;br /&gt;
Chaque paramètre à réguler est corrigé par un régulateur PID de coefficients différents via la&lt;br /&gt;
fonction '''pid()'''.&lt;br /&gt;
Enfin, nous obtenons une commande à envoyer aux moteurs, qui actionnent notre robot de la&lt;br /&gt;
manière souhaitée.&lt;br /&gt;
Le code de notre système est disponible sur nôtre dépôt gitlab également.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Bilan'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 6 :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 7 :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 8 :'''&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Gestion de projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Durant ces trois semestres, la gestion de projet est un des domaines où nous avons le plus de difficultés, mais également un de ceux dans lequel nous avons le plus appris. &lt;br /&gt;
&lt;br /&gt;
Voici notre Diagramme de Gantt previsionnel réalisé au S6&lt;br /&gt;
[[Fichier:Gt.png|400px|thumb|left|texte descriptif]]&lt;br /&gt;
&lt;br /&gt;
D'abord trois, nous nous sommes retrouvés à deux dès le deuxième semestre, et nous avons donc du modifier l'organisation prévue pour la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons au final plus ou moins suivis ce diagramme previsionnel, à quelques choses près.&lt;br /&gt;
&lt;br /&gt;
En travaillant à deux, nous avons du trouvé un moyen d'avancer efficacement.&lt;br /&gt;
L'un de nous étant en filière SA (Systemes Autonomes) et l'autre en filière SC (Systemes Communicants), la répartition des taches informatiques et automatiques était donc simplifiée.&lt;br /&gt;
&lt;br /&gt;
Cependant, nous avons donc du réussir à expliquer et à mettre en relation chacune de nos parties, en s'améliorant sur la partie communication.&lt;br /&gt;
Pour cela, au début de chaque séance, nous commencions par faire le point sur l'avancement globale et propre à chacun.&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous nous répartitions les taches communes aux différentes parties.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous échangions sur les taches respectives à nos deux parties afin de pouvoir les faire coincider le moment venu, et il est arrivé plusieurs fois que l'on s'aide réciproquement chacun sur la partie de l'autre.&lt;br /&gt;
&lt;br /&gt;
Globalement, cela a été positif car nous avons pu tous les deux sortir de notre zone de confort et apprendre beaucoup dans différents domaines.&lt;br /&gt;
&lt;br /&gt;
Comme outils, nous utilisions donc git et gitlab pour la gestion de code et google drive pour le partage de documents.&lt;br /&gt;
&lt;br /&gt;
Nous avons préferés travailler un maximum en présentiel, d'un accord commun.&lt;br /&gt;
&lt;br /&gt;
== Semestre 6 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/22''' &lt;br /&gt;
&lt;br /&gt;
Séance de découverte du sujet de notre projet.&lt;br /&gt;
&lt;br /&gt;
Recherche de l'existant &lt;br /&gt;
&lt;br /&gt;
Réalisation de recherches sur leurs différentes utilisations.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/22''' &lt;br /&gt;
&lt;br /&gt;
Début de création du diagramme de Gantt .&lt;br /&gt;
&lt;br /&gt;
Réalisation d'une étude du besoin.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du marché : Recherche des robots similaires.&lt;br /&gt;
&lt;br /&gt;
Commencer à prendre en main le robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 22/03/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de l'étude de marché.&lt;br /&gt;
&lt;br /&gt;
Etude des opportunités.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 29/03/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'étude du marché.&lt;br /&gt;
&lt;br /&gt;
Commencer à rédiger le cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 05/04/22''' &lt;br /&gt;
&lt;br /&gt;
Commencer la rédaction du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 26/04/22''' &lt;br /&gt;
&lt;br /&gt;
Bilan du semestre.&lt;br /&gt;
&lt;br /&gt;
Etude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Etude des risques.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 03/05/22''' &lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude des risques.&lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Finalisation du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
== Semestre 7 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 10/10/22'''&lt;br /&gt;
&lt;br /&gt;
Commencement de l'étude technique des encodeurs . &lt;br /&gt;
Recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du changement de la carte arduino pour ajouter des nouvelles fonctionnalités : connexion Wifi, fréquence microprocesseur plus élevé,..&lt;br /&gt;
Test des encodeurs moteur DC : validé .&lt;br /&gt;
Poursuite de recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude de génération des signaux PWM&lt;br /&gt;
&lt;br /&gt;
Test sur Matlab Simulink des boucles d'asservissement issues des robots similaires .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/11/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation des signaux PWM du robot.&lt;br /&gt;
&lt;br /&gt;
Calcul de la fonction de transfert issue de la boucle.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/11/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du fonctionnement du gyroscope et des autres composants pour programmer le robot .  &lt;br /&gt;
&lt;br /&gt;
Séparation du travail a effectuer pour le robot entre une boucle du moteur DC(niveau 1) et une boucle du niveau supérieur(niveau 2) pour asservir l'angle d'inclinaison du robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/11/22''' &lt;br /&gt;
&lt;br /&gt;
Modification et amélioration du diagramme de Gantt pour le S7 et le S8.&lt;br /&gt;
&lt;br /&gt;
Avancée de la modélisation de la boucle du niveau 1 .&lt;br /&gt;
&lt;br /&gt;
Diagramme de Gantt S7-S8&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/11/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation de la boucle du niveau inférieur sur Matlab/Simulink et récupération des résultats sur le scope .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/12/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie informatique et avancement de la partie automatique .&lt;br /&gt;
Programmation de la liaison série pour débugger les sorties de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/12/22''' &lt;br /&gt;
&lt;br /&gt;
Début de rédaction du rapport pour le S7&lt;br /&gt;
&lt;br /&gt;
== Semestre 8 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/01/23''' &lt;br /&gt;
&lt;br /&gt;
Recherches pour le gyroscope . &lt;br /&gt;
Test des encodeurs .&lt;br /&gt;
Communication sur les attentes du semestre s8 ,les fautes à éviter pour rebondir par rapport au retard S7 &lt;br /&gt;
Mise à niveau pour comprendre les aspects techniques de la partie informatique pour pouvoir travailler ensemble sur les résultats du S8 .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/01/23''' &lt;br /&gt;
&lt;br /&gt;
- Suppression des structures de données pour avancer plus rapidement sur les résultats du semestre s8 .&lt;br /&gt;
&lt;br /&gt;
- Recherches pour la programmation des interruptions PCINT . &lt;br /&gt;
&lt;br /&gt;
- Recherche sur la doc technique pour faire l'initialisation des interruptions externes . &lt;br /&gt;
&lt;br /&gt;
- Recherche de la modélisation en 3D de notre robot pour trouver les paramètres PID de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/02/23''' &lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons :&lt;br /&gt;
&lt;br /&gt;
Modification du code des encodeurs et test sur les moteurs DC . &lt;br /&gt;
&lt;br /&gt;
Poursuite de recherche de l'existant pour trouver le code du gyroscope .&lt;br /&gt;
&lt;br /&gt;
Mise à jour du git .&lt;br /&gt;
&lt;br /&gt;
Début du calcul des matrices d'inertie de chaque solide.&lt;br /&gt;
&lt;br /&gt;
Recherche du code des régulateurs.&lt;br /&gt;
&lt;br /&gt;
Avancement sur la gestion de projet .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/02/23'''&lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons essayé de récupérer les résultats des tests électronique de l'oscilloscope effectués dans les salles d'électronique .&lt;br /&gt;
&lt;br /&gt;
Le code des encodeurs marchent ,la liaison série affiche exactement la vitesse de la consigne :les Régulateurs implémentés correspondent bien à notre applications.&lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation de la partie informatique du gyroscope : Objectif : récupération de l'angle d'inclinaison sur la liaison série avec la meilleure précision possible .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/02/23''' &lt;br /&gt;
&lt;br /&gt;
Fin du calcul des matrices d'inertie . &lt;br /&gt;
&lt;br /&gt;
Paramétrage de notre robot pour avoir la visibilité sur les configurations possibles d'avoir(en virage, ligne droite),en précisant les angles d'inclinaison et es repères associés . &lt;br /&gt;
&lt;br /&gt;
Poursuite de programmation des régulateurs par niveaux en utilisant le code précédemment implémenté pour les encodeurs .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/23''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation du modèle en 3D de notre robot pour essayer de l'autoéquilibrer en utilisant les PIDS issues de l'autotune par rapport à nos préférences(stabilité,temps de réponse,dépassement,précision). &lt;br /&gt;
&lt;br /&gt;
Nous avons testé le robot en l'alimentant par le biai la liaison USB ! et enregistrement des résultats .  &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie automatique en trouvant toutes les équations nécessaires à notre modèle .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/23''' &lt;br /&gt;
&lt;br /&gt;
Réalisations de cette séance :&lt;br /&gt;
&lt;br /&gt;
Test du robot pour se stabiliser sur le sol en applicant plusieurs . &lt;br /&gt;
&lt;br /&gt;
Faire tous les calculs des dimensions géométriques de notre robot et test de la boucle d'asservissement avec les deux niveaux sur Matlab Simulink avec nos préférences de stabilité, temps de réponse,précision,dépassement .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/23''' &lt;br /&gt;
&lt;br /&gt;
Absence justifiée .&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91446</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91446"/>
				<updated>2023-05-09T21:04:41Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : /* Gestion de projet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Résumé'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
[[Fichier: SegwayRobot.jpg|200px|right|thumb|Exemple de robot similaire au notre]]&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
L'intégralité de notre programme est disponible sur le dépôt git à l'adresse: https://gitlab.com/remi_farault/self-balanced-robot&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Présentation générale'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==🌏Contexte==&lt;br /&gt;
Les moyens de transport actuels reposent principalement sur le principe du robot à deux roues, c'est la raison pour laquelle l'étude de celui ci s'avère importante, en effet l'étude   &lt;br /&gt;
de sa conception et son contrôle va nous permettre de développer des outils innovants qui pourraient potentiellement intéresser des sociétés de transport .&lt;br /&gt;
&lt;br /&gt;
==🎯Objectif==&lt;br /&gt;
&lt;br /&gt;
Notre objectif principal est de commander le robot, de là interviennent d'autres objectifs tel que la stabilité ,développer un code robuste qui assure cette fonctionnalité et aussi le contrôler pour réaliser des fonctionnalités de déplacement et d'éviter des obstacles . Des objectifs secondaires sont de créer un site web à travers lequel nous allons mener toutes les opérations de contrôle .&lt;br /&gt;
&lt;br /&gt;
==🔍Expression du besoin==&lt;br /&gt;
&lt;br /&gt;
Un robot autoéquilibré à deux roues est un type de robot qui peut se maintenir en équilibre sur deux roues sans tomber. Pour réaliser cette fonctionnalité, le robot utilise un ensemble de capteurs, d'algorithmes de contrôle et de moteurs pour ajuster sa position en temps réel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Self_balanc_bt.png|400px|Bete a corne SBR]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le diagramme interacteurs permet en fait de visualiser les fonctions services assurées par le système &lt;br /&gt;
&lt;br /&gt;
[[Fichier:341702419_560921119358434_1016673599353874396_n_(1).png|400px|DGI SBR]]    [[Fichier:Btacorne.png |500px|DGI SBR|right]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Réalisations et Résultats'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
[[Fichier: seg.jpg|200px|left|thumb|Exemple de commande désirée]]&lt;br /&gt;
&lt;br /&gt;
Après mis en place notre stratégie de gestion de projet en s6 à travers le diagramme de GANTT et le cahier de charges fonctionnels, nous nous sommes focalisés sur l'étude technique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: progg.png|300px|right|thumb|Organisation de notre programme]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, étudier à travers des outils automatiques la stabilité du robot en faisant appel à des modèles théoriques et pratiques et commencer par un raisonnement par niveaux, d'abord le niveau 1 du moteur à courant continu et les équations correspondantes puis le niveau 2 assurant la stabilité du robot directement, on avait la possibilité de passer directement au niveau 2 à travers le modèle du pendule inversé et les équations qui en découlent sauf que celui-ci ne nous permettra pas de revenir au niveau 1 et asservir le moteur à travers les codeurs incrémentales ,la deuxième partie consistait à réaliser les codes informatiques en s'appuyant sur les structures de données en C vues l'année dernière et conduire un même raisonnement(par niveaux) s'appuyant d'abord sur les codes sources correspondants à la génération d'un signal PWM pour les deux moteurs avec un rapport cyclique modifiable, et aussi les codes sources correspondants à la gestion des moteurs, en effet, ceux-ci tournent  dans un sens ou dans un autre ou ne tournent pas en fonction de la variable in1 et in2  pour faire tourner les moteurs .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Avr.png|100px|left|thumb|Compilateur utilisé]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cependant, nous avons rencontré quelques problèmes en automatique notamment pour trouver des valeurs des constantes théoriques pour les références du moteur entre les mains, ce qui nous a obligé à prendre des valeurs issues d'autres applications, nous avons rencontré aussi quelques problèmes choisir une modélisation parmi celles qui sont disponibles sur Internet .&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Etude Automatique'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Avant de programmer notre système sur la carte Arduino, nous avons également créé une simulation complète de notre système robotisé sur SIMULINK. Cependant, avant cela, nous avons dû déterminer les équations qui régissent notre système en trouvant les matrices d'inertie de chaque composant de notre robot, à savoir la masse transportée par le robot (M), le châssis constitué de deux plateaux et de la motorisation (les piliers et leur inertie ont été négligés car leur masse est très faible), ainsi que les roues (roue droite et roue gauche). Vous trouverez ci-dessous les matrices d'inertie que nous avons obtenues pour chaque composant.&lt;br /&gt;
&lt;br /&gt;
'''Masse M :'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatM.png|200px|thumb|left|Matrice de la masse M]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients seront notés dans la suite pour simplifier : AM,BM,CM &lt;br /&gt;
&lt;br /&gt;
'''Chassis:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatB.png|800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AH,BH,CH &lt;br /&gt;
&lt;br /&gt;
'''Roue gauche:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrg.png |600px|Matrice de RG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
'''Roue droite:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrd.png |600px|Matrice RD]]&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
Ci-dessous un paramétrage de notre système : Chaque angle détermine un repère&lt;br /&gt;
&lt;br /&gt;
Le repère R0 est supposé galliléen.&lt;br /&gt;
&lt;br /&gt;
Le repère R1 est en rotation  ,appelé angle de virage par rapport à R0.&lt;br /&gt;
&lt;br /&gt;
Le repère R2 est en rotation  ,appelé angle d’inclinaison du châssis par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R3 est en rotation  ,appelé angle d’inclinaison arrière-avant de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R4 est en rotation ,appelé angle d’inclinaison droite-gauche de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:param.png |800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
l’angle de consigne est de 0deg,nous employons un PID pour corriger l’angle de mesure,à sa sortie,on aura une tension W(p).Les blocs Km et W(p) assurent le passage tension-&amp;gt;couple-&amp;gt;angle ,il faut ensuite retirer  pour ne garder que l’angle d’inclinaison du châssis  .Km=0.0125N.m.V-1(d’après la datasheet du moteur)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bcle.png |800px|Asservissement]]                                                             [[Fichier:Matuu.png|right|800px|Asservissement]]      &lt;br /&gt;
&lt;br /&gt;
Les équations obtenues sont les suivantes (Le détail des calculs a été précisé dans le Rapport): &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eq nnlin.png |500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après linéarisation : Considérer l'approximations des petits angles pour le sinus et cosinus,et négliger aussi la vitesse angulaire quadratique devant la vitesse angulaire,nous obtenons : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eqlin.png |300px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crbe.png|600px|Courbe]]&lt;br /&gt;
&lt;br /&gt;
On obtient une courbe avec un bon temps de réponse, un léger dépassement et une stabilité .Le système est régulé de manière efficace, capable de répondre rapidement et précisément aux perturbations tout en maintenant une position d'équilibre stable.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mat3d.png|500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Environnement de developpement'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Notre microcontrolleur étant une Arduino Uno, nous aurions pu utiliser le framework ''Arduino'' donnant accès à un IDE intégrant les outils pour compiler et flasher le code, ainsi qu'une multitude de bibliothèques haut niveaux très simples d'utilisation et plutôt performantes, permettant de programmer notre robot en simplement quelques dizaines de lignes de code.&lt;br /&gt;
&lt;br /&gt;
Cependant, l'Arduino est simplement une carte de prototypage intégrant un microcontrôleur ''AVR Atmega 328p''. &lt;br /&gt;
Les microcontroleurs AVR disposent d'une grande communauté, et il existe de nombreux outils nécessaires au developpement sur ces cartes.&lt;br /&gt;
Afin d'avoir un meilleur contrôle sur notre projet, et surtout d'en tirer un maximum de compétences, nous avons donc décidés de programmer notre robot directement en C en utilisant les outils AVR:&lt;br /&gt;
&lt;br /&gt;
- '''avr-gcc''': compilateur open-source portant toutes les fonctionnalités du langage C standard sur les microcontroleurs AVR.&lt;br /&gt;
Seul, son utilisation est quasiment impossible et demande trop de travail en programmation bas-niveau.&lt;br /&gt;
&lt;br /&gt;
- '''avr-libc''': implémentation basé sur le compilateur avr-gcc de la bibliothèque standard du langage C.&lt;br /&gt;
Cette bibliothèque permet donc d'utiliser les fonctions et structures standards du C (IO, maths, chaines de caractères), mais elle intègre également un mapping mémoire de tous les registres de l'atmega, ainsi qu'un mécanisme pour programmer des interruptions.&lt;br /&gt;
&lt;br /&gt;
- '''avr-objcopy''': ce programme en ligne de commande formate le binaire obtenu en format utilisable par les AVR&lt;br /&gt;
&lt;br /&gt;
- '''avr-dude''': ce programme en ligne de commande permet de flasher via une interface USB-série un microcontroleur AVR présent sur une carte Arduino.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc developpé un '''Makefile''' utilisant tous ces outils, constituant un environnement de developpement très efficace pour notre projet. Ce Makefile est disponible sur notre gitlab.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Programme du robot'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''PWM'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
La première étape consistait à commander nos moteurs DC, afin de poser les bases de notre&lt;br /&gt;
asservissement bas niveau. Ces moteurs sont contrôlés par le driver de moteurs, utilisant des signaux logiques pour définir l’état d’un moteur et des signaux '''PWM''' pour définir la vitesse de&lt;br /&gt;
rotation. La génération de signaux PWM sur AVR se fait en utilisant les '''timers''' en mode PWM.&lt;br /&gt;
Tout simplement, nous avons un registre compteur 16 bits incrémenté périodiquement, et une valeur&lt;br /&gt;
maximale définie par le registre ''ICRx''. Nous utilisons ensuite les registres ''OCRnx'' contenant une&lt;br /&gt;
valeur inférieure au maximum. &lt;br /&gt;
Lorsque le compteur atteint la valeur contenue dans OCRnx, il&lt;br /&gt;
inverse la valeur logique de sortie du pin ''OCnx''. Ainsi, nous pouvons modifier instantanément la&lt;br /&gt;
valeur d’OCRnx afin de modifier le rapport cyclique de notre signal. Ce rapport cyclique est ensuite&lt;br /&gt;
directement proportionnel à la vitesse de rotation du moteur associé. &lt;br /&gt;
La fréquence du signal est définie par la période d’incrémentation du compteur et par la valeur maximale ICRx.&lt;br /&gt;
Pour notre composant, nous pouvions utiliser une fréquence allant jusqu’à plusieurs kHz. Cette&lt;br /&gt;
fréquence n’a aucun impact sur la rotation du moteur. Nous avons donc choisis 20 kHz.&lt;br /&gt;
Nous avons définis la '''init_pwm''' pour configurer les registres nécessaires, et la fonction&lt;br /&gt;
'''generate_pwm''' pour modifier le rapport cyclique de nos deux signaux PWM avec la valeur&lt;br /&gt;
souhaitée.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Encodeurs'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Une fois nos moteurs pouvant tourner à une vitesse voulue, nous avons du trouver un moyen de&lt;br /&gt;
mesurer leurs vitesses effectives afin de réaliser une boucle d’asservissement. Pour cela, nous avons&lt;br /&gt;
utilisés les encodeurs optiques disponibles sur nos moteurs DC. &lt;br /&gt;
Ces encodeurs envoient sur leur broches un front-montant à chaque tour de la roue codeuse reliée au moteurs (ayant une vitesse&lt;br /&gt;
proportionnelle à celle du moteur). En détectant ces fronts montant, nous pouvons donc compter le&lt;br /&gt;
nombre de tours du moteur pendant un intervalle de temps défini, puis déterminer la vitesse réelle&lt;br /&gt;
du moteur.&lt;br /&gt;
Pour détecter les fronts montant, nous utilisons l’interface '''Pin Change Interrupt''' de l’Atmega. Cette&lt;br /&gt;
interface exécute une interruption logicielle à chaque changement d’état logique du pin associé.&lt;br /&gt;
Dans notre cas, nous devons ensuite observé l’état précédent de la sortie et l’état actuel pour&lt;br /&gt;
déterminer si on est bien en présence d’un front montant. Une fois le front montant détecté, cette&lt;br /&gt;
interruption incrémente ensuite le compteur de tours.&lt;br /&gt;
Ce compteur est ensuite utilisé pour calculer la vitesse de rotation puis remis à zéro pour la mesure&lt;br /&gt;
suivante.&lt;br /&gt;
Dans notre cas, nous réalisons cette mesure à une fréquence d’environ 244 Hz, dans une autre&lt;br /&gt;
fonction d’interruption qu’on détaillera plus loin.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Angle'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Notre boucle de régulation principale a besoin d’une mesure de l’angle d’inclinaison du robot sur&lt;br /&gt;
son axe vertical perpendiculaire à celui de déplacement. Cette mesure s’effectue via le '''MPU6050'''.&lt;br /&gt;
Ce composant fonctionne via le protocole '''i2c''', protocole de communication simple utilisé par la&lt;br /&gt;
plupart des systèmes électroniques. Ce protocole étant bas niveau, il existe de nombreuses&lt;br /&gt;
bibliothèques implémentés en C permettant son utilisation. De plus, le MPU6050 est un composant&lt;br /&gt;
très complet et complexe, afin d’en récupérer l’angle, il faut d’abord amorcer une communication&lt;br /&gt;
i2c puis configurer certains des ses registres, afin ensuite de pouvoir lire les registres contenant la&lt;br /&gt;
mesure de l’angle selon l’axe désiré. Afin de conserver un code efficace et concis, nous avons&lt;br /&gt;
également décidés d’utiliser une bibliothèque faisant office de « '''driver''' » pour ce composant,&lt;br /&gt;
intégrant des fonctions d’initialisation et de lecture des mesures faites par ce gyroscope.&lt;br /&gt;
Nous obtenons donc la valeur de l’angle en degrés, comprise entre 0 et 360.Dans notre cas, nous souhaitions obtenir une valeur comprise entre -180 et 180, car seule la valeur&lt;br /&gt;
absolue et le sens de l’inclinaison nous intéresse, nous avons donc appliqués une correction de cette&lt;br /&gt;
valeur.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Interruption principale'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Lors de implémentation d’un asservissement automatique via un microcontrôleur, la puissance de&lt;br /&gt;
calcul finie impose que les commandes des actionneurs et les mesures des capteurs doivent être&lt;br /&gt;
réalisées périodiquement. Pour cela, nous pouvons utiliser une '''routine d’interruption''' qui s’exécute à&lt;br /&gt;
chaque ''overflow'' d’un compteur, via l’interface des '''timers''' de l’atmega. Dans notre cas, cette&lt;br /&gt;
interruption correspond à la fonction principale de notre programme. Nous avons réglés sa&lt;br /&gt;
fréquence à 244Hz, en divisant le fréquence de base de 16MHz avec un '''prescaler''' de 256 (plus une&lt;br /&gt;
deuxième division par 256 du à la taille du registre timer de 8 bits).&lt;br /&gt;
Cette interruption vient d’abord remettre a zéro les compteurs des encodeurs et récupérer la vitesse&lt;br /&gt;
des deux moteurs.&lt;br /&gt;
Ensuite, elle effectue les calculs nécessaires à la régulation de l’angle, mais également de la vitesse&lt;br /&gt;
linéaire et de la rotation du robot.&lt;br /&gt;
Chaque paramètre à réguler est corrigé par un régulateur PID de coefficients différents via la&lt;br /&gt;
fonction '''pid()'''.&lt;br /&gt;
Enfin, nous obtenons une commande à envoyer aux moteurs, qui actionnent notre robot de la&lt;br /&gt;
manière souhaitée.&lt;br /&gt;
Le code de notre système est disponible sur nôtre dépôt gitlab également.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Bilan'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 6 :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 7 :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 8 :'''&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Gestion de projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Durant ces trois semestres, la gestion de projet est un des domaines où nous avons le plus de difficultés, mais également un de ceux dans lequel nous avons le plus appris. &lt;br /&gt;
&lt;br /&gt;
Diagramme de Gantt previsionnel réalisé au S6&lt;br /&gt;
[[Fichier:Gt.png|400px|thumb|left|texte descriptif]]&lt;br /&gt;
&lt;br /&gt;
D'abord trois, nous nous sommes retrouvés à deux dès le deuxième semestre, et nous avons donc du modifier l'organisation prévue pour la suite.&lt;br /&gt;
En travaillant à deux, nous avons du trouvé un moyen d'avancer efficacement.&lt;br /&gt;
L'un de nous étant en filière SA (Systemes Autonomes) et l'autre en filière SC (Systemes Communicants), la répartition des taches informatiques et automatiques était donc simplifiée.&lt;br /&gt;
&lt;br /&gt;
Cependant, nous avons donc du réussir à expliquer et à mettre en relation chacune de nos parties, en s'améliorant sur la partie communication.&lt;br /&gt;
Pour cela, au début de chaque séance, nous commencions par faire le point sur l'avancement globale et propre à chacun.&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous nous répartitions les taches communes aux différentes parties.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous échangions sur les taches respectives à nos deux parties afin de pouvoir les faire coincider le moment venu, et il est arrivé plusieurs fois que l'on s'aide réciproquement chacun sur la partie de l'autre.&lt;br /&gt;
&lt;br /&gt;
Globalement, cela a été positif car nous avons pu tous les deux sortir de notre zone de confort et apprendre beaucoup dans différents domaines.&lt;br /&gt;
&lt;br /&gt;
Comme outils, nous utilisions donc git et gitlab pour la gestion de code et google drive pour le partage de documents.&lt;br /&gt;
&lt;br /&gt;
Nous avons préferés travailler un maximum en présentiel, d'un accord commun.&lt;br /&gt;
&lt;br /&gt;
== Semestre 6 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/22''' &lt;br /&gt;
&lt;br /&gt;
Séance de découverte du sujet de notre projet.&lt;br /&gt;
&lt;br /&gt;
Recherche de l'existant &lt;br /&gt;
&lt;br /&gt;
Réalisation de recherches sur leurs différentes utilisations.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/22''' &lt;br /&gt;
&lt;br /&gt;
Début de création du diagramme de Gantt .&lt;br /&gt;
&lt;br /&gt;
Réalisation d'une étude du besoin.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du marché : Recherche des robots similaires.&lt;br /&gt;
&lt;br /&gt;
Commencer à prendre en main le robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 22/03/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de l'étude de marché.&lt;br /&gt;
&lt;br /&gt;
Etude des opportunités.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 29/03/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'étude du marché.&lt;br /&gt;
&lt;br /&gt;
Commencer à rédiger le cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 05/04/22''' &lt;br /&gt;
&lt;br /&gt;
Commencer la rédaction du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 26/04/22''' &lt;br /&gt;
&lt;br /&gt;
Bilan du semestre.&lt;br /&gt;
&lt;br /&gt;
Etude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Etude des risques.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 03/05/22''' &lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude des risques.&lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Finalisation du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
== Semestre 7 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 10/10/22'''&lt;br /&gt;
&lt;br /&gt;
Commencement de l'étude technique des encodeurs . &lt;br /&gt;
Recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du changement de la carte arduino pour ajouter des nouvelles fonctionnalités : connexion Wifi, fréquence microprocesseur plus élevé,..&lt;br /&gt;
Test des encodeurs moteur DC : validé .&lt;br /&gt;
Poursuite de recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude de génération des signaux PWM&lt;br /&gt;
&lt;br /&gt;
Test sur Matlab Simulink des boucles d'asservissement issues des robots similaires .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/11/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation des signaux PWM du robot.&lt;br /&gt;
&lt;br /&gt;
Calcul de la fonction de transfert issue de la boucle.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/11/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du fonctionnement du gyroscope et des autres composants pour programmer le robot .  &lt;br /&gt;
&lt;br /&gt;
Séparation du travail a effectuer pour le robot entre une boucle du moteur DC(niveau 1) et une boucle du niveau supérieur(niveau 2) pour asservir l'angle d'inclinaison du robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/11/22''' &lt;br /&gt;
&lt;br /&gt;
Modification et amélioration du diagramme de Gantt pour le S7 et le S8.&lt;br /&gt;
&lt;br /&gt;
Avancée de la modélisation de la boucle du niveau 1 .&lt;br /&gt;
&lt;br /&gt;
Diagramme de Gantt S7-S8&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/11/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation de la boucle du niveau inférieur sur Matlab/Simulink et récupération des résultats sur le scope .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/12/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie informatique et avancement de la partie automatique .&lt;br /&gt;
Programmation de la liaison série pour débugger les sorties de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/12/22''' &lt;br /&gt;
&lt;br /&gt;
Début de rédaction du rapport pour le S7&lt;br /&gt;
&lt;br /&gt;
== Semestre 8 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/01/23''' &lt;br /&gt;
&lt;br /&gt;
Recherches pour le gyroscope . &lt;br /&gt;
Test des encodeurs .&lt;br /&gt;
Communication sur les attentes du semestre s8 ,les fautes à éviter pour rebondir par rapport au retard S7 &lt;br /&gt;
Mise à niveau pour comprendre les aspects techniques de la partie informatique pour pouvoir travailler ensemble sur les résultats du S8 .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/01/23''' &lt;br /&gt;
&lt;br /&gt;
- Suppression des structures de données pour avancer plus rapidement sur les résultats du semestre s8 .&lt;br /&gt;
&lt;br /&gt;
- Recherches pour la programmation des interruptions PCINT . &lt;br /&gt;
&lt;br /&gt;
- Recherche sur la doc technique pour faire l'initialisation des interruptions externes . &lt;br /&gt;
&lt;br /&gt;
- Recherche de la modélisation en 3D de notre robot pour trouver les paramètres PID de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/02/23''' &lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons :&lt;br /&gt;
&lt;br /&gt;
Modification du code des encodeurs et test sur les moteurs DC . &lt;br /&gt;
&lt;br /&gt;
Poursuite de recherche de l'existant pour trouver le code du gyroscope .&lt;br /&gt;
&lt;br /&gt;
Mise à jour du git .&lt;br /&gt;
&lt;br /&gt;
Début du calcul des matrices d'inertie de chaque solide.&lt;br /&gt;
&lt;br /&gt;
Recherche du code des régulateurs.&lt;br /&gt;
&lt;br /&gt;
Avancement sur la gestion de projet .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/02/23'''&lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons essayé de récupérer les résultats des tests électronique de l'oscilloscope effectués dans les salles d'électronique .&lt;br /&gt;
&lt;br /&gt;
Le code des encodeurs marchent ,la liaison série affiche exactement la vitesse de la consigne :les Régulateurs implémentés correspondent bien à notre applications.&lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation de la partie informatique du gyroscope : Objectif : récupération de l'angle d'inclinaison sur la liaison série avec la meilleure précision possible .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/02/23''' &lt;br /&gt;
&lt;br /&gt;
Fin du calcul des matrices d'inertie . &lt;br /&gt;
&lt;br /&gt;
Paramétrage de notre robot pour avoir la visibilité sur les configurations possibles d'avoir(en virage, ligne droite),en précisant les angles d'inclinaison et es repères associés . &lt;br /&gt;
&lt;br /&gt;
Poursuite de programmation des régulateurs par niveaux en utilisant le code précédemment implémenté pour les encodeurs .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/23''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation du modèle en 3D de notre robot pour essayer de l'autoéquilibrer en utilisant les PIDS issues de l'autotune par rapport à nos préférences(stabilité,temps de réponse,dépassement,précision). &lt;br /&gt;
&lt;br /&gt;
Nous avons testé le robot en l'alimentant par le biai la liaison USB ! et enregistrement des résultats .  &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie automatique en trouvant toutes les équations nécessaires à notre modèle .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/23''' &lt;br /&gt;
&lt;br /&gt;
Réalisations de cette séance :&lt;br /&gt;
&lt;br /&gt;
Test du robot pour se stabiliser sur le sol en applicant plusieurs . &lt;br /&gt;
&lt;br /&gt;
Faire tous les calculs des dimensions géométriques de notre robot et test de la boucle d'asservissement avec les deux niveaux sur Matlab Simulink avec nos préférences de stabilité, temps de réponse,précision,dépassement .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/23''' &lt;br /&gt;
&lt;br /&gt;
Absence justifiée .&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91445</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91445"/>
				<updated>2023-05-09T21:04:02Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : /* Gestion de projet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Résumé'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
[[Fichier: SegwayRobot.jpg|200px|right|thumb|Exemple de robot similaire au notre]]&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
L'intégralité de notre programme est disponible sur le dépôt git à l'adresse: https://gitlab.com/remi_farault/self-balanced-robot&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Présentation générale'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==🌏Contexte==&lt;br /&gt;
Les moyens de transport actuels reposent principalement sur le principe du robot à deux roues, c'est la raison pour laquelle l'étude de celui ci s'avère importante, en effet l'étude   &lt;br /&gt;
de sa conception et son contrôle va nous permettre de développer des outils innovants qui pourraient potentiellement intéresser des sociétés de transport .&lt;br /&gt;
&lt;br /&gt;
==🎯Objectif==&lt;br /&gt;
&lt;br /&gt;
Notre objectif principal est de commander le robot, de là interviennent d'autres objectifs tel que la stabilité ,développer un code robuste qui assure cette fonctionnalité et aussi le contrôler pour réaliser des fonctionnalités de déplacement et d'éviter des obstacles . Des objectifs secondaires sont de créer un site web à travers lequel nous allons mener toutes les opérations de contrôle .&lt;br /&gt;
&lt;br /&gt;
==🔍Expression du besoin==&lt;br /&gt;
&lt;br /&gt;
Un robot autoéquilibré à deux roues est un type de robot qui peut se maintenir en équilibre sur deux roues sans tomber. Pour réaliser cette fonctionnalité, le robot utilise un ensemble de capteurs, d'algorithmes de contrôle et de moteurs pour ajuster sa position en temps réel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Self_balanc_bt.png|400px|Bete a corne SBR]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le diagramme interacteurs permet en fait de visualiser les fonctions services assurées par le système &lt;br /&gt;
&lt;br /&gt;
[[Fichier:341702419_560921119358434_1016673599353874396_n_(1).png|400px|DGI SBR]]    [[Fichier:Btacorne.png |500px|DGI SBR|right]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Réalisations et Résultats'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
[[Fichier: seg.jpg|200px|left|thumb|Exemple de commande désirée]]&lt;br /&gt;
&lt;br /&gt;
Après mis en place notre stratégie de gestion de projet en s6 à travers le diagramme de GANTT et le cahier de charges fonctionnels, nous nous sommes focalisés sur l'étude technique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: progg.png|300px|right|thumb|Organisation de notre programme]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, étudier à travers des outils automatiques la stabilité du robot en faisant appel à des modèles théoriques et pratiques et commencer par un raisonnement par niveaux, d'abord le niveau 1 du moteur à courant continu et les équations correspondantes puis le niveau 2 assurant la stabilité du robot directement, on avait la possibilité de passer directement au niveau 2 à travers le modèle du pendule inversé et les équations qui en découlent sauf que celui-ci ne nous permettra pas de revenir au niveau 1 et asservir le moteur à travers les codeurs incrémentales ,la deuxième partie consistait à réaliser les codes informatiques en s'appuyant sur les structures de données en C vues l'année dernière et conduire un même raisonnement(par niveaux) s'appuyant d'abord sur les codes sources correspondants à la génération d'un signal PWM pour les deux moteurs avec un rapport cyclique modifiable, et aussi les codes sources correspondants à la gestion des moteurs, en effet, ceux-ci tournent  dans un sens ou dans un autre ou ne tournent pas en fonction de la variable in1 et in2  pour faire tourner les moteurs .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Avr.png|100px|left|thumb|Compilateur utilisé]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cependant, nous avons rencontré quelques problèmes en automatique notamment pour trouver des valeurs des constantes théoriques pour les références du moteur entre les mains, ce qui nous a obligé à prendre des valeurs issues d'autres applications, nous avons rencontré aussi quelques problèmes choisir une modélisation parmi celles qui sont disponibles sur Internet .&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Etude Automatique'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Avant de programmer notre système sur la carte Arduino, nous avons également créé une simulation complète de notre système robotisé sur SIMULINK. Cependant, avant cela, nous avons dû déterminer les équations qui régissent notre système en trouvant les matrices d'inertie de chaque composant de notre robot, à savoir la masse transportée par le robot (M), le châssis constitué de deux plateaux et de la motorisation (les piliers et leur inertie ont été négligés car leur masse est très faible), ainsi que les roues (roue droite et roue gauche). Vous trouverez ci-dessous les matrices d'inertie que nous avons obtenues pour chaque composant.&lt;br /&gt;
&lt;br /&gt;
'''Masse M :'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatM.png|200px|thumb|left|Matrice de la masse M]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients seront notés dans la suite pour simplifier : AM,BM,CM &lt;br /&gt;
&lt;br /&gt;
'''Chassis:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatB.png|800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AH,BH,CH &lt;br /&gt;
&lt;br /&gt;
'''Roue gauche:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrg.png |600px|Matrice de RG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
'''Roue droite:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrd.png |600px|Matrice RD]]&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
Ci-dessous un paramétrage de notre système : Chaque angle détermine un repère&lt;br /&gt;
&lt;br /&gt;
Le repère R0 est supposé galliléen.&lt;br /&gt;
&lt;br /&gt;
Le repère R1 est en rotation  ,appelé angle de virage par rapport à R0.&lt;br /&gt;
&lt;br /&gt;
Le repère R2 est en rotation  ,appelé angle d’inclinaison du châssis par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R3 est en rotation  ,appelé angle d’inclinaison arrière-avant de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R4 est en rotation ,appelé angle d’inclinaison droite-gauche de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:param.png |800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
l’angle de consigne est de 0deg,nous employons un PID pour corriger l’angle de mesure,à sa sortie,on aura une tension W(p).Les blocs Km et W(p) assurent le passage tension-&amp;gt;couple-&amp;gt;angle ,il faut ensuite retirer  pour ne garder que l’angle d’inclinaison du châssis  .Km=0.0125N.m.V-1(d’après la datasheet du moteur)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bcle.png |800px|Asservissement]]                                                             [[Fichier:Matuu.png|right|800px|Asservissement]]      &lt;br /&gt;
&lt;br /&gt;
Les équations obtenues sont les suivantes (Le détail des calculs a été précisé dans le Rapport): &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eq nnlin.png |500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après linéarisation : Considérer l'approximations des petits angles pour le sinus et cosinus,et négliger aussi la vitesse angulaire quadratique devant la vitesse angulaire,nous obtenons : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eqlin.png |300px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crbe.png|600px|Courbe]]&lt;br /&gt;
&lt;br /&gt;
On obtient une courbe avec un bon temps de réponse, un léger dépassement et une stabilité .Le système est régulé de manière efficace, capable de répondre rapidement et précisément aux perturbations tout en maintenant une position d'équilibre stable.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mat3d.png|500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Environnement de developpement'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Notre microcontrolleur étant une Arduino Uno, nous aurions pu utiliser le framework ''Arduino'' donnant accès à un IDE intégrant les outils pour compiler et flasher le code, ainsi qu'une multitude de bibliothèques haut niveaux très simples d'utilisation et plutôt performantes, permettant de programmer notre robot en simplement quelques dizaines de lignes de code.&lt;br /&gt;
&lt;br /&gt;
Cependant, l'Arduino est simplement une carte de prototypage intégrant un microcontrôleur ''AVR Atmega 328p''. &lt;br /&gt;
Les microcontroleurs AVR disposent d'une grande communauté, et il existe de nombreux outils nécessaires au developpement sur ces cartes.&lt;br /&gt;
Afin d'avoir un meilleur contrôle sur notre projet, et surtout d'en tirer un maximum de compétences, nous avons donc décidés de programmer notre robot directement en C en utilisant les outils AVR:&lt;br /&gt;
&lt;br /&gt;
- '''avr-gcc''': compilateur open-source portant toutes les fonctionnalités du langage C standard sur les microcontroleurs AVR.&lt;br /&gt;
Seul, son utilisation est quasiment impossible et demande trop de travail en programmation bas-niveau.&lt;br /&gt;
&lt;br /&gt;
- '''avr-libc''': implémentation basé sur le compilateur avr-gcc de la bibliothèque standard du langage C.&lt;br /&gt;
Cette bibliothèque permet donc d'utiliser les fonctions et structures standards du C (IO, maths, chaines de caractères), mais elle intègre également un mapping mémoire de tous les registres de l'atmega, ainsi qu'un mécanisme pour programmer des interruptions.&lt;br /&gt;
&lt;br /&gt;
- '''avr-objcopy''': ce programme en ligne de commande formate le binaire obtenu en format utilisable par les AVR&lt;br /&gt;
&lt;br /&gt;
- '''avr-dude''': ce programme en ligne de commande permet de flasher via une interface USB-série un microcontroleur AVR présent sur une carte Arduino.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc developpé un '''Makefile''' utilisant tous ces outils, constituant un environnement de developpement très efficace pour notre projet. Ce Makefile est disponible sur notre gitlab.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Programme du robot'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''PWM'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
La première étape consistait à commander nos moteurs DC, afin de poser les bases de notre&lt;br /&gt;
asservissement bas niveau. Ces moteurs sont contrôlés par le driver de moteurs, utilisant des signaux logiques pour définir l’état d’un moteur et des signaux '''PWM''' pour définir la vitesse de&lt;br /&gt;
rotation. La génération de signaux PWM sur AVR se fait en utilisant les '''timers''' en mode PWM.&lt;br /&gt;
Tout simplement, nous avons un registre compteur 16 bits incrémenté périodiquement, et une valeur&lt;br /&gt;
maximale définie par le registre ''ICRx''. Nous utilisons ensuite les registres ''OCRnx'' contenant une&lt;br /&gt;
valeur inférieure au maximum. &lt;br /&gt;
Lorsque le compteur atteint la valeur contenue dans OCRnx, il&lt;br /&gt;
inverse la valeur logique de sortie du pin ''OCnx''. Ainsi, nous pouvons modifier instantanément la&lt;br /&gt;
valeur d’OCRnx afin de modifier le rapport cyclique de notre signal. Ce rapport cyclique est ensuite&lt;br /&gt;
directement proportionnel à la vitesse de rotation du moteur associé. &lt;br /&gt;
La fréquence du signal est définie par la période d’incrémentation du compteur et par la valeur maximale ICRx.&lt;br /&gt;
Pour notre composant, nous pouvions utiliser une fréquence allant jusqu’à plusieurs kHz. Cette&lt;br /&gt;
fréquence n’a aucun impact sur la rotation du moteur. Nous avons donc choisis 20 kHz.&lt;br /&gt;
Nous avons définis la '''init_pwm''' pour configurer les registres nécessaires, et la fonction&lt;br /&gt;
'''generate_pwm''' pour modifier le rapport cyclique de nos deux signaux PWM avec la valeur&lt;br /&gt;
souhaitée.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Encodeurs'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Une fois nos moteurs pouvant tourner à une vitesse voulue, nous avons du trouver un moyen de&lt;br /&gt;
mesurer leurs vitesses effectives afin de réaliser une boucle d’asservissement. Pour cela, nous avons&lt;br /&gt;
utilisés les encodeurs optiques disponibles sur nos moteurs DC. &lt;br /&gt;
Ces encodeurs envoient sur leur broches un front-montant à chaque tour de la roue codeuse reliée au moteurs (ayant une vitesse&lt;br /&gt;
proportionnelle à celle du moteur). En détectant ces fronts montant, nous pouvons donc compter le&lt;br /&gt;
nombre de tours du moteur pendant un intervalle de temps défini, puis déterminer la vitesse réelle&lt;br /&gt;
du moteur.&lt;br /&gt;
Pour détecter les fronts montant, nous utilisons l’interface '''Pin Change Interrupt''' de l’Atmega. Cette&lt;br /&gt;
interface exécute une interruption logicielle à chaque changement d’état logique du pin associé.&lt;br /&gt;
Dans notre cas, nous devons ensuite observé l’état précédent de la sortie et l’état actuel pour&lt;br /&gt;
déterminer si on est bien en présence d’un front montant. Une fois le front montant détecté, cette&lt;br /&gt;
interruption incrémente ensuite le compteur de tours.&lt;br /&gt;
Ce compteur est ensuite utilisé pour calculer la vitesse de rotation puis remis à zéro pour la mesure&lt;br /&gt;
suivante.&lt;br /&gt;
Dans notre cas, nous réalisons cette mesure à une fréquence d’environ 244 Hz, dans une autre&lt;br /&gt;
fonction d’interruption qu’on détaillera plus loin.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Angle'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Notre boucle de régulation principale a besoin d’une mesure de l’angle d’inclinaison du robot sur&lt;br /&gt;
son axe vertical perpendiculaire à celui de déplacement. Cette mesure s’effectue via le '''MPU6050'''.&lt;br /&gt;
Ce composant fonctionne via le protocole '''i2c''', protocole de communication simple utilisé par la&lt;br /&gt;
plupart des systèmes électroniques. Ce protocole étant bas niveau, il existe de nombreuses&lt;br /&gt;
bibliothèques implémentés en C permettant son utilisation. De plus, le MPU6050 est un composant&lt;br /&gt;
très complet et complexe, afin d’en récupérer l’angle, il faut d’abord amorcer une communication&lt;br /&gt;
i2c puis configurer certains des ses registres, afin ensuite de pouvoir lire les registres contenant la&lt;br /&gt;
mesure de l’angle selon l’axe désiré. Afin de conserver un code efficace et concis, nous avons&lt;br /&gt;
également décidés d’utiliser une bibliothèque faisant office de « '''driver''' » pour ce composant,&lt;br /&gt;
intégrant des fonctions d’initialisation et de lecture des mesures faites par ce gyroscope.&lt;br /&gt;
Nous obtenons donc la valeur de l’angle en degrés, comprise entre 0 et 360.Dans notre cas, nous souhaitions obtenir une valeur comprise entre -180 et 180, car seule la valeur&lt;br /&gt;
absolue et le sens de l’inclinaison nous intéresse, nous avons donc appliqués une correction de cette&lt;br /&gt;
valeur.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Interruption principale'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Lors de implémentation d’un asservissement automatique via un microcontrôleur, la puissance de&lt;br /&gt;
calcul finie impose que les commandes des actionneurs et les mesures des capteurs doivent être&lt;br /&gt;
réalisées périodiquement. Pour cela, nous pouvons utiliser une '''routine d’interruption''' qui s’exécute à&lt;br /&gt;
chaque ''overflow'' d’un compteur, via l’interface des '''timers''' de l’atmega. Dans notre cas, cette&lt;br /&gt;
interruption correspond à la fonction principale de notre programme. Nous avons réglés sa&lt;br /&gt;
fréquence à 244Hz, en divisant le fréquence de base de 16MHz avec un '''prescaler''' de 256 (plus une&lt;br /&gt;
deuxième division par 256 du à la taille du registre timer de 8 bits).&lt;br /&gt;
Cette interruption vient d’abord remettre a zéro les compteurs des encodeurs et récupérer la vitesse&lt;br /&gt;
des deux moteurs.&lt;br /&gt;
Ensuite, elle effectue les calculs nécessaires à la régulation de l’angle, mais également de la vitesse&lt;br /&gt;
linéaire et de la rotation du robot.&lt;br /&gt;
Chaque paramètre à réguler est corrigé par un régulateur PID de coefficients différents via la&lt;br /&gt;
fonction '''pid()'''.&lt;br /&gt;
Enfin, nous obtenons une commande à envoyer aux moteurs, qui actionnent notre robot de la&lt;br /&gt;
manière souhaitée.&lt;br /&gt;
Le code de notre système est disponible sur nôtre dépôt gitlab également.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Bilan'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 6 :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 7 :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 8 :'''&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Gestion de projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Durant ces trois semestres, la gestion de projet est un des domaines où nous avons le plus de difficultés, mais également un de ceux dans lequel nous avons le plus appris. &lt;br /&gt;
&lt;br /&gt;
Diagramme de Gantt previsionnel réalisé au S6&lt;br /&gt;
[[Fichier:Gt.png|400px|thumb|left|texte descriptif]]&lt;br /&gt;
&lt;br /&gt;
D'abord trois, nous nous sommes retrouvés à deux dès le deuxième semestre, et nous avons donc du modifier l'organisation prévue pour la suite.&lt;br /&gt;
Ensuite, en travaillant à deux, nous avons du trouvé un moyen d'avancer efficacement.&lt;br /&gt;
L'un de nous étant en filière SA (Systemes Autonomes) et l'autre en filière SC (Systemes Communicants), la répartition des taches informatiques et automatiques était donc simplifiée.&lt;br /&gt;
&lt;br /&gt;
Cependant, nous avons donc du réussir à expliquer et à mettre en relation chacune de nos parties, en s'améliorant sur la partie communication.&lt;br /&gt;
Pour cela, au début de chaque séance, nous commencions par faire le point sur l'avancement globale et propre à chacun.&lt;br /&gt;
Ensuite, nous nous répartitions les taches communes aux différentes parties.&lt;br /&gt;
Enfin, nous échangions sur les taches respectives à nos deux parties afin de pouvoir les faire coincider le moment venu, et il est arrivé plusieurs fois que l'on s'aide réciproquement chacun sur la partie de l'autre.&lt;br /&gt;
&lt;br /&gt;
Globalement, cela a été positif car nous avons pu tous les deux sortir de notre zone de confort et apprendre beaucoup dans différents domaines.&lt;br /&gt;
&lt;br /&gt;
Comme outils, nous utilisions donc git et gitlab pour la gestion de code et google drive pour le partage de documents.&lt;br /&gt;
&lt;br /&gt;
Nous avons préferés travailler un maximum en présentiel, d'un accord commun.&lt;br /&gt;
&lt;br /&gt;
== Semestre 6 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/22''' &lt;br /&gt;
&lt;br /&gt;
Séance de découverte du sujet de notre projet.&lt;br /&gt;
&lt;br /&gt;
Recherche de l'existant &lt;br /&gt;
&lt;br /&gt;
Réalisation de recherches sur leurs différentes utilisations.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/22''' &lt;br /&gt;
&lt;br /&gt;
Début de création du diagramme de Gantt .&lt;br /&gt;
&lt;br /&gt;
Réalisation d'une étude du besoin.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du marché : Recherche des robots similaires.&lt;br /&gt;
&lt;br /&gt;
Commencer à prendre en main le robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 22/03/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de l'étude de marché.&lt;br /&gt;
&lt;br /&gt;
Etude des opportunités.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 29/03/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'étude du marché.&lt;br /&gt;
&lt;br /&gt;
Commencer à rédiger le cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 05/04/22''' &lt;br /&gt;
&lt;br /&gt;
Commencer la rédaction du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 26/04/22''' &lt;br /&gt;
&lt;br /&gt;
Bilan du semestre.&lt;br /&gt;
&lt;br /&gt;
Etude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Etude des risques.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 03/05/22''' &lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude des risques.&lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Finalisation du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
== Semestre 7 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 10/10/22'''&lt;br /&gt;
&lt;br /&gt;
Commencement de l'étude technique des encodeurs . &lt;br /&gt;
Recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du changement de la carte arduino pour ajouter des nouvelles fonctionnalités : connexion Wifi, fréquence microprocesseur plus élevé,..&lt;br /&gt;
Test des encodeurs moteur DC : validé .&lt;br /&gt;
Poursuite de recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude de génération des signaux PWM&lt;br /&gt;
&lt;br /&gt;
Test sur Matlab Simulink des boucles d'asservissement issues des robots similaires .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/11/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation des signaux PWM du robot.&lt;br /&gt;
&lt;br /&gt;
Calcul de la fonction de transfert issue de la boucle.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/11/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du fonctionnement du gyroscope et des autres composants pour programmer le robot .  &lt;br /&gt;
&lt;br /&gt;
Séparation du travail a effectuer pour le robot entre une boucle du moteur DC(niveau 1) et une boucle du niveau supérieur(niveau 2) pour asservir l'angle d'inclinaison du robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/11/22''' &lt;br /&gt;
&lt;br /&gt;
Modification et amélioration du diagramme de Gantt pour le S7 et le S8.&lt;br /&gt;
&lt;br /&gt;
Avancée de la modélisation de la boucle du niveau 1 .&lt;br /&gt;
&lt;br /&gt;
Diagramme de Gantt S7-S8&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/11/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation de la boucle du niveau inférieur sur Matlab/Simulink et récupération des résultats sur le scope .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/12/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie informatique et avancement de la partie automatique .&lt;br /&gt;
Programmation de la liaison série pour débugger les sorties de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/12/22''' &lt;br /&gt;
&lt;br /&gt;
Début de rédaction du rapport pour le S7&lt;br /&gt;
&lt;br /&gt;
== Semestre 8 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/01/23''' &lt;br /&gt;
&lt;br /&gt;
Recherches pour le gyroscope . &lt;br /&gt;
Test des encodeurs .&lt;br /&gt;
Communication sur les attentes du semestre s8 ,les fautes à éviter pour rebondir par rapport au retard S7 &lt;br /&gt;
Mise à niveau pour comprendre les aspects techniques de la partie informatique pour pouvoir travailler ensemble sur les résultats du S8 .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/01/23''' &lt;br /&gt;
&lt;br /&gt;
- Suppression des structures de données pour avancer plus rapidement sur les résultats du semestre s8 .&lt;br /&gt;
&lt;br /&gt;
- Recherches pour la programmation des interruptions PCINT . &lt;br /&gt;
&lt;br /&gt;
- Recherche sur la doc technique pour faire l'initialisation des interruptions externes . &lt;br /&gt;
&lt;br /&gt;
- Recherche de la modélisation en 3D de notre robot pour trouver les paramètres PID de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/02/23''' &lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons :&lt;br /&gt;
&lt;br /&gt;
Modification du code des encodeurs et test sur les moteurs DC . &lt;br /&gt;
&lt;br /&gt;
Poursuite de recherche de l'existant pour trouver le code du gyroscope .&lt;br /&gt;
&lt;br /&gt;
Mise à jour du git .&lt;br /&gt;
&lt;br /&gt;
Début du calcul des matrices d'inertie de chaque solide.&lt;br /&gt;
&lt;br /&gt;
Recherche du code des régulateurs.&lt;br /&gt;
&lt;br /&gt;
Avancement sur la gestion de projet .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/02/23'''&lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons essayé de récupérer les résultats des tests électronique de l'oscilloscope effectués dans les salles d'électronique .&lt;br /&gt;
&lt;br /&gt;
Le code des encodeurs marchent ,la liaison série affiche exactement la vitesse de la consigne :les Régulateurs implémentés correspondent bien à notre applications.&lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation de la partie informatique du gyroscope : Objectif : récupération de l'angle d'inclinaison sur la liaison série avec la meilleure précision possible .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/02/23''' &lt;br /&gt;
&lt;br /&gt;
Fin du calcul des matrices d'inertie . &lt;br /&gt;
&lt;br /&gt;
Paramétrage de notre robot pour avoir la visibilité sur les configurations possibles d'avoir(en virage, ligne droite),en précisant les angles d'inclinaison et es repères associés . &lt;br /&gt;
&lt;br /&gt;
Poursuite de programmation des régulateurs par niveaux en utilisant le code précédemment implémenté pour les encodeurs .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/23''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation du modèle en 3D de notre robot pour essayer de l'autoéquilibrer en utilisant les PIDS issues de l'autotune par rapport à nos préférences(stabilité,temps de réponse,dépassement,précision). &lt;br /&gt;
&lt;br /&gt;
Nous avons testé le robot en l'alimentant par le biai la liaison USB ! et enregistrement des résultats .  &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie automatique en trouvant toutes les équations nécessaires à notre modèle .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/23''' &lt;br /&gt;
&lt;br /&gt;
Réalisations de cette séance :&lt;br /&gt;
&lt;br /&gt;
Test du robot pour se stabiliser sur le sol en applicant plusieurs . &lt;br /&gt;
&lt;br /&gt;
Faire tous les calculs des dimensions géométriques de notre robot et test de la boucle d'asservissement avec les deux niveaux sur Matlab Simulink avec nos préférences de stabilité, temps de réponse,précision,dépassement .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/23''' &lt;br /&gt;
&lt;br /&gt;
Absence justifiée .&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91444</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91444"/>
				<updated>2023-05-09T21:00:40Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : /* Gestion de projet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Résumé'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
[[Fichier: SegwayRobot.jpg|200px|right|thumb|Exemple de robot similaire au notre]]&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
L'intégralité de notre programme est disponible sur le dépôt git à l'adresse: https://gitlab.com/remi_farault/self-balanced-robot&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Présentation générale'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==🌏Contexte==&lt;br /&gt;
Les moyens de transport actuels reposent principalement sur le principe du robot à deux roues, c'est la raison pour laquelle l'étude de celui ci s'avère importante, en effet l'étude   &lt;br /&gt;
de sa conception et son contrôle va nous permettre de développer des outils innovants qui pourraient potentiellement intéresser des sociétés de transport .&lt;br /&gt;
&lt;br /&gt;
==🎯Objectif==&lt;br /&gt;
&lt;br /&gt;
Notre objectif principal est de commander le robot, de là interviennent d'autres objectifs tel que la stabilité ,développer un code robuste qui assure cette fonctionnalité et aussi le contrôler pour réaliser des fonctionnalités de déplacement et d'éviter des obstacles . Des objectifs secondaires sont de créer un site web à travers lequel nous allons mener toutes les opérations de contrôle .&lt;br /&gt;
&lt;br /&gt;
==🔍Expression du besoin==&lt;br /&gt;
&lt;br /&gt;
Un robot autoéquilibré à deux roues est un type de robot qui peut se maintenir en équilibre sur deux roues sans tomber. Pour réaliser cette fonctionnalité, le robot utilise un ensemble de capteurs, d'algorithmes de contrôle et de moteurs pour ajuster sa position en temps réel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Self_balanc_bt.png|400px|Bete a corne SBR]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le diagramme interacteurs permet en fait de visualiser les fonctions services assurées par le système &lt;br /&gt;
&lt;br /&gt;
[[Fichier:341702419_560921119358434_1016673599353874396_n_(1).png|400px|DGI SBR]]    [[Fichier:Btacorne.png |500px|DGI SBR|right]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Réalisations et Résultats'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
[[Fichier: seg.jpg|200px|left|thumb|Exemple de commande désirée]]&lt;br /&gt;
&lt;br /&gt;
Après mis en place notre stratégie de gestion de projet en s6 à travers le diagramme de GANTT et le cahier de charges fonctionnels, nous nous sommes focalisés sur l'étude technique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: progg.png|300px|right|thumb|Organisation de notre programme]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, étudier à travers des outils automatiques la stabilité du robot en faisant appel à des modèles théoriques et pratiques et commencer par un raisonnement par niveaux, d'abord le niveau 1 du moteur à courant continu et les équations correspondantes puis le niveau 2 assurant la stabilité du robot directement, on avait la possibilité de passer directement au niveau 2 à travers le modèle du pendule inversé et les équations qui en découlent sauf que celui-ci ne nous permettra pas de revenir au niveau 1 et asservir le moteur à travers les codeurs incrémentales ,la deuxième partie consistait à réaliser les codes informatiques en s'appuyant sur les structures de données en C vues l'année dernière et conduire un même raisonnement(par niveaux) s'appuyant d'abord sur les codes sources correspondants à la génération d'un signal PWM pour les deux moteurs avec un rapport cyclique modifiable, et aussi les codes sources correspondants à la gestion des moteurs, en effet, ceux-ci tournent  dans un sens ou dans un autre ou ne tournent pas en fonction de la variable in1 et in2  pour faire tourner les moteurs .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Avr.png|100px|left|thumb|Compilateur utilisé]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cependant, nous avons rencontré quelques problèmes en automatique notamment pour trouver des valeurs des constantes théoriques pour les références du moteur entre les mains, ce qui nous a obligé à prendre des valeurs issues d'autres applications, nous avons rencontré aussi quelques problèmes choisir une modélisation parmi celles qui sont disponibles sur Internet .&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Etude Automatique'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Avant de programmer notre système sur la carte Arduino, nous avons également créé une simulation complète de notre système robotisé sur SIMULINK. Cependant, avant cela, nous avons dû déterminer les équations qui régissent notre système en trouvant les matrices d'inertie de chaque composant de notre robot, à savoir la masse transportée par le robot (M), le châssis constitué de deux plateaux et de la motorisation (les piliers et leur inertie ont été négligés car leur masse est très faible), ainsi que les roues (roue droite et roue gauche). Vous trouverez ci-dessous les matrices d'inertie que nous avons obtenues pour chaque composant.&lt;br /&gt;
&lt;br /&gt;
'''Masse M :'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatM.png|200px|thumb|left|Matrice de la masse M]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients seront notés dans la suite pour simplifier : AM,BM,CM &lt;br /&gt;
&lt;br /&gt;
'''Chassis:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatB.png|800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AH,BH,CH &lt;br /&gt;
&lt;br /&gt;
'''Roue gauche:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrg.png |600px|Matrice de RG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
'''Roue droite:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrd.png |600px|Matrice RD]]&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
Ci-dessous un paramétrage de notre système : Chaque angle détermine un repère&lt;br /&gt;
&lt;br /&gt;
Le repère R0 est supposé galliléen.&lt;br /&gt;
&lt;br /&gt;
Le repère R1 est en rotation  ,appelé angle de virage par rapport à R0.&lt;br /&gt;
&lt;br /&gt;
Le repère R2 est en rotation  ,appelé angle d’inclinaison du châssis par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R3 est en rotation  ,appelé angle d’inclinaison arrière-avant de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R4 est en rotation ,appelé angle d’inclinaison droite-gauche de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:param.png |800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
l’angle de consigne est de 0deg,nous employons un PID pour corriger l’angle de mesure,à sa sortie,on aura une tension W(p).Les blocs Km et W(p) assurent le passage tension-&amp;gt;couple-&amp;gt;angle ,il faut ensuite retirer  pour ne garder que l’angle d’inclinaison du châssis  .Km=0.0125N.m.V-1(d’après la datasheet du moteur)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bcle.png |800px|Asservissement]]                                                             [[Fichier:Matuu.png|right|800px|Asservissement]]      &lt;br /&gt;
&lt;br /&gt;
Les équations obtenues sont les suivantes (Le détail des calculs a été précisé dans le Rapport): &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eq nnlin.png |500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après linéarisation : Considérer l'approximations des petits angles pour le sinus et cosinus,et négliger aussi la vitesse angulaire quadratique devant la vitesse angulaire,nous obtenons : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eqlin.png |300px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crbe.png|600px|Courbe]]&lt;br /&gt;
&lt;br /&gt;
On obtient une courbe avec un bon temps de réponse, un léger dépassement et une stabilité .Le système est régulé de manière efficace, capable de répondre rapidement et précisément aux perturbations tout en maintenant une position d'équilibre stable.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mat3d.png|500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Environnement de developpement'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Notre microcontrolleur étant une Arduino Uno, nous aurions pu utiliser le framework ''Arduino'' donnant accès à un IDE intégrant les outils pour compiler et flasher le code, ainsi qu'une multitude de bibliothèques haut niveaux très simples d'utilisation et plutôt performantes, permettant de programmer notre robot en simplement quelques dizaines de lignes de code.&lt;br /&gt;
&lt;br /&gt;
Cependant, l'Arduino est simplement une carte de prototypage intégrant un microcontrôleur ''AVR Atmega 328p''. &lt;br /&gt;
Les microcontroleurs AVR disposent d'une grande communauté, et il existe de nombreux outils nécessaires au developpement sur ces cartes.&lt;br /&gt;
Afin d'avoir un meilleur contrôle sur notre projet, et surtout d'en tirer un maximum de compétences, nous avons donc décidés de programmer notre robot directement en C en utilisant les outils AVR:&lt;br /&gt;
&lt;br /&gt;
- '''avr-gcc''': compilateur open-source portant toutes les fonctionnalités du langage C standard sur les microcontroleurs AVR.&lt;br /&gt;
Seul, son utilisation est quasiment impossible et demande trop de travail en programmation bas-niveau.&lt;br /&gt;
&lt;br /&gt;
- '''avr-libc''': implémentation basé sur le compilateur avr-gcc de la bibliothèque standard du langage C.&lt;br /&gt;
Cette bibliothèque permet donc d'utiliser les fonctions et structures standards du C (IO, maths, chaines de caractères), mais elle intègre également un mapping mémoire de tous les registres de l'atmega, ainsi qu'un mécanisme pour programmer des interruptions.&lt;br /&gt;
&lt;br /&gt;
- '''avr-objcopy''': ce programme en ligne de commande formate le binaire obtenu en format utilisable par les AVR&lt;br /&gt;
&lt;br /&gt;
- '''avr-dude''': ce programme en ligne de commande permet de flasher via une interface USB-série un microcontroleur AVR présent sur une carte Arduino.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc developpé un '''Makefile''' utilisant tous ces outils, constituant un environnement de developpement très efficace pour notre projet. Ce Makefile est disponible sur notre gitlab.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Programme du robot'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''PWM'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
La première étape consistait à commander nos moteurs DC, afin de poser les bases de notre&lt;br /&gt;
asservissement bas niveau. Ces moteurs sont contrôlés par le driver de moteurs, utilisant des signaux logiques pour définir l’état d’un moteur et des signaux '''PWM''' pour définir la vitesse de&lt;br /&gt;
rotation. La génération de signaux PWM sur AVR se fait en utilisant les '''timers''' en mode PWM.&lt;br /&gt;
Tout simplement, nous avons un registre compteur 16 bits incrémenté périodiquement, et une valeur&lt;br /&gt;
maximale définie par le registre ''ICRx''. Nous utilisons ensuite les registres ''OCRnx'' contenant une&lt;br /&gt;
valeur inférieure au maximum. &lt;br /&gt;
Lorsque le compteur atteint la valeur contenue dans OCRnx, il&lt;br /&gt;
inverse la valeur logique de sortie du pin ''OCnx''. Ainsi, nous pouvons modifier instantanément la&lt;br /&gt;
valeur d’OCRnx afin de modifier le rapport cyclique de notre signal. Ce rapport cyclique est ensuite&lt;br /&gt;
directement proportionnel à la vitesse de rotation du moteur associé. &lt;br /&gt;
La fréquence du signal est définie par la période d’incrémentation du compteur et par la valeur maximale ICRx.&lt;br /&gt;
Pour notre composant, nous pouvions utiliser une fréquence allant jusqu’à plusieurs kHz. Cette&lt;br /&gt;
fréquence n’a aucun impact sur la rotation du moteur. Nous avons donc choisis 20 kHz.&lt;br /&gt;
Nous avons définis la '''init_pwm''' pour configurer les registres nécessaires, et la fonction&lt;br /&gt;
'''generate_pwm''' pour modifier le rapport cyclique de nos deux signaux PWM avec la valeur&lt;br /&gt;
souhaitée.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Encodeurs'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Une fois nos moteurs pouvant tourner à une vitesse voulue, nous avons du trouver un moyen de&lt;br /&gt;
mesurer leurs vitesses effectives afin de réaliser une boucle d’asservissement. Pour cela, nous avons&lt;br /&gt;
utilisés les encodeurs optiques disponibles sur nos moteurs DC. &lt;br /&gt;
Ces encodeurs envoient sur leur broches un front-montant à chaque tour de la roue codeuse reliée au moteurs (ayant une vitesse&lt;br /&gt;
proportionnelle à celle du moteur). En détectant ces fronts montant, nous pouvons donc compter le&lt;br /&gt;
nombre de tours du moteur pendant un intervalle de temps défini, puis déterminer la vitesse réelle&lt;br /&gt;
du moteur.&lt;br /&gt;
Pour détecter les fronts montant, nous utilisons l’interface '''Pin Change Interrupt''' de l’Atmega. Cette&lt;br /&gt;
interface exécute une interruption logicielle à chaque changement d’état logique du pin associé.&lt;br /&gt;
Dans notre cas, nous devons ensuite observé l’état précédent de la sortie et l’état actuel pour&lt;br /&gt;
déterminer si on est bien en présence d’un front montant. Une fois le front montant détecté, cette&lt;br /&gt;
interruption incrémente ensuite le compteur de tours.&lt;br /&gt;
Ce compteur est ensuite utilisé pour calculer la vitesse de rotation puis remis à zéro pour la mesure&lt;br /&gt;
suivante.&lt;br /&gt;
Dans notre cas, nous réalisons cette mesure à une fréquence d’environ 244 Hz, dans une autre&lt;br /&gt;
fonction d’interruption qu’on détaillera plus loin.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Angle'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Notre boucle de régulation principale a besoin d’une mesure de l’angle d’inclinaison du robot sur&lt;br /&gt;
son axe vertical perpendiculaire à celui de déplacement. Cette mesure s’effectue via le '''MPU6050'''.&lt;br /&gt;
Ce composant fonctionne via le protocole '''i2c''', protocole de communication simple utilisé par la&lt;br /&gt;
plupart des systèmes électroniques. Ce protocole étant bas niveau, il existe de nombreuses&lt;br /&gt;
bibliothèques implémentés en C permettant son utilisation. De plus, le MPU6050 est un composant&lt;br /&gt;
très complet et complexe, afin d’en récupérer l’angle, il faut d’abord amorcer une communication&lt;br /&gt;
i2c puis configurer certains des ses registres, afin ensuite de pouvoir lire les registres contenant la&lt;br /&gt;
mesure de l’angle selon l’axe désiré. Afin de conserver un code efficace et concis, nous avons&lt;br /&gt;
également décidés d’utiliser une bibliothèque faisant office de « '''driver''' » pour ce composant,&lt;br /&gt;
intégrant des fonctions d’initialisation et de lecture des mesures faites par ce gyroscope.&lt;br /&gt;
Nous obtenons donc la valeur de l’angle en degrés, comprise entre 0 et 360.Dans notre cas, nous souhaitions obtenir une valeur comprise entre -180 et 180, car seule la valeur&lt;br /&gt;
absolue et le sens de l’inclinaison nous intéresse, nous avons donc appliqués une correction de cette&lt;br /&gt;
valeur.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Interruption principale'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Lors de implémentation d’un asservissement automatique via un microcontrôleur, la puissance de&lt;br /&gt;
calcul finie impose que les commandes des actionneurs et les mesures des capteurs doivent être&lt;br /&gt;
réalisées périodiquement. Pour cela, nous pouvons utiliser une '''routine d’interruption''' qui s’exécute à&lt;br /&gt;
chaque ''overflow'' d’un compteur, via l’interface des '''timers''' de l’atmega. Dans notre cas, cette&lt;br /&gt;
interruption correspond à la fonction principale de notre programme. Nous avons réglés sa&lt;br /&gt;
fréquence à 244Hz, en divisant le fréquence de base de 16MHz avec un '''prescaler''' de 256 (plus une&lt;br /&gt;
deuxième division par 256 du à la taille du registre timer de 8 bits).&lt;br /&gt;
Cette interruption vient d’abord remettre a zéro les compteurs des encodeurs et récupérer la vitesse&lt;br /&gt;
des deux moteurs.&lt;br /&gt;
Ensuite, elle effectue les calculs nécessaires à la régulation de l’angle, mais également de la vitesse&lt;br /&gt;
linéaire et de la rotation du robot.&lt;br /&gt;
Chaque paramètre à réguler est corrigé par un régulateur PID de coefficients différents via la&lt;br /&gt;
fonction '''pid()'''.&lt;br /&gt;
Enfin, nous obtenons une commande à envoyer aux moteurs, qui actionnent notre robot de la&lt;br /&gt;
manière souhaitée.&lt;br /&gt;
Le code de notre système est disponible sur nôtre dépôt gitlab également.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Bilan'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 6 :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 7 :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 8 :'''&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Gestion de projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Durant ces trois semestres, la gestion de projet est un des domaines où nous avons le plus de difficultés, mais également un de ceux dans lequel nous avons le plus appris. &lt;br /&gt;
&lt;br /&gt;
Diagramme de Gantt previsionnel réalisé au S6&lt;br /&gt;
[[Fichier:Gt.png|400px|thumb|left|texte descriptif]]&lt;br /&gt;
&lt;br /&gt;
D'abord trois, nous nous sommes retrouvés à deux dès le deuxième semestre, et nous avons donc du modifier l'organisation prévue pour la suite.&lt;br /&gt;
Ensuite, en travaillant à deux, nous avons du trouvé un moyen d'avancer efficacement.&lt;br /&gt;
L'un de nous étant en filière SA (Systemes Autonomes) et l'autre en filière SC (Systemes Communicants), la répartition des taches informatiques et automatiques était donc simplifiée.&lt;br /&gt;
&lt;br /&gt;
Cependant, nous avons donc du réussir à expliquer et à mettre en relation chacune de nos parties, en s'améliorant sur la partie communication.&lt;br /&gt;
&lt;br /&gt;
Comme outils, nous utilisions donc git et gitlab pour la gestion de code et google drive pour le partage de documents.&lt;br /&gt;
Nous avons préferés travailler un maximum en présentiel, d'un accord commun.&lt;br /&gt;
&lt;br /&gt;
== Semestre 6 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/22''' &lt;br /&gt;
&lt;br /&gt;
Séance de découverte du sujet de notre projet.&lt;br /&gt;
&lt;br /&gt;
Recherche de l'existant &lt;br /&gt;
&lt;br /&gt;
Réalisation de recherches sur leurs différentes utilisations.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/22''' &lt;br /&gt;
&lt;br /&gt;
Début de création du diagramme de Gantt .&lt;br /&gt;
&lt;br /&gt;
Réalisation d'une étude du besoin.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du marché : Recherche des robots similaires.&lt;br /&gt;
&lt;br /&gt;
Commencer à prendre en main le robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 22/03/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de l'étude de marché.&lt;br /&gt;
&lt;br /&gt;
Etude des opportunités.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 29/03/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'étude du marché.&lt;br /&gt;
&lt;br /&gt;
Commencer à rédiger le cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 05/04/22''' &lt;br /&gt;
&lt;br /&gt;
Commencer la rédaction du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 26/04/22''' &lt;br /&gt;
&lt;br /&gt;
Bilan du semestre.&lt;br /&gt;
&lt;br /&gt;
Etude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Etude des risques.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 03/05/22''' &lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude des risques.&lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Finalisation du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
== Semestre 7 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 10/10/22'''&lt;br /&gt;
&lt;br /&gt;
Commencement de l'étude technique des encodeurs . &lt;br /&gt;
Recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du changement de la carte arduino pour ajouter des nouvelles fonctionnalités : connexion Wifi, fréquence microprocesseur plus élevé,..&lt;br /&gt;
Test des encodeurs moteur DC : validé .&lt;br /&gt;
Poursuite de recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude de génération des signaux PWM&lt;br /&gt;
&lt;br /&gt;
Test sur Matlab Simulink des boucles d'asservissement issues des robots similaires .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/11/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation des signaux PWM du robot.&lt;br /&gt;
&lt;br /&gt;
Calcul de la fonction de transfert issue de la boucle.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/11/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du fonctionnement du gyroscope et des autres composants pour programmer le robot .  &lt;br /&gt;
&lt;br /&gt;
Séparation du travail a effectuer pour le robot entre une boucle du moteur DC(niveau 1) et une boucle du niveau supérieur(niveau 2) pour asservir l'angle d'inclinaison du robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/11/22''' &lt;br /&gt;
&lt;br /&gt;
Modification et amélioration du diagramme de Gantt pour le S7 et le S8.&lt;br /&gt;
&lt;br /&gt;
Avancée de la modélisation de la boucle du niveau 1 .&lt;br /&gt;
&lt;br /&gt;
Diagramme de Gantt S7-S8&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/11/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation de la boucle du niveau inférieur sur Matlab/Simulink et récupération des résultats sur le scope .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/12/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie informatique et avancement de la partie automatique .&lt;br /&gt;
Programmation de la liaison série pour débugger les sorties de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/12/22''' &lt;br /&gt;
&lt;br /&gt;
Début de rédaction du rapport pour le S7&lt;br /&gt;
&lt;br /&gt;
== Semestre 8 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/01/23''' &lt;br /&gt;
&lt;br /&gt;
Recherches pour le gyroscope . &lt;br /&gt;
Test des encodeurs .&lt;br /&gt;
Communication sur les attentes du semestre s8 ,les fautes à éviter pour rebondir par rapport au retard S7 &lt;br /&gt;
Mise à niveau pour comprendre les aspects techniques de la partie informatique pour pouvoir travailler ensemble sur les résultats du S8 .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/01/23''' &lt;br /&gt;
&lt;br /&gt;
- Suppression des structures de données pour avancer plus rapidement sur les résultats du semestre s8 .&lt;br /&gt;
&lt;br /&gt;
- Recherches pour la programmation des interruptions PCINT . &lt;br /&gt;
&lt;br /&gt;
- Recherche sur la doc technique pour faire l'initialisation des interruptions externes . &lt;br /&gt;
&lt;br /&gt;
- Recherche de la modélisation en 3D de notre robot pour trouver les paramètres PID de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/02/23''' &lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons :&lt;br /&gt;
&lt;br /&gt;
Modification du code des encodeurs et test sur les moteurs DC . &lt;br /&gt;
&lt;br /&gt;
Poursuite de recherche de l'existant pour trouver le code du gyroscope .&lt;br /&gt;
&lt;br /&gt;
Mise à jour du git .&lt;br /&gt;
&lt;br /&gt;
Début du calcul des matrices d'inertie de chaque solide.&lt;br /&gt;
&lt;br /&gt;
Recherche du code des régulateurs.&lt;br /&gt;
&lt;br /&gt;
Avancement sur la gestion de projet .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/02/23'''&lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons essayé de récupérer les résultats des tests électronique de l'oscilloscope effectués dans les salles d'électronique .&lt;br /&gt;
&lt;br /&gt;
Le code des encodeurs marchent ,la liaison série affiche exactement la vitesse de la consigne :les Régulateurs implémentés correspondent bien à notre applications.&lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation de la partie informatique du gyroscope : Objectif : récupération de l'angle d'inclinaison sur la liaison série avec la meilleure précision possible .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/02/23''' &lt;br /&gt;
&lt;br /&gt;
Fin du calcul des matrices d'inertie . &lt;br /&gt;
&lt;br /&gt;
Paramétrage de notre robot pour avoir la visibilité sur les configurations possibles d'avoir(en virage, ligne droite),en précisant les angles d'inclinaison et es repères associés . &lt;br /&gt;
&lt;br /&gt;
Poursuite de programmation des régulateurs par niveaux en utilisant le code précédemment implémenté pour les encodeurs .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/23''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation du modèle en 3D de notre robot pour essayer de l'autoéquilibrer en utilisant les PIDS issues de l'autotune par rapport à nos préférences(stabilité,temps de réponse,dépassement,précision). &lt;br /&gt;
&lt;br /&gt;
Nous avons testé le robot en l'alimentant par le biai la liaison USB ! et enregistrement des résultats .  &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie automatique en trouvant toutes les équations nécessaires à notre modèle .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/23''' &lt;br /&gt;
&lt;br /&gt;
Réalisations de cette séance :&lt;br /&gt;
&lt;br /&gt;
Test du robot pour se stabiliser sur le sol en applicant plusieurs . &lt;br /&gt;
&lt;br /&gt;
Faire tous les calculs des dimensions géométriques de notre robot et test de la boucle d'asservissement avec les deux niveaux sur Matlab Simulink avec nos préférences de stabilité, temps de réponse,précision,dépassement .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/23''' &lt;br /&gt;
&lt;br /&gt;
Absence justifiée .&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91443</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91443"/>
				<updated>2023-05-09T20:52:44Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : /* Interruption principale */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Résumé'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
[[Fichier: SegwayRobot.jpg|200px|right|thumb|Exemple de robot similaire au notre]]&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
L'intégralité de notre programme est disponible sur le dépôt git à l'adresse: https://gitlab.com/remi_farault/self-balanced-robot&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Présentation générale'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==🌏Contexte==&lt;br /&gt;
Les moyens de transport actuels reposent principalement sur le principe du robot à deux roues, c'est la raison pour laquelle l'étude de celui ci s'avère importante, en effet l'étude   &lt;br /&gt;
de sa conception et son contrôle va nous permettre de développer des outils innovants qui pourraient potentiellement intéresser des sociétés de transport .&lt;br /&gt;
&lt;br /&gt;
==🎯Objectif==&lt;br /&gt;
&lt;br /&gt;
Notre objectif principal est de commander le robot, de là interviennent d'autres objectifs tel que la stabilité ,développer un code robuste qui assure cette fonctionnalité et aussi le contrôler pour réaliser des fonctionnalités de déplacement et d'éviter des obstacles . Des objectifs secondaires sont de créer un site web à travers lequel nous allons mener toutes les opérations de contrôle .&lt;br /&gt;
&lt;br /&gt;
==🔍Expression du besoin==&lt;br /&gt;
&lt;br /&gt;
Un robot autoéquilibré à deux roues est un type de robot qui peut se maintenir en équilibre sur deux roues sans tomber. Pour réaliser cette fonctionnalité, le robot utilise un ensemble de capteurs, d'algorithmes de contrôle et de moteurs pour ajuster sa position en temps réel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Self_balanc_bt.png|400px|Bete a corne SBR]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le diagramme interacteurs permet en fait de visualiser les fonctions services assurées par le système &lt;br /&gt;
&lt;br /&gt;
[[Fichier:341702419_560921119358434_1016673599353874396_n_(1).png|400px|DGI SBR]]    [[Fichier:Btacorne.png |500px|DGI SBR|right]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Réalisations et Résultats'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
[[Fichier: seg.jpg|200px|left|thumb|Exemple de commande désirée]]&lt;br /&gt;
&lt;br /&gt;
Après mis en place notre stratégie de gestion de projet en s6 à travers le diagramme de GANTT et le cahier de charges fonctionnels, nous nous sommes focalisés sur l'étude technique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: progg.png|300px|right|thumb|Organisation de notre programme]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, étudier à travers des outils automatiques la stabilité du robot en faisant appel à des modèles théoriques et pratiques et commencer par un raisonnement par niveaux, d'abord le niveau 1 du moteur à courant continu et les équations correspondantes puis le niveau 2 assurant la stabilité du robot directement, on avait la possibilité de passer directement au niveau 2 à travers le modèle du pendule inversé et les équations qui en découlent sauf que celui-ci ne nous permettra pas de revenir au niveau 1 et asservir le moteur à travers les codeurs incrémentales ,la deuxième partie consistait à réaliser les codes informatiques en s'appuyant sur les structures de données en C vues l'année dernière et conduire un même raisonnement(par niveaux) s'appuyant d'abord sur les codes sources correspondants à la génération d'un signal PWM pour les deux moteurs avec un rapport cyclique modifiable, et aussi les codes sources correspondants à la gestion des moteurs, en effet, ceux-ci tournent  dans un sens ou dans un autre ou ne tournent pas en fonction de la variable in1 et in2  pour faire tourner les moteurs .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Avr.png|100px|left|thumb|Compilateur utilisé]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cependant, nous avons rencontré quelques problèmes en automatique notamment pour trouver des valeurs des constantes théoriques pour les références du moteur entre les mains, ce qui nous a obligé à prendre des valeurs issues d'autres applications, nous avons rencontré aussi quelques problèmes choisir une modélisation parmi celles qui sont disponibles sur Internet .&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Etude Automatique'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Avant de programmer notre système sur la carte Arduino, nous avons également créé une simulation complète de notre système robotisé sur SIMULINK. Cependant, avant cela, nous avons dû déterminer les équations qui régissent notre système en trouvant les matrices d'inertie de chaque composant de notre robot, à savoir la masse transportée par le robot (M), le châssis constitué de deux plateaux et de la motorisation (les piliers et leur inertie ont été négligés car leur masse est très faible), ainsi que les roues (roue droite et roue gauche). Vous trouverez ci-dessous les matrices d'inertie que nous avons obtenues pour chaque composant.&lt;br /&gt;
&lt;br /&gt;
'''Masse M :'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatM.png|200px|thumb|left|Matrice de la masse M]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients seront notés dans la suite pour simplifier : AM,BM,CM &lt;br /&gt;
&lt;br /&gt;
'''Chassis:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatB.png|800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AH,BH,CH &lt;br /&gt;
&lt;br /&gt;
'''Roue gauche:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrg.png |600px|Matrice de RG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
'''Roue droite:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrd.png |600px|Matrice RD]]&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
Ci-dessous un paramétrage de notre système : Chaque angle détermine un repère&lt;br /&gt;
&lt;br /&gt;
Le repère R0 est supposé galliléen.&lt;br /&gt;
&lt;br /&gt;
Le repère R1 est en rotation  ,appelé angle de virage par rapport à R0.&lt;br /&gt;
&lt;br /&gt;
Le repère R2 est en rotation  ,appelé angle d’inclinaison du châssis par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R3 est en rotation  ,appelé angle d’inclinaison arrière-avant de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R4 est en rotation ,appelé angle d’inclinaison droite-gauche de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:param.png |800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
l’angle de consigne est de 0deg,nous employons un PID pour corriger l’angle de mesure,à sa sortie,on aura une tension W(p).Les blocs Km et W(p) assurent le passage tension-&amp;gt;couple-&amp;gt;angle ,il faut ensuite retirer  pour ne garder que l’angle d’inclinaison du châssis  .Km=0.0125N.m.V-1(d’après la datasheet du moteur)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bcle.png |800px|Asservissement]]                                                             [[Fichier:Matuu.png|right|800px|Asservissement]]      &lt;br /&gt;
&lt;br /&gt;
Les équations obtenues sont les suivantes (Le détail des calculs a été précisé dans le Rapport): &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eq nnlin.png |500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après linéarisation : Considérer l'approximations des petits angles pour le sinus et cosinus,et négliger aussi la vitesse angulaire quadratique devant la vitesse angulaire,nous obtenons : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eqlin.png |300px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crbe.png|600px|Courbe]]&lt;br /&gt;
&lt;br /&gt;
On obtient une courbe avec un bon temps de réponse, un léger dépassement et une stabilité .Le système est régulé de manière efficace, capable de répondre rapidement et précisément aux perturbations tout en maintenant une position d'équilibre stable.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mat3d.png|500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Environnement de developpement'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Notre microcontrolleur étant une Arduino Uno, nous aurions pu utiliser le framework ''Arduino'' donnant accès à un IDE intégrant les outils pour compiler et flasher le code, ainsi qu'une multitude de bibliothèques haut niveaux très simples d'utilisation et plutôt performantes, permettant de programmer notre robot en simplement quelques dizaines de lignes de code.&lt;br /&gt;
&lt;br /&gt;
Cependant, l'Arduino est simplement une carte de prototypage intégrant un microcontrôleur ''AVR Atmega 328p''. &lt;br /&gt;
Les microcontroleurs AVR disposent d'une grande communauté, et il existe de nombreux outils nécessaires au developpement sur ces cartes.&lt;br /&gt;
Afin d'avoir un meilleur contrôle sur notre projet, et surtout d'en tirer un maximum de compétences, nous avons donc décidés de programmer notre robot directement en C en utilisant les outils AVR:&lt;br /&gt;
&lt;br /&gt;
- '''avr-gcc''': compilateur open-source portant toutes les fonctionnalités du langage C standard sur les microcontroleurs AVR.&lt;br /&gt;
Seul, son utilisation est quasiment impossible et demande trop de travail en programmation bas-niveau.&lt;br /&gt;
&lt;br /&gt;
- '''avr-libc''': implémentation basé sur le compilateur avr-gcc de la bibliothèque standard du langage C.&lt;br /&gt;
Cette bibliothèque permet donc d'utiliser les fonctions et structures standards du C (IO, maths, chaines de caractères), mais elle intègre également un mapping mémoire de tous les registres de l'atmega, ainsi qu'un mécanisme pour programmer des interruptions.&lt;br /&gt;
&lt;br /&gt;
- '''avr-objcopy''': ce programme en ligne de commande formate le binaire obtenu en format utilisable par les AVR&lt;br /&gt;
&lt;br /&gt;
- '''avr-dude''': ce programme en ligne de commande permet de flasher via une interface USB-série un microcontroleur AVR présent sur une carte Arduino.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc developpé un '''Makefile''' utilisant tous ces outils, constituant un environnement de developpement très efficace pour notre projet. Ce Makefile est disponible sur notre gitlab.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Programme du robot'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''PWM'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
La première étape consistait à commander nos moteurs DC, afin de poser les bases de notre&lt;br /&gt;
asservissement bas niveau. Ces moteurs sont contrôlés par le driver de moteurs, utilisant des signaux logiques pour définir l’état d’un moteur et des signaux '''PWM''' pour définir la vitesse de&lt;br /&gt;
rotation. La génération de signaux PWM sur AVR se fait en utilisant les '''timers''' en mode PWM.&lt;br /&gt;
Tout simplement, nous avons un registre compteur 16 bits incrémenté périodiquement, et une valeur&lt;br /&gt;
maximale définie par le registre ''ICRx''. Nous utilisons ensuite les registres ''OCRnx'' contenant une&lt;br /&gt;
valeur inférieure au maximum. &lt;br /&gt;
Lorsque le compteur atteint la valeur contenue dans OCRnx, il&lt;br /&gt;
inverse la valeur logique de sortie du pin ''OCnx''. Ainsi, nous pouvons modifier instantanément la&lt;br /&gt;
valeur d’OCRnx afin de modifier le rapport cyclique de notre signal. Ce rapport cyclique est ensuite&lt;br /&gt;
directement proportionnel à la vitesse de rotation du moteur associé. &lt;br /&gt;
La fréquence du signal est définie par la période d’incrémentation du compteur et par la valeur maximale ICRx.&lt;br /&gt;
Pour notre composant, nous pouvions utiliser une fréquence allant jusqu’à plusieurs kHz. Cette&lt;br /&gt;
fréquence n’a aucun impact sur la rotation du moteur. Nous avons donc choisis 20 kHz.&lt;br /&gt;
Nous avons définis la '''init_pwm''' pour configurer les registres nécessaires, et la fonction&lt;br /&gt;
'''generate_pwm''' pour modifier le rapport cyclique de nos deux signaux PWM avec la valeur&lt;br /&gt;
souhaitée.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Encodeurs'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Une fois nos moteurs pouvant tourner à une vitesse voulue, nous avons du trouver un moyen de&lt;br /&gt;
mesurer leurs vitesses effectives afin de réaliser une boucle d’asservissement. Pour cela, nous avons&lt;br /&gt;
utilisés les encodeurs optiques disponibles sur nos moteurs DC. &lt;br /&gt;
Ces encodeurs envoient sur leur broches un front-montant à chaque tour de la roue codeuse reliée au moteurs (ayant une vitesse&lt;br /&gt;
proportionnelle à celle du moteur). En détectant ces fronts montant, nous pouvons donc compter le&lt;br /&gt;
nombre de tours du moteur pendant un intervalle de temps défini, puis déterminer la vitesse réelle&lt;br /&gt;
du moteur.&lt;br /&gt;
Pour détecter les fronts montant, nous utilisons l’interface '''Pin Change Interrupt''' de l’Atmega. Cette&lt;br /&gt;
interface exécute une interruption logicielle à chaque changement d’état logique du pin associé.&lt;br /&gt;
Dans notre cas, nous devons ensuite observé l’état précédent de la sortie et l’état actuel pour&lt;br /&gt;
déterminer si on est bien en présence d’un front montant. Une fois le front montant détecté, cette&lt;br /&gt;
interruption incrémente ensuite le compteur de tours.&lt;br /&gt;
Ce compteur est ensuite utilisé pour calculer la vitesse de rotation puis remis à zéro pour la mesure&lt;br /&gt;
suivante.&lt;br /&gt;
Dans notre cas, nous réalisons cette mesure à une fréquence d’environ 244 Hz, dans une autre&lt;br /&gt;
fonction d’interruption qu’on détaillera plus loin.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Angle'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Notre boucle de régulation principale a besoin d’une mesure de l’angle d’inclinaison du robot sur&lt;br /&gt;
son axe vertical perpendiculaire à celui de déplacement. Cette mesure s’effectue via le '''MPU6050'''.&lt;br /&gt;
Ce composant fonctionne via le protocole '''i2c''', protocole de communication simple utilisé par la&lt;br /&gt;
plupart des systèmes électroniques. Ce protocole étant bas niveau, il existe de nombreuses&lt;br /&gt;
bibliothèques implémentés en C permettant son utilisation. De plus, le MPU6050 est un composant&lt;br /&gt;
très complet et complexe, afin d’en récupérer l’angle, il faut d’abord amorcer une communication&lt;br /&gt;
i2c puis configurer certains des ses registres, afin ensuite de pouvoir lire les registres contenant la&lt;br /&gt;
mesure de l’angle selon l’axe désiré. Afin de conserver un code efficace et concis, nous avons&lt;br /&gt;
également décidés d’utiliser une bibliothèque faisant office de « '''driver''' » pour ce composant,&lt;br /&gt;
intégrant des fonctions d’initialisation et de lecture des mesures faites par ce gyroscope.&lt;br /&gt;
Nous obtenons donc la valeur de l’angle en degrés, comprise entre 0 et 360.Dans notre cas, nous souhaitions obtenir une valeur comprise entre -180 et 180, car seule la valeur&lt;br /&gt;
absolue et le sens de l’inclinaison nous intéresse, nous avons donc appliqués une correction de cette&lt;br /&gt;
valeur.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Interruption principale'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Lors de implémentation d’un asservissement automatique via un microcontrôleur, la puissance de&lt;br /&gt;
calcul finie impose que les commandes des actionneurs et les mesures des capteurs doivent être&lt;br /&gt;
réalisées périodiquement. Pour cela, nous pouvons utiliser une '''routine d’interruption''' qui s’exécute à&lt;br /&gt;
chaque ''overflow'' d’un compteur, via l’interface des '''timers''' de l’atmega. Dans notre cas, cette&lt;br /&gt;
interruption correspond à la fonction principale de notre programme. Nous avons réglés sa&lt;br /&gt;
fréquence à 244Hz, en divisant le fréquence de base de 16MHz avec un '''prescaler''' de 256 (plus une&lt;br /&gt;
deuxième division par 256 du à la taille du registre timer de 8 bits).&lt;br /&gt;
Cette interruption vient d’abord remettre a zéro les compteurs des encodeurs et récupérer la vitesse&lt;br /&gt;
des deux moteurs.&lt;br /&gt;
Ensuite, elle effectue les calculs nécessaires à la régulation de l’angle, mais également de la vitesse&lt;br /&gt;
linéaire et de la rotation du robot.&lt;br /&gt;
Chaque paramètre à réguler est corrigé par un régulateur PID de coefficients différents via la&lt;br /&gt;
fonction '''pid()'''.&lt;br /&gt;
Enfin, nous obtenons une commande à envoyer aux moteurs, qui actionnent notre robot de la&lt;br /&gt;
manière souhaitée.&lt;br /&gt;
Le code de notre système est disponible sur nôtre dépôt gitlab également.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Bilan'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 6 :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 7 :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 8 :'''&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Gestion de projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
- L'utilisation de git : &lt;br /&gt;
[[Fichier:Gt.png|400px|thumb|left|texte descriptif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Semestre 6 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/22''' &lt;br /&gt;
&lt;br /&gt;
Séance de découverte du sujet de notre projet.&lt;br /&gt;
&lt;br /&gt;
Recherche de l'existant &lt;br /&gt;
&lt;br /&gt;
Réalisation de recherches sur leurs différentes utilisations.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/22''' &lt;br /&gt;
&lt;br /&gt;
Début de création du diagramme de Gantt .&lt;br /&gt;
&lt;br /&gt;
Réalisation d'une étude du besoin.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du marché : Recherche des robots similaires.&lt;br /&gt;
&lt;br /&gt;
Commencer à prendre en main le robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 22/03/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de l'étude de marché.&lt;br /&gt;
&lt;br /&gt;
Etude des opportunités.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 29/03/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'étude du marché.&lt;br /&gt;
&lt;br /&gt;
Commencer à rédiger le cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 05/04/22''' &lt;br /&gt;
&lt;br /&gt;
Commencer la rédaction du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 26/04/22''' &lt;br /&gt;
&lt;br /&gt;
Bilan du semestre.&lt;br /&gt;
&lt;br /&gt;
Etude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Etude des risques.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 03/05/22''' &lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude des risques.&lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Finalisation du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
== Semestre 7 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 10/10/22'''&lt;br /&gt;
&lt;br /&gt;
Commencement de l'étude technique des encodeurs . &lt;br /&gt;
Recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du changement de la carte arduino pour ajouter des nouvelles fonctionnalités : connexion Wifi, fréquence microprocesseur plus élevé,..&lt;br /&gt;
Test des encodeurs moteur DC : validé .&lt;br /&gt;
Poursuite de recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude de génération des signaux PWM&lt;br /&gt;
&lt;br /&gt;
Test sur Matlab Simulink des boucles d'asservissement issues des robots similaires .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/11/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation des signaux PWM du robot.&lt;br /&gt;
&lt;br /&gt;
Calcul de la fonction de transfert issue de la boucle.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/11/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du fonctionnement du gyroscope et des autres composants pour programmer le robot .  &lt;br /&gt;
&lt;br /&gt;
Séparation du travail a effectuer pour le robot entre une boucle du moteur DC(niveau 1) et une boucle du niveau supérieur(niveau 2) pour asservir l'angle d'inclinaison du robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/11/22''' &lt;br /&gt;
&lt;br /&gt;
Modification et amélioration du diagramme de Gantt pour le S7 et le S8.&lt;br /&gt;
&lt;br /&gt;
Avancée de la modélisation de la boucle du niveau 1 .&lt;br /&gt;
&lt;br /&gt;
Diagramme de Gantt S7-S8&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/11/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation de la boucle du niveau inférieur sur Matlab/Simulink et récupération des résultats sur le scope .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/12/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie informatique et avancement de la partie automatique .&lt;br /&gt;
Programmation de la liaison série pour débugger les sorties de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/12/22''' &lt;br /&gt;
&lt;br /&gt;
Début de rédaction du rapport pour le S7&lt;br /&gt;
&lt;br /&gt;
== Semestre 8 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/01/23''' &lt;br /&gt;
&lt;br /&gt;
Recherches pour le gyroscope . &lt;br /&gt;
Test des encodeurs .&lt;br /&gt;
Communication sur les attentes du semestre s8 ,les fautes à éviter pour rebondir par rapport au retard S7 &lt;br /&gt;
Mise à niveau pour comprendre les aspects techniques de la partie informatique pour pouvoir travailler ensemble sur les résultats du S8 .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/01/23''' &lt;br /&gt;
&lt;br /&gt;
- Suppression des structures de données pour avancer plus rapidement sur les résultats du semestre s8 .&lt;br /&gt;
&lt;br /&gt;
- Recherches pour la programmation des interruptions PCINT . &lt;br /&gt;
&lt;br /&gt;
- Recherche sur la doc technique pour faire l'initialisation des interruptions externes . &lt;br /&gt;
&lt;br /&gt;
- Recherche de la modélisation en 3D de notre robot pour trouver les paramètres PID de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/02/23''' &lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons :&lt;br /&gt;
&lt;br /&gt;
Modification du code des encodeurs et test sur les moteurs DC . &lt;br /&gt;
&lt;br /&gt;
Poursuite de recherche de l'existant pour trouver le code du gyroscope .&lt;br /&gt;
&lt;br /&gt;
Mise à jour du git .&lt;br /&gt;
&lt;br /&gt;
Début du calcul des matrices d'inertie de chaque solide.&lt;br /&gt;
&lt;br /&gt;
Recherche du code des régulateurs.&lt;br /&gt;
&lt;br /&gt;
Avancement sur la gestion de projet .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/02/23'''&lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons essayé de récupérer les résultats des tests électronique de l'oscilloscope effectués dans les salles d'électronique .&lt;br /&gt;
&lt;br /&gt;
Le code des encodeurs marchent ,la liaison série affiche exactement la vitesse de la consigne :les Régulateurs implémentés correspondent bien à notre applications.&lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation de la partie informatique du gyroscope : Objectif : récupération de l'angle d'inclinaison sur la liaison série avec la meilleure précision possible .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/02/23''' &lt;br /&gt;
&lt;br /&gt;
Fin du calcul des matrices d'inertie . &lt;br /&gt;
&lt;br /&gt;
Paramétrage de notre robot pour avoir la visibilité sur les configurations possibles d'avoir(en virage, ligne droite),en précisant les angles d'inclinaison et es repères associés . &lt;br /&gt;
&lt;br /&gt;
Poursuite de programmation des régulateurs par niveaux en utilisant le code précédemment implémenté pour les encodeurs .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/23''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation du modèle en 3D de notre robot pour essayer de l'autoéquilibrer en utilisant les PIDS issues de l'autotune par rapport à nos préférences(stabilité,temps de réponse,dépassement,précision). &lt;br /&gt;
&lt;br /&gt;
Nous avons testé le robot en l'alimentant par le biai la liaison USB ! et enregistrement des résultats .  &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie automatique en trouvant toutes les équations nécessaires à notre modèle .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/23''' &lt;br /&gt;
&lt;br /&gt;
Réalisations de cette séance :&lt;br /&gt;
&lt;br /&gt;
Test du robot pour se stabiliser sur le sol en applicant plusieurs . &lt;br /&gt;
&lt;br /&gt;
Faire tous les calculs des dimensions géométriques de notre robot et test de la boucle d'asservissement avec les deux niveaux sur Matlab Simulink avec nos préférences de stabilité, temps de réponse,précision,dépassement .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/23''' &lt;br /&gt;
&lt;br /&gt;
Absence justifiée .&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91442</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91442"/>
				<updated>2023-05-09T20:51:25Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : /* Angle */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Résumé'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
[[Fichier: SegwayRobot.jpg|200px|right|thumb|Exemple de robot similaire au notre]]&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
L'intégralité de notre programme est disponible sur le dépôt git à l'adresse: https://gitlab.com/remi_farault/self-balanced-robot&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Présentation générale'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==🌏Contexte==&lt;br /&gt;
Les moyens de transport actuels reposent principalement sur le principe du robot à deux roues, c'est la raison pour laquelle l'étude de celui ci s'avère importante, en effet l'étude   &lt;br /&gt;
de sa conception et son contrôle va nous permettre de développer des outils innovants qui pourraient potentiellement intéresser des sociétés de transport .&lt;br /&gt;
&lt;br /&gt;
==🎯Objectif==&lt;br /&gt;
&lt;br /&gt;
Notre objectif principal est de commander le robot, de là interviennent d'autres objectifs tel que la stabilité ,développer un code robuste qui assure cette fonctionnalité et aussi le contrôler pour réaliser des fonctionnalités de déplacement et d'éviter des obstacles . Des objectifs secondaires sont de créer un site web à travers lequel nous allons mener toutes les opérations de contrôle .&lt;br /&gt;
&lt;br /&gt;
==🔍Expression du besoin==&lt;br /&gt;
&lt;br /&gt;
Un robot autoéquilibré à deux roues est un type de robot qui peut se maintenir en équilibre sur deux roues sans tomber. Pour réaliser cette fonctionnalité, le robot utilise un ensemble de capteurs, d'algorithmes de contrôle et de moteurs pour ajuster sa position en temps réel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Self_balanc_bt.png|400px|Bete a corne SBR]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le diagramme interacteurs permet en fait de visualiser les fonctions services assurées par le système &lt;br /&gt;
&lt;br /&gt;
[[Fichier:341702419_560921119358434_1016673599353874396_n_(1).png|400px|DGI SBR]]    [[Fichier:Btacorne.png |500px|DGI SBR|right]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Réalisations et Résultats'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
[[Fichier: seg.jpg|200px|left|thumb|Exemple de commande désirée]]&lt;br /&gt;
&lt;br /&gt;
Après mis en place notre stratégie de gestion de projet en s6 à travers le diagramme de GANTT et le cahier de charges fonctionnels, nous nous sommes focalisés sur l'étude technique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: progg.png|300px|right|thumb|Organisation de notre programme]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, étudier à travers des outils automatiques la stabilité du robot en faisant appel à des modèles théoriques et pratiques et commencer par un raisonnement par niveaux, d'abord le niveau 1 du moteur à courant continu et les équations correspondantes puis le niveau 2 assurant la stabilité du robot directement, on avait la possibilité de passer directement au niveau 2 à travers le modèle du pendule inversé et les équations qui en découlent sauf que celui-ci ne nous permettra pas de revenir au niveau 1 et asservir le moteur à travers les codeurs incrémentales ,la deuxième partie consistait à réaliser les codes informatiques en s'appuyant sur les structures de données en C vues l'année dernière et conduire un même raisonnement(par niveaux) s'appuyant d'abord sur les codes sources correspondants à la génération d'un signal PWM pour les deux moteurs avec un rapport cyclique modifiable, et aussi les codes sources correspondants à la gestion des moteurs, en effet, ceux-ci tournent  dans un sens ou dans un autre ou ne tournent pas en fonction de la variable in1 et in2  pour faire tourner les moteurs .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Avr.png|100px|left|thumb|Compilateur utilisé]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cependant, nous avons rencontré quelques problèmes en automatique notamment pour trouver des valeurs des constantes théoriques pour les références du moteur entre les mains, ce qui nous a obligé à prendre des valeurs issues d'autres applications, nous avons rencontré aussi quelques problèmes choisir une modélisation parmi celles qui sont disponibles sur Internet .&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Etude Automatique'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Avant de programmer notre système sur la carte Arduino, nous avons également créé une simulation complète de notre système robotisé sur SIMULINK. Cependant, avant cela, nous avons dû déterminer les équations qui régissent notre système en trouvant les matrices d'inertie de chaque composant de notre robot, à savoir la masse transportée par le robot (M), le châssis constitué de deux plateaux et de la motorisation (les piliers et leur inertie ont été négligés car leur masse est très faible), ainsi que les roues (roue droite et roue gauche). Vous trouverez ci-dessous les matrices d'inertie que nous avons obtenues pour chaque composant.&lt;br /&gt;
&lt;br /&gt;
'''Masse M :'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatM.png|200px|thumb|left|Matrice de la masse M]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients seront notés dans la suite pour simplifier : AM,BM,CM &lt;br /&gt;
&lt;br /&gt;
'''Chassis:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatB.png|800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AH,BH,CH &lt;br /&gt;
&lt;br /&gt;
'''Roue gauche:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrg.png |600px|Matrice de RG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
'''Roue droite:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrd.png |600px|Matrice RD]]&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
Ci-dessous un paramétrage de notre système : Chaque angle détermine un repère&lt;br /&gt;
&lt;br /&gt;
Le repère R0 est supposé galliléen.&lt;br /&gt;
&lt;br /&gt;
Le repère R1 est en rotation  ,appelé angle de virage par rapport à R0.&lt;br /&gt;
&lt;br /&gt;
Le repère R2 est en rotation  ,appelé angle d’inclinaison du châssis par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R3 est en rotation  ,appelé angle d’inclinaison arrière-avant de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R4 est en rotation ,appelé angle d’inclinaison droite-gauche de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:param.png |800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
l’angle de consigne est de 0deg,nous employons un PID pour corriger l’angle de mesure,à sa sortie,on aura une tension W(p).Les blocs Km et W(p) assurent le passage tension-&amp;gt;couple-&amp;gt;angle ,il faut ensuite retirer  pour ne garder que l’angle d’inclinaison du châssis  .Km=0.0125N.m.V-1(d’après la datasheet du moteur)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bcle.png |800px|Asservissement]]                                                             [[Fichier:Matuu.png|right|800px|Asservissement]]      &lt;br /&gt;
&lt;br /&gt;
Les équations obtenues sont les suivantes (Le détail des calculs a été précisé dans le Rapport): &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eq nnlin.png |500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après linéarisation : Considérer l'approximations des petits angles pour le sinus et cosinus,et négliger aussi la vitesse angulaire quadratique devant la vitesse angulaire,nous obtenons : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eqlin.png |300px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crbe.png|600px|Courbe]]&lt;br /&gt;
&lt;br /&gt;
On obtient une courbe avec un bon temps de réponse, un léger dépassement et une stabilité .Le système est régulé de manière efficace, capable de répondre rapidement et précisément aux perturbations tout en maintenant une position d'équilibre stable.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mat3d.png|500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Environnement de developpement'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Notre microcontrolleur étant une Arduino Uno, nous aurions pu utiliser le framework ''Arduino'' donnant accès à un IDE intégrant les outils pour compiler et flasher le code, ainsi qu'une multitude de bibliothèques haut niveaux très simples d'utilisation et plutôt performantes, permettant de programmer notre robot en simplement quelques dizaines de lignes de code.&lt;br /&gt;
&lt;br /&gt;
Cependant, l'Arduino est simplement une carte de prototypage intégrant un microcontrôleur ''AVR Atmega 328p''. &lt;br /&gt;
Les microcontroleurs AVR disposent d'une grande communauté, et il existe de nombreux outils nécessaires au developpement sur ces cartes.&lt;br /&gt;
Afin d'avoir un meilleur contrôle sur notre projet, et surtout d'en tirer un maximum de compétences, nous avons donc décidés de programmer notre robot directement en C en utilisant les outils AVR:&lt;br /&gt;
&lt;br /&gt;
- '''avr-gcc''': compilateur open-source portant toutes les fonctionnalités du langage C standard sur les microcontroleurs AVR.&lt;br /&gt;
Seul, son utilisation est quasiment impossible et demande trop de travail en programmation bas-niveau.&lt;br /&gt;
&lt;br /&gt;
- '''avr-libc''': implémentation basé sur le compilateur avr-gcc de la bibliothèque standard du langage C.&lt;br /&gt;
Cette bibliothèque permet donc d'utiliser les fonctions et structures standards du C (IO, maths, chaines de caractères), mais elle intègre également un mapping mémoire de tous les registres de l'atmega, ainsi qu'un mécanisme pour programmer des interruptions.&lt;br /&gt;
&lt;br /&gt;
- '''avr-objcopy''': ce programme en ligne de commande formate le binaire obtenu en format utilisable par les AVR&lt;br /&gt;
&lt;br /&gt;
- '''avr-dude''': ce programme en ligne de commande permet de flasher via une interface USB-série un microcontroleur AVR présent sur une carte Arduino.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc developpé un '''Makefile''' utilisant tous ces outils, constituant un environnement de developpement très efficace pour notre projet. Ce Makefile est disponible sur notre gitlab.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Programme du robot'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''PWM'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
La première étape consistait à commander nos moteurs DC, afin de poser les bases de notre&lt;br /&gt;
asservissement bas niveau. Ces moteurs sont contrôlés par le driver de moteurs, utilisant des signaux logiques pour définir l’état d’un moteur et des signaux '''PWM''' pour définir la vitesse de&lt;br /&gt;
rotation. La génération de signaux PWM sur AVR se fait en utilisant les '''timers''' en mode PWM.&lt;br /&gt;
Tout simplement, nous avons un registre compteur 16 bits incrémenté périodiquement, et une valeur&lt;br /&gt;
maximale définie par le registre ''ICRx''. Nous utilisons ensuite les registres ''OCRnx'' contenant une&lt;br /&gt;
valeur inférieure au maximum. &lt;br /&gt;
Lorsque le compteur atteint la valeur contenue dans OCRnx, il&lt;br /&gt;
inverse la valeur logique de sortie du pin ''OCnx''. Ainsi, nous pouvons modifier instantanément la&lt;br /&gt;
valeur d’OCRnx afin de modifier le rapport cyclique de notre signal. Ce rapport cyclique est ensuite&lt;br /&gt;
directement proportionnel à la vitesse de rotation du moteur associé. &lt;br /&gt;
La fréquence du signal est définie par la période d’incrémentation du compteur et par la valeur maximale ICRx.&lt;br /&gt;
Pour notre composant, nous pouvions utiliser une fréquence allant jusqu’à plusieurs kHz. Cette&lt;br /&gt;
fréquence n’a aucun impact sur la rotation du moteur. Nous avons donc choisis 20 kHz.&lt;br /&gt;
Nous avons définis la '''init_pwm''' pour configurer les registres nécessaires, et la fonction&lt;br /&gt;
'''generate_pwm''' pour modifier le rapport cyclique de nos deux signaux PWM avec la valeur&lt;br /&gt;
souhaitée.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Encodeurs'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Une fois nos moteurs pouvant tourner à une vitesse voulue, nous avons du trouver un moyen de&lt;br /&gt;
mesurer leurs vitesses effectives afin de réaliser une boucle d’asservissement. Pour cela, nous avons&lt;br /&gt;
utilisés les encodeurs optiques disponibles sur nos moteurs DC. &lt;br /&gt;
Ces encodeurs envoient sur leur broches un front-montant à chaque tour de la roue codeuse reliée au moteurs (ayant une vitesse&lt;br /&gt;
proportionnelle à celle du moteur). En détectant ces fronts montant, nous pouvons donc compter le&lt;br /&gt;
nombre de tours du moteur pendant un intervalle de temps défini, puis déterminer la vitesse réelle&lt;br /&gt;
du moteur.&lt;br /&gt;
Pour détecter les fronts montant, nous utilisons l’interface '''Pin Change Interrupt''' de l’Atmega. Cette&lt;br /&gt;
interface exécute une interruption logicielle à chaque changement d’état logique du pin associé.&lt;br /&gt;
Dans notre cas, nous devons ensuite observé l’état précédent de la sortie et l’état actuel pour&lt;br /&gt;
déterminer si on est bien en présence d’un front montant. Une fois le front montant détecté, cette&lt;br /&gt;
interruption incrémente ensuite le compteur de tours.&lt;br /&gt;
Ce compteur est ensuite utilisé pour calculer la vitesse de rotation puis remis à zéro pour la mesure&lt;br /&gt;
suivante.&lt;br /&gt;
Dans notre cas, nous réalisons cette mesure à une fréquence d’environ 244 Hz, dans une autre&lt;br /&gt;
fonction d’interruption qu’on détaillera plus loin.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Angle'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Notre boucle de régulation principale a besoin d’une mesure de l’angle d’inclinaison du robot sur&lt;br /&gt;
son axe vertical perpendiculaire à celui de déplacement. Cette mesure s’effectue via le '''MPU6050'''.&lt;br /&gt;
Ce composant fonctionne via le protocole '''i2c''', protocole de communication simple utilisé par la&lt;br /&gt;
plupart des systèmes électroniques. Ce protocole étant bas niveau, il existe de nombreuses&lt;br /&gt;
bibliothèques implémentés en C permettant son utilisation. De plus, le MPU6050 est un composant&lt;br /&gt;
très complet et complexe, afin d’en récupérer l’angle, il faut d’abord amorcer une communication&lt;br /&gt;
i2c puis configurer certains des ses registres, afin ensuite de pouvoir lire les registres contenant la&lt;br /&gt;
mesure de l’angle selon l’axe désiré. Afin de conserver un code efficace et concis, nous avons&lt;br /&gt;
également décidés d’utiliser une bibliothèque faisant office de « '''driver''' » pour ce composant,&lt;br /&gt;
intégrant des fonctions d’initialisation et de lecture des mesures faites par ce gyroscope.&lt;br /&gt;
Nous obtenons donc la valeur de l’angle en degrés, comprise entre 0 et 360.Dans notre cas, nous souhaitions obtenir une valeur comprise entre -180 et 180, car seule la valeur&lt;br /&gt;
absolue et le sens de l’inclinaison nous intéresse, nous avons donc appliqués une correction de cette&lt;br /&gt;
valeur.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Interruption principale'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Bilan'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 6 :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 7 :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 8 :'''&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Gestion de projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
- L'utilisation de git : &lt;br /&gt;
[[Fichier:Gt.png|400px|thumb|left|texte descriptif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Semestre 6 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/22''' &lt;br /&gt;
&lt;br /&gt;
Séance de découverte du sujet de notre projet.&lt;br /&gt;
&lt;br /&gt;
Recherche de l'existant &lt;br /&gt;
&lt;br /&gt;
Réalisation de recherches sur leurs différentes utilisations.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/22''' &lt;br /&gt;
&lt;br /&gt;
Début de création du diagramme de Gantt .&lt;br /&gt;
&lt;br /&gt;
Réalisation d'une étude du besoin.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du marché : Recherche des robots similaires.&lt;br /&gt;
&lt;br /&gt;
Commencer à prendre en main le robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 22/03/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de l'étude de marché.&lt;br /&gt;
&lt;br /&gt;
Etude des opportunités.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 29/03/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'étude du marché.&lt;br /&gt;
&lt;br /&gt;
Commencer à rédiger le cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 05/04/22''' &lt;br /&gt;
&lt;br /&gt;
Commencer la rédaction du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 26/04/22''' &lt;br /&gt;
&lt;br /&gt;
Bilan du semestre.&lt;br /&gt;
&lt;br /&gt;
Etude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Etude des risques.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 03/05/22''' &lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude des risques.&lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Finalisation du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
== Semestre 7 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 10/10/22'''&lt;br /&gt;
&lt;br /&gt;
Commencement de l'étude technique des encodeurs . &lt;br /&gt;
Recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du changement de la carte arduino pour ajouter des nouvelles fonctionnalités : connexion Wifi, fréquence microprocesseur plus élevé,..&lt;br /&gt;
Test des encodeurs moteur DC : validé .&lt;br /&gt;
Poursuite de recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude de génération des signaux PWM&lt;br /&gt;
&lt;br /&gt;
Test sur Matlab Simulink des boucles d'asservissement issues des robots similaires .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/11/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation des signaux PWM du robot.&lt;br /&gt;
&lt;br /&gt;
Calcul de la fonction de transfert issue de la boucle.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/11/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du fonctionnement du gyroscope et des autres composants pour programmer le robot .  &lt;br /&gt;
&lt;br /&gt;
Séparation du travail a effectuer pour le robot entre une boucle du moteur DC(niveau 1) et une boucle du niveau supérieur(niveau 2) pour asservir l'angle d'inclinaison du robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/11/22''' &lt;br /&gt;
&lt;br /&gt;
Modification et amélioration du diagramme de Gantt pour le S7 et le S8.&lt;br /&gt;
&lt;br /&gt;
Avancée de la modélisation de la boucle du niveau 1 .&lt;br /&gt;
&lt;br /&gt;
Diagramme de Gantt S7-S8&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/11/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation de la boucle du niveau inférieur sur Matlab/Simulink et récupération des résultats sur le scope .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/12/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie informatique et avancement de la partie automatique .&lt;br /&gt;
Programmation de la liaison série pour débugger les sorties de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/12/22''' &lt;br /&gt;
&lt;br /&gt;
Début de rédaction du rapport pour le S7&lt;br /&gt;
&lt;br /&gt;
== Semestre 8 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/01/23''' &lt;br /&gt;
&lt;br /&gt;
Recherches pour le gyroscope . &lt;br /&gt;
Test des encodeurs .&lt;br /&gt;
Communication sur les attentes du semestre s8 ,les fautes à éviter pour rebondir par rapport au retard S7 &lt;br /&gt;
Mise à niveau pour comprendre les aspects techniques de la partie informatique pour pouvoir travailler ensemble sur les résultats du S8 .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/01/23''' &lt;br /&gt;
&lt;br /&gt;
- Suppression des structures de données pour avancer plus rapidement sur les résultats du semestre s8 .&lt;br /&gt;
&lt;br /&gt;
- Recherches pour la programmation des interruptions PCINT . &lt;br /&gt;
&lt;br /&gt;
- Recherche sur la doc technique pour faire l'initialisation des interruptions externes . &lt;br /&gt;
&lt;br /&gt;
- Recherche de la modélisation en 3D de notre robot pour trouver les paramètres PID de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/02/23''' &lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons :&lt;br /&gt;
&lt;br /&gt;
Modification du code des encodeurs et test sur les moteurs DC . &lt;br /&gt;
&lt;br /&gt;
Poursuite de recherche de l'existant pour trouver le code du gyroscope .&lt;br /&gt;
&lt;br /&gt;
Mise à jour du git .&lt;br /&gt;
&lt;br /&gt;
Début du calcul des matrices d'inertie de chaque solide.&lt;br /&gt;
&lt;br /&gt;
Recherche du code des régulateurs.&lt;br /&gt;
&lt;br /&gt;
Avancement sur la gestion de projet .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/02/23'''&lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons essayé de récupérer les résultats des tests électronique de l'oscilloscope effectués dans les salles d'électronique .&lt;br /&gt;
&lt;br /&gt;
Le code des encodeurs marchent ,la liaison série affiche exactement la vitesse de la consigne :les Régulateurs implémentés correspondent bien à notre applications.&lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation de la partie informatique du gyroscope : Objectif : récupération de l'angle d'inclinaison sur la liaison série avec la meilleure précision possible .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/02/23''' &lt;br /&gt;
&lt;br /&gt;
Fin du calcul des matrices d'inertie . &lt;br /&gt;
&lt;br /&gt;
Paramétrage de notre robot pour avoir la visibilité sur les configurations possibles d'avoir(en virage, ligne droite),en précisant les angles d'inclinaison et es repères associés . &lt;br /&gt;
&lt;br /&gt;
Poursuite de programmation des régulateurs par niveaux en utilisant le code précédemment implémenté pour les encodeurs .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/23''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation du modèle en 3D de notre robot pour essayer de l'autoéquilibrer en utilisant les PIDS issues de l'autotune par rapport à nos préférences(stabilité,temps de réponse,dépassement,précision). &lt;br /&gt;
&lt;br /&gt;
Nous avons testé le robot en l'alimentant par le biai la liaison USB ! et enregistrement des résultats .  &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie automatique en trouvant toutes les équations nécessaires à notre modèle .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/23''' &lt;br /&gt;
&lt;br /&gt;
Réalisations de cette séance :&lt;br /&gt;
&lt;br /&gt;
Test du robot pour se stabiliser sur le sol en applicant plusieurs . &lt;br /&gt;
&lt;br /&gt;
Faire tous les calculs des dimensions géométriques de notre robot et test de la boucle d'asservissement avec les deux niveaux sur Matlab Simulink avec nos préférences de stabilité, temps de réponse,précision,dépassement .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/23''' &lt;br /&gt;
&lt;br /&gt;
Absence justifiée .&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91441</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91441"/>
				<updated>2023-05-09T20:50:35Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : /* Encodeurs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Résumé'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
[[Fichier: SegwayRobot.jpg|200px|right|thumb|Exemple de robot similaire au notre]]&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
L'intégralité de notre programme est disponible sur le dépôt git à l'adresse: https://gitlab.com/remi_farault/self-balanced-robot&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Présentation générale'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==🌏Contexte==&lt;br /&gt;
Les moyens de transport actuels reposent principalement sur le principe du robot à deux roues, c'est la raison pour laquelle l'étude de celui ci s'avère importante, en effet l'étude   &lt;br /&gt;
de sa conception et son contrôle va nous permettre de développer des outils innovants qui pourraient potentiellement intéresser des sociétés de transport .&lt;br /&gt;
&lt;br /&gt;
==🎯Objectif==&lt;br /&gt;
&lt;br /&gt;
Notre objectif principal est de commander le robot, de là interviennent d'autres objectifs tel que la stabilité ,développer un code robuste qui assure cette fonctionnalité et aussi le contrôler pour réaliser des fonctionnalités de déplacement et d'éviter des obstacles . Des objectifs secondaires sont de créer un site web à travers lequel nous allons mener toutes les opérations de contrôle .&lt;br /&gt;
&lt;br /&gt;
==🔍Expression du besoin==&lt;br /&gt;
&lt;br /&gt;
Un robot autoéquilibré à deux roues est un type de robot qui peut se maintenir en équilibre sur deux roues sans tomber. Pour réaliser cette fonctionnalité, le robot utilise un ensemble de capteurs, d'algorithmes de contrôle et de moteurs pour ajuster sa position en temps réel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Self_balanc_bt.png|400px|Bete a corne SBR]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le diagramme interacteurs permet en fait de visualiser les fonctions services assurées par le système &lt;br /&gt;
&lt;br /&gt;
[[Fichier:341702419_560921119358434_1016673599353874396_n_(1).png|400px|DGI SBR]]    [[Fichier:Btacorne.png |500px|DGI SBR|right]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Réalisations et Résultats'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
[[Fichier: seg.jpg|200px|left|thumb|Exemple de commande désirée]]&lt;br /&gt;
&lt;br /&gt;
Après mis en place notre stratégie de gestion de projet en s6 à travers le diagramme de GANTT et le cahier de charges fonctionnels, nous nous sommes focalisés sur l'étude technique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: progg.png|300px|right|thumb|Organisation de notre programme]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, étudier à travers des outils automatiques la stabilité du robot en faisant appel à des modèles théoriques et pratiques et commencer par un raisonnement par niveaux, d'abord le niveau 1 du moteur à courant continu et les équations correspondantes puis le niveau 2 assurant la stabilité du robot directement, on avait la possibilité de passer directement au niveau 2 à travers le modèle du pendule inversé et les équations qui en découlent sauf que celui-ci ne nous permettra pas de revenir au niveau 1 et asservir le moteur à travers les codeurs incrémentales ,la deuxième partie consistait à réaliser les codes informatiques en s'appuyant sur les structures de données en C vues l'année dernière et conduire un même raisonnement(par niveaux) s'appuyant d'abord sur les codes sources correspondants à la génération d'un signal PWM pour les deux moteurs avec un rapport cyclique modifiable, et aussi les codes sources correspondants à la gestion des moteurs, en effet, ceux-ci tournent  dans un sens ou dans un autre ou ne tournent pas en fonction de la variable in1 et in2  pour faire tourner les moteurs .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Avr.png|100px|left|thumb|Compilateur utilisé]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cependant, nous avons rencontré quelques problèmes en automatique notamment pour trouver des valeurs des constantes théoriques pour les références du moteur entre les mains, ce qui nous a obligé à prendre des valeurs issues d'autres applications, nous avons rencontré aussi quelques problèmes choisir une modélisation parmi celles qui sont disponibles sur Internet .&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Etude Automatique'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Avant de programmer notre système sur la carte Arduino, nous avons également créé une simulation complète de notre système robotisé sur SIMULINK. Cependant, avant cela, nous avons dû déterminer les équations qui régissent notre système en trouvant les matrices d'inertie de chaque composant de notre robot, à savoir la masse transportée par le robot (M), le châssis constitué de deux plateaux et de la motorisation (les piliers et leur inertie ont été négligés car leur masse est très faible), ainsi que les roues (roue droite et roue gauche). Vous trouverez ci-dessous les matrices d'inertie que nous avons obtenues pour chaque composant.&lt;br /&gt;
&lt;br /&gt;
'''Masse M :'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatM.png|200px|thumb|left|Matrice de la masse M]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients seront notés dans la suite pour simplifier : AM,BM,CM &lt;br /&gt;
&lt;br /&gt;
'''Chassis:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatB.png|800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AH,BH,CH &lt;br /&gt;
&lt;br /&gt;
'''Roue gauche:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrg.png |600px|Matrice de RG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
'''Roue droite:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrd.png |600px|Matrice RD]]&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
Ci-dessous un paramétrage de notre système : Chaque angle détermine un repère&lt;br /&gt;
&lt;br /&gt;
Le repère R0 est supposé galliléen.&lt;br /&gt;
&lt;br /&gt;
Le repère R1 est en rotation  ,appelé angle de virage par rapport à R0.&lt;br /&gt;
&lt;br /&gt;
Le repère R2 est en rotation  ,appelé angle d’inclinaison du châssis par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R3 est en rotation  ,appelé angle d’inclinaison arrière-avant de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R4 est en rotation ,appelé angle d’inclinaison droite-gauche de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:param.png |800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
l’angle de consigne est de 0deg,nous employons un PID pour corriger l’angle de mesure,à sa sortie,on aura une tension W(p).Les blocs Km et W(p) assurent le passage tension-&amp;gt;couple-&amp;gt;angle ,il faut ensuite retirer  pour ne garder que l’angle d’inclinaison du châssis  .Km=0.0125N.m.V-1(d’après la datasheet du moteur)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bcle.png |800px|Asservissement]]                                                             [[Fichier:Matuu.png|right|800px|Asservissement]]      &lt;br /&gt;
&lt;br /&gt;
Les équations obtenues sont les suivantes (Le détail des calculs a été précisé dans le Rapport): &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eq nnlin.png |500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après linéarisation : Considérer l'approximations des petits angles pour le sinus et cosinus,et négliger aussi la vitesse angulaire quadratique devant la vitesse angulaire,nous obtenons : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eqlin.png |300px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crbe.png|600px|Courbe]]&lt;br /&gt;
&lt;br /&gt;
On obtient une courbe avec un bon temps de réponse, un léger dépassement et une stabilité .Le système est régulé de manière efficace, capable de répondre rapidement et précisément aux perturbations tout en maintenant une position d'équilibre stable.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mat3d.png|500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Environnement de developpement'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Notre microcontrolleur étant une Arduino Uno, nous aurions pu utiliser le framework ''Arduino'' donnant accès à un IDE intégrant les outils pour compiler et flasher le code, ainsi qu'une multitude de bibliothèques haut niveaux très simples d'utilisation et plutôt performantes, permettant de programmer notre robot en simplement quelques dizaines de lignes de code.&lt;br /&gt;
&lt;br /&gt;
Cependant, l'Arduino est simplement une carte de prototypage intégrant un microcontrôleur ''AVR Atmega 328p''. &lt;br /&gt;
Les microcontroleurs AVR disposent d'une grande communauté, et il existe de nombreux outils nécessaires au developpement sur ces cartes.&lt;br /&gt;
Afin d'avoir un meilleur contrôle sur notre projet, et surtout d'en tirer un maximum de compétences, nous avons donc décidés de programmer notre robot directement en C en utilisant les outils AVR:&lt;br /&gt;
&lt;br /&gt;
- '''avr-gcc''': compilateur open-source portant toutes les fonctionnalités du langage C standard sur les microcontroleurs AVR.&lt;br /&gt;
Seul, son utilisation est quasiment impossible et demande trop de travail en programmation bas-niveau.&lt;br /&gt;
&lt;br /&gt;
- '''avr-libc''': implémentation basé sur le compilateur avr-gcc de la bibliothèque standard du langage C.&lt;br /&gt;
Cette bibliothèque permet donc d'utiliser les fonctions et structures standards du C (IO, maths, chaines de caractères), mais elle intègre également un mapping mémoire de tous les registres de l'atmega, ainsi qu'un mécanisme pour programmer des interruptions.&lt;br /&gt;
&lt;br /&gt;
- '''avr-objcopy''': ce programme en ligne de commande formate le binaire obtenu en format utilisable par les AVR&lt;br /&gt;
&lt;br /&gt;
- '''avr-dude''': ce programme en ligne de commande permet de flasher via une interface USB-série un microcontroleur AVR présent sur une carte Arduino.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc developpé un '''Makefile''' utilisant tous ces outils, constituant un environnement de developpement très efficace pour notre projet. Ce Makefile est disponible sur notre gitlab.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Programme du robot'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''PWM'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
La première étape consistait à commander nos moteurs DC, afin de poser les bases de notre&lt;br /&gt;
asservissement bas niveau. Ces moteurs sont contrôlés par le driver de moteurs, utilisant des signaux logiques pour définir l’état d’un moteur et des signaux '''PWM''' pour définir la vitesse de&lt;br /&gt;
rotation. La génération de signaux PWM sur AVR se fait en utilisant les '''timers''' en mode PWM.&lt;br /&gt;
Tout simplement, nous avons un registre compteur 16 bits incrémenté périodiquement, et une valeur&lt;br /&gt;
maximale définie par le registre ''ICRx''. Nous utilisons ensuite les registres ''OCRnx'' contenant une&lt;br /&gt;
valeur inférieure au maximum. &lt;br /&gt;
Lorsque le compteur atteint la valeur contenue dans OCRnx, il&lt;br /&gt;
inverse la valeur logique de sortie du pin ''OCnx''. Ainsi, nous pouvons modifier instantanément la&lt;br /&gt;
valeur d’OCRnx afin de modifier le rapport cyclique de notre signal. Ce rapport cyclique est ensuite&lt;br /&gt;
directement proportionnel à la vitesse de rotation du moteur associé. &lt;br /&gt;
La fréquence du signal est définie par la période d’incrémentation du compteur et par la valeur maximale ICRx.&lt;br /&gt;
Pour notre composant, nous pouvions utiliser une fréquence allant jusqu’à plusieurs kHz. Cette&lt;br /&gt;
fréquence n’a aucun impact sur la rotation du moteur. Nous avons donc choisis 20 kHz.&lt;br /&gt;
Nous avons définis la '''init_pwm''' pour configurer les registres nécessaires, et la fonction&lt;br /&gt;
'''generate_pwm''' pour modifier le rapport cyclique de nos deux signaux PWM avec la valeur&lt;br /&gt;
souhaitée.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Encodeurs'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Une fois nos moteurs pouvant tourner à une vitesse voulue, nous avons du trouver un moyen de&lt;br /&gt;
mesurer leurs vitesses effectives afin de réaliser une boucle d’asservissement. Pour cela, nous avons&lt;br /&gt;
utilisés les encodeurs optiques disponibles sur nos moteurs DC. &lt;br /&gt;
Ces encodeurs envoient sur leur broches un front-montant à chaque tour de la roue codeuse reliée au moteurs (ayant une vitesse&lt;br /&gt;
proportionnelle à celle du moteur). En détectant ces fronts montant, nous pouvons donc compter le&lt;br /&gt;
nombre de tours du moteur pendant un intervalle de temps défini, puis déterminer la vitesse réelle&lt;br /&gt;
du moteur.&lt;br /&gt;
Pour détecter les fronts montant, nous utilisons l’interface '''Pin Change Interrupt''' de l’Atmega. Cette&lt;br /&gt;
interface exécute une interruption logicielle à chaque changement d’état logique du pin associé.&lt;br /&gt;
Dans notre cas, nous devons ensuite observé l’état précédent de la sortie et l’état actuel pour&lt;br /&gt;
déterminer si on est bien en présence d’un front montant. Une fois le front montant détecté, cette&lt;br /&gt;
interruption incrémente ensuite le compteur de tours.&lt;br /&gt;
Ce compteur est ensuite utilisé pour calculer la vitesse de rotation puis remis à zéro pour la mesure&lt;br /&gt;
suivante.&lt;br /&gt;
Dans notre cas, nous réalisons cette mesure à une fréquence d’environ 244 Hz, dans une autre&lt;br /&gt;
fonction d’interruption qu’on détaillera plus loin.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Angle'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Interruption principale'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Bilan'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 6 :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 7 :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 8 :'''&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Gestion de projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
- L'utilisation de git : &lt;br /&gt;
[[Fichier:Gt.png|400px|thumb|left|texte descriptif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Semestre 6 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/22''' &lt;br /&gt;
&lt;br /&gt;
Séance de découverte du sujet de notre projet.&lt;br /&gt;
&lt;br /&gt;
Recherche de l'existant &lt;br /&gt;
&lt;br /&gt;
Réalisation de recherches sur leurs différentes utilisations.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/22''' &lt;br /&gt;
&lt;br /&gt;
Début de création du diagramme de Gantt .&lt;br /&gt;
&lt;br /&gt;
Réalisation d'une étude du besoin.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du marché : Recherche des robots similaires.&lt;br /&gt;
&lt;br /&gt;
Commencer à prendre en main le robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 22/03/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de l'étude de marché.&lt;br /&gt;
&lt;br /&gt;
Etude des opportunités.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 29/03/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'étude du marché.&lt;br /&gt;
&lt;br /&gt;
Commencer à rédiger le cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 05/04/22''' &lt;br /&gt;
&lt;br /&gt;
Commencer la rédaction du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 26/04/22''' &lt;br /&gt;
&lt;br /&gt;
Bilan du semestre.&lt;br /&gt;
&lt;br /&gt;
Etude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Etude des risques.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 03/05/22''' &lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude des risques.&lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Finalisation du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
== Semestre 7 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 10/10/22'''&lt;br /&gt;
&lt;br /&gt;
Commencement de l'étude technique des encodeurs . &lt;br /&gt;
Recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du changement de la carte arduino pour ajouter des nouvelles fonctionnalités : connexion Wifi, fréquence microprocesseur plus élevé,..&lt;br /&gt;
Test des encodeurs moteur DC : validé .&lt;br /&gt;
Poursuite de recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude de génération des signaux PWM&lt;br /&gt;
&lt;br /&gt;
Test sur Matlab Simulink des boucles d'asservissement issues des robots similaires .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/11/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation des signaux PWM du robot.&lt;br /&gt;
&lt;br /&gt;
Calcul de la fonction de transfert issue de la boucle.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/11/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du fonctionnement du gyroscope et des autres composants pour programmer le robot .  &lt;br /&gt;
&lt;br /&gt;
Séparation du travail a effectuer pour le robot entre une boucle du moteur DC(niveau 1) et une boucle du niveau supérieur(niveau 2) pour asservir l'angle d'inclinaison du robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/11/22''' &lt;br /&gt;
&lt;br /&gt;
Modification et amélioration du diagramme de Gantt pour le S7 et le S8.&lt;br /&gt;
&lt;br /&gt;
Avancée de la modélisation de la boucle du niveau 1 .&lt;br /&gt;
&lt;br /&gt;
Diagramme de Gantt S7-S8&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/11/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation de la boucle du niveau inférieur sur Matlab/Simulink et récupération des résultats sur le scope .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/12/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie informatique et avancement de la partie automatique .&lt;br /&gt;
Programmation de la liaison série pour débugger les sorties de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/12/22''' &lt;br /&gt;
&lt;br /&gt;
Début de rédaction du rapport pour le S7&lt;br /&gt;
&lt;br /&gt;
== Semestre 8 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/01/23''' &lt;br /&gt;
&lt;br /&gt;
Recherches pour le gyroscope . &lt;br /&gt;
Test des encodeurs .&lt;br /&gt;
Communication sur les attentes du semestre s8 ,les fautes à éviter pour rebondir par rapport au retard S7 &lt;br /&gt;
Mise à niveau pour comprendre les aspects techniques de la partie informatique pour pouvoir travailler ensemble sur les résultats du S8 .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/01/23''' &lt;br /&gt;
&lt;br /&gt;
- Suppression des structures de données pour avancer plus rapidement sur les résultats du semestre s8 .&lt;br /&gt;
&lt;br /&gt;
- Recherches pour la programmation des interruptions PCINT . &lt;br /&gt;
&lt;br /&gt;
- Recherche sur la doc technique pour faire l'initialisation des interruptions externes . &lt;br /&gt;
&lt;br /&gt;
- Recherche de la modélisation en 3D de notre robot pour trouver les paramètres PID de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/02/23''' &lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons :&lt;br /&gt;
&lt;br /&gt;
Modification du code des encodeurs et test sur les moteurs DC . &lt;br /&gt;
&lt;br /&gt;
Poursuite de recherche de l'existant pour trouver le code du gyroscope .&lt;br /&gt;
&lt;br /&gt;
Mise à jour du git .&lt;br /&gt;
&lt;br /&gt;
Début du calcul des matrices d'inertie de chaque solide.&lt;br /&gt;
&lt;br /&gt;
Recherche du code des régulateurs.&lt;br /&gt;
&lt;br /&gt;
Avancement sur la gestion de projet .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/02/23'''&lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons essayé de récupérer les résultats des tests électronique de l'oscilloscope effectués dans les salles d'électronique .&lt;br /&gt;
&lt;br /&gt;
Le code des encodeurs marchent ,la liaison série affiche exactement la vitesse de la consigne :les Régulateurs implémentés correspondent bien à notre applications.&lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation de la partie informatique du gyroscope : Objectif : récupération de l'angle d'inclinaison sur la liaison série avec la meilleure précision possible .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/02/23''' &lt;br /&gt;
&lt;br /&gt;
Fin du calcul des matrices d'inertie . &lt;br /&gt;
&lt;br /&gt;
Paramétrage de notre robot pour avoir la visibilité sur les configurations possibles d'avoir(en virage, ligne droite),en précisant les angles d'inclinaison et es repères associés . &lt;br /&gt;
&lt;br /&gt;
Poursuite de programmation des régulateurs par niveaux en utilisant le code précédemment implémenté pour les encodeurs .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/23''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation du modèle en 3D de notre robot pour essayer de l'autoéquilibrer en utilisant les PIDS issues de l'autotune par rapport à nos préférences(stabilité,temps de réponse,dépassement,précision). &lt;br /&gt;
&lt;br /&gt;
Nous avons testé le robot en l'alimentant par le biai la liaison USB ! et enregistrement des résultats .  &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie automatique en trouvant toutes les équations nécessaires à notre modèle .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/23''' &lt;br /&gt;
&lt;br /&gt;
Réalisations de cette séance :&lt;br /&gt;
&lt;br /&gt;
Test du robot pour se stabiliser sur le sol en applicant plusieurs . &lt;br /&gt;
&lt;br /&gt;
Faire tous les calculs des dimensions géométriques de notre robot et test de la boucle d'asservissement avec les deux niveaux sur Matlab Simulink avec nos préférences de stabilité, temps de réponse,précision,dépassement .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/23''' &lt;br /&gt;
&lt;br /&gt;
Absence justifiée .&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91440</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91440"/>
				<updated>2023-05-09T20:49:45Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : /* PWM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Résumé'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
[[Fichier: SegwayRobot.jpg|200px|right|thumb|Exemple de robot similaire au notre]]&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
L'intégralité de notre programme est disponible sur le dépôt git à l'adresse: https://gitlab.com/remi_farault/self-balanced-robot&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Présentation générale'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==🌏Contexte==&lt;br /&gt;
Les moyens de transport actuels reposent principalement sur le principe du robot à deux roues, c'est la raison pour laquelle l'étude de celui ci s'avère importante, en effet l'étude   &lt;br /&gt;
de sa conception et son contrôle va nous permettre de développer des outils innovants qui pourraient potentiellement intéresser des sociétés de transport .&lt;br /&gt;
&lt;br /&gt;
==🎯Objectif==&lt;br /&gt;
&lt;br /&gt;
Notre objectif principal est de commander le robot, de là interviennent d'autres objectifs tel que la stabilité ,développer un code robuste qui assure cette fonctionnalité et aussi le contrôler pour réaliser des fonctionnalités de déplacement et d'éviter des obstacles . Des objectifs secondaires sont de créer un site web à travers lequel nous allons mener toutes les opérations de contrôle .&lt;br /&gt;
&lt;br /&gt;
==🔍Expression du besoin==&lt;br /&gt;
&lt;br /&gt;
Un robot autoéquilibré à deux roues est un type de robot qui peut se maintenir en équilibre sur deux roues sans tomber. Pour réaliser cette fonctionnalité, le robot utilise un ensemble de capteurs, d'algorithmes de contrôle et de moteurs pour ajuster sa position en temps réel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Self_balanc_bt.png|400px|Bete a corne SBR]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le diagramme interacteurs permet en fait de visualiser les fonctions services assurées par le système &lt;br /&gt;
&lt;br /&gt;
[[Fichier:341702419_560921119358434_1016673599353874396_n_(1).png|400px|DGI SBR]]    [[Fichier:Btacorne.png |500px|DGI SBR|right]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Réalisations et Résultats'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
[[Fichier: seg.jpg|200px|left|thumb|Exemple de commande désirée]]&lt;br /&gt;
&lt;br /&gt;
Après mis en place notre stratégie de gestion de projet en s6 à travers le diagramme de GANTT et le cahier de charges fonctionnels, nous nous sommes focalisés sur l'étude technique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: progg.png|300px|right|thumb|Organisation de notre programme]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, étudier à travers des outils automatiques la stabilité du robot en faisant appel à des modèles théoriques et pratiques et commencer par un raisonnement par niveaux, d'abord le niveau 1 du moteur à courant continu et les équations correspondantes puis le niveau 2 assurant la stabilité du robot directement, on avait la possibilité de passer directement au niveau 2 à travers le modèle du pendule inversé et les équations qui en découlent sauf que celui-ci ne nous permettra pas de revenir au niveau 1 et asservir le moteur à travers les codeurs incrémentales ,la deuxième partie consistait à réaliser les codes informatiques en s'appuyant sur les structures de données en C vues l'année dernière et conduire un même raisonnement(par niveaux) s'appuyant d'abord sur les codes sources correspondants à la génération d'un signal PWM pour les deux moteurs avec un rapport cyclique modifiable, et aussi les codes sources correspondants à la gestion des moteurs, en effet, ceux-ci tournent  dans un sens ou dans un autre ou ne tournent pas en fonction de la variable in1 et in2  pour faire tourner les moteurs .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Avr.png|100px|left|thumb|Compilateur utilisé]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cependant, nous avons rencontré quelques problèmes en automatique notamment pour trouver des valeurs des constantes théoriques pour les références du moteur entre les mains, ce qui nous a obligé à prendre des valeurs issues d'autres applications, nous avons rencontré aussi quelques problèmes choisir une modélisation parmi celles qui sont disponibles sur Internet .&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Etude Automatique'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Avant de programmer notre système sur la carte Arduino, nous avons également créé une simulation complète de notre système robotisé sur SIMULINK. Cependant, avant cela, nous avons dû déterminer les équations qui régissent notre système en trouvant les matrices d'inertie de chaque composant de notre robot, à savoir la masse transportée par le robot (M), le châssis constitué de deux plateaux et de la motorisation (les piliers et leur inertie ont été négligés car leur masse est très faible), ainsi que les roues (roue droite et roue gauche). Vous trouverez ci-dessous les matrices d'inertie que nous avons obtenues pour chaque composant.&lt;br /&gt;
&lt;br /&gt;
'''Masse M :'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatM.png|200px|thumb|left|Matrice de la masse M]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients seront notés dans la suite pour simplifier : AM,BM,CM &lt;br /&gt;
&lt;br /&gt;
'''Chassis:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatB.png|800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AH,BH,CH &lt;br /&gt;
&lt;br /&gt;
'''Roue gauche:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrg.png |600px|Matrice de RG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
'''Roue droite:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrd.png |600px|Matrice RD]]&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
Ci-dessous un paramétrage de notre système : Chaque angle détermine un repère&lt;br /&gt;
&lt;br /&gt;
Le repère R0 est supposé galliléen.&lt;br /&gt;
&lt;br /&gt;
Le repère R1 est en rotation  ,appelé angle de virage par rapport à R0.&lt;br /&gt;
&lt;br /&gt;
Le repère R2 est en rotation  ,appelé angle d’inclinaison du châssis par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R3 est en rotation  ,appelé angle d’inclinaison arrière-avant de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R4 est en rotation ,appelé angle d’inclinaison droite-gauche de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:param.png |800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
l’angle de consigne est de 0deg,nous employons un PID pour corriger l’angle de mesure,à sa sortie,on aura une tension W(p).Les blocs Km et W(p) assurent le passage tension-&amp;gt;couple-&amp;gt;angle ,il faut ensuite retirer  pour ne garder que l’angle d’inclinaison du châssis  .Km=0.0125N.m.V-1(d’après la datasheet du moteur)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bcle.png |800px|Asservissement]]                                                             [[Fichier:Matuu.png|right|800px|Asservissement]]      &lt;br /&gt;
&lt;br /&gt;
Les équations obtenues sont les suivantes (Le détail des calculs a été précisé dans le Rapport): &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eq nnlin.png |500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après linéarisation : Considérer l'approximations des petits angles pour le sinus et cosinus,et négliger aussi la vitesse angulaire quadratique devant la vitesse angulaire,nous obtenons : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eqlin.png |300px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crbe.png|600px|Courbe]]&lt;br /&gt;
&lt;br /&gt;
On obtient une courbe avec un bon temps de réponse, un léger dépassement et une stabilité .Le système est régulé de manière efficace, capable de répondre rapidement et précisément aux perturbations tout en maintenant une position d'équilibre stable.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mat3d.png|500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Environnement de developpement'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Notre microcontrolleur étant une Arduino Uno, nous aurions pu utiliser le framework ''Arduino'' donnant accès à un IDE intégrant les outils pour compiler et flasher le code, ainsi qu'une multitude de bibliothèques haut niveaux très simples d'utilisation et plutôt performantes, permettant de programmer notre robot en simplement quelques dizaines de lignes de code.&lt;br /&gt;
&lt;br /&gt;
Cependant, l'Arduino est simplement une carte de prototypage intégrant un microcontrôleur ''AVR Atmega 328p''. &lt;br /&gt;
Les microcontroleurs AVR disposent d'une grande communauté, et il existe de nombreux outils nécessaires au developpement sur ces cartes.&lt;br /&gt;
Afin d'avoir un meilleur contrôle sur notre projet, et surtout d'en tirer un maximum de compétences, nous avons donc décidés de programmer notre robot directement en C en utilisant les outils AVR:&lt;br /&gt;
&lt;br /&gt;
- '''avr-gcc''': compilateur open-source portant toutes les fonctionnalités du langage C standard sur les microcontroleurs AVR.&lt;br /&gt;
Seul, son utilisation est quasiment impossible et demande trop de travail en programmation bas-niveau.&lt;br /&gt;
&lt;br /&gt;
- '''avr-libc''': implémentation basé sur le compilateur avr-gcc de la bibliothèque standard du langage C.&lt;br /&gt;
Cette bibliothèque permet donc d'utiliser les fonctions et structures standards du C (IO, maths, chaines de caractères), mais elle intègre également un mapping mémoire de tous les registres de l'atmega, ainsi qu'un mécanisme pour programmer des interruptions.&lt;br /&gt;
&lt;br /&gt;
- '''avr-objcopy''': ce programme en ligne de commande formate le binaire obtenu en format utilisable par les AVR&lt;br /&gt;
&lt;br /&gt;
- '''avr-dude''': ce programme en ligne de commande permet de flasher via une interface USB-série un microcontroleur AVR présent sur une carte Arduino.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc developpé un '''Makefile''' utilisant tous ces outils, constituant un environnement de developpement très efficace pour notre projet. Ce Makefile est disponible sur notre gitlab.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Programme du robot'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''PWM'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
La première étape consistait à commander nos moteurs DC, afin de poser les bases de notre&lt;br /&gt;
asservissement bas niveau. Ces moteurs sont contrôlés par le driver de moteurs, utilisant des signaux logiques pour définir l’état d’un moteur et des signaux '''PWM''' pour définir la vitesse de&lt;br /&gt;
rotation. La génération de signaux PWM sur AVR se fait en utilisant les '''timers''' en mode PWM.&lt;br /&gt;
Tout simplement, nous avons un registre compteur 16 bits incrémenté périodiquement, et une valeur&lt;br /&gt;
maximale définie par le registre ''ICRx''. Nous utilisons ensuite les registres ''OCRnx'' contenant une&lt;br /&gt;
valeur inférieure au maximum. &lt;br /&gt;
Lorsque le compteur atteint la valeur contenue dans OCRnx, il&lt;br /&gt;
inverse la valeur logique de sortie du pin ''OCnx''. Ainsi, nous pouvons modifier instantanément la&lt;br /&gt;
valeur d’OCRnx afin de modifier le rapport cyclique de notre signal. Ce rapport cyclique est ensuite&lt;br /&gt;
directement proportionnel à la vitesse de rotation du moteur associé. &lt;br /&gt;
La fréquence du signal est définie par la période d’incrémentation du compteur et par la valeur maximale ICRx.&lt;br /&gt;
Pour notre composant, nous pouvions utiliser une fréquence allant jusqu’à plusieurs kHz. Cette&lt;br /&gt;
fréquence n’a aucun impact sur la rotation du moteur. Nous avons donc choisis 20 kHz.&lt;br /&gt;
Nous avons définis la '''init_pwm''' pour configurer les registres nécessaires, et la fonction&lt;br /&gt;
'''generate_pwm''' pour modifier le rapport cyclique de nos deux signaux PWM avec la valeur&lt;br /&gt;
souhaitée.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Encodeurs'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Angle'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Interruption principale'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Bilan'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 6 :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 7 :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 8 :'''&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Gestion de projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
- L'utilisation de git : &lt;br /&gt;
[[Fichier:Gt.png|400px|thumb|left|texte descriptif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Semestre 6 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/22''' &lt;br /&gt;
&lt;br /&gt;
Séance de découverte du sujet de notre projet.&lt;br /&gt;
&lt;br /&gt;
Recherche de l'existant &lt;br /&gt;
&lt;br /&gt;
Réalisation de recherches sur leurs différentes utilisations.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/22''' &lt;br /&gt;
&lt;br /&gt;
Début de création du diagramme de Gantt .&lt;br /&gt;
&lt;br /&gt;
Réalisation d'une étude du besoin.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du marché : Recherche des robots similaires.&lt;br /&gt;
&lt;br /&gt;
Commencer à prendre en main le robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 22/03/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de l'étude de marché.&lt;br /&gt;
&lt;br /&gt;
Etude des opportunités.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 29/03/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'étude du marché.&lt;br /&gt;
&lt;br /&gt;
Commencer à rédiger le cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 05/04/22''' &lt;br /&gt;
&lt;br /&gt;
Commencer la rédaction du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 26/04/22''' &lt;br /&gt;
&lt;br /&gt;
Bilan du semestre.&lt;br /&gt;
&lt;br /&gt;
Etude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Etude des risques.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 03/05/22''' &lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude des risques.&lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Finalisation du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
== Semestre 7 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 10/10/22'''&lt;br /&gt;
&lt;br /&gt;
Commencement de l'étude technique des encodeurs . &lt;br /&gt;
Recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du changement de la carte arduino pour ajouter des nouvelles fonctionnalités : connexion Wifi, fréquence microprocesseur plus élevé,..&lt;br /&gt;
Test des encodeurs moteur DC : validé .&lt;br /&gt;
Poursuite de recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude de génération des signaux PWM&lt;br /&gt;
&lt;br /&gt;
Test sur Matlab Simulink des boucles d'asservissement issues des robots similaires .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/11/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation des signaux PWM du robot.&lt;br /&gt;
&lt;br /&gt;
Calcul de la fonction de transfert issue de la boucle.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/11/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du fonctionnement du gyroscope et des autres composants pour programmer le robot .  &lt;br /&gt;
&lt;br /&gt;
Séparation du travail a effectuer pour le robot entre une boucle du moteur DC(niveau 1) et une boucle du niveau supérieur(niveau 2) pour asservir l'angle d'inclinaison du robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/11/22''' &lt;br /&gt;
&lt;br /&gt;
Modification et amélioration du diagramme de Gantt pour le S7 et le S8.&lt;br /&gt;
&lt;br /&gt;
Avancée de la modélisation de la boucle du niveau 1 .&lt;br /&gt;
&lt;br /&gt;
Diagramme de Gantt S7-S8&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/11/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation de la boucle du niveau inférieur sur Matlab/Simulink et récupération des résultats sur le scope .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/12/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie informatique et avancement de la partie automatique .&lt;br /&gt;
Programmation de la liaison série pour débugger les sorties de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/12/22''' &lt;br /&gt;
&lt;br /&gt;
Début de rédaction du rapport pour le S7&lt;br /&gt;
&lt;br /&gt;
== Semestre 8 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/01/23''' &lt;br /&gt;
&lt;br /&gt;
Recherches pour le gyroscope . &lt;br /&gt;
Test des encodeurs .&lt;br /&gt;
Communication sur les attentes du semestre s8 ,les fautes à éviter pour rebondir par rapport au retard S7 &lt;br /&gt;
Mise à niveau pour comprendre les aspects techniques de la partie informatique pour pouvoir travailler ensemble sur les résultats du S8 .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/01/23''' &lt;br /&gt;
&lt;br /&gt;
- Suppression des structures de données pour avancer plus rapidement sur les résultats du semestre s8 .&lt;br /&gt;
&lt;br /&gt;
- Recherches pour la programmation des interruptions PCINT . &lt;br /&gt;
&lt;br /&gt;
- Recherche sur la doc technique pour faire l'initialisation des interruptions externes . &lt;br /&gt;
&lt;br /&gt;
- Recherche de la modélisation en 3D de notre robot pour trouver les paramètres PID de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/02/23''' &lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons :&lt;br /&gt;
&lt;br /&gt;
Modification du code des encodeurs et test sur les moteurs DC . &lt;br /&gt;
&lt;br /&gt;
Poursuite de recherche de l'existant pour trouver le code du gyroscope .&lt;br /&gt;
&lt;br /&gt;
Mise à jour du git .&lt;br /&gt;
&lt;br /&gt;
Début du calcul des matrices d'inertie de chaque solide.&lt;br /&gt;
&lt;br /&gt;
Recherche du code des régulateurs.&lt;br /&gt;
&lt;br /&gt;
Avancement sur la gestion de projet .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/02/23'''&lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons essayé de récupérer les résultats des tests électronique de l'oscilloscope effectués dans les salles d'électronique .&lt;br /&gt;
&lt;br /&gt;
Le code des encodeurs marchent ,la liaison série affiche exactement la vitesse de la consigne :les Régulateurs implémentés correspondent bien à notre applications.&lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation de la partie informatique du gyroscope : Objectif : récupération de l'angle d'inclinaison sur la liaison série avec la meilleure précision possible .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/02/23''' &lt;br /&gt;
&lt;br /&gt;
Fin du calcul des matrices d'inertie . &lt;br /&gt;
&lt;br /&gt;
Paramétrage de notre robot pour avoir la visibilité sur les configurations possibles d'avoir(en virage, ligne droite),en précisant les angles d'inclinaison et es repères associés . &lt;br /&gt;
&lt;br /&gt;
Poursuite de programmation des régulateurs par niveaux en utilisant le code précédemment implémenté pour les encodeurs .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/23''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation du modèle en 3D de notre robot pour essayer de l'autoéquilibrer en utilisant les PIDS issues de l'autotune par rapport à nos préférences(stabilité,temps de réponse,dépassement,précision). &lt;br /&gt;
&lt;br /&gt;
Nous avons testé le robot en l'alimentant par le biai la liaison USB ! et enregistrement des résultats .  &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie automatique en trouvant toutes les équations nécessaires à notre modèle .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/23''' &lt;br /&gt;
&lt;br /&gt;
Réalisations de cette séance :&lt;br /&gt;
&lt;br /&gt;
Test du robot pour se stabiliser sur le sol en applicant plusieurs . &lt;br /&gt;
&lt;br /&gt;
Faire tous les calculs des dimensions géométriques de notre robot et test de la boucle d'asservissement avec les deux niveaux sur Matlab Simulink avec nos préférences de stabilité, temps de réponse,précision,dépassement .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/23''' &lt;br /&gt;
&lt;br /&gt;
Absence justifiée .&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91439</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91439"/>
				<updated>2023-05-09T20:47:55Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Résumé'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
[[Fichier: SegwayRobot.jpg|200px|right|thumb|Exemple de robot similaire au notre]]&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
L'intégralité de notre programme est disponible sur le dépôt git à l'adresse: https://gitlab.com/remi_farault/self-balanced-robot&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Présentation générale'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==🌏Contexte==&lt;br /&gt;
Les moyens de transport actuels reposent principalement sur le principe du robot à deux roues, c'est la raison pour laquelle l'étude de celui ci s'avère importante, en effet l'étude   &lt;br /&gt;
de sa conception et son contrôle va nous permettre de développer des outils innovants qui pourraient potentiellement intéresser des sociétés de transport .&lt;br /&gt;
&lt;br /&gt;
==🎯Objectif==&lt;br /&gt;
&lt;br /&gt;
Notre objectif principal est de commander le robot, de là interviennent d'autres objectifs tel que la stabilité ,développer un code robuste qui assure cette fonctionnalité et aussi le contrôler pour réaliser des fonctionnalités de déplacement et d'éviter des obstacles . Des objectifs secondaires sont de créer un site web à travers lequel nous allons mener toutes les opérations de contrôle .&lt;br /&gt;
&lt;br /&gt;
==🔍Expression du besoin==&lt;br /&gt;
&lt;br /&gt;
Un robot autoéquilibré à deux roues est un type de robot qui peut se maintenir en équilibre sur deux roues sans tomber. Pour réaliser cette fonctionnalité, le robot utilise un ensemble de capteurs, d'algorithmes de contrôle et de moteurs pour ajuster sa position en temps réel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Self_balanc_bt.png|400px|Bete a corne SBR]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le diagramme interacteurs permet en fait de visualiser les fonctions services assurées par le système &lt;br /&gt;
&lt;br /&gt;
[[Fichier:341702419_560921119358434_1016673599353874396_n_(1).png|400px|DGI SBR]]    [[Fichier:Btacorne.png |500px|DGI SBR|right]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Réalisations et Résultats'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
[[Fichier: seg.jpg|200px|left|thumb|Exemple de commande désirée]]&lt;br /&gt;
&lt;br /&gt;
Après mis en place notre stratégie de gestion de projet en s6 à travers le diagramme de GANTT et le cahier de charges fonctionnels, nous nous sommes focalisés sur l'étude technique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: progg.png|300px|right|thumb|Organisation de notre programme]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, étudier à travers des outils automatiques la stabilité du robot en faisant appel à des modèles théoriques et pratiques et commencer par un raisonnement par niveaux, d'abord le niveau 1 du moteur à courant continu et les équations correspondantes puis le niveau 2 assurant la stabilité du robot directement, on avait la possibilité de passer directement au niveau 2 à travers le modèle du pendule inversé et les équations qui en découlent sauf que celui-ci ne nous permettra pas de revenir au niveau 1 et asservir le moteur à travers les codeurs incrémentales ,la deuxième partie consistait à réaliser les codes informatiques en s'appuyant sur les structures de données en C vues l'année dernière et conduire un même raisonnement(par niveaux) s'appuyant d'abord sur les codes sources correspondants à la génération d'un signal PWM pour les deux moteurs avec un rapport cyclique modifiable, et aussi les codes sources correspondants à la gestion des moteurs, en effet, ceux-ci tournent  dans un sens ou dans un autre ou ne tournent pas en fonction de la variable in1 et in2  pour faire tourner les moteurs .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Avr.png|100px|left|thumb|Compilateur utilisé]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cependant, nous avons rencontré quelques problèmes en automatique notamment pour trouver des valeurs des constantes théoriques pour les références du moteur entre les mains, ce qui nous a obligé à prendre des valeurs issues d'autres applications, nous avons rencontré aussi quelques problèmes choisir une modélisation parmi celles qui sont disponibles sur Internet .&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Etude Automatique'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Avant de programmer notre système sur la carte Arduino, nous avons également créé une simulation complète de notre système robotisé sur SIMULINK. Cependant, avant cela, nous avons dû déterminer les équations qui régissent notre système en trouvant les matrices d'inertie de chaque composant de notre robot, à savoir la masse transportée par le robot (M), le châssis constitué de deux plateaux et de la motorisation (les piliers et leur inertie ont été négligés car leur masse est très faible), ainsi que les roues (roue droite et roue gauche). Vous trouverez ci-dessous les matrices d'inertie que nous avons obtenues pour chaque composant.&lt;br /&gt;
&lt;br /&gt;
'''Masse M :'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatM.png|200px|thumb|left|Matrice de la masse M]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients seront notés dans la suite pour simplifier : AM,BM,CM &lt;br /&gt;
&lt;br /&gt;
'''Chassis:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatB.png|800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AH,BH,CH &lt;br /&gt;
&lt;br /&gt;
'''Roue gauche:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrg.png |600px|Matrice de RG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
'''Roue droite:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrd.png |600px|Matrice RD]]&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
Ci-dessous un paramétrage de notre système : Chaque angle détermine un repère&lt;br /&gt;
&lt;br /&gt;
Le repère R0 est supposé galliléen.&lt;br /&gt;
&lt;br /&gt;
Le repère R1 est en rotation  ,appelé angle de virage par rapport à R0.&lt;br /&gt;
&lt;br /&gt;
Le repère R2 est en rotation  ,appelé angle d’inclinaison du châssis par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R3 est en rotation  ,appelé angle d’inclinaison arrière-avant de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R4 est en rotation ,appelé angle d’inclinaison droite-gauche de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:param.png |800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
l’angle de consigne est de 0deg,nous employons un PID pour corriger l’angle de mesure,à sa sortie,on aura une tension W(p).Les blocs Km et W(p) assurent le passage tension-&amp;gt;couple-&amp;gt;angle ,il faut ensuite retirer  pour ne garder que l’angle d’inclinaison du châssis  .Km=0.0125N.m.V-1(d’après la datasheet du moteur)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bcle.png |800px|Asservissement]]                                                             [[Fichier:Matuu.png|right|800px|Asservissement]]      &lt;br /&gt;
&lt;br /&gt;
Les équations obtenues sont les suivantes (Le détail des calculs a été précisé dans le Rapport): &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eq nnlin.png |500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après linéarisation : Considérer l'approximations des petits angles pour le sinus et cosinus,et négliger aussi la vitesse angulaire quadratique devant la vitesse angulaire,nous obtenons : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eqlin.png |300px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crbe.png|600px|Courbe]]&lt;br /&gt;
&lt;br /&gt;
On obtient une courbe avec un bon temps de réponse, un léger dépassement et une stabilité .Le système est régulé de manière efficace, capable de répondre rapidement et précisément aux perturbations tout en maintenant une position d'équilibre stable.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mat3d.png|500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Environnement de developpement'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Notre microcontrolleur étant une Arduino Uno, nous aurions pu utiliser le framework ''Arduino'' donnant accès à un IDE intégrant les outils pour compiler et flasher le code, ainsi qu'une multitude de bibliothèques haut niveaux très simples d'utilisation et plutôt performantes, permettant de programmer notre robot en simplement quelques dizaines de lignes de code.&lt;br /&gt;
&lt;br /&gt;
Cependant, l'Arduino est simplement une carte de prototypage intégrant un microcontrôleur ''AVR Atmega 328p''. &lt;br /&gt;
Les microcontroleurs AVR disposent d'une grande communauté, et il existe de nombreux outils nécessaires au developpement sur ces cartes.&lt;br /&gt;
Afin d'avoir un meilleur contrôle sur notre projet, et surtout d'en tirer un maximum de compétences, nous avons donc décidés de programmer notre robot directement en C en utilisant les outils AVR:&lt;br /&gt;
&lt;br /&gt;
- '''avr-gcc''': compilateur open-source portant toutes les fonctionnalités du langage C standard sur les microcontroleurs AVR.&lt;br /&gt;
Seul, son utilisation est quasiment impossible et demande trop de travail en programmation bas-niveau.&lt;br /&gt;
&lt;br /&gt;
- '''avr-libc''': implémentation basé sur le compilateur avr-gcc de la bibliothèque standard du langage C.&lt;br /&gt;
Cette bibliothèque permet donc d'utiliser les fonctions et structures standards du C (IO, maths, chaines de caractères), mais elle intègre également un mapping mémoire de tous les registres de l'atmega, ainsi qu'un mécanisme pour programmer des interruptions.&lt;br /&gt;
&lt;br /&gt;
- '''avr-objcopy''': ce programme en ligne de commande formate le binaire obtenu en format utilisable par les AVR&lt;br /&gt;
&lt;br /&gt;
- '''avr-dude''': ce programme en ligne de commande permet de flasher via une interface USB-série un microcontroleur AVR présent sur une carte Arduino.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc developpé un '''Makefile''' utilisant tous ces outils, constituant un environnement de developpement très efficace pour notre projet. Ce Makefile est disponible sur notre gitlab.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Programme du robot'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''PWM'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Encodeurs'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Angle'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Interruption principale'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Bilan'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 6 :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 7 :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 8 :'''&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Gestion de projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
- L'utilisation de git : &lt;br /&gt;
[[Fichier:Gt.png|400px|thumb|left|texte descriptif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Semestre 6 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/22''' &lt;br /&gt;
&lt;br /&gt;
Séance de découverte du sujet de notre projet.&lt;br /&gt;
&lt;br /&gt;
Recherche de l'existant &lt;br /&gt;
&lt;br /&gt;
Réalisation de recherches sur leurs différentes utilisations.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/22''' &lt;br /&gt;
&lt;br /&gt;
Début de création du diagramme de Gantt .&lt;br /&gt;
&lt;br /&gt;
Réalisation d'une étude du besoin.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du marché : Recherche des robots similaires.&lt;br /&gt;
&lt;br /&gt;
Commencer à prendre en main le robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 22/03/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de l'étude de marché.&lt;br /&gt;
&lt;br /&gt;
Etude des opportunités.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 29/03/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'étude du marché.&lt;br /&gt;
&lt;br /&gt;
Commencer à rédiger le cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 05/04/22''' &lt;br /&gt;
&lt;br /&gt;
Commencer la rédaction du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 26/04/22''' &lt;br /&gt;
&lt;br /&gt;
Bilan du semestre.&lt;br /&gt;
&lt;br /&gt;
Etude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Etude des risques.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 03/05/22''' &lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude des risques.&lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Finalisation du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
== Semestre 7 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 10/10/22'''&lt;br /&gt;
&lt;br /&gt;
Commencement de l'étude technique des encodeurs . &lt;br /&gt;
Recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du changement de la carte arduino pour ajouter des nouvelles fonctionnalités : connexion Wifi, fréquence microprocesseur plus élevé,..&lt;br /&gt;
Test des encodeurs moteur DC : validé .&lt;br /&gt;
Poursuite de recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude de génération des signaux PWM&lt;br /&gt;
&lt;br /&gt;
Test sur Matlab Simulink des boucles d'asservissement issues des robots similaires .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/11/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation des signaux PWM du robot.&lt;br /&gt;
&lt;br /&gt;
Calcul de la fonction de transfert issue de la boucle.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/11/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du fonctionnement du gyroscope et des autres composants pour programmer le robot .  &lt;br /&gt;
&lt;br /&gt;
Séparation du travail a effectuer pour le robot entre une boucle du moteur DC(niveau 1) et une boucle du niveau supérieur(niveau 2) pour asservir l'angle d'inclinaison du robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/11/22''' &lt;br /&gt;
&lt;br /&gt;
Modification et amélioration du diagramme de Gantt pour le S7 et le S8.&lt;br /&gt;
&lt;br /&gt;
Avancée de la modélisation de la boucle du niveau 1 .&lt;br /&gt;
&lt;br /&gt;
Diagramme de Gantt S7-S8&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/11/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation de la boucle du niveau inférieur sur Matlab/Simulink et récupération des résultats sur le scope .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/12/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie informatique et avancement de la partie automatique .&lt;br /&gt;
Programmation de la liaison série pour débugger les sorties de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/12/22''' &lt;br /&gt;
&lt;br /&gt;
Début de rédaction du rapport pour le S7&lt;br /&gt;
&lt;br /&gt;
== Semestre 8 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/01/23''' &lt;br /&gt;
&lt;br /&gt;
Recherches pour le gyroscope . &lt;br /&gt;
Test des encodeurs .&lt;br /&gt;
Communication sur les attentes du semestre s8 ,les fautes à éviter pour rebondir par rapport au retard S7 &lt;br /&gt;
Mise à niveau pour comprendre les aspects techniques de la partie informatique pour pouvoir travailler ensemble sur les résultats du S8 .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/01/23''' &lt;br /&gt;
&lt;br /&gt;
- Suppression des structures de données pour avancer plus rapidement sur les résultats du semestre s8 .&lt;br /&gt;
&lt;br /&gt;
- Recherches pour la programmation des interruptions PCINT . &lt;br /&gt;
&lt;br /&gt;
- Recherche sur la doc technique pour faire l'initialisation des interruptions externes . &lt;br /&gt;
&lt;br /&gt;
- Recherche de la modélisation en 3D de notre robot pour trouver les paramètres PID de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/02/23''' &lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons :&lt;br /&gt;
&lt;br /&gt;
Modification du code des encodeurs et test sur les moteurs DC . &lt;br /&gt;
&lt;br /&gt;
Poursuite de recherche de l'existant pour trouver le code du gyroscope .&lt;br /&gt;
&lt;br /&gt;
Mise à jour du git .&lt;br /&gt;
&lt;br /&gt;
Début du calcul des matrices d'inertie de chaque solide.&lt;br /&gt;
&lt;br /&gt;
Recherche du code des régulateurs.&lt;br /&gt;
&lt;br /&gt;
Avancement sur la gestion de projet .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/02/23'''&lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons essayé de récupérer les résultats des tests électronique de l'oscilloscope effectués dans les salles d'électronique .&lt;br /&gt;
&lt;br /&gt;
Le code des encodeurs marchent ,la liaison série affiche exactement la vitesse de la consigne :les Régulateurs implémentés correspondent bien à notre applications.&lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation de la partie informatique du gyroscope : Objectif : récupération de l'angle d'inclinaison sur la liaison série avec la meilleure précision possible .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/02/23''' &lt;br /&gt;
&lt;br /&gt;
Fin du calcul des matrices d'inertie . &lt;br /&gt;
&lt;br /&gt;
Paramétrage de notre robot pour avoir la visibilité sur les configurations possibles d'avoir(en virage, ligne droite),en précisant les angles d'inclinaison et es repères associés . &lt;br /&gt;
&lt;br /&gt;
Poursuite de programmation des régulateurs par niveaux en utilisant le code précédemment implémenté pour les encodeurs .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/23''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation du modèle en 3D de notre robot pour essayer de l'autoéquilibrer en utilisant les PIDS issues de l'autotune par rapport à nos préférences(stabilité,temps de réponse,dépassement,précision). &lt;br /&gt;
&lt;br /&gt;
Nous avons testé le robot en l'alimentant par le biai la liaison USB ! et enregistrement des résultats .  &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie automatique en trouvant toutes les équations nécessaires à notre modèle .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/23''' &lt;br /&gt;
&lt;br /&gt;
Réalisations de cette séance :&lt;br /&gt;
&lt;br /&gt;
Test du robot pour se stabiliser sur le sol en applicant plusieurs . &lt;br /&gt;
&lt;br /&gt;
Faire tous les calculs des dimensions géométriques de notre robot et test de la boucle d'asservissement avec les deux niveaux sur Matlab Simulink avec nos préférences de stabilité, temps de réponse,précision,dépassement .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/23''' &lt;br /&gt;
&lt;br /&gt;
Absence justifiée .&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91438</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91438"/>
				<updated>2023-05-09T20:47:03Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Résumé'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
[[Fichier: SegwayRobot.jpg|200px|right|thumb|Exemple de robot similaire au notre]]&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
L'intégralité de notre programme est disponible sur le dépôt git à l'adresse: https://gitlab.com/remi_farault/self-balanced-robot&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Présentation générale'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==🌏Contexte==&lt;br /&gt;
Les moyens de transport actuels reposent principalement sur le principe du robot à deux roues, c'est la raison pour laquelle l'étude de celui ci s'avère importante, en effet l'étude   &lt;br /&gt;
de sa conception et son contrôle va nous permettre de développer des outils innovants qui pourraient potentiellement intéresser des sociétés de transport .&lt;br /&gt;
&lt;br /&gt;
==🎯Objectif==&lt;br /&gt;
&lt;br /&gt;
Notre objectif principal est de commander le robot, de là interviennent d'autres objectifs tel que la stabilité ,développer un code robuste qui assure cette fonctionnalité et aussi le contrôler pour réaliser des fonctionnalités de déplacement et d'éviter des obstacles . Des objectifs secondaires sont de créer un site web à travers lequel nous allons mener toutes les opérations de contrôle .&lt;br /&gt;
&lt;br /&gt;
==🔍Expression du besoin==&lt;br /&gt;
&lt;br /&gt;
Un robot autoéquilibré à deux roues est un type de robot qui peut se maintenir en équilibre sur deux roues sans tomber. Pour réaliser cette fonctionnalité, le robot utilise un ensemble de capteurs, d'algorithmes de contrôle et de moteurs pour ajuster sa position en temps réel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Self_balanc_bt.png|400px|Bete a corne SBR]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le diagramme interacteurs permet en fait de visualiser les fonctions services assurées par le système &lt;br /&gt;
&lt;br /&gt;
[[Fichier:341702419_560921119358434_1016673599353874396_n_(1).png|400px|DGI SBR]]    [[Fichier:Btacorne.png |500px|DGI SBR|right]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Réalisations et Résultats'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
[[Fichier: seg.jpg|200px|left|thumb|Exemple de commande désirée]]&lt;br /&gt;
&lt;br /&gt;
Après mis en place notre stratégie de gestion de projet en s6 à travers le diagramme de GANTT et le cahier de charges fonctionnels, nous nous sommes focalisés sur l'étude technique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: progg.png|300px|right|thumb|Organisation de notre programme]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, étudier à travers des outils automatiques la stabilité du robot en faisant appel à des modèles théoriques et pratiques et commencer par un raisonnement par niveaux, d'abord le niveau 1 du moteur à courant continu et les équations correspondantes puis le niveau 2 assurant la stabilité du robot directement, on avait la possibilité de passer directement au niveau 2 à travers le modèle du pendule inversé et les équations qui en découlent sauf que celui-ci ne nous permettra pas de revenir au niveau 1 et asservir le moteur à travers les codeurs incrémentales ,la deuxième partie consistait à réaliser les codes informatiques en s'appuyant sur les structures de données en C vues l'année dernière et conduire un même raisonnement(par niveaux) s'appuyant d'abord sur les codes sources correspondants à la génération d'un signal PWM pour les deux moteurs avec un rapport cyclique modifiable, et aussi les codes sources correspondants à la gestion des moteurs, en effet, ceux-ci tournent  dans un sens ou dans un autre ou ne tournent pas en fonction de la variable in1 et in2  pour faire tourner les moteurs .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Avr.png|100px|left|thumb|Compilateur utilisé]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cependant, nous avons rencontré quelques problèmes en automatique notamment pour trouver des valeurs des constantes théoriques pour les références du moteur entre les mains, ce qui nous a obligé à prendre des valeurs issues d'autres applications, nous avons rencontré aussi quelques problèmes choisir une modélisation parmi celles qui sont disponibles sur Internet .&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Etude Automatique'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Avant de programmer notre système sur la carte Arduino, nous avons également créé une simulation complète de notre système robotisé sur SIMULINK. Cependant, avant cela, nous avons dû déterminer les équations qui régissent notre système en trouvant les matrices d'inertie de chaque composant de notre robot, à savoir la masse transportée par le robot (M), le châssis constitué de deux plateaux et de la motorisation (les piliers et leur inertie ont été négligés car leur masse est très faible), ainsi que les roues (roue droite et roue gauche). Vous trouverez ci-dessous les matrices d'inertie que nous avons obtenues pour chaque composant.&lt;br /&gt;
&lt;br /&gt;
'''Masse M :'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatM.png|200px|thumb|left|Matrice de la masse M]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients seront notés dans la suite pour simplifier : AM,BM,CM &lt;br /&gt;
&lt;br /&gt;
'''Chassis:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatB.png|800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AH,BH,CH &lt;br /&gt;
&lt;br /&gt;
'''Roue gauche:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrg.png |600px|Matrice de RG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
'''Roue droite:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrd.png |600px|Matrice RD]]&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
Ci-dessous un paramétrage de notre système : Chaque angle détermine un repère&lt;br /&gt;
&lt;br /&gt;
Le repère R0 est supposé galliléen.&lt;br /&gt;
&lt;br /&gt;
Le repère R1 est en rotation  ,appelé angle de virage par rapport à R0.&lt;br /&gt;
&lt;br /&gt;
Le repère R2 est en rotation  ,appelé angle d’inclinaison du châssis par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R3 est en rotation  ,appelé angle d’inclinaison arrière-avant de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R4 est en rotation ,appelé angle d’inclinaison droite-gauche de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:param.png |800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
l’angle de consigne est de 0deg,nous employons un PID pour corriger l’angle de mesure,à sa sortie,on aura une tension W(p).Les blocs Km et W(p) assurent le passage tension-&amp;gt;couple-&amp;gt;angle ,il faut ensuite retirer  pour ne garder que l’angle d’inclinaison du châssis  .Km=0.0125N.m.V-1(d’après la datasheet du moteur)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bcle.png |800px|Asservissement]]                                                             [[Fichier:Matuu.png|right|800px|Asservissement]]      &lt;br /&gt;
&lt;br /&gt;
Les équations obtenues sont les suivantes (Le détail des calculs a été précisé dans le Rapport): &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eq nnlin.png |500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après linéarisation : Considérer l'approximations des petits angles pour le sinus et cosinus,et négliger aussi la vitesse angulaire quadratique devant la vitesse angulaire,nous obtenons : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eqlin.png |300px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crbe.png|600px|Courbe]]&lt;br /&gt;
&lt;br /&gt;
On obtient une courbe avec un bon temps de réponse, un léger dépassement et une stabilité .Le système est régulé de manière efficace, capable de répondre rapidement et précisément aux perturbations tout en maintenant une position d'équilibre stable.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mat3d.png|500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Environnement de developpement'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Notre microcontrolleur étant une Arduino Uno, nous aurions pu utiliser le framework ''Arduino'' donnant accès à un IDE intégrant les outils pour compiler et flasher le code, ainsi qu'une multitude de bibliothèques haut niveaux très simples d'utilisation et plutôt performantes, permettant de programmer notre robot en simplement quelques dizaines de lignes de code.&lt;br /&gt;
&lt;br /&gt;
Cependant, l'Arduino est simplement une carte de prototypage intégrant un microcontrôleur ''AVR Atmega 328p''. &lt;br /&gt;
Les microcontroleurs AVR disposent d'une grande communauté, et il existe de nombreux outils nécessaires au developpement sur ces cartes.&lt;br /&gt;
Afin d'avoir un meilleur contrôle sur notre projet, et surtout d'en tirer un maximum de compétences, nous avons donc décidés de programmer notre robot directement en C en utilisant les outils AVR:&lt;br /&gt;
&lt;br /&gt;
- '''avr-gcc''': compilateur open-source portant toutes les fonctionnalités du langage C standard sur les microcontroleurs AVR.&lt;br /&gt;
Seul, son utilisation est quasiment impossible et demande trop de travail en programmation bas-niveau.&lt;br /&gt;
&lt;br /&gt;
- '''avr-libc''': implémentation basé sur le compilateur avr-gcc de la bibliothèque standard du langage C.&lt;br /&gt;
Cette bibliothèque permet donc d'utiliser les fonctions et structures standards du C (IO, maths, chaines de caractères), mais elle intègre également un mapping mémoire de tous les registres de l'atmega, ainsi qu'un mécanisme pour programmer des interruptions.&lt;br /&gt;
&lt;br /&gt;
- '''avr-objcopy''': ce programme en ligne de commande formate le binaire obtenu en format utilisable par les AVR&lt;br /&gt;
&lt;br /&gt;
- '''avr-dude''': ce programme en ligne de commande permet de flasher via une interface USB-série un microcontroleur AVR présent sur une carte Arduino.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc developpé un '''Makefile''' utilisant tous ces outils, constituant un environnement de developpement très efficace pour notre projet. Ce Makefile est disponible sur notre gitlab.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Programme du robot'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
=&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''PWM'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
=&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Encodeurs'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
=&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Angle'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
=&amp;lt;span style=&amp;quot;color:#000070&amp;quot;&amp;gt;'''Interruption principale'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Bilan'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 6 :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 7 :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 8 :'''&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Gestion de projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
- L'utilisation de git : &lt;br /&gt;
[[Fichier:Gt.png|400px|thumb|left|texte descriptif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Semestre 6 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/22''' &lt;br /&gt;
&lt;br /&gt;
Séance de découverte du sujet de notre projet.&lt;br /&gt;
&lt;br /&gt;
Recherche de l'existant &lt;br /&gt;
&lt;br /&gt;
Réalisation de recherches sur leurs différentes utilisations.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/22''' &lt;br /&gt;
&lt;br /&gt;
Début de création du diagramme de Gantt .&lt;br /&gt;
&lt;br /&gt;
Réalisation d'une étude du besoin.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du marché : Recherche des robots similaires.&lt;br /&gt;
&lt;br /&gt;
Commencer à prendre en main le robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 22/03/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de l'étude de marché.&lt;br /&gt;
&lt;br /&gt;
Etude des opportunités.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 29/03/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'étude du marché.&lt;br /&gt;
&lt;br /&gt;
Commencer à rédiger le cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 05/04/22''' &lt;br /&gt;
&lt;br /&gt;
Commencer la rédaction du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 26/04/22''' &lt;br /&gt;
&lt;br /&gt;
Bilan du semestre.&lt;br /&gt;
&lt;br /&gt;
Etude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Etude des risques.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 03/05/22''' &lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude des risques.&lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Finalisation du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
== Semestre 7 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 10/10/22'''&lt;br /&gt;
&lt;br /&gt;
Commencement de l'étude technique des encodeurs . &lt;br /&gt;
Recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du changement de la carte arduino pour ajouter des nouvelles fonctionnalités : connexion Wifi, fréquence microprocesseur plus élevé,..&lt;br /&gt;
Test des encodeurs moteur DC : validé .&lt;br /&gt;
Poursuite de recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude de génération des signaux PWM&lt;br /&gt;
&lt;br /&gt;
Test sur Matlab Simulink des boucles d'asservissement issues des robots similaires .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/11/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation des signaux PWM du robot.&lt;br /&gt;
&lt;br /&gt;
Calcul de la fonction de transfert issue de la boucle.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/11/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du fonctionnement du gyroscope et des autres composants pour programmer le robot .  &lt;br /&gt;
&lt;br /&gt;
Séparation du travail a effectuer pour le robot entre une boucle du moteur DC(niveau 1) et une boucle du niveau supérieur(niveau 2) pour asservir l'angle d'inclinaison du robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/11/22''' &lt;br /&gt;
&lt;br /&gt;
Modification et amélioration du diagramme de Gantt pour le S7 et le S8.&lt;br /&gt;
&lt;br /&gt;
Avancée de la modélisation de la boucle du niveau 1 .&lt;br /&gt;
&lt;br /&gt;
Diagramme de Gantt S7-S8&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/11/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation de la boucle du niveau inférieur sur Matlab/Simulink et récupération des résultats sur le scope .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/12/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie informatique et avancement de la partie automatique .&lt;br /&gt;
Programmation de la liaison série pour débugger les sorties de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/12/22''' &lt;br /&gt;
&lt;br /&gt;
Début de rédaction du rapport pour le S7&lt;br /&gt;
&lt;br /&gt;
== Semestre 8 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/01/23''' &lt;br /&gt;
&lt;br /&gt;
Recherches pour le gyroscope . &lt;br /&gt;
Test des encodeurs .&lt;br /&gt;
Communication sur les attentes du semestre s8 ,les fautes à éviter pour rebondir par rapport au retard S7 &lt;br /&gt;
Mise à niveau pour comprendre les aspects techniques de la partie informatique pour pouvoir travailler ensemble sur les résultats du S8 .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/01/23''' &lt;br /&gt;
&lt;br /&gt;
- Suppression des structures de données pour avancer plus rapidement sur les résultats du semestre s8 .&lt;br /&gt;
&lt;br /&gt;
- Recherches pour la programmation des interruptions PCINT . &lt;br /&gt;
&lt;br /&gt;
- Recherche sur la doc technique pour faire l'initialisation des interruptions externes . &lt;br /&gt;
&lt;br /&gt;
- Recherche de la modélisation en 3D de notre robot pour trouver les paramètres PID de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/02/23''' &lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons :&lt;br /&gt;
&lt;br /&gt;
Modification du code des encodeurs et test sur les moteurs DC . &lt;br /&gt;
&lt;br /&gt;
Poursuite de recherche de l'existant pour trouver le code du gyroscope .&lt;br /&gt;
&lt;br /&gt;
Mise à jour du git .&lt;br /&gt;
&lt;br /&gt;
Début du calcul des matrices d'inertie de chaque solide.&lt;br /&gt;
&lt;br /&gt;
Recherche du code des régulateurs.&lt;br /&gt;
&lt;br /&gt;
Avancement sur la gestion de projet .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/02/23'''&lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons essayé de récupérer les résultats des tests électronique de l'oscilloscope effectués dans les salles d'électronique .&lt;br /&gt;
&lt;br /&gt;
Le code des encodeurs marchent ,la liaison série affiche exactement la vitesse de la consigne :les Régulateurs implémentés correspondent bien à notre applications.&lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation de la partie informatique du gyroscope : Objectif : récupération de l'angle d'inclinaison sur la liaison série avec la meilleure précision possible .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/02/23''' &lt;br /&gt;
&lt;br /&gt;
Fin du calcul des matrices d'inertie . &lt;br /&gt;
&lt;br /&gt;
Paramétrage de notre robot pour avoir la visibilité sur les configurations possibles d'avoir(en virage, ligne droite),en précisant les angles d'inclinaison et es repères associés . &lt;br /&gt;
&lt;br /&gt;
Poursuite de programmation des régulateurs par niveaux en utilisant le code précédemment implémenté pour les encodeurs .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/23''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation du modèle en 3D de notre robot pour essayer de l'autoéquilibrer en utilisant les PIDS issues de l'autotune par rapport à nos préférences(stabilité,temps de réponse,dépassement,précision). &lt;br /&gt;
&lt;br /&gt;
Nous avons testé le robot en l'alimentant par le biai la liaison USB ! et enregistrement des résultats .  &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie automatique en trouvant toutes les équations nécessaires à notre modèle .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/23''' &lt;br /&gt;
&lt;br /&gt;
Réalisations de cette séance :&lt;br /&gt;
&lt;br /&gt;
Test du robot pour se stabiliser sur le sol en applicant plusieurs . &lt;br /&gt;
&lt;br /&gt;
Faire tous les calculs des dimensions géométriques de notre robot et test de la boucle d'asservissement avec les deux niveaux sur Matlab Simulink avec nos préférences de stabilité, temps de réponse,précision,dépassement .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/23''' &lt;br /&gt;
&lt;br /&gt;
Absence justifiée .&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91437</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91437"/>
				<updated>2023-05-09T20:45:13Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : /* Environnement de developpement */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Résumé'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
[[Fichier: SegwayRobot.jpg|200px|right|thumb|Exemple de robot similaire au notre]]&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
L'intégralité de notre programme est disponible sur le dépôt git à l'adresse: https://gitlab.com/remi_farault/self-balanced-robot&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Présentation générale'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==🌏Contexte==&lt;br /&gt;
Les moyens de transport actuels reposent principalement sur le principe du robot à deux roues, c'est la raison pour laquelle l'étude de celui ci s'avère importante, en effet l'étude   &lt;br /&gt;
de sa conception et son contrôle va nous permettre de développer des outils innovants qui pourraient potentiellement intéresser des sociétés de transport .&lt;br /&gt;
&lt;br /&gt;
==🎯Objectif==&lt;br /&gt;
&lt;br /&gt;
Notre objectif principal est de commander le robot, de là interviennent d'autres objectifs tel que la stabilité ,développer un code robuste qui assure cette fonctionnalité et aussi le contrôler pour réaliser des fonctionnalités de déplacement et d'éviter des obstacles . Des objectifs secondaires sont de créer un site web à travers lequel nous allons mener toutes les opérations de contrôle .&lt;br /&gt;
&lt;br /&gt;
==🔍Expression du besoin==&lt;br /&gt;
&lt;br /&gt;
Un robot autoéquilibré à deux roues est un type de robot qui peut se maintenir en équilibre sur deux roues sans tomber. Pour réaliser cette fonctionnalité, le robot utilise un ensemble de capteurs, d'algorithmes de contrôle et de moteurs pour ajuster sa position en temps réel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Self_balanc_bt.png|400px|Bete a corne SBR]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le diagramme interacteurs permet en fait de visualiser les fonctions services assurées par le système &lt;br /&gt;
&lt;br /&gt;
[[Fichier:341702419_560921119358434_1016673599353874396_n_(1).png|400px|DGI SBR]]    [[Fichier:Btacorne.png |500px|DGI SBR|right]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Réalisations et Résultats'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
[[Fichier: seg.jpg|200px|left|thumb|Exemple de commande désirée]]&lt;br /&gt;
&lt;br /&gt;
Après mis en place notre stratégie de gestion de projet en s6 à travers le diagramme de GANTT et le cahier de charges fonctionnels, nous nous sommes focalisés sur l'étude technique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: progg.png|300px|right|thumb|Organisation de notre programme]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, étudier à travers des outils automatiques la stabilité du robot en faisant appel à des modèles théoriques et pratiques et commencer par un raisonnement par niveaux, d'abord le niveau 1 du moteur à courant continu et les équations correspondantes puis le niveau 2 assurant la stabilité du robot directement, on avait la possibilité de passer directement au niveau 2 à travers le modèle du pendule inversé et les équations qui en découlent sauf que celui-ci ne nous permettra pas de revenir au niveau 1 et asservir le moteur à travers les codeurs incrémentales ,la deuxième partie consistait à réaliser les codes informatiques en s'appuyant sur les structures de données en C vues l'année dernière et conduire un même raisonnement(par niveaux) s'appuyant d'abord sur les codes sources correspondants à la génération d'un signal PWM pour les deux moteurs avec un rapport cyclique modifiable, et aussi les codes sources correspondants à la gestion des moteurs, en effet, ceux-ci tournent  dans un sens ou dans un autre ou ne tournent pas en fonction de la variable in1 et in2  pour faire tourner les moteurs .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Avr.png|100px|left|thumb|Compilateur utilisé]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cependant, nous avons rencontré quelques problèmes en automatique notamment pour trouver des valeurs des constantes théoriques pour les références du moteur entre les mains, ce qui nous a obligé à prendre des valeurs issues d'autres applications, nous avons rencontré aussi quelques problèmes choisir une modélisation parmi celles qui sont disponibles sur Internet .&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Etude Automatique'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Avant de programmer notre système sur la carte Arduino, nous avons également créé une simulation complète de notre système robotisé sur SIMULINK. Cependant, avant cela, nous avons dû déterminer les équations qui régissent notre système en trouvant les matrices d'inertie de chaque composant de notre robot, à savoir la masse transportée par le robot (M), le châssis constitué de deux plateaux et de la motorisation (les piliers et leur inertie ont été négligés car leur masse est très faible), ainsi que les roues (roue droite et roue gauche). Vous trouverez ci-dessous les matrices d'inertie que nous avons obtenues pour chaque composant.&lt;br /&gt;
&lt;br /&gt;
'''Masse M :'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatM.png|200px|thumb|left|Matrice de la masse M]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients seront notés dans la suite pour simplifier : AM,BM,CM &lt;br /&gt;
&lt;br /&gt;
'''Chassis:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatB.png|800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AH,BH,CH &lt;br /&gt;
&lt;br /&gt;
'''Roue gauche:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrg.png |600px|Matrice de RG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
'''Roue droite:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrd.png |600px|Matrice RD]]&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
Ci-dessous un paramétrage de notre système : Chaque angle détermine un repère&lt;br /&gt;
&lt;br /&gt;
Le repère R0 est supposé galliléen.&lt;br /&gt;
&lt;br /&gt;
Le repère R1 est en rotation  ,appelé angle de virage par rapport à R0.&lt;br /&gt;
&lt;br /&gt;
Le repère R2 est en rotation  ,appelé angle d’inclinaison du châssis par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R3 est en rotation  ,appelé angle d’inclinaison arrière-avant de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R4 est en rotation ,appelé angle d’inclinaison droite-gauche de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:param.png |800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
l’angle de consigne est de 0deg,nous employons un PID pour corriger l’angle de mesure,à sa sortie,on aura une tension W(p).Les blocs Km et W(p) assurent le passage tension-&amp;gt;couple-&amp;gt;angle ,il faut ensuite retirer  pour ne garder que l’angle d’inclinaison du châssis  .Km=0.0125N.m.V-1(d’après la datasheet du moteur)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bcle.png |800px|Asservissement]]                                                             [[Fichier:Matuu.png|right|800px|Asservissement]]      &lt;br /&gt;
&lt;br /&gt;
Les équations obtenues sont les suivantes (Le détail des calculs a été précisé dans le Rapport): &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eq nnlin.png |500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après linéarisation : Considérer l'approximations des petits angles pour le sinus et cosinus,et négliger aussi la vitesse angulaire quadratique devant la vitesse angulaire,nous obtenons : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eqlin.png |300px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crbe.png|600px|Courbe]]&lt;br /&gt;
&lt;br /&gt;
On obtient une courbe avec un bon temps de réponse, un léger dépassement et une stabilité .Le système est régulé de manière efficace, capable de répondre rapidement et précisément aux perturbations tout en maintenant une position d'équilibre stable.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mat3d.png|500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Environnement de developpement'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Notre microcontrolleur étant une Arduino Uno, nous aurions pu utiliser le framework ''Arduino'' donnant accès à un IDE intégrant les outils pour compiler et flasher le code, ainsi qu'une multitude de bibliothèques haut niveaux très simples d'utilisation et plutôt performantes, permettant de programmer notre robot en simplement quelques dizaines de lignes de code.&lt;br /&gt;
&lt;br /&gt;
Cependant, l'Arduino est simplement une carte de prototypage intégrant un microcontrôleur ''AVR Atmega 328p''. &lt;br /&gt;
Les microcontroleurs AVR disposent d'une grande communauté, et il existe de nombreux outils nécessaires au developpement sur ces cartes.&lt;br /&gt;
Afin d'avoir un meilleur contrôle sur notre projet, et surtout d'en tirer un maximum de compétences, nous avons donc décidés de programmer notre robot directement en C en utilisant les outils AVR:&lt;br /&gt;
&lt;br /&gt;
- '''avr-gcc''': compilateur open-source portant toutes les fonctionnalités du langage C standard sur les microcontroleurs AVR.&lt;br /&gt;
Seul, son utilisation est quasiment impossible et demande trop de travail en programmation bas-niveau.&lt;br /&gt;
&lt;br /&gt;
- '''avr-libc''': implémentation basé sur le compilateur avr-gcc de la bibliothèque standard du langage C.&lt;br /&gt;
Cette bibliothèque permet donc d'utiliser les fonctions et structures standards du C (IO, maths, chaines de caractères), mais elle intègre également un mapping mémoire de tous les registres de l'atmega, ainsi qu'un mécanisme pour programmer des interruptions.&lt;br /&gt;
&lt;br /&gt;
- '''avr-objcopy''': ce programme en ligne de commande formate le binaire obtenu en format utilisable par les AVR&lt;br /&gt;
&lt;br /&gt;
- '''avr-dude''': ce programme en ligne de commande permet de flasher via une interface USB-série un microcontroleur AVR présent sur une carte Arduino.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc developpé un '''Makefile''' utilisant tous ces outils, constituant un environnement de developpement très efficace pour notre projet. Ce Makefile est disponible sur notre gitlab.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Bilan'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 6 :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 7 :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 8 :'''&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Gestion de projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
- L'utilisation de git : &lt;br /&gt;
[[Fichier:Gt.png|400px|thumb|left|texte descriptif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Semestre 6 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/22''' &lt;br /&gt;
&lt;br /&gt;
Séance de découverte du sujet de notre projet.&lt;br /&gt;
&lt;br /&gt;
Recherche de l'existant &lt;br /&gt;
&lt;br /&gt;
Réalisation de recherches sur leurs différentes utilisations.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/22''' &lt;br /&gt;
&lt;br /&gt;
Début de création du diagramme de Gantt .&lt;br /&gt;
&lt;br /&gt;
Réalisation d'une étude du besoin.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du marché : Recherche des robots similaires.&lt;br /&gt;
&lt;br /&gt;
Commencer à prendre en main le robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 22/03/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de l'étude de marché.&lt;br /&gt;
&lt;br /&gt;
Etude des opportunités.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 29/03/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'étude du marché.&lt;br /&gt;
&lt;br /&gt;
Commencer à rédiger le cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 05/04/22''' &lt;br /&gt;
&lt;br /&gt;
Commencer la rédaction du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 26/04/22''' &lt;br /&gt;
&lt;br /&gt;
Bilan du semestre.&lt;br /&gt;
&lt;br /&gt;
Etude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Etude des risques.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 03/05/22''' &lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude des risques.&lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Finalisation du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
== Semestre 7 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 10/10/22'''&lt;br /&gt;
&lt;br /&gt;
Commencement de l'étude technique des encodeurs . &lt;br /&gt;
Recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du changement de la carte arduino pour ajouter des nouvelles fonctionnalités : connexion Wifi, fréquence microprocesseur plus élevé,..&lt;br /&gt;
Test des encodeurs moteur DC : validé .&lt;br /&gt;
Poursuite de recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude de génération des signaux PWM&lt;br /&gt;
&lt;br /&gt;
Test sur Matlab Simulink des boucles d'asservissement issues des robots similaires .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/11/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation des signaux PWM du robot.&lt;br /&gt;
&lt;br /&gt;
Calcul de la fonction de transfert issue de la boucle.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/11/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du fonctionnement du gyroscope et des autres composants pour programmer le robot .  &lt;br /&gt;
&lt;br /&gt;
Séparation du travail a effectuer pour le robot entre une boucle du moteur DC(niveau 1) et une boucle du niveau supérieur(niveau 2) pour asservir l'angle d'inclinaison du robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/11/22''' &lt;br /&gt;
&lt;br /&gt;
Modification et amélioration du diagramme de Gantt pour le S7 et le S8.&lt;br /&gt;
&lt;br /&gt;
Avancée de la modélisation de la boucle du niveau 1 .&lt;br /&gt;
&lt;br /&gt;
Diagramme de Gantt S7-S8&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/11/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation de la boucle du niveau inférieur sur Matlab/Simulink et récupération des résultats sur le scope .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/12/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie informatique et avancement de la partie automatique .&lt;br /&gt;
Programmation de la liaison série pour débugger les sorties de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/12/22''' &lt;br /&gt;
&lt;br /&gt;
Début de rédaction du rapport pour le S7&lt;br /&gt;
&lt;br /&gt;
== Semestre 8 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/01/23''' &lt;br /&gt;
&lt;br /&gt;
Recherches pour le gyroscope . &lt;br /&gt;
Test des encodeurs .&lt;br /&gt;
Communication sur les attentes du semestre s8 ,les fautes à éviter pour rebondir par rapport au retard S7 &lt;br /&gt;
Mise à niveau pour comprendre les aspects techniques de la partie informatique pour pouvoir travailler ensemble sur les résultats du S8 .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/01/23''' &lt;br /&gt;
&lt;br /&gt;
- Suppression des structures de données pour avancer plus rapidement sur les résultats du semestre s8 .&lt;br /&gt;
&lt;br /&gt;
- Recherches pour la programmation des interruptions PCINT . &lt;br /&gt;
&lt;br /&gt;
- Recherche sur la doc technique pour faire l'initialisation des interruptions externes . &lt;br /&gt;
&lt;br /&gt;
- Recherche de la modélisation en 3D de notre robot pour trouver les paramètres PID de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/02/23''' &lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons :&lt;br /&gt;
&lt;br /&gt;
Modification du code des encodeurs et test sur les moteurs DC . &lt;br /&gt;
&lt;br /&gt;
Poursuite de recherche de l'existant pour trouver le code du gyroscope .&lt;br /&gt;
&lt;br /&gt;
Mise à jour du git .&lt;br /&gt;
&lt;br /&gt;
Début du calcul des matrices d'inertie de chaque solide.&lt;br /&gt;
&lt;br /&gt;
Recherche du code des régulateurs.&lt;br /&gt;
&lt;br /&gt;
Avancement sur la gestion de projet .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/02/23'''&lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons essayé de récupérer les résultats des tests électronique de l'oscilloscope effectués dans les salles d'électronique .&lt;br /&gt;
&lt;br /&gt;
Le code des encodeurs marchent ,la liaison série affiche exactement la vitesse de la consigne :les Régulateurs implémentés correspondent bien à notre applications.&lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation de la partie informatique du gyroscope : Objectif : récupération de l'angle d'inclinaison sur la liaison série avec la meilleure précision possible .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/02/23''' &lt;br /&gt;
&lt;br /&gt;
Fin du calcul des matrices d'inertie . &lt;br /&gt;
&lt;br /&gt;
Paramétrage de notre robot pour avoir la visibilité sur les configurations possibles d'avoir(en virage, ligne droite),en précisant les angles d'inclinaison et es repères associés . &lt;br /&gt;
&lt;br /&gt;
Poursuite de programmation des régulateurs par niveaux en utilisant le code précédemment implémenté pour les encodeurs .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/23''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation du modèle en 3D de notre robot pour essayer de l'autoéquilibrer en utilisant les PIDS issues de l'autotune par rapport à nos préférences(stabilité,temps de réponse,dépassement,précision). &lt;br /&gt;
&lt;br /&gt;
Nous avons testé le robot en l'alimentant par le biai la liaison USB ! et enregistrement des résultats .  &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie automatique en trouvant toutes les équations nécessaires à notre modèle .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/23''' &lt;br /&gt;
&lt;br /&gt;
Réalisations de cette séance :&lt;br /&gt;
&lt;br /&gt;
Test du robot pour se stabiliser sur le sol en applicant plusieurs . &lt;br /&gt;
&lt;br /&gt;
Faire tous les calculs des dimensions géométriques de notre robot et test de la boucle d'asservissement avec les deux niveaux sur Matlab Simulink avec nos préférences de stabilité, temps de réponse,précision,dépassement .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/23''' &lt;br /&gt;
&lt;br /&gt;
Absence justifiée .&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91436</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91436"/>
				<updated>2023-05-09T20:44:41Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : /* Environnement de developpement */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Résumé'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
[[Fichier: SegwayRobot.jpg|200px|right|thumb|Exemple de robot similaire au notre]]&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
L'intégralité de notre programme est disponible sur le dépôt git à l'adresse: https://gitlab.com/remi_farault/self-balanced-robot&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Présentation générale'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==🌏Contexte==&lt;br /&gt;
Les moyens de transport actuels reposent principalement sur le principe du robot à deux roues, c'est la raison pour laquelle l'étude de celui ci s'avère importante, en effet l'étude   &lt;br /&gt;
de sa conception et son contrôle va nous permettre de développer des outils innovants qui pourraient potentiellement intéresser des sociétés de transport .&lt;br /&gt;
&lt;br /&gt;
==🎯Objectif==&lt;br /&gt;
&lt;br /&gt;
Notre objectif principal est de commander le robot, de là interviennent d'autres objectifs tel que la stabilité ,développer un code robuste qui assure cette fonctionnalité et aussi le contrôler pour réaliser des fonctionnalités de déplacement et d'éviter des obstacles . Des objectifs secondaires sont de créer un site web à travers lequel nous allons mener toutes les opérations de contrôle .&lt;br /&gt;
&lt;br /&gt;
==🔍Expression du besoin==&lt;br /&gt;
&lt;br /&gt;
Un robot autoéquilibré à deux roues est un type de robot qui peut se maintenir en équilibre sur deux roues sans tomber. Pour réaliser cette fonctionnalité, le robot utilise un ensemble de capteurs, d'algorithmes de contrôle et de moteurs pour ajuster sa position en temps réel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Self_balanc_bt.png|400px|Bete a corne SBR]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le diagramme interacteurs permet en fait de visualiser les fonctions services assurées par le système &lt;br /&gt;
&lt;br /&gt;
[[Fichier:341702419_560921119358434_1016673599353874396_n_(1).png|400px|DGI SBR]]    [[Fichier:Btacorne.png |500px|DGI SBR|right]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Réalisations et Résultats'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
[[Fichier: seg.jpg|200px|left|thumb|Exemple de commande désirée]]&lt;br /&gt;
&lt;br /&gt;
Après mis en place notre stratégie de gestion de projet en s6 à travers le diagramme de GANTT et le cahier de charges fonctionnels, nous nous sommes focalisés sur l'étude technique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: progg.png|300px|right|thumb|Organisation de notre programme]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, étudier à travers des outils automatiques la stabilité du robot en faisant appel à des modèles théoriques et pratiques et commencer par un raisonnement par niveaux, d'abord le niveau 1 du moteur à courant continu et les équations correspondantes puis le niveau 2 assurant la stabilité du robot directement, on avait la possibilité de passer directement au niveau 2 à travers le modèle du pendule inversé et les équations qui en découlent sauf que celui-ci ne nous permettra pas de revenir au niveau 1 et asservir le moteur à travers les codeurs incrémentales ,la deuxième partie consistait à réaliser les codes informatiques en s'appuyant sur les structures de données en C vues l'année dernière et conduire un même raisonnement(par niveaux) s'appuyant d'abord sur les codes sources correspondants à la génération d'un signal PWM pour les deux moteurs avec un rapport cyclique modifiable, et aussi les codes sources correspondants à la gestion des moteurs, en effet, ceux-ci tournent  dans un sens ou dans un autre ou ne tournent pas en fonction de la variable in1 et in2  pour faire tourner les moteurs .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Avr.png|100px|left|thumb|Compilateur utilisé]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cependant, nous avons rencontré quelques problèmes en automatique notamment pour trouver des valeurs des constantes théoriques pour les références du moteur entre les mains, ce qui nous a obligé à prendre des valeurs issues d'autres applications, nous avons rencontré aussi quelques problèmes choisir une modélisation parmi celles qui sont disponibles sur Internet .&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Etude Automatique'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Avant de programmer notre système sur la carte Arduino, nous avons également créé une simulation complète de notre système robotisé sur SIMULINK. Cependant, avant cela, nous avons dû déterminer les équations qui régissent notre système en trouvant les matrices d'inertie de chaque composant de notre robot, à savoir la masse transportée par le robot (M), le châssis constitué de deux plateaux et de la motorisation (les piliers et leur inertie ont été négligés car leur masse est très faible), ainsi que les roues (roue droite et roue gauche). Vous trouverez ci-dessous les matrices d'inertie que nous avons obtenues pour chaque composant.&lt;br /&gt;
&lt;br /&gt;
'''Masse M :'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatM.png|200px|thumb|left|Matrice de la masse M]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients seront notés dans la suite pour simplifier : AM,BM,CM &lt;br /&gt;
&lt;br /&gt;
'''Chassis:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatB.png|800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AH,BH,CH &lt;br /&gt;
&lt;br /&gt;
'''Roue gauche:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrg.png |600px|Matrice de RG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
'''Roue droite:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrd.png |600px|Matrice RD]]&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
Ci-dessous un paramétrage de notre système : Chaque angle détermine un repère&lt;br /&gt;
&lt;br /&gt;
Le repère R0 est supposé galliléen.&lt;br /&gt;
&lt;br /&gt;
Le repère R1 est en rotation  ,appelé angle de virage par rapport à R0.&lt;br /&gt;
&lt;br /&gt;
Le repère R2 est en rotation  ,appelé angle d’inclinaison du châssis par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R3 est en rotation  ,appelé angle d’inclinaison arrière-avant de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R4 est en rotation ,appelé angle d’inclinaison droite-gauche de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:param.png |800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
l’angle de consigne est de 0deg,nous employons un PID pour corriger l’angle de mesure,à sa sortie,on aura une tension W(p).Les blocs Km et W(p) assurent le passage tension-&amp;gt;couple-&amp;gt;angle ,il faut ensuite retirer  pour ne garder que l’angle d’inclinaison du châssis  .Km=0.0125N.m.V-1(d’après la datasheet du moteur)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bcle.png |800px|Asservissement]]                                                             [[Fichier:Matuu.png|right|800px|Asservissement]]      &lt;br /&gt;
&lt;br /&gt;
Les équations obtenues sont les suivantes (Le détail des calculs a été précisé dans le Rapport): &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eq nnlin.png |500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après linéarisation : Considérer l'approximations des petits angles pour le sinus et cosinus,et négliger aussi la vitesse angulaire quadratique devant la vitesse angulaire,nous obtenons : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eqlin.png |300px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crbe.png|600px|Courbe]]&lt;br /&gt;
&lt;br /&gt;
On obtient une courbe avec un bon temps de réponse, un léger dépassement et une stabilité .Le système est régulé de manière efficace, capable de répondre rapidement et précisément aux perturbations tout en maintenant une position d'équilibre stable.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mat3d.png|500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Environnement de developpement'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Notre microcontrolleur étant une Arduino Uno, nous aurions pu utiliser le framework ''Arduino'' donnant accès à un IDE intégrant les outils pour compiler et flasher le code, ainsi qu'une multitude de bibliothèques haut niveaux très simples d'utilisation et plutôt performantes, permettant de programmer notre robot en simplement quelques dizaines de lignes de code.&lt;br /&gt;
&lt;br /&gt;
Cependant, l'Arduino est simplement une carte de prototypage intégrant un microcontrôleur ''AVR Atmega 328p''. &lt;br /&gt;
Les microcontroleurs AVR disposent d'une grande communauté, et il existe de nombreux outils nécessaires au developpement sur ces cartes.&lt;br /&gt;
Afin d'avoir un meilleur contrôle sur notre projet, et surtout d'en tirer un maximum de compétences, nous avons donc décidés de programmer notre robot directement en C en utilisant les outils AVR:&lt;br /&gt;
&lt;br /&gt;
- '''avr-gcc''': compilateur open-source portant toutes les fonctionnalités du langage C standard sur les microcontroleurs AVR.&lt;br /&gt;
Seul, son utilisation est quasiment impossible et demande trop de travail en programmation bas-niveau.&lt;br /&gt;
&lt;br /&gt;
- '''avr-libc''': implémentation basé sur le compilateur avr-gcc de la bibliothèque standard du langage C.&lt;br /&gt;
Cette bibliothèque permet donc d'utiliser les fonctions et structures standards du C (IO, maths, chaines de caractères), mais elle intègre également un mapping mémoire de tous les registres de l'atmega, ainsi qu'un mécanisme pour programmer des interruptions.&lt;br /&gt;
&lt;br /&gt;
- '''avr-objcopy''': ce programme en ligne de commande formate le binaire obtenu en format utilisable par les AVR&lt;br /&gt;
&lt;br /&gt;
- '''avr-dude''': ce programme en ligne de commande permet de flasher via une interface USB-série un microcontroleur AVR présent sur une carte Arduino.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc developpé un Makefile utilisant tous ces outils, constituant un environnement de developpement très efficace pour notre projet. Ce Makefile est disponible sur notre gitlab.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Bilan'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 6 :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 7 :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 8 :'''&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Gestion de projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
- L'utilisation de git : &lt;br /&gt;
[[Fichier:Gt.png|400px|thumb|left|texte descriptif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Semestre 6 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/22''' &lt;br /&gt;
&lt;br /&gt;
Séance de découverte du sujet de notre projet.&lt;br /&gt;
&lt;br /&gt;
Recherche de l'existant &lt;br /&gt;
&lt;br /&gt;
Réalisation de recherches sur leurs différentes utilisations.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/22''' &lt;br /&gt;
&lt;br /&gt;
Début de création du diagramme de Gantt .&lt;br /&gt;
&lt;br /&gt;
Réalisation d'une étude du besoin.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du marché : Recherche des robots similaires.&lt;br /&gt;
&lt;br /&gt;
Commencer à prendre en main le robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 22/03/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de l'étude de marché.&lt;br /&gt;
&lt;br /&gt;
Etude des opportunités.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 29/03/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'étude du marché.&lt;br /&gt;
&lt;br /&gt;
Commencer à rédiger le cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 05/04/22''' &lt;br /&gt;
&lt;br /&gt;
Commencer la rédaction du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 26/04/22''' &lt;br /&gt;
&lt;br /&gt;
Bilan du semestre.&lt;br /&gt;
&lt;br /&gt;
Etude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Etude des risques.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 03/05/22''' &lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude des risques.&lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Finalisation du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
== Semestre 7 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 10/10/22'''&lt;br /&gt;
&lt;br /&gt;
Commencement de l'étude technique des encodeurs . &lt;br /&gt;
Recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du changement de la carte arduino pour ajouter des nouvelles fonctionnalités : connexion Wifi, fréquence microprocesseur plus élevé,..&lt;br /&gt;
Test des encodeurs moteur DC : validé .&lt;br /&gt;
Poursuite de recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude de génération des signaux PWM&lt;br /&gt;
&lt;br /&gt;
Test sur Matlab Simulink des boucles d'asservissement issues des robots similaires .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/11/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation des signaux PWM du robot.&lt;br /&gt;
&lt;br /&gt;
Calcul de la fonction de transfert issue de la boucle.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/11/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du fonctionnement du gyroscope et des autres composants pour programmer le robot .  &lt;br /&gt;
&lt;br /&gt;
Séparation du travail a effectuer pour le robot entre une boucle du moteur DC(niveau 1) et une boucle du niveau supérieur(niveau 2) pour asservir l'angle d'inclinaison du robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/11/22''' &lt;br /&gt;
&lt;br /&gt;
Modification et amélioration du diagramme de Gantt pour le S7 et le S8.&lt;br /&gt;
&lt;br /&gt;
Avancée de la modélisation de la boucle du niveau 1 .&lt;br /&gt;
&lt;br /&gt;
Diagramme de Gantt S7-S8&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/11/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation de la boucle du niveau inférieur sur Matlab/Simulink et récupération des résultats sur le scope .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/12/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie informatique et avancement de la partie automatique .&lt;br /&gt;
Programmation de la liaison série pour débugger les sorties de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/12/22''' &lt;br /&gt;
&lt;br /&gt;
Début de rédaction du rapport pour le S7&lt;br /&gt;
&lt;br /&gt;
== Semestre 8 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/01/23''' &lt;br /&gt;
&lt;br /&gt;
Recherches pour le gyroscope . &lt;br /&gt;
Test des encodeurs .&lt;br /&gt;
Communication sur les attentes du semestre s8 ,les fautes à éviter pour rebondir par rapport au retard S7 &lt;br /&gt;
Mise à niveau pour comprendre les aspects techniques de la partie informatique pour pouvoir travailler ensemble sur les résultats du S8 .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/01/23''' &lt;br /&gt;
&lt;br /&gt;
- Suppression des structures de données pour avancer plus rapidement sur les résultats du semestre s8 .&lt;br /&gt;
&lt;br /&gt;
- Recherches pour la programmation des interruptions PCINT . &lt;br /&gt;
&lt;br /&gt;
- Recherche sur la doc technique pour faire l'initialisation des interruptions externes . &lt;br /&gt;
&lt;br /&gt;
- Recherche de la modélisation en 3D de notre robot pour trouver les paramètres PID de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/02/23''' &lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons :&lt;br /&gt;
&lt;br /&gt;
Modification du code des encodeurs et test sur les moteurs DC . &lt;br /&gt;
&lt;br /&gt;
Poursuite de recherche de l'existant pour trouver le code du gyroscope .&lt;br /&gt;
&lt;br /&gt;
Mise à jour du git .&lt;br /&gt;
&lt;br /&gt;
Début du calcul des matrices d'inertie de chaque solide.&lt;br /&gt;
&lt;br /&gt;
Recherche du code des régulateurs.&lt;br /&gt;
&lt;br /&gt;
Avancement sur la gestion de projet .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/02/23'''&lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons essayé de récupérer les résultats des tests électronique de l'oscilloscope effectués dans les salles d'électronique .&lt;br /&gt;
&lt;br /&gt;
Le code des encodeurs marchent ,la liaison série affiche exactement la vitesse de la consigne :les Régulateurs implémentés correspondent bien à notre applications.&lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation de la partie informatique du gyroscope : Objectif : récupération de l'angle d'inclinaison sur la liaison série avec la meilleure précision possible .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/02/23''' &lt;br /&gt;
&lt;br /&gt;
Fin du calcul des matrices d'inertie . &lt;br /&gt;
&lt;br /&gt;
Paramétrage de notre robot pour avoir la visibilité sur les configurations possibles d'avoir(en virage, ligne droite),en précisant les angles d'inclinaison et es repères associés . &lt;br /&gt;
&lt;br /&gt;
Poursuite de programmation des régulateurs par niveaux en utilisant le code précédemment implémenté pour les encodeurs .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/23''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation du modèle en 3D de notre robot pour essayer de l'autoéquilibrer en utilisant les PIDS issues de l'autotune par rapport à nos préférences(stabilité,temps de réponse,dépassement,précision). &lt;br /&gt;
&lt;br /&gt;
Nous avons testé le robot en l'alimentant par le biai la liaison USB ! et enregistrement des résultats .  &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie automatique en trouvant toutes les équations nécessaires à notre modèle .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/23''' &lt;br /&gt;
&lt;br /&gt;
Réalisations de cette séance :&lt;br /&gt;
&lt;br /&gt;
Test du robot pour se stabiliser sur le sol en applicant plusieurs . &lt;br /&gt;
&lt;br /&gt;
Faire tous les calculs des dimensions géométriques de notre robot et test de la boucle d'asservissement avec les deux niveaux sur Matlab Simulink avec nos préférences de stabilité, temps de réponse,précision,dépassement .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/23''' &lt;br /&gt;
&lt;br /&gt;
Absence justifiée .&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91435</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91435"/>
				<updated>2023-05-09T20:43:16Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : /* Réalisations et Résultats */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Résumé'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
[[Fichier: SegwayRobot.jpg|200px|right|thumb|Exemple de robot similaire au notre]]&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
L'intégralité de notre programme est disponible sur le dépôt git à l'adresse: https://gitlab.com/remi_farault/self-balanced-robot&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Présentation générale'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==🌏Contexte==&lt;br /&gt;
Les moyens de transport actuels reposent principalement sur le principe du robot à deux roues, c'est la raison pour laquelle l'étude de celui ci s'avère importante, en effet l'étude   &lt;br /&gt;
de sa conception et son contrôle va nous permettre de développer des outils innovants qui pourraient potentiellement intéresser des sociétés de transport .&lt;br /&gt;
&lt;br /&gt;
==🎯Objectif==&lt;br /&gt;
&lt;br /&gt;
Notre objectif principal est de commander le robot, de là interviennent d'autres objectifs tel que la stabilité ,développer un code robuste qui assure cette fonctionnalité et aussi le contrôler pour réaliser des fonctionnalités de déplacement et d'éviter des obstacles . Des objectifs secondaires sont de créer un site web à travers lequel nous allons mener toutes les opérations de contrôle .&lt;br /&gt;
&lt;br /&gt;
==🔍Expression du besoin==&lt;br /&gt;
&lt;br /&gt;
Un robot autoéquilibré à deux roues est un type de robot qui peut se maintenir en équilibre sur deux roues sans tomber. Pour réaliser cette fonctionnalité, le robot utilise un ensemble de capteurs, d'algorithmes de contrôle et de moteurs pour ajuster sa position en temps réel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Self_balanc_bt.png|400px|Bete a corne SBR]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le diagramme interacteurs permet en fait de visualiser les fonctions services assurées par le système &lt;br /&gt;
&lt;br /&gt;
[[Fichier:341702419_560921119358434_1016673599353874396_n_(1).png|400px|DGI SBR]]    [[Fichier:Btacorne.png |500px|DGI SBR|right]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Réalisations et Résultats'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
[[Fichier: seg.jpg|200px|left|thumb|Exemple de commande désirée]]&lt;br /&gt;
&lt;br /&gt;
Après mis en place notre stratégie de gestion de projet en s6 à travers le diagramme de GANTT et le cahier de charges fonctionnels, nous nous sommes focalisés sur l'étude technique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: progg.png|300px|right|thumb|Organisation de notre programme]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, étudier à travers des outils automatiques la stabilité du robot en faisant appel à des modèles théoriques et pratiques et commencer par un raisonnement par niveaux, d'abord le niveau 1 du moteur à courant continu et les équations correspondantes puis le niveau 2 assurant la stabilité du robot directement, on avait la possibilité de passer directement au niveau 2 à travers le modèle du pendule inversé et les équations qui en découlent sauf que celui-ci ne nous permettra pas de revenir au niveau 1 et asservir le moteur à travers les codeurs incrémentales ,la deuxième partie consistait à réaliser les codes informatiques en s'appuyant sur les structures de données en C vues l'année dernière et conduire un même raisonnement(par niveaux) s'appuyant d'abord sur les codes sources correspondants à la génération d'un signal PWM pour les deux moteurs avec un rapport cyclique modifiable, et aussi les codes sources correspondants à la gestion des moteurs, en effet, ceux-ci tournent  dans un sens ou dans un autre ou ne tournent pas en fonction de la variable in1 et in2  pour faire tourner les moteurs .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Avr.png|100px|left|thumb|Compilateur utilisé]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cependant, nous avons rencontré quelques problèmes en automatique notamment pour trouver des valeurs des constantes théoriques pour les références du moteur entre les mains, ce qui nous a obligé à prendre des valeurs issues d'autres applications, nous avons rencontré aussi quelques problèmes choisir une modélisation parmi celles qui sont disponibles sur Internet .&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Etude Automatique'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Avant de programmer notre système sur la carte Arduino, nous avons également créé une simulation complète de notre système robotisé sur SIMULINK. Cependant, avant cela, nous avons dû déterminer les équations qui régissent notre système en trouvant les matrices d'inertie de chaque composant de notre robot, à savoir la masse transportée par le robot (M), le châssis constitué de deux plateaux et de la motorisation (les piliers et leur inertie ont été négligés car leur masse est très faible), ainsi que les roues (roue droite et roue gauche). Vous trouverez ci-dessous les matrices d'inertie que nous avons obtenues pour chaque composant.&lt;br /&gt;
&lt;br /&gt;
'''Masse M :'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatM.png|200px|thumb|left|Matrice de la masse M]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients seront notés dans la suite pour simplifier : AM,BM,CM &lt;br /&gt;
&lt;br /&gt;
'''Chassis:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatB.png|800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AH,BH,CH &lt;br /&gt;
&lt;br /&gt;
'''Roue gauche:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrg.png |600px|Matrice de RG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
'''Roue droite:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrd.png |600px|Matrice RD]]&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
Ci-dessous un paramétrage de notre système : Chaque angle détermine un repère&lt;br /&gt;
&lt;br /&gt;
Le repère R0 est supposé galliléen.&lt;br /&gt;
&lt;br /&gt;
Le repère R1 est en rotation  ,appelé angle de virage par rapport à R0.&lt;br /&gt;
&lt;br /&gt;
Le repère R2 est en rotation  ,appelé angle d’inclinaison du châssis par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R3 est en rotation  ,appelé angle d’inclinaison arrière-avant de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R4 est en rotation ,appelé angle d’inclinaison droite-gauche de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:param.png |800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
l’angle de consigne est de 0deg,nous employons un PID pour corriger l’angle de mesure,à sa sortie,on aura une tension W(p).Les blocs Km et W(p) assurent le passage tension-&amp;gt;couple-&amp;gt;angle ,il faut ensuite retirer  pour ne garder que l’angle d’inclinaison du châssis  .Km=0.0125N.m.V-1(d’après la datasheet du moteur)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bcle.png |800px|Asservissement]]                                                             [[Fichier:Matuu.png|right|800px|Asservissement]]      &lt;br /&gt;
&lt;br /&gt;
Les équations obtenues sont les suivantes (Le détail des calculs a été précisé dans le Rapport): &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eq nnlin.png |500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après linéarisation : Considérer l'approximations des petits angles pour le sinus et cosinus,et négliger aussi la vitesse angulaire quadratique devant la vitesse angulaire,nous obtenons : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eqlin.png |300px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crbe.png|600px|Courbe]]&lt;br /&gt;
&lt;br /&gt;
On obtient une courbe avec un bon temps de réponse, un léger dépassement et une stabilité .Le système est régulé de manière efficace, capable de répondre rapidement et précisément aux perturbations tout en maintenant une position d'équilibre stable.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mat3d.png|500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Environnement de developpement'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Notre microcontrolleur étant une Arduino Uno, nous aurions pu utiliser le framework Arduino donnant accès à un IDE intégrant les outils pour compiler et flasher le code, ainsi qu'une multitude de bibliothèques haut niveaux très simples d'utilisation et plutôt performantes, permettant de programmer notre robot en simplement quelques dizaines de lignes de code.&lt;br /&gt;
&lt;br /&gt;
Cependant, l'Arduino est simplement une carte de prototypage intégrant un microcontrôleur AVR Atmega 328p. &lt;br /&gt;
Les microcontroleurs AVR disposent d'une grande communauté, et il existe de nombreux outils nécessaires au developpement sur ces cartes.&lt;br /&gt;
Afin d'avoir un meilleur contrôle sur notre projet, et surtout d'en tirer un maximum de compétences, nous avons donc décidés de programmer notre robot directement en C en utilisant les outils AVR:&lt;br /&gt;
&lt;br /&gt;
- avr-gcc: compilateur open-source portant toutes les fonctionnalités du langage C standard sur les microcontroleurs AVR.&lt;br /&gt;
Seul, son utilisation est quasiment impossible et demande trop de travail en programmation bas-niveau.&lt;br /&gt;
&lt;br /&gt;
- avr-libc: implémentation basé sur le compilateur avr-gcc de la bibliothèque standard du langage C.&lt;br /&gt;
Cette bibliothèque permet donc d'utiliser les fonctions et structures standards du C (IO, maths, chaines de caractères), mais elle intègre également un mapping mémoire de tous les registres de l'atmega, ainsi qu'un mécanisme pour programmer des interruptions.&lt;br /&gt;
&lt;br /&gt;
- avr-objcopy: ce programme en ligne de commande formate le binaire obtenu en format utilisable par les AVR&lt;br /&gt;
&lt;br /&gt;
- avr-dude: ce programme en ligne de commande permet de flasher via une interface USB-série un microcontroleur AVR présent sur une carte Arduino.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc developpé un Makefile utilisant tous ces outils, constituant un environnement de developpement très efficace pour notre projet. Ce Makefile est disponible sur notre gitlab.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Bilan'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 6 :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 7 :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 8 :'''&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Gestion de projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
- L'utilisation de git : &lt;br /&gt;
[[Fichier:Gt.png|400px|thumb|left|texte descriptif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Semestre 6 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/22''' &lt;br /&gt;
&lt;br /&gt;
Séance de découverte du sujet de notre projet.&lt;br /&gt;
&lt;br /&gt;
Recherche de l'existant &lt;br /&gt;
&lt;br /&gt;
Réalisation de recherches sur leurs différentes utilisations.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/22''' &lt;br /&gt;
&lt;br /&gt;
Début de création du diagramme de Gantt .&lt;br /&gt;
&lt;br /&gt;
Réalisation d'une étude du besoin.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du marché : Recherche des robots similaires.&lt;br /&gt;
&lt;br /&gt;
Commencer à prendre en main le robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 22/03/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de l'étude de marché.&lt;br /&gt;
&lt;br /&gt;
Etude des opportunités.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 29/03/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'étude du marché.&lt;br /&gt;
&lt;br /&gt;
Commencer à rédiger le cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 05/04/22''' &lt;br /&gt;
&lt;br /&gt;
Commencer la rédaction du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 26/04/22''' &lt;br /&gt;
&lt;br /&gt;
Bilan du semestre.&lt;br /&gt;
&lt;br /&gt;
Etude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Etude des risques.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 03/05/22''' &lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude des risques.&lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Finalisation du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
== Semestre 7 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 10/10/22'''&lt;br /&gt;
&lt;br /&gt;
Commencement de l'étude technique des encodeurs . &lt;br /&gt;
Recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du changement de la carte arduino pour ajouter des nouvelles fonctionnalités : connexion Wifi, fréquence microprocesseur plus élevé,..&lt;br /&gt;
Test des encodeurs moteur DC : validé .&lt;br /&gt;
Poursuite de recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude de génération des signaux PWM&lt;br /&gt;
&lt;br /&gt;
Test sur Matlab Simulink des boucles d'asservissement issues des robots similaires .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/11/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation des signaux PWM du robot.&lt;br /&gt;
&lt;br /&gt;
Calcul de la fonction de transfert issue de la boucle.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/11/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du fonctionnement du gyroscope et des autres composants pour programmer le robot .  &lt;br /&gt;
&lt;br /&gt;
Séparation du travail a effectuer pour le robot entre une boucle du moteur DC(niveau 1) et une boucle du niveau supérieur(niveau 2) pour asservir l'angle d'inclinaison du robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/11/22''' &lt;br /&gt;
&lt;br /&gt;
Modification et amélioration du diagramme de Gantt pour le S7 et le S8.&lt;br /&gt;
&lt;br /&gt;
Avancée de la modélisation de la boucle du niveau 1 .&lt;br /&gt;
&lt;br /&gt;
Diagramme de Gantt S7-S8&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/11/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation de la boucle du niveau inférieur sur Matlab/Simulink et récupération des résultats sur le scope .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/12/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie informatique et avancement de la partie automatique .&lt;br /&gt;
Programmation de la liaison série pour débugger les sorties de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/12/22''' &lt;br /&gt;
&lt;br /&gt;
Début de rédaction du rapport pour le S7&lt;br /&gt;
&lt;br /&gt;
== Semestre 8 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/01/23''' &lt;br /&gt;
&lt;br /&gt;
Recherches pour le gyroscope . &lt;br /&gt;
Test des encodeurs .&lt;br /&gt;
Communication sur les attentes du semestre s8 ,les fautes à éviter pour rebondir par rapport au retard S7 &lt;br /&gt;
Mise à niveau pour comprendre les aspects techniques de la partie informatique pour pouvoir travailler ensemble sur les résultats du S8 .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/01/23''' &lt;br /&gt;
&lt;br /&gt;
- Suppression des structures de données pour avancer plus rapidement sur les résultats du semestre s8 .&lt;br /&gt;
&lt;br /&gt;
- Recherches pour la programmation des interruptions PCINT . &lt;br /&gt;
&lt;br /&gt;
- Recherche sur la doc technique pour faire l'initialisation des interruptions externes . &lt;br /&gt;
&lt;br /&gt;
- Recherche de la modélisation en 3D de notre robot pour trouver les paramètres PID de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/02/23''' &lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons :&lt;br /&gt;
&lt;br /&gt;
Modification du code des encodeurs et test sur les moteurs DC . &lt;br /&gt;
&lt;br /&gt;
Poursuite de recherche de l'existant pour trouver le code du gyroscope .&lt;br /&gt;
&lt;br /&gt;
Mise à jour du git .&lt;br /&gt;
&lt;br /&gt;
Début du calcul des matrices d'inertie de chaque solide.&lt;br /&gt;
&lt;br /&gt;
Recherche du code des régulateurs.&lt;br /&gt;
&lt;br /&gt;
Avancement sur la gestion de projet .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/02/23'''&lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons essayé de récupérer les résultats des tests électronique de l'oscilloscope effectués dans les salles d'électronique .&lt;br /&gt;
&lt;br /&gt;
Le code des encodeurs marchent ,la liaison série affiche exactement la vitesse de la consigne :les Régulateurs implémentés correspondent bien à notre applications.&lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation de la partie informatique du gyroscope : Objectif : récupération de l'angle d'inclinaison sur la liaison série avec la meilleure précision possible .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/02/23''' &lt;br /&gt;
&lt;br /&gt;
Fin du calcul des matrices d'inertie . &lt;br /&gt;
&lt;br /&gt;
Paramétrage de notre robot pour avoir la visibilité sur les configurations possibles d'avoir(en virage, ligne droite),en précisant les angles d'inclinaison et es repères associés . &lt;br /&gt;
&lt;br /&gt;
Poursuite de programmation des régulateurs par niveaux en utilisant le code précédemment implémenté pour les encodeurs .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/23''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation du modèle en 3D de notre robot pour essayer de l'autoéquilibrer en utilisant les PIDS issues de l'autotune par rapport à nos préférences(stabilité,temps de réponse,dépassement,précision). &lt;br /&gt;
&lt;br /&gt;
Nous avons testé le robot en l'alimentant par le biai la liaison USB ! et enregistrement des résultats .  &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie automatique en trouvant toutes les équations nécessaires à notre modèle .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/23''' &lt;br /&gt;
&lt;br /&gt;
Réalisations de cette séance :&lt;br /&gt;
&lt;br /&gt;
Test du robot pour se stabiliser sur le sol en applicant plusieurs . &lt;br /&gt;
&lt;br /&gt;
Faire tous les calculs des dimensions géométriques de notre robot et test de la boucle d'asservissement avec les deux niveaux sur Matlab Simulink avec nos préférences de stabilité, temps de réponse,précision,dépassement .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/23''' &lt;br /&gt;
&lt;br /&gt;
Absence justifiée .&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91434</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91434"/>
				<updated>2023-05-09T20:42:44Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Résumé'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
[[Fichier: SegwayRobot.jpg|200px|right|thumb|Exemple de robot similaire au notre]]&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
L'intégralité de notre programme est disponible sur le dépôt git à l'adresse: https://gitlab.com/remi_farault/self-balanced-robot&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Présentation générale'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==🌏Contexte==&lt;br /&gt;
Les moyens de transport actuels reposent principalement sur le principe du robot à deux roues, c'est la raison pour laquelle l'étude de celui ci s'avère importante, en effet l'étude   &lt;br /&gt;
de sa conception et son contrôle va nous permettre de développer des outils innovants qui pourraient potentiellement intéresser des sociétés de transport .&lt;br /&gt;
&lt;br /&gt;
==🎯Objectif==&lt;br /&gt;
&lt;br /&gt;
Notre objectif principal est de commander le robot, de là interviennent d'autres objectifs tel que la stabilité ,développer un code robuste qui assure cette fonctionnalité et aussi le contrôler pour réaliser des fonctionnalités de déplacement et d'éviter des obstacles . Des objectifs secondaires sont de créer un site web à travers lequel nous allons mener toutes les opérations de contrôle .&lt;br /&gt;
&lt;br /&gt;
==🔍Expression du besoin==&lt;br /&gt;
&lt;br /&gt;
Un robot autoéquilibré à deux roues est un type de robot qui peut se maintenir en équilibre sur deux roues sans tomber. Pour réaliser cette fonctionnalité, le robot utilise un ensemble de capteurs, d'algorithmes de contrôle et de moteurs pour ajuster sa position en temps réel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Self_balanc_bt.png|400px|Bete a corne SBR]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le diagramme interacteurs permet en fait de visualiser les fonctions services assurées par le système &lt;br /&gt;
&lt;br /&gt;
[[Fichier:341702419_560921119358434_1016673599353874396_n_(1).png|400px|DGI SBR]]    [[Fichier:Btacorne.png |500px|DGI SBR|right]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Réalisations et Résultats'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
[[Fichier: seg.jpg|200px|left|thumb|Exemple de commande désirée]]&lt;br /&gt;
&lt;br /&gt;
Après mis en place notre stratégie de gestion de projet en s6 à travers le diagramme de GANTT et le cahier de charges fonctionnels, nous nous sommes focalisés sur l'étude technique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: progg.png|300px|right|thumb|Organisation de notre programme]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, étudier à travers des outils automatiques la stabilité du robot en faisant appel à des modèles théoriques et pratiques et commencer par un raisonnement par niveaux, d'abord le niveau 1 du moteur à courant continu et les équations correspondantes puis le niveau 2 assurant la stabilité du robot directement, on avait la possibilité de passer directement au niveau 2 à travers le modèle du pendule inversé et les équations qui en découlent sauf que celui-ci ne nous permettra pas de revenir au niveau 1 et asservir le moteur à travers les codeurs incrémentales ,la deuxième partie consistait à réaliser les codes informatiques en s'appuyant sur les structures de données en C vues l'année dernière et conduire un même raisonnement(par niveaux) s'appuyant d'abord sur les codes sources correspondants à la génération d'un signal PWM pour les deux moteurs avec un rapport cyclique modifiable, et aussi les codes sources correspondants à la gestion des moteurs, en effet, ceux-ci tournent  dans un sens ou dans un autre ou ne tournent pas en fonction de la variable in1 et in2  pour faire tourner les moteurs .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Avr.png|100px|left|thumb|Compilateur utilisé]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cependant, nous avons rencontré quelques problèmes en automatique notamment pour trouver des valeurs des constantes théoriques pour les références du moteur entre les mains, ce qui nous a obligé à prendre des valeurs issues d'autres applications, nous avons rencontré aussi quelques problèmes choisir une modélisation parmi celles qui sont disponibles sur Internet .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les problèmes rencontrés en Informatique étaient de tester les codes de la PWM pratiquement sur les moteurs DC,...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Etude Automatique'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Avant de programmer notre système sur la carte Arduino, nous avons également créé une simulation complète de notre système robotisé sur SIMULINK. Cependant, avant cela, nous avons dû déterminer les équations qui régissent notre système en trouvant les matrices d'inertie de chaque composant de notre robot, à savoir la masse transportée par le robot (M), le châssis constitué de deux plateaux et de la motorisation (les piliers et leur inertie ont été négligés car leur masse est très faible), ainsi que les roues (roue droite et roue gauche). Vous trouverez ci-dessous les matrices d'inertie que nous avons obtenues pour chaque composant.&lt;br /&gt;
&lt;br /&gt;
'''Masse M :'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatM.png|200px|thumb|left|Matrice de la masse M]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients seront notés dans la suite pour simplifier : AM,BM,CM &lt;br /&gt;
&lt;br /&gt;
'''Chassis:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatB.png|800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AH,BH,CH &lt;br /&gt;
&lt;br /&gt;
'''Roue gauche:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrg.png |600px|Matrice de RG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
'''Roue droite:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrd.png |600px|Matrice RD]]&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
Ci-dessous un paramétrage de notre système : Chaque angle détermine un repère&lt;br /&gt;
&lt;br /&gt;
Le repère R0 est supposé galliléen.&lt;br /&gt;
&lt;br /&gt;
Le repère R1 est en rotation  ,appelé angle de virage par rapport à R0.&lt;br /&gt;
&lt;br /&gt;
Le repère R2 est en rotation  ,appelé angle d’inclinaison du châssis par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R3 est en rotation  ,appelé angle d’inclinaison arrière-avant de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R4 est en rotation ,appelé angle d’inclinaison droite-gauche de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:param.png |800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
l’angle de consigne est de 0deg,nous employons un PID pour corriger l’angle de mesure,à sa sortie,on aura une tension W(p).Les blocs Km et W(p) assurent le passage tension-&amp;gt;couple-&amp;gt;angle ,il faut ensuite retirer  pour ne garder que l’angle d’inclinaison du châssis  .Km=0.0125N.m.V-1(d’après la datasheet du moteur)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bcle.png |800px|Asservissement]]                                                             [[Fichier:Matuu.png|right|800px|Asservissement]]      &lt;br /&gt;
&lt;br /&gt;
Les équations obtenues sont les suivantes (Le détail des calculs a été précisé dans le Rapport): &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eq nnlin.png |500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après linéarisation : Considérer l'approximations des petits angles pour le sinus et cosinus,et négliger aussi la vitesse angulaire quadratique devant la vitesse angulaire,nous obtenons : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eqlin.png |300px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crbe.png|600px|Courbe]]&lt;br /&gt;
&lt;br /&gt;
On obtient une courbe avec un bon temps de réponse, un léger dépassement et une stabilité .Le système est régulé de manière efficace, capable de répondre rapidement et précisément aux perturbations tout en maintenant une position d'équilibre stable.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mat3d.png|500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Environnement de developpement'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Notre microcontrolleur étant une Arduino Uno, nous aurions pu utiliser le framework Arduino donnant accès à un IDE intégrant les outils pour compiler et flasher le code, ainsi qu'une multitude de bibliothèques haut niveaux très simples d'utilisation et plutôt performantes, permettant de programmer notre robot en simplement quelques dizaines de lignes de code.&lt;br /&gt;
&lt;br /&gt;
Cependant, l'Arduino est simplement une carte de prototypage intégrant un microcontrôleur AVR Atmega 328p. &lt;br /&gt;
Les microcontroleurs AVR disposent d'une grande communauté, et il existe de nombreux outils nécessaires au developpement sur ces cartes.&lt;br /&gt;
Afin d'avoir un meilleur contrôle sur notre projet, et surtout d'en tirer un maximum de compétences, nous avons donc décidés de programmer notre robot directement en C en utilisant les outils AVR:&lt;br /&gt;
&lt;br /&gt;
- avr-gcc: compilateur open-source portant toutes les fonctionnalités du langage C standard sur les microcontroleurs AVR.&lt;br /&gt;
Seul, son utilisation est quasiment impossible et demande trop de travail en programmation bas-niveau.&lt;br /&gt;
&lt;br /&gt;
- avr-libc: implémentation basé sur le compilateur avr-gcc de la bibliothèque standard du langage C.&lt;br /&gt;
Cette bibliothèque permet donc d'utiliser les fonctions et structures standards du C (IO, maths, chaines de caractères), mais elle intègre également un mapping mémoire de tous les registres de l'atmega, ainsi qu'un mécanisme pour programmer des interruptions.&lt;br /&gt;
&lt;br /&gt;
- avr-objcopy: ce programme en ligne de commande formate le binaire obtenu en format utilisable par les AVR&lt;br /&gt;
&lt;br /&gt;
- avr-dude: ce programme en ligne de commande permet de flasher via une interface USB-série un microcontroleur AVR présent sur une carte Arduino.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc developpé un Makefile utilisant tous ces outils, constituant un environnement de developpement très efficace pour notre projet. Ce Makefile est disponible sur notre gitlab.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Bilan'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 6 :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 7 :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 8 :'''&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Gestion de projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
- L'utilisation de git : &lt;br /&gt;
[[Fichier:Gt.png|400px|thumb|left|texte descriptif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Semestre 6 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/22''' &lt;br /&gt;
&lt;br /&gt;
Séance de découverte du sujet de notre projet.&lt;br /&gt;
&lt;br /&gt;
Recherche de l'existant &lt;br /&gt;
&lt;br /&gt;
Réalisation de recherches sur leurs différentes utilisations.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/22''' &lt;br /&gt;
&lt;br /&gt;
Début de création du diagramme de Gantt .&lt;br /&gt;
&lt;br /&gt;
Réalisation d'une étude du besoin.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du marché : Recherche des robots similaires.&lt;br /&gt;
&lt;br /&gt;
Commencer à prendre en main le robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 22/03/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de l'étude de marché.&lt;br /&gt;
&lt;br /&gt;
Etude des opportunités.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 29/03/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'étude du marché.&lt;br /&gt;
&lt;br /&gt;
Commencer à rédiger le cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 05/04/22''' &lt;br /&gt;
&lt;br /&gt;
Commencer la rédaction du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 26/04/22''' &lt;br /&gt;
&lt;br /&gt;
Bilan du semestre.&lt;br /&gt;
&lt;br /&gt;
Etude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Etude des risques.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 03/05/22''' &lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude des risques.&lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Finalisation du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
== Semestre 7 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 10/10/22'''&lt;br /&gt;
&lt;br /&gt;
Commencement de l'étude technique des encodeurs . &lt;br /&gt;
Recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du changement de la carte arduino pour ajouter des nouvelles fonctionnalités : connexion Wifi, fréquence microprocesseur plus élevé,..&lt;br /&gt;
Test des encodeurs moteur DC : validé .&lt;br /&gt;
Poursuite de recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude de génération des signaux PWM&lt;br /&gt;
&lt;br /&gt;
Test sur Matlab Simulink des boucles d'asservissement issues des robots similaires .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/11/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation des signaux PWM du robot.&lt;br /&gt;
&lt;br /&gt;
Calcul de la fonction de transfert issue de la boucle.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/11/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du fonctionnement du gyroscope et des autres composants pour programmer le robot .  &lt;br /&gt;
&lt;br /&gt;
Séparation du travail a effectuer pour le robot entre une boucle du moteur DC(niveau 1) et une boucle du niveau supérieur(niveau 2) pour asservir l'angle d'inclinaison du robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/11/22''' &lt;br /&gt;
&lt;br /&gt;
Modification et amélioration du diagramme de Gantt pour le S7 et le S8.&lt;br /&gt;
&lt;br /&gt;
Avancée de la modélisation de la boucle du niveau 1 .&lt;br /&gt;
&lt;br /&gt;
Diagramme de Gantt S7-S8&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/11/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation de la boucle du niveau inférieur sur Matlab/Simulink et récupération des résultats sur le scope .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/12/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie informatique et avancement de la partie automatique .&lt;br /&gt;
Programmation de la liaison série pour débugger les sorties de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/12/22''' &lt;br /&gt;
&lt;br /&gt;
Début de rédaction du rapport pour le S7&lt;br /&gt;
&lt;br /&gt;
== Semestre 8 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/01/23''' &lt;br /&gt;
&lt;br /&gt;
Recherches pour le gyroscope . &lt;br /&gt;
Test des encodeurs .&lt;br /&gt;
Communication sur les attentes du semestre s8 ,les fautes à éviter pour rebondir par rapport au retard S7 &lt;br /&gt;
Mise à niveau pour comprendre les aspects techniques de la partie informatique pour pouvoir travailler ensemble sur les résultats du S8 .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/01/23''' &lt;br /&gt;
&lt;br /&gt;
- Suppression des structures de données pour avancer plus rapidement sur les résultats du semestre s8 .&lt;br /&gt;
&lt;br /&gt;
- Recherches pour la programmation des interruptions PCINT . &lt;br /&gt;
&lt;br /&gt;
- Recherche sur la doc technique pour faire l'initialisation des interruptions externes . &lt;br /&gt;
&lt;br /&gt;
- Recherche de la modélisation en 3D de notre robot pour trouver les paramètres PID de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/02/23''' &lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons :&lt;br /&gt;
&lt;br /&gt;
Modification du code des encodeurs et test sur les moteurs DC . &lt;br /&gt;
&lt;br /&gt;
Poursuite de recherche de l'existant pour trouver le code du gyroscope .&lt;br /&gt;
&lt;br /&gt;
Mise à jour du git .&lt;br /&gt;
&lt;br /&gt;
Début du calcul des matrices d'inertie de chaque solide.&lt;br /&gt;
&lt;br /&gt;
Recherche du code des régulateurs.&lt;br /&gt;
&lt;br /&gt;
Avancement sur la gestion de projet .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/02/23'''&lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons essayé de récupérer les résultats des tests électronique de l'oscilloscope effectués dans les salles d'électronique .&lt;br /&gt;
&lt;br /&gt;
Le code des encodeurs marchent ,la liaison série affiche exactement la vitesse de la consigne :les Régulateurs implémentés correspondent bien à notre applications.&lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation de la partie informatique du gyroscope : Objectif : récupération de l'angle d'inclinaison sur la liaison série avec la meilleure précision possible .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/02/23''' &lt;br /&gt;
&lt;br /&gt;
Fin du calcul des matrices d'inertie . &lt;br /&gt;
&lt;br /&gt;
Paramétrage de notre robot pour avoir la visibilité sur les configurations possibles d'avoir(en virage, ligne droite),en précisant les angles d'inclinaison et es repères associés . &lt;br /&gt;
&lt;br /&gt;
Poursuite de programmation des régulateurs par niveaux en utilisant le code précédemment implémenté pour les encodeurs .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/23''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation du modèle en 3D de notre robot pour essayer de l'autoéquilibrer en utilisant les PIDS issues de l'autotune par rapport à nos préférences(stabilité,temps de réponse,dépassement,précision). &lt;br /&gt;
&lt;br /&gt;
Nous avons testé le robot en l'alimentant par le biai la liaison USB ! et enregistrement des résultats .  &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie automatique en trouvant toutes les équations nécessaires à notre modèle .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/23''' &lt;br /&gt;
&lt;br /&gt;
Réalisations de cette séance :&lt;br /&gt;
&lt;br /&gt;
Test du robot pour se stabiliser sur le sol en applicant plusieurs . &lt;br /&gt;
&lt;br /&gt;
Faire tous les calculs des dimensions géométriques de notre robot et test de la boucle d'asservissement avec les deux niveaux sur Matlab Simulink avec nos préférences de stabilité, temps de réponse,précision,dépassement .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/23''' &lt;br /&gt;
&lt;br /&gt;
Absence justifiée .&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91433</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91433"/>
				<updated>2023-05-09T20:42:13Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : /* Environnement de developpement */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Résumé'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
[[Fichier: SegwayRobot.jpg|200px|right|thumb|Exemple de robot similaire au notre]]&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
L'intégralité de notre programme est disponible sur le dépôt git à l'adresse: https://gitlab.com/remi_farault/self-balanced-robot&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Présentation générale'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==🌏Contexte==&lt;br /&gt;
Les moyens de transport actuels reposent principalement sur le principe du robot à deux roues, c'est la raison pour laquelle l'étude de celui ci s'avère importante, en effet l'étude   &lt;br /&gt;
de sa conception et son contrôle va nous permettre de développer des outils innovants qui pourraient potentiellement intéresser des sociétés de transport .&lt;br /&gt;
&lt;br /&gt;
==🎯Objectif==&lt;br /&gt;
&lt;br /&gt;
Notre objectif principal est de commander le robot, de là interviennent d'autres objectifs tel que la stabilité ,développer un code robuste qui assure cette fonctionnalité et aussi le contrôler pour réaliser des fonctionnalités de déplacement et d'éviter des obstacles . Des objectifs secondaires sont de créer un site web à travers lequel nous allons mener toutes les opérations de contrôle .&lt;br /&gt;
&lt;br /&gt;
==🔍Expression du besoin==&lt;br /&gt;
&lt;br /&gt;
Un robot autoéquilibré à deux roues est un type de robot qui peut se maintenir en équilibre sur deux roues sans tomber. Pour réaliser cette fonctionnalité, le robot utilise un ensemble de capteurs, d'algorithmes de contrôle et de moteurs pour ajuster sa position en temps réel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Self_balanc_bt.png|400px|Bete a corne SBR]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le diagramme interacteurs permet en fait de visualiser les fonctions services assurées par le système &lt;br /&gt;
&lt;br /&gt;
[[Fichier:341702419_560921119358434_1016673599353874396_n_(1).png|400px|DGI SBR]]    [[Fichier:Btacorne.png |500px|DGI SBR|right]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Réalisations et Résultats'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
[[Fichier: seg.jpg|200px|left|thumb|Exemple de commande désirée]]&lt;br /&gt;
&lt;br /&gt;
Après mis en place notre stratégie de gestion de projet en s6 à travers le diagramme de GANTT et le cahier de charges fonctionnels, nous nous sommes focalisés sur l'étude technique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: progg.png|300px|right|thumb|Organisation de notre programme]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, étudier à travers des outils automatiques la stabilité du robot en faisant appel à des modèles théoriques et pratiques et commencer par un raisonnement par niveaux, d'abord le niveau 1 du moteur à courant continu et les équations correspondantes puis le niveau 2 assurant la stabilité du robot directement, on avait la possibilité de passer directement au niveau 2 à travers le modèle du pendule inversé et les équations qui en découlent sauf que celui-ci ne nous permettra pas de revenir au niveau 1 et asservir le moteur à travers les codeurs incrémentales ,la deuxième partie consistait à réaliser les codes informatiques en s'appuyant sur les structures de données en C vues l'année dernière et conduire un même raisonnement(par niveaux) s'appuyant d'abord sur les codes sources correspondants à la génération d'un signal PWM pour les deux moteurs avec un rapport cyclique modifiable, et aussi les codes sources correspondants à la gestion des moteurs, en effet, ceux-ci tournent  dans un sens ou dans un autre ou ne tournent pas en fonction de la variable in1 et in2  pour faire tourner les moteurs .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Avr.png|100px|left|thumb|Compilateur utilisé]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cependant, nous avons rencontré quelques problèmes en automatique notamment pour trouver des valeurs des constantes théoriques pour les références du moteur entre les mains, ce qui nous a obligé à prendre des valeurs issues d'autres applications, nous avons rencontré aussi quelques problèmes choisir une modélisation parmi celles qui sont disponibles sur Internet .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les problèmes rencontrés en Informatique étaient de tester les codes de la PWM pratiquement sur les moteurs DC,...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Etude Automatique'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Avant de programmer notre système sur la carte Arduino, nous avons également créé une simulation complète de notre système robotisé sur SIMULINK. Cependant, avant cela, nous avons dû déterminer les équations qui régissent notre système en trouvant les matrices d'inertie de chaque composant de notre robot, à savoir la masse transportée par le robot (M), le châssis constitué de deux plateaux et de la motorisation (les piliers et leur inertie ont été négligés car leur masse est très faible), ainsi que les roues (roue droite et roue gauche). Vous trouverez ci-dessous les matrices d'inertie que nous avons obtenues pour chaque composant.&lt;br /&gt;
&lt;br /&gt;
'''Masse M :'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatM.png|200px|thumb|left|Matrice de la masse M]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients seront notés dans la suite pour simplifier : AM,BM,CM &lt;br /&gt;
&lt;br /&gt;
'''Chassis:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatB.png|800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AH,BH,CH &lt;br /&gt;
&lt;br /&gt;
'''Roue gauche:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrg.png |600px|Matrice de RG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
'''Roue droite:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrd.png |600px|Matrice RD]]&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
Ci-dessous un paramétrage de notre système : Chaque angle détermine un repère&lt;br /&gt;
&lt;br /&gt;
Le repère R0 est supposé galliléen.&lt;br /&gt;
&lt;br /&gt;
Le repère R1 est en rotation  ,appelé angle de virage par rapport à R0.&lt;br /&gt;
&lt;br /&gt;
Le repère R2 est en rotation  ,appelé angle d’inclinaison du châssis par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R3 est en rotation  ,appelé angle d’inclinaison arrière-avant de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R4 est en rotation ,appelé angle d’inclinaison droite-gauche de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:param.png |800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
l’angle de consigne est de 0deg,nous employons un PID pour corriger l’angle de mesure,à sa sortie,on aura une tension W(p).Les blocs Km et W(p) assurent le passage tension-&amp;gt;couple-&amp;gt;angle ,il faut ensuite retirer  pour ne garder que l’angle d’inclinaison du châssis  .Km=0.0125N.m.V-1(d’après la datasheet du moteur)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bcle.png |800px|Asservissement]]                                                             [[Fichier:Matuu.png|right|800px|Asservissement]]      &lt;br /&gt;
&lt;br /&gt;
Les équations obtenues sont les suivantes (Le détail des calculs a été précisé dans le Rapport): &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eq nnlin.png |500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après linéarisation : Considérer l'approximations des petits angles pour le sinus et cosinus,et négliger aussi la vitesse angulaire quadratique devant la vitesse angulaire,nous obtenons : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eqlin.png |300px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crbe.png|600px|Courbe]]&lt;br /&gt;
&lt;br /&gt;
On obtient une courbe avec un bon temps de réponse, un léger dépassement et une stabilité .Le système est régulé de manière efficace, capable de répondre rapidement et précisément aux perturbations tout en maintenant une position d'équilibre stable.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mat3d.png|500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Environnement de developpement'''&amp;lt;/span&amp;gt;==tion.&lt;br /&gt;
&lt;br /&gt;
Notre microcontrolleur étant une Arduino Uno, nous aurions pu utiliser le framework Arduino donnant accès à un IDE intégrant les outils pour compiler et flasher le code, ainsi qu'une multitude de bibliothèques haut niveaux très simples d'utilisation et plutôt performantes, permettant de programmer notre robot en simplement quelques dizaines de lignes de code.&lt;br /&gt;
&lt;br /&gt;
Cependant, l'Arduino est simplement une carte de prototypage intégrant un microcontrôleur AVR Atmega 328p. &lt;br /&gt;
Les microcontroleurs AVR disposent d'une grande communauté, et il existe de nombreux outils nécessaires au developpement sur ces cartes.&lt;br /&gt;
Afin d'avoir un meilleur contrôle sur notre projet, et surtout d'en tirer un maximum de compétences, nous avons donc décidés de programmer notre robot directement en C en utilisant les outils AVR:&lt;br /&gt;
&lt;br /&gt;
- avr-gcc: compilateur open-source portant toutes les fonctionnalités du langage C standard sur les microcontroleurs AVR.&lt;br /&gt;
Seul, son utilisation est quasiment impossible et demande trop de travail en programmation bas-niveau.&lt;br /&gt;
&lt;br /&gt;
- avr-libc: implémentation basé sur le compilateur avr-gcc de la bibliothèque standard du langage C.&lt;br /&gt;
Cette bibliothèque permet donc d'utiliser les fonctions et structures standards du C (IO, maths, chaines de caractères), mais elle intègre également un mapping mémoire de tous les registres de l'atmega, ainsi qu'un mécanisme pour programmer des interruptions.&lt;br /&gt;
&lt;br /&gt;
- avr-objcopy: ce programme en ligne de commande formate le binaire obtenu en format utilisable par les AVR&lt;br /&gt;
&lt;br /&gt;
- avr-dude: ce programme en ligne de commande permet de flasher via une interface USB-série un microcontroleur AVR présent sur une carte Arduino.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc developpé un Makefile utilisant tous ces outils, constituant un environnement de developpement très efficace pour notre projet. Ce Makefile est disponible sur notre gitlab.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Bilan'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 6 :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 7 :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 8 :'''&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Gestion de projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
- L'utilisation de git : &lt;br /&gt;
[[Fichier:Gt.png|400px|thumb|left|texte descriptif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Semestre 6 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/22''' &lt;br /&gt;
&lt;br /&gt;
Séance de découverte du sujet de notre projet.&lt;br /&gt;
&lt;br /&gt;
Recherche de l'existant &lt;br /&gt;
&lt;br /&gt;
Réalisation de recherches sur leurs différentes utilisations.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/22''' &lt;br /&gt;
&lt;br /&gt;
Début de création du diagramme de Gantt .&lt;br /&gt;
&lt;br /&gt;
Réalisation d'une étude du besoin.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du marché : Recherche des robots similaires.&lt;br /&gt;
&lt;br /&gt;
Commencer à prendre en main le robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 22/03/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de l'étude de marché.&lt;br /&gt;
&lt;br /&gt;
Etude des opportunités.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 29/03/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'étude du marché.&lt;br /&gt;
&lt;br /&gt;
Commencer à rédiger le cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 05/04/22''' &lt;br /&gt;
&lt;br /&gt;
Commencer la rédaction du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 26/04/22''' &lt;br /&gt;
&lt;br /&gt;
Bilan du semestre.&lt;br /&gt;
&lt;br /&gt;
Etude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Etude des risques.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 03/05/22''' &lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude des risques.&lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Finalisation du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
== Semestre 7 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 10/10/22'''&lt;br /&gt;
&lt;br /&gt;
Commencement de l'étude technique des encodeurs . &lt;br /&gt;
Recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du changement de la carte arduino pour ajouter des nouvelles fonctionnalités : connexion Wifi, fréquence microprocesseur plus élevé,..&lt;br /&gt;
Test des encodeurs moteur DC : validé .&lt;br /&gt;
Poursuite de recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude de génération des signaux PWM&lt;br /&gt;
&lt;br /&gt;
Test sur Matlab Simulink des boucles d'asservissement issues des robots similaires .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/11/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation des signaux PWM du robot.&lt;br /&gt;
&lt;br /&gt;
Calcul de la fonction de transfert issue de la boucle.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/11/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du fonctionnement du gyroscope et des autres composants pour programmer le robot .  &lt;br /&gt;
&lt;br /&gt;
Séparation du travail a effectuer pour le robot entre une boucle du moteur DC(niveau 1) et une boucle du niveau supérieur(niveau 2) pour asservir l'angle d'inclinaison du robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/11/22''' &lt;br /&gt;
&lt;br /&gt;
Modification et amélioration du diagramme de Gantt pour le S7 et le S8.&lt;br /&gt;
&lt;br /&gt;
Avancée de la modélisation de la boucle du niveau 1 .&lt;br /&gt;
&lt;br /&gt;
Diagramme de Gantt S7-S8&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/11/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation de la boucle du niveau inférieur sur Matlab/Simulink et récupération des résultats sur le scope .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/12/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie informatique et avancement de la partie automatique .&lt;br /&gt;
Programmation de la liaison série pour débugger les sorties de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/12/22''' &lt;br /&gt;
&lt;br /&gt;
Début de rédaction du rapport pour le S7&lt;br /&gt;
&lt;br /&gt;
== Semestre 8 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/01/23''' &lt;br /&gt;
&lt;br /&gt;
Recherches pour le gyroscope . &lt;br /&gt;
Test des encodeurs .&lt;br /&gt;
Communication sur les attentes du semestre s8 ,les fautes à éviter pour rebondir par rapport au retard S7 &lt;br /&gt;
Mise à niveau pour comprendre les aspects techniques de la partie informatique pour pouvoir travailler ensemble sur les résultats du S8 .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/01/23''' &lt;br /&gt;
&lt;br /&gt;
- Suppression des structures de données pour avancer plus rapidement sur les résultats du semestre s8 .&lt;br /&gt;
&lt;br /&gt;
- Recherches pour la programmation des interruptions PCINT . &lt;br /&gt;
&lt;br /&gt;
- Recherche sur la doc technique pour faire l'initialisation des interruptions externes . &lt;br /&gt;
&lt;br /&gt;
- Recherche de la modélisation en 3D de notre robot pour trouver les paramètres PID de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/02/23''' &lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons :&lt;br /&gt;
&lt;br /&gt;
Modification du code des encodeurs et test sur les moteurs DC . &lt;br /&gt;
&lt;br /&gt;
Poursuite de recherche de l'existant pour trouver le code du gyroscope .&lt;br /&gt;
&lt;br /&gt;
Mise à jour du git .&lt;br /&gt;
&lt;br /&gt;
Début du calcul des matrices d'inertie de chaque solide.&lt;br /&gt;
&lt;br /&gt;
Recherche du code des régulateurs.&lt;br /&gt;
&lt;br /&gt;
Avancement sur la gestion de projet .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/02/23'''&lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons essayé de récupérer les résultats des tests électronique de l'oscilloscope effectués dans les salles d'électronique .&lt;br /&gt;
&lt;br /&gt;
Le code des encodeurs marchent ,la liaison série affiche exactement la vitesse de la consigne :les Régulateurs implémentés correspondent bien à notre applications.&lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation de la partie informatique du gyroscope : Objectif : récupération de l'angle d'inclinaison sur la liaison série avec la meilleure précision possible .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/02/23''' &lt;br /&gt;
&lt;br /&gt;
Fin du calcul des matrices d'inertie . &lt;br /&gt;
&lt;br /&gt;
Paramétrage de notre robot pour avoir la visibilité sur les configurations possibles d'avoir(en virage, ligne droite),en précisant les angles d'inclinaison et es repères associés . &lt;br /&gt;
&lt;br /&gt;
Poursuite de programmation des régulateurs par niveaux en utilisant le code précédemment implémenté pour les encodeurs .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/23''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation du modèle en 3D de notre robot pour essayer de l'autoéquilibrer en utilisant les PIDS issues de l'autotune par rapport à nos préférences(stabilité,temps de réponse,dépassement,précision). &lt;br /&gt;
&lt;br /&gt;
Nous avons testé le robot en l'alimentant par le biai la liaison USB ! et enregistrement des résultats .  &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie automatique en trouvant toutes les équations nécessaires à notre modèle .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/23''' &lt;br /&gt;
&lt;br /&gt;
Réalisations de cette séance :&lt;br /&gt;
&lt;br /&gt;
Test du robot pour se stabiliser sur le sol en applicant plusieurs . &lt;br /&gt;
&lt;br /&gt;
Faire tous les calculs des dimensions géométriques de notre robot et test de la boucle d'asservissement avec les deux niveaux sur Matlab Simulink avec nos préférences de stabilité, temps de réponse,précision,dépassement .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/23''' &lt;br /&gt;
&lt;br /&gt;
Absence justifiée .&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91432</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91432"/>
				<updated>2023-05-09T20:25:42Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Résumé'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
[[Fichier: SegwayRobot.jpg|200px|right|thumb|Exemple de robot similaire au notre]]&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
L'intégralité de notre programme est disponible sur le dépôt git à l'adresse: https://gitlab.com/remi_farault/self-balanced-robot&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Présentation générale'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==🌏Contexte==&lt;br /&gt;
Les moyens de transport actuels reposent principalement sur le principe du robot à deux roues, c'est la raison pour laquelle l'étude de celui ci s'avère importante, en effet l'étude   &lt;br /&gt;
de sa conception et son contrôle va nous permettre de développer des outils innovants qui pourraient potentiellement intéresser des sociétés de transport .&lt;br /&gt;
&lt;br /&gt;
==🎯Objectif==&lt;br /&gt;
&lt;br /&gt;
Notre objectif principal est de commander le robot, de là interviennent d'autres objectifs tel que la stabilité ,développer un code robuste qui assure cette fonctionnalité et aussi le contrôler pour réaliser des fonctionnalités de déplacement et d'éviter des obstacles . Des objectifs secondaires sont de créer un site web à travers lequel nous allons mener toutes les opérations de contrôle .&lt;br /&gt;
&lt;br /&gt;
==🔍Expression du besoin==&lt;br /&gt;
&lt;br /&gt;
Un robot autoéquilibré à deux roues est un type de robot qui peut se maintenir en équilibre sur deux roues sans tomber. Pour réaliser cette fonctionnalité, le robot utilise un ensemble de capteurs, d'algorithmes de contrôle et de moteurs pour ajuster sa position en temps réel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Self_balanc_bt.png|400px|Bete a corne SBR]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le diagramme interacteurs permet en fait de visualiser les fonctions services assurées par le système &lt;br /&gt;
&lt;br /&gt;
[[Fichier:341702419_560921119358434_1016673599353874396_n_(1).png|400px|DGI SBR]]    [[Fichier:Btacorne.png |500px|DGI SBR|right]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Réalisations et Résultats'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
[[Fichier: seg.jpg|200px|left|thumb|Exemple de commande désirée]]&lt;br /&gt;
&lt;br /&gt;
Après mis en place notre stratégie de gestion de projet en s6 à travers le diagramme de GANTT et le cahier de charges fonctionnels, nous nous sommes focalisés sur l'étude technique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: progg.png|300px|right|thumb|Organisation de notre programme]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, étudier à travers des outils automatiques la stabilité du robot en faisant appel à des modèles théoriques et pratiques et commencer par un raisonnement par niveaux, d'abord le niveau 1 du moteur à courant continu et les équations correspondantes puis le niveau 2 assurant la stabilité du robot directement, on avait la possibilité de passer directement au niveau 2 à travers le modèle du pendule inversé et les équations qui en découlent sauf que celui-ci ne nous permettra pas de revenir au niveau 1 et asservir le moteur à travers les codeurs incrémentales ,la deuxième partie consistait à réaliser les codes informatiques en s'appuyant sur les structures de données en C vues l'année dernière et conduire un même raisonnement(par niveaux) s'appuyant d'abord sur les codes sources correspondants à la génération d'un signal PWM pour les deux moteurs avec un rapport cyclique modifiable, et aussi les codes sources correspondants à la gestion des moteurs, en effet, ceux-ci tournent  dans un sens ou dans un autre ou ne tournent pas en fonction de la variable in1 et in2  pour faire tourner les moteurs .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Avr.png|100px|left|thumb|Compilateur utilisé]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cependant, nous avons rencontré quelques problèmes en automatique notamment pour trouver des valeurs des constantes théoriques pour les références du moteur entre les mains, ce qui nous a obligé à prendre des valeurs issues d'autres applications, nous avons rencontré aussi quelques problèmes choisir une modélisation parmi celles qui sont disponibles sur Internet .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les problèmes rencontrés en Informatique étaient de tester les codes de la PWM pratiquement sur les moteurs DC,...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Etude Automatique'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Avant de programmer notre système sur la carte Arduino, nous avons également créé une simulation complète de notre système robotisé sur SIMULINK. Cependant, avant cela, nous avons dû déterminer les équations qui régissent notre système en trouvant les matrices d'inertie de chaque composant de notre robot, à savoir la masse transportée par le robot (M), le châssis constitué de deux plateaux et de la motorisation (les piliers et leur inertie ont été négligés car leur masse est très faible), ainsi que les roues (roue droite et roue gauche). Vous trouverez ci-dessous les matrices d'inertie que nous avons obtenues pour chaque composant.&lt;br /&gt;
&lt;br /&gt;
'''Masse M :'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatM.png|200px|thumb|left|Matrice de la masse M]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients seront notés dans la suite pour simplifier : AM,BM,CM &lt;br /&gt;
&lt;br /&gt;
'''Chassis:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatB.png|800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AH,BH,CH &lt;br /&gt;
&lt;br /&gt;
'''Roue gauche:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrg.png |600px|Matrice de RG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
'''Roue droite:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrd.png |600px|Matrice RD]]&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
Ci-dessous un paramétrage de notre système : Chaque angle détermine un repère&lt;br /&gt;
&lt;br /&gt;
Le repère R0 est supposé galliléen.&lt;br /&gt;
&lt;br /&gt;
Le repère R1 est en rotation  ,appelé angle de virage par rapport à R0.&lt;br /&gt;
&lt;br /&gt;
Le repère R2 est en rotation  ,appelé angle d’inclinaison du châssis par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R3 est en rotation  ,appelé angle d’inclinaison arrière-avant de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R4 est en rotation ,appelé angle d’inclinaison droite-gauche de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:param.png |800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
l’angle de consigne est de 0deg,nous employons un PID pour corriger l’angle de mesure,à sa sortie,on aura une tension W(p).Les blocs Km et W(p) assurent le passage tension-&amp;gt;couple-&amp;gt;angle ,il faut ensuite retirer  pour ne garder que l’angle d’inclinaison du châssis  .Km=0.0125N.m.V-1(d’après la datasheet du moteur)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bcle.png |800px|Asservissement]]                                                             [[Fichier:Matuu.png|right|800px|Asservissement]]      &lt;br /&gt;
&lt;br /&gt;
Les équations obtenues sont les suivantes (Le détail des calculs a été précisé dans le Rapport): &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eq nnlin.png |500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après linéarisation : Considérer l'approximations des petits angles pour le sinus et cosinus,et négliger aussi la vitesse angulaire quadratique devant la vitesse angulaire,nous obtenons : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eqlin.png |300px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crbe.png|600px|Courbe]]&lt;br /&gt;
&lt;br /&gt;
On obtient une courbe avec un bon temps de réponse, un léger dépassement et une stabilité .Le système est régulé de manière efficace, capable de répondre rapidement et précisément aux perturbations tout en maintenant une position d'équilibre stable.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mat3d.png|500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Etude Informatique'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Nous avons décidés d’utiliser les outils de développement pour AVR fonctionnant en&lt;br /&gt;
lignes de commandes, plutôt que d’utiliser un logiciel intégrant ces fonctionnalités sur une interface&lt;br /&gt;
graphique fonctionnant de manière transparente et difficile à configurer.&lt;br /&gt;
Nous avons donc utilisé :&lt;br /&gt;
- Le compilateur avr-gcc, qui permet de porter le langage C standard sur l’architecture AVR. Ce&lt;br /&gt;
compilateur open-source donne accès à toutes les fonctionnalités du C (types, fonctions, pointeurs,&lt;br /&gt;
boucles, conditions, macros, etc.) directement sur les microcontrôleurs. Son utilisation seule est&lt;br /&gt;
cependant très compliquée, il faut tout redéfinir et cela nécessite énormément de travail en&lt;br /&gt;
programmation bas niveau.&lt;br /&gt;
- La bibliothèque standard avr-libc, qui est une implémentation lié au compilateur avr-gcc de la&lt;br /&gt;
bibliothèque standard du C. Sa première force est donc d’intégrer toutes les fonctions de la libc dans&lt;br /&gt;
un code compact portable sur AVR, comme par exemple les fonctions mathématiques, les&lt;br /&gt;
opérations sur les chaînes de caractères, les fonctions d’entrées sorties (printf, scanf...).&lt;br /&gt;
En plus de ces fonctionnalités, cette bibliothèque comporte également des implémentation de tous&lt;br /&gt;
les mécanismes bas-niveaux utilisés par les microcontrôleurs AVR. D’abord, tous les registres&lt;br /&gt;
généraux, de configurations et d’entrées/sorties sont mappés via des adresse mémoires, ainsi, il est&lt;br /&gt;
possible de les manipuler directement comme des variables. On a également la possibilité d’écrire&lt;br /&gt;
des routines d’interruptions et de les associer aux vecteurs correspondants.&lt;br /&gt;
- L’outil avr-objcopy qui formate le fichier binaire elf obtenu en binaire utilisable par les&lt;br /&gt;
microcontrôleurs avr.&lt;br /&gt;
- Le programmateur en ligne de commande avrdude, qui permet de flasher notre microcontrôleur&lt;br /&gt;
avec le programme compilé et assemblé.&lt;br /&gt;
Afin de simplifier l’utilisation de ces outils, nous avons développé un Makefile automatisant le&lt;br /&gt;
compilation, le formatage et le transfert de notre code sur notre Arduino. Ainsi, il nous suffit de&lt;br /&gt;
relier notre Arduino via le port série USB et d’utiliser les commandes make pour compiler notre&lt;br /&gt;
programme et make flash pour programmer notre Arduino. Ce Makefile est disponible sur notre&lt;br /&gt;
dépôt gitlab.&lt;br /&gt;
&lt;br /&gt;
A – Signaux PWM.&lt;br /&gt;
Pour développer le programme permettant à notre système de fonctionner, nous avons du passer par&lt;br /&gt;
de nombreuses étapes, alternant programmation puis test de nos fonctionnalités.&lt;br /&gt;
La première étape consistait à commander nos moteurs DC, afin de poser les bases de notre&lt;br /&gt;
asservissement bas niveau. Ces moteurs sont contrôlés par le driver de moteurs, utilisant dessignaux logiques pour définir l’état d’un moteur et des signaux PWM pour définir la vitesse de&lt;br /&gt;
rotation. La génération de signaux PWM sur AVR se fait en utilisant les timers en mode PWM.&lt;br /&gt;
Tout simplement, nous avons un registre compteur 16 bits incrémenté périodiquement, et une valeur&lt;br /&gt;
maximale définie par le registre ICRx. Nous utilisons ensuite les registres OCRnx contenant une&lt;br /&gt;
valeur inférieure au maximum. Lorsque le compteur atteint la valeur contenue dans OCRnx, il&lt;br /&gt;
inverse la valeur logique de sortie du pin OCnx. Ainsi, nous pouvons modifier instantanément la&lt;br /&gt;
valeur d’OCRnx afin de modifier le rapport cyclique de notre signal. Ce rapport cyclique est ensuite&lt;br /&gt;
directement proportionnel à la vitesse de rotation du moteur associé. La fréquence du signal est&lt;br /&gt;
choisie par la période d’incrémentation du compteur et par la valeur maximale ICRx.&lt;br /&gt;
Pour notre composant, nous pouvions utiliser une fréquence allant jusqu’à plusieurs kHz. Cette&lt;br /&gt;
fréquence n’a aucun impact sur la rotation du moteur. Nous avons donc choisis 20 kHz.&lt;br /&gt;
Nous avons définis la init_pwm pour configurer les registres nécessaires, et la fonction&lt;br /&gt;
generate_pwm pour modifier le rapport cyclique de nos deux signaux PWM avec la valeur&lt;br /&gt;
souhaitée.&lt;br /&gt;
&lt;br /&gt;
B – Mesures encodeurs :&lt;br /&gt;
Une fois nos moteurs pouvant tourner à une vitesse voulue, nous avons du trouver un moyen de&lt;br /&gt;
mesurer leurs vitesses effectives afin de réaliser une boucle d’asservissement. Pour cela, nous avons&lt;br /&gt;
utilisés les encodeurs optiques disponibles sur nos moteurs DC. Ces encodeurs envoient sur leur&lt;br /&gt;
broches un front-montant à chaque tour de la roue codeuse reliée au moteurs (ayant une vitesse&lt;br /&gt;
proportionnelle à celle du moteur). En détectant ces fronts montant, nous pouvons donc compter le&lt;br /&gt;
nombre de tours du moteur pendant un intervalle de temps défini, puis déterminer la vitesse réelle&lt;br /&gt;
du moteur.&lt;br /&gt;
Pour détecter les fronts montant, nous utilisons l’interface Pin Change Interrupt de l’Atmega. Cette&lt;br /&gt;
interface exécute une interruption logicielle à chaque changement d’état logique du pin associé.&lt;br /&gt;
Dans notre cas, nous devons ensuite observé l’état précédent de la sortie et l’état actuel pour&lt;br /&gt;
déterminer si on est bien en présence d’un front montant. Une fois le front montant détecté, cette&lt;br /&gt;
interruption incrémente ensuite le compteur de tours.&lt;br /&gt;
Ce compteur est ensuite utilisé pour calculer la vitesse de rotation puis remis à zéro pour la mesure&lt;br /&gt;
suivante.&lt;br /&gt;
Dans notre cas, nous réalisons cette mesure à une fréquence d’environ 244 Hz, dans une autre&lt;br /&gt;
fonction d’interruption qu’on détaillera plus loin.&lt;br /&gt;
C – Mesure de l’angle d’inclinaison du robot&lt;br /&gt;
Notre boucle de régulation principale a besoin d’une mesure de l’angle d’inclinaison du robot sur&lt;br /&gt;
son axe vertical perpendiculaire à celui de déplacement. Cette mesure s’effectue via le MPU6050.&lt;br /&gt;
Ce composant fonctionne via le protocole i2c, protocole de communication simple utilisé par la&lt;br /&gt;
plupart des systèmes électroniques. Ce protocole étant bas niveau, il existe de nombreuses&lt;br /&gt;
bibliothèques implémentés en C permettant son utilisation. De plus, le MPU6050 est un composant&lt;br /&gt;
très complet et complexe, afin d’en récupérer l’angle, il faut d’abord amorcer une communication&lt;br /&gt;
i2c puis configurer certains des ses registres, afin ensuite de pouvoir lire les registres contenant la&lt;br /&gt;
mesure de l’angle selon l’axe désiré. Afin de conserver un code efficace et concis, nous avons&lt;br /&gt;
également décidés d’utiliser une bibliothèque faisant office de « driver » pour ce composant,&lt;br /&gt;
intégrant des fonctions d’initialisation et de lecture des mesures faites par ce gyroscope.&lt;br /&gt;
Nous obtenons donc la valeur de l’angle en degrés, comprise entre 0 et 360.Dans notre cas, nous souhaitions obtenir une valeur comprise entre -180 et 180, car seule la valeur&lt;br /&gt;
absolue et le sens de l’inclinaison nous intéresse, nous avons donc appliqués une correction de cette&lt;br /&gt;
valeur.&lt;br /&gt;
&lt;br /&gt;
D – Interruption principale :&lt;br /&gt;
Lors de implémentation d’un asservissement automatique via un microcontrôleur, la puissance de&lt;br /&gt;
calcul finie impose que les commandes des actionneurs et les mesures des capteurs doivent être&lt;br /&gt;
réalisées périodiquement. Pour cela, nous pouvons utiliser une routine d’interruption qui s’exécute à&lt;br /&gt;
chaque overflow d’un compteur, via l’interface des timers de l’atmega. Dans notre cas, cette&lt;br /&gt;
interruption correspond à la fonction principale de notre programme. Nous avons réglés sa&lt;br /&gt;
fréquence à 244Hz, en divisant le fréquence de base de 16MHz avec un prescaler de 256 (plus une&lt;br /&gt;
deuxième division par 256 du à la taille du registre timer de 8 bits).&lt;br /&gt;
Cette interruption vient d’abord remettre a zéro les compteurs des encodeurs et récupérer la vitesse&lt;br /&gt;
des deux moteurs.&lt;br /&gt;
Ensuite, elle effectue les calculs nécessaires à la régulation de l’angle, mais également de la vitesse&lt;br /&gt;
linéaire et de la rotation du robot.&lt;br /&gt;
Chaque paramètre à réguler est corrigé par un régulateur PID de coefficients différents via la&lt;br /&gt;
fonction pid().&lt;br /&gt;
Enfin, nous obtenons une commande à envoyer aux moteurs, qui actionnent notre robot de la&lt;br /&gt;
manière souhaitée.&lt;br /&gt;
Le code de notre système est disponible sur nôtre dépôt gitlab également.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Bilan'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 6 :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 7 :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 8 :'''&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Gestion de projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
- L'utilisation de git : &lt;br /&gt;
[[Fichier:Gt.png|400px|thumb|left|texte descriptif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Semestre 6 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/22''' &lt;br /&gt;
&lt;br /&gt;
Séance de découverte du sujet de notre projet.&lt;br /&gt;
&lt;br /&gt;
Recherche de l'existant &lt;br /&gt;
&lt;br /&gt;
Réalisation de recherches sur leurs différentes utilisations.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/22''' &lt;br /&gt;
&lt;br /&gt;
Début de création du diagramme de Gantt .&lt;br /&gt;
&lt;br /&gt;
Réalisation d'une étude du besoin.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du marché : Recherche des robots similaires.&lt;br /&gt;
&lt;br /&gt;
Commencer à prendre en main le robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 22/03/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de l'étude de marché.&lt;br /&gt;
&lt;br /&gt;
Etude des opportunités.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 29/03/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'étude du marché.&lt;br /&gt;
&lt;br /&gt;
Commencer à rédiger le cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 05/04/22''' &lt;br /&gt;
&lt;br /&gt;
Commencer la rédaction du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 26/04/22''' &lt;br /&gt;
&lt;br /&gt;
Bilan du semestre.&lt;br /&gt;
&lt;br /&gt;
Etude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Etude des risques.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 03/05/22''' &lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude des risques.&lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude de faisabilité.&lt;br /&gt;
&lt;br /&gt;
Finalisation du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
== Semestre 7 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 10/10/22'''&lt;br /&gt;
&lt;br /&gt;
Commencement de l'étude technique des encodeurs . &lt;br /&gt;
Recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du changement de la carte arduino pour ajouter des nouvelles fonctionnalités : connexion Wifi, fréquence microprocesseur plus élevé,..&lt;br /&gt;
Test des encodeurs moteur DC : validé .&lt;br /&gt;
Poursuite de recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude de génération des signaux PWM&lt;br /&gt;
&lt;br /&gt;
Test sur Matlab Simulink des boucles d'asservissement issues des robots similaires .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/11/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation des signaux PWM du robot.&lt;br /&gt;
&lt;br /&gt;
Calcul de la fonction de transfert issue de la boucle.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/11/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du fonctionnement du gyroscope et des autres composants pour programmer le robot .  &lt;br /&gt;
&lt;br /&gt;
Séparation du travail a effectuer pour le robot entre une boucle du moteur DC(niveau 1) et une boucle du niveau supérieur(niveau 2) pour asservir l'angle d'inclinaison du robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/11/22''' &lt;br /&gt;
&lt;br /&gt;
Modification et amélioration du diagramme de Gantt pour le S7 et le S8.&lt;br /&gt;
&lt;br /&gt;
Avancée de la modélisation de la boucle du niveau 1 .&lt;br /&gt;
&lt;br /&gt;
Diagramme de Gantt S7-S8&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/11/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation de la boucle du niveau inférieur sur Matlab/Simulink et récupération des résultats sur le scope .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/12/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie informatique et avancement de la partie automatique .&lt;br /&gt;
Programmation de la liaison série pour débugger les sorties de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/12/22''' &lt;br /&gt;
&lt;br /&gt;
Début de rédaction du rapport pour le S7&lt;br /&gt;
&lt;br /&gt;
== Semestre 8 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/01/23''' &lt;br /&gt;
&lt;br /&gt;
Recherches pour le gyroscope . &lt;br /&gt;
Test des encodeurs .&lt;br /&gt;
Communication sur les attentes du semestre s8 ,les fautes à éviter pour rebondir par rapport au retard S7 &lt;br /&gt;
Mise à niveau pour comprendre les aspects techniques de la partie informatique pour pouvoir travailler ensemble sur les résultats du S8 .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/01/23''' &lt;br /&gt;
&lt;br /&gt;
- Suppression des structures de données pour avancer plus rapidement sur les résultats du semestre s8 .&lt;br /&gt;
&lt;br /&gt;
- Recherches pour la programmation des interruptions PCINT . &lt;br /&gt;
&lt;br /&gt;
- Recherche sur la doc technique pour faire l'initialisation des interruptions externes . &lt;br /&gt;
&lt;br /&gt;
- Recherche de la modélisation en 3D de notre robot pour trouver les paramètres PID de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/02/23''' &lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons :&lt;br /&gt;
&lt;br /&gt;
Modification du code des encodeurs et test sur les moteurs DC . &lt;br /&gt;
&lt;br /&gt;
Poursuite de recherche de l'existant pour trouver le code du gyroscope .&lt;br /&gt;
&lt;br /&gt;
Mise à jour du git .&lt;br /&gt;
&lt;br /&gt;
Début du calcul des matrices d'inertie de chaque solide.&lt;br /&gt;
&lt;br /&gt;
Recherche du code des régulateurs.&lt;br /&gt;
&lt;br /&gt;
Avancement sur la gestion de projet .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/02/23'''&lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons essayé de récupérer les résultats des tests électronique de l'oscilloscope effectués dans les salles d'électronique .&lt;br /&gt;
&lt;br /&gt;
Le code des encodeurs marchent ,la liaison série affiche exactement la vitesse de la consigne :les Régulateurs implémentés correspondent bien à notre applications.&lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation de la partie informatique du gyroscope : Objectif : récupération de l'angle d'inclinaison sur la liaison série avec la meilleure précision possible .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/02/23''' &lt;br /&gt;
&lt;br /&gt;
Fin du calcul des matrices d'inertie . &lt;br /&gt;
&lt;br /&gt;
Paramétrage de notre robot pour avoir la visibilité sur les configurations possibles d'avoir(en virage, ligne droite),en précisant les angles d'inclinaison et es repères associés . &lt;br /&gt;
&lt;br /&gt;
Poursuite de programmation des régulateurs par niveaux en utilisant le code précédemment implémenté pour les encodeurs .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/23''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation du modèle en 3D de notre robot pour essayer de l'autoéquilibrer en utilisant les PIDS issues de l'autotune par rapport à nos préférences(stabilité,temps de réponse,dépassement,précision). &lt;br /&gt;
&lt;br /&gt;
Nous avons testé le robot en l'alimentant par le biai la liaison USB ! et enregistrement des résultats .  &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie automatique en trouvant toutes les équations nécessaires à notre modèle .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/23''' &lt;br /&gt;
&lt;br /&gt;
Réalisations de cette séance :&lt;br /&gt;
&lt;br /&gt;
Test du robot pour se stabiliser sur le sol en applicant plusieurs . &lt;br /&gt;
&lt;br /&gt;
Faire tous les calculs des dimensions géométriques de notre robot et test de la boucle d'asservissement avec les deux niveaux sur Matlab Simulink avec nos préférences de stabilité, temps de réponse,précision,dépassement .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/23''' &lt;br /&gt;
&lt;br /&gt;
Absence justifiée .&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91429</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=91429"/>
				<updated>2023-05-08T19:34:56Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : /* Etude Automatique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Résumé'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
[[Fichier: SegwayRobot.jpg|200px|right|thumb|Exemple de robot similaire au notre]]&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
L'intégralité de notre programme est disponible sur le dépôt git à l'adresse: https://gitlab.com/remi_farault/self-balanced-robot&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Présentation générale'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==🌏Contexte==&lt;br /&gt;
Les moyens de transport actuels reposent principalement sur le principe du robot à deux roues, c'est la raison pour laquelle l'étude de celui ci s'avère importante, en effet l'étude   &lt;br /&gt;
de sa conception et son contrôle va nous permettre de développer des outils innovants qui pourraient potentiellement intéresser des sociétés de transport .&lt;br /&gt;
&lt;br /&gt;
==🎯Objectif==&lt;br /&gt;
&lt;br /&gt;
Notre objectif principal est de commander le robot, de là interviennent d'autres objectifs tel que la stabilité ,développer un code robuste qui assure cette fonctionnalité et aussi le contrôler pour réaliser des fonctionnalités de déplacement et d'éviter des obstacles . Des objectifs secondaires sont de créer un site web à travers lequel nous allons mener toutes les opérations de contrôle .&lt;br /&gt;
&lt;br /&gt;
==🔍Expression du besoin==&lt;br /&gt;
&lt;br /&gt;
Un robot autoéquilibré à deux roues est un type de robot qui peut se maintenir en équilibre sur deux roues sans tomber. Pour réaliser cette fonctionnalité, le robot utilise un ensemble de capteurs, d'algorithmes de contrôle et de moteurs pour ajuster sa position en temps réel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Self_balanc_bt.png|400px|Bete a corne SBR]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le diagramme interacteurs permet en fait de visualiser les fonctions services assurées par le système &lt;br /&gt;
&lt;br /&gt;
[[Fichier:341702419_560921119358434_1016673599353874396_n_(1).png|400px|DGI SBR]]    [[Fichier:Btacorne.png |500px|DGI SBR|right]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Réalisations et Résultats'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
[[Fichier: seg.jpg|200px|left|thumb|Exemple de commande désirée]]&lt;br /&gt;
&lt;br /&gt;
Après mis en place notre stratégie de gestion de projet en s6 à travers le diagramme de GANTT et le cahier de charges fonctionnels, nous nous sommes focalisés sur l'étude technique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: progg.png|300px|right|thumb|Organisation de notre programme]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, étudier à travers des outils automatiques la stabilité du robot en faisant appel à des modèles théoriques et pratiques et commencer par un raisonnement par niveaux, d'abord le niveau 1 du moteur à courant continu et les équations correspondantes puis le niveau 2 assurant la stabilité du robot directement, on avait la possibilité de passer directement au niveau 2 à travers le modèle du pendule inversé et les équations qui en découlent sauf que celui-ci ne nous permettra pas de revenir au niveau 1 et asservir le moteur à travers les codeurs incrémentales ,la deuxième partie consistait à réaliser les codes informatiques en s'appuyant sur les structures de données en C vues l'année dernière et conduire un même raisonnement(par niveaux) s'appuyant d'abord sur les codes sources correspondants à la génération d'un signal PWM pour les deux moteurs avec un rapport cyclique modifiable, et aussi les codes sources correspondants à la gestion des moteurs, en effet, ceux-ci tournent  dans un sens ou dans un autre ou ne tournent pas en fonction de la variable in1 et in2  pour faire tourner les moteurs .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Avr.png|100px|left|thumb|Compilateur utilisé]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cependant, nous avons rencontré quelques problèmes en automatique notamment pour trouver des valeurs des constantes théoriques pour les références du moteur entre les mains, ce qui nous a obligé à prendre des valeurs issues d'autres applications, nous avons rencontré aussi quelques problèmes choisir une modélisation parmi celles qui sont disponibles sur Internet .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les problèmes rencontrés en Informatique étaient de tester les codes de la PWM pratiquement sur les moteurs DC,...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Etude Automatique'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Avant de programmer notre système sur la carte Arduino, nous avons également créé une simulation complète de notre système robotisé sur SIMULINK. Cependant, avant cela, nous avons dû déterminer les équations qui régissent notre système en trouvant les matrices d'inertie de chaque composant de notre robot, à savoir la masse transportée par le robot (M), le châssis constitué de deux plateaux et de la motorisation (les piliers et leur inertie ont été négligés car leur masse est très faible), ainsi que les roues (roue droite et roue gauche). Vous trouverez ci-dessous les matrices d'inertie que nous avons obtenues pour chaque composant.&lt;br /&gt;
&lt;br /&gt;
'''Masse M :'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatM.png|200px|thumb|left|Matrice de la masse M]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients seront notés dans la suite pour simplifier : AM,BM,CM &lt;br /&gt;
&lt;br /&gt;
'''Chassis:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatB.png|800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AH,BH,CH &lt;br /&gt;
&lt;br /&gt;
'''Roue gauche:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrg.png |600px|Matrice de RG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
'''Roue droite:'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Matrd.png |600px|Matrice RD]]&lt;br /&gt;
&lt;br /&gt;
Les coefficients de la diagonale seront notés dans la suite pour simplifier : AD,BD,CD &lt;br /&gt;
&lt;br /&gt;
Ci-dessous un paramétrage de notre système : Chaque angle détermine un repère&lt;br /&gt;
&lt;br /&gt;
Le repère R0 est supposé galliléen.&lt;br /&gt;
&lt;br /&gt;
Le repère R1 est en rotation  ,appelé angle de virage par rapport à R0.&lt;br /&gt;
&lt;br /&gt;
Le repère R2 est en rotation  ,appelé angle d’inclinaison du châssis par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R3 est en rotation  ,appelé angle d’inclinaison arrière-avant de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
Le repère  R4 est en rotation ,appelé angle d’inclinaison droite-gauche de la masse par rapport à R0 . &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:param.png |800px|Matrice du chassis]]&lt;br /&gt;
&lt;br /&gt;
l’angle de consigne est de 0deg,nous employons un PID pour corriger l’angle de mesure,à sa sortie,on aura une tension W(p).Les blocs Km et W(p) assurent le passage tension-&amp;gt;couple-&amp;gt;angle ,il faut ensuite retirer  pour ne garder que l’angle d’inclinaison du châssis  .Km=0.0125N.m.V-1(d’après la datasheet du moteur)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bcle.png |800px|Asservissement]]                                                             [[Fichier:Matuu.png|right|800px|Asservissement]]      &lt;br /&gt;
&lt;br /&gt;
Les équations obtenues sont les suivantes (Le détail des calculs a été précisé dans le Rapport): &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eq nnlin.png |500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après linéarisation : Considérer l'approximations des petits angles pour le sinus et cosinus,et négliger aussi la vitesse angulaire quadratique devant la vitesse angulaire,nous obtenons : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Eqlin.png |300px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crbe.png|600px|Courbe]]&lt;br /&gt;
&lt;br /&gt;
On obtient une courbe avec un bon temps de réponse, un léger dépassement et une stabilité .Le système est régulé de manière efficace, capable de répondre rapidement et précisément aux perturbations tout en maintenant une position d'équilibre stable.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mat3d.png|500px|Asservissement]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Bilan'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 6 :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 7 :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Bilan du semestre 8 :'''&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Gestion de projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
- L'utilisation de git : &lt;br /&gt;
[[Fichier:Gt.png|400px|thumb|left|texte descriptif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Semestre 6 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/22''' &lt;br /&gt;
&lt;br /&gt;
Séance de découverte du sujet de notre projet.&lt;br /&gt;
&lt;br /&gt;
Recherche de l'existant &lt;br /&gt;
&lt;br /&gt;
Réalisation de recherches sur leurs différentes utilisations.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/22''' &lt;br /&gt;
&lt;br /&gt;
Début de création du diagramme de Gantt .&lt;br /&gt;
&lt;br /&gt;
Réalisation d'une étude du besoin.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du marché : Recherche des robots similaires.&lt;br /&gt;
Commencer à prendre en main le robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 22/03/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de l'étude de marché.&lt;br /&gt;
Etude des opportunités.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 29/03/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'étude du marché.&lt;br /&gt;
Commencer à rédiger le cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 05/04/22''' &lt;br /&gt;
&lt;br /&gt;
Commencer la rédaction du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 26/04/22''' &lt;br /&gt;
&lt;br /&gt;
Bilan du semestre.&lt;br /&gt;
Etude de faisabilité.&lt;br /&gt;
Etude des risques.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 03/05/22''' &lt;br /&gt;
&lt;br /&gt;
Finalisation de l'étude des risques.&lt;br /&gt;
Finalisation de l'étude de faisabilité.&lt;br /&gt;
Finalisation du cahier des charges.&lt;br /&gt;
&lt;br /&gt;
== Semestre 7 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 10/10/22'''&lt;br /&gt;
&lt;br /&gt;
Commencement de l'étude technique des encodeurs . &lt;br /&gt;
Recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du changement de la carte arduino pour ajouter des nouvelles fonctionnalités : connexion Wifi, fréquence microprocesseur plus élevé,..&lt;br /&gt;
Test des encodeurs moteur DC : validé .&lt;br /&gt;
Poursuite de recherche des boucles d'asservissement du robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/10/22''' &lt;br /&gt;
&lt;br /&gt;
Etude de génération des signaux PWM&lt;br /&gt;
&lt;br /&gt;
Test sur Matlab Simulink des boucles d'asservissement issues des robots similaires .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/11/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation des signaux PWM du robot.&lt;br /&gt;
&lt;br /&gt;
Calcul de la fonction de transfert issue de la boucle.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 21/11/22''' &lt;br /&gt;
&lt;br /&gt;
Etude du fonctionnement du gyroscope et des autres composants pour programmer le robot .  &lt;br /&gt;
&lt;br /&gt;
Séparation du travail a effectuer pour le robot entre une boucle du moteur DC(niveau 1) et une boucle du niveau supérieur(niveau 2) pour asservir l'angle d'inclinaison du robot.&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/11/22''' &lt;br /&gt;
&lt;br /&gt;
Modification et amélioration du diagramme de Gantt pour le S7 et le S8.&lt;br /&gt;
&lt;br /&gt;
Avancée de la modélisation de la boucle du niveau 1 .&lt;br /&gt;
&lt;br /&gt;
Diagramme de Gantt S7-S8&lt;br /&gt;
&lt;br /&gt;
'''Séance du 28/11/22''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation de la boucle du niveau inférieur sur Matlab/Simulink et récupération des résultats sur le scope .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/12/22''' &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie informatique et avancement de la partie automatique .&lt;br /&gt;
Programmation de la liaison série pour débugger les sorties de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/12/22''' &lt;br /&gt;
&lt;br /&gt;
Début de rédaction du rapport pour le S7&lt;br /&gt;
&lt;br /&gt;
== Semestre 8 ==&lt;br /&gt;
&lt;br /&gt;
'''Séance du 18/01/23''' &lt;br /&gt;
&lt;br /&gt;
Recherches pour le gyroscope . &lt;br /&gt;
Test des encodeurs .&lt;br /&gt;
Communication sur les attentes du semestre s8 ,les fautes à éviter pour rebondir par rapport au retard S7 &lt;br /&gt;
Mise à niveau pour comprendre les aspects techniques de la partie informatique pour pouvoir travailler ensemble sur les résultats du S8 .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 25/01/23''' &lt;br /&gt;
&lt;br /&gt;
- Suppression des structures de données pour avancer plus rapidement sur les résultats du semestre s8 .&lt;br /&gt;
&lt;br /&gt;
- Recherches pour la programmation des interruptions PCINT . &lt;br /&gt;
&lt;br /&gt;
- Recherche sur la doc technique pour faire l'initialisation des interruptions externes . &lt;br /&gt;
&lt;br /&gt;
- Recherche de la modélisation en 3D de notre robot pour trouver les paramètres PID de notre robot .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/02/23''' &lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons :&lt;br /&gt;
&lt;br /&gt;
Modification du code des encodeurs et test sur les moteurs DC . &lt;br /&gt;
Poursuite de recherche de l'existant pour trouver le code du gyroscope .&lt;br /&gt;
Mise à jour du git .&lt;br /&gt;
Début du calcul des matrices d'inertie de chaque solide.&lt;br /&gt;
Recherche du code des régulateurs.&lt;br /&gt;
Avancement sur la gestion de projet .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/02/23'''&lt;br /&gt;
&lt;br /&gt;
Durant cette séance, nous avons essayé de récupérer les résultats des tests électronique de l'oscilloscope effectués dans les salles d'électronique .&lt;br /&gt;
&lt;br /&gt;
Le code des encodeurs marchent ,la liaison série affiche exactement la vitesse de la consigne :les Régulateurs implémentés correspondent bien à notre applications.&lt;br /&gt;
&lt;br /&gt;
Poursuite de la programmation de la partie informatique du gyroscope : Objectif : récupération de l'angle d'inclinaison sur la liaison série avec la meilleure précision possible .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/02/23''' &lt;br /&gt;
&lt;br /&gt;
Fin du calcul des matrices d'inertie . &lt;br /&gt;
&lt;br /&gt;
Paramétrage de notre robot pour avoir la visibilité sur les configurations possibles d'avoir(en virage, ligne droite),en précisant les angles d'inclinaison et es repères associés . &lt;br /&gt;
&lt;br /&gt;
Poursuite de programmation des régulateurs par niveaux en utilisant le code précédemment implémenté pour les encodeurs .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 01/03/23''' &lt;br /&gt;
&lt;br /&gt;
Fin d'implémentation du modèle en 3D de notre robot pour essayer de l'autoéquilibrer en utilisant les PIDS issues de l'autotune par rapport à nos préférences(stabilité,temps de réponse,dépassement,précision). &lt;br /&gt;
&lt;br /&gt;
Nous avons testé le robot en l'alimentant par le biai la liaison USB ! et enregistrement des résultats .  &lt;br /&gt;
&lt;br /&gt;
Poursuite de la partie automatique en trouvant toutes les équations nécessaires à notre modèle .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 08/03/23''' &lt;br /&gt;
&lt;br /&gt;
Réalisations de cette séance :&lt;br /&gt;
&lt;br /&gt;
Test du robot pour se stabiliser sur le sol en applicant plusieurs . &lt;br /&gt;
&lt;br /&gt;
Faire tous les calculs des dimensions géométriques de notre robot et test de la boucle d'asservissement avec les deux niveaux sur Matlab Simulink avec nos préférences de stabilité, temps de réponse,précision,dépassement .&lt;br /&gt;
&lt;br /&gt;
'''Séance du 15/03/23''' &lt;br /&gt;
&lt;br /&gt;
Absence justifiée .&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=90463</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=90463"/>
				<updated>2023-01-18T18:41:00Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : /* Gestion de projet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Résumé'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
[[Fichier: SegwayRobot.jpg|200px|right|thumb|Exemple de robot similaire au notre]]&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
L'intégralité de notre programme est disponible sur le dépôt git à l'adresse: https://gitlab.com/remi_farault/self-balanced-robot&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Présentation générale'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==Contexte==&lt;br /&gt;
Les moyens de transport actuels reposent principalement sur le principe du robot à deux roues, c'est la raison pour laquelle l'étude de celui ci s'avère importante, en effet l'étude   &lt;br /&gt;
de sa conception et son contrôle va nous permettre de développer des outils innovants qui pourraient potentiellement intéresser des sociétés de transport .&lt;br /&gt;
&lt;br /&gt;
==Objectif==&lt;br /&gt;
&lt;br /&gt;
Notre objectif principal est de commander le robot, de là interviennent d'autres objectifs tel que la stabilité ,développer un code robuste qui assure cette fonctionnalité et aussi le contrôler pour réaliser des fonctionnalités de déplacement et d'éviter des obstacles . Des objectifs secondaires sont de créer un site web à travers lequel nous allons mener toutes les opérations de contrôle .&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Réalisations et Résultats'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
[[Fichier: seg.jpg|200px|left|thumb|Exemple de commande désirée]]&lt;br /&gt;
&lt;br /&gt;
Après mis en place notre stratégie de gestion de projet en s6 à travers le diagramme de GANTT et le cahier de charges fonctionnels, nous nous sommes focalisés sur l'étude technique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: progg.png|300px|right|thumb|Organisation de notre programme]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, étudier à travers des outils automatiques la stabilité du robot en faisant appel à des modèles théoriques et pratiques et commencer par un raisonnement par niveaux, d'abord le niveau 1 du moteur à courant continu et les équations correspondantes puis le niveau 2 assurant la stabilité du robot directement, on avait la possibilité de passer directement au niveau 2 à travers le modèle du pendule inversé et les équations qui en découlent sauf que celui-ci ne nous permettra pas de revenir au niveau 1 et asservir le moteur à travers les codeurs incrémentales ,la deuxième partie consistait à réaliser les codes informatiques en s'appuyant sur les structures de données en C vues l'année dernière et conduire un même raisonnement(par niveaux) s'appuyant d'abord sur les codes sources correspondants à la génération d'un signal PWM pour les deux moteurs avec un rapport cyclique modifiable, et aussi les codes sources correspondants à la gestion des moteurs, en effet, ceux-ci tournent  dans un sens ou dans un autre ou ne tournent pas en fonction de la variable in1 et in2  pour faire tourner les moteurs .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Avr.png|100px|left|thumb|Compilateur utilisé]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cependant, nous avons rencontré quelques problèmes en automatique notamment pour trouver des valeurs des constantes théoriques pour les références du moteur entre les mains, ce qui nous a obligé à prendre des valeurs issues d'autres applications, nous avons rencontré aussi quelques problèmes choisir une modélisation parmi celles qui sont disponibles sur Internet .&lt;br /&gt;
&lt;br /&gt;
[[Fichier: boucle.png|300px|right|thumb|modèle théorique du moteur à courant continu]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les problèmes rencontrés en Informatique étaient de tester les codes de la PWM pratiquement sur les moteurs DC,...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Bilan'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Gestion de projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
- Google Drive&lt;br /&gt;
[[Fichier:Gt.png|100px|thumb|left|texte descriptif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rapport séance 18/01 == &lt;br /&gt;
&lt;br /&gt;
Mohamed: &lt;br /&gt;
&lt;br /&gt;
Developpement et documentation sur les encodeurs des moteurs&lt;br /&gt;
&lt;br /&gt;
Rémi:&lt;br /&gt;
&lt;br /&gt;
Documentation sur le MPU6050 et i2c&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=90077</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=90077"/>
				<updated>2023-01-04T22:07:52Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;='''Résumé''' =&lt;br /&gt;
&lt;br /&gt;
[[Fichier: SegwayRobot.jpg|200px|right|thumb|Exemple de robot similaire au notre]]&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
L'intégralité de notre programme est disponible sur le dépôt git à l'adresse: https://gitlab.com/remi_farault/self-balanced-robot&lt;br /&gt;
&lt;br /&gt;
='''Présentation générale'''=&lt;br /&gt;
&lt;br /&gt;
==Contexte==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Objectif==&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
='''Réalisations et résultats'''=&lt;br /&gt;
&lt;br /&gt;
='''Bilan'''=&lt;br /&gt;
&lt;br /&gt;
='''Gestion de projet'''=&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=90075</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=90075"/>
				<updated>2023-01-04T22:07:21Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : /* Résumé */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;='''Résumé''' =&lt;br /&gt;
&lt;br /&gt;
[[Fichier: SegwayRobot.jpg|200px|right|thumb|Exemple de robot similaire au notre]]&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
L'intégralité de notre programme est disponible sur ce &amp;lt;a href='https://gitlab.com/remi_farault/self-balanced-robot'&amp;gt; dépôt git &amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
='''Présentation générale'''=&lt;br /&gt;
&lt;br /&gt;
==Contexte==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Objectif==&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
='''Réalisations et résultats'''=&lt;br /&gt;
&lt;br /&gt;
='''Bilan'''=&lt;br /&gt;
&lt;br /&gt;
='''Gestion de projet'''=&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=89759</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=89759"/>
				<updated>2023-01-04T12:46:14Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : /* Présentation générale */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;='''Résumé''' =&lt;br /&gt;
&lt;br /&gt;
[[Fichier: SegwayRobot.jpg|200px|right|thumb|Exemple de robot similaire au notre]]&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
='''Présentation générale'''=&lt;br /&gt;
&lt;br /&gt;
==Contexte==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Objectif==&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
='''Réalisations et résultats'''=&lt;br /&gt;
&lt;br /&gt;
='''Bilan'''=&lt;br /&gt;
&lt;br /&gt;
='''Gestion de projet'''=&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=89758</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=89758"/>
				<updated>2023-01-04T12:38:35Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : /* Résumé */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;='''Résumé''' =&lt;br /&gt;
&lt;br /&gt;
[[Fichier: SegwayRobot.jpg|200px|right|thumb|Exemple de robot similaire au notre]]&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
='''Présentation générale'''=&lt;br /&gt;
&lt;br /&gt;
==Contexte==&lt;br /&gt;
&lt;br /&gt;
==Objectif==&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
='''Réalisations et résultats'''=&lt;br /&gt;
&lt;br /&gt;
='''Bilan'''=&lt;br /&gt;
&lt;br /&gt;
='''Gestion de projet'''=&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=89757</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=89757"/>
				<updated>2023-01-04T12:38:12Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : /* Résumé */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;='''Résumé''' =&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
[[Fichier: SegwayRobot.jpg|200px|right|thumb|Exemple de robot similaire au notre]]&lt;br /&gt;
&lt;br /&gt;
='''Présentation générale'''=&lt;br /&gt;
&lt;br /&gt;
==Contexte==&lt;br /&gt;
&lt;br /&gt;
==Objectif==&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
='''Réalisations et résultats'''=&lt;br /&gt;
&lt;br /&gt;
='''Bilan'''=&lt;br /&gt;
&lt;br /&gt;
='''Gestion de projet'''=&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=89756</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=89756"/>
				<updated>2023-01-04T12:37:59Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : /* Résumé */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;='''Résumé''' =&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
[[Fichier: SegwayRobot.jpg|200px|left|thumb|Exemple de robot similaire au notre]]&lt;br /&gt;
&lt;br /&gt;
='''Présentation générale'''=&lt;br /&gt;
&lt;br /&gt;
==Contexte==&lt;br /&gt;
&lt;br /&gt;
==Objectif==&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
='''Réalisations et résultats'''=&lt;br /&gt;
&lt;br /&gt;
='''Bilan'''=&lt;br /&gt;
&lt;br /&gt;
='''Gestion de projet'''=&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=89755</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=89755"/>
				<updated>2023-01-04T12:37:22Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : /* Résumé */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;='''Résumé''' =&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
[[Fichier: SegwayRobot.jpg | 200px | left | Exemple de robot similaire au notre]]&lt;br /&gt;
&lt;br /&gt;
='''Présentation générale'''=&lt;br /&gt;
&lt;br /&gt;
==Contexte==&lt;br /&gt;
&lt;br /&gt;
==Objectif==&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
='''Réalisations et résultats'''=&lt;br /&gt;
&lt;br /&gt;
='''Bilan'''=&lt;br /&gt;
&lt;br /&gt;
='''Gestion de projet'''=&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=89754</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=89754"/>
				<updated>2023-01-04T12:36:29Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : /* Résumé */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;='''Résumé''' =&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
[[Fichier: SegwayRobot.jpg | 200px]]&lt;br /&gt;
&lt;br /&gt;
='''Présentation générale'''=&lt;br /&gt;
&lt;br /&gt;
==Contexte==&lt;br /&gt;
&lt;br /&gt;
==Objectif==&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
='''Réalisations et résultats'''=&lt;br /&gt;
&lt;br /&gt;
='''Bilan'''=&lt;br /&gt;
&lt;br /&gt;
='''Gestion de projet'''=&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=89750</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=89750"/>
				<updated>2023-01-03T22:09:05Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : /* Résumé */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;='''Résumé''' =&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
[[Fichier: SegwayRobot.jpg]]&lt;br /&gt;
&lt;br /&gt;
='''Présentation générale'''=&lt;br /&gt;
&lt;br /&gt;
==Contexte==&lt;br /&gt;
&lt;br /&gt;
==Objectif==&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
='''Réalisations et résultats'''=&lt;br /&gt;
&lt;br /&gt;
='''Bilan'''=&lt;br /&gt;
&lt;br /&gt;
='''Gestion de projet'''=&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=89749</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=89749"/>
				<updated>2023-01-03T22:08:47Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : /* Résumé */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;='''Résumé''' =&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
[[Fichier: RobotSegway.jpg]]&lt;br /&gt;
&lt;br /&gt;
='''Présentation générale'''=&lt;br /&gt;
&lt;br /&gt;
==Contexte==&lt;br /&gt;
&lt;br /&gt;
==Objectif==&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
='''Réalisations et résultats'''=&lt;br /&gt;
&lt;br /&gt;
='''Bilan'''=&lt;br /&gt;
&lt;br /&gt;
='''Gestion de projet'''=&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=89748</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=89748"/>
				<updated>2023-01-03T22:08:37Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : /* Résumé */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;='''Résumé''' =&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RobotSegway.jpg]]&lt;br /&gt;
&lt;br /&gt;
='''Présentation générale'''=&lt;br /&gt;
&lt;br /&gt;
==Contexte==&lt;br /&gt;
&lt;br /&gt;
==Objectif==&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
='''Réalisations et résultats'''=&lt;br /&gt;
&lt;br /&gt;
='''Bilan'''=&lt;br /&gt;
&lt;br /&gt;
='''Gestion de projet'''=&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:SegwayRobot.jpg&amp;diff=89747</id>
		<title>Fichier:SegwayRobot.jpg</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:SegwayRobot.jpg&amp;diff=89747"/>
				<updated>2023-01-03T22:07:54Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=89746</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=89746"/>
				<updated>2023-01-03T21:59:09Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : /* Résumé */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;='''Résumé''' =&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:test.png]]&lt;br /&gt;
&lt;br /&gt;
='''Présentation générale'''=&lt;br /&gt;
&lt;br /&gt;
==Contexte==&lt;br /&gt;
&lt;br /&gt;
==Objectif==&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
='''Réalisations et résultats'''=&lt;br /&gt;
&lt;br /&gt;
='''Bilan'''=&lt;br /&gt;
&lt;br /&gt;
='''Gestion de projet'''=&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=89745</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=89745"/>
				<updated>2023-01-03T21:57:49Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : /* Résumé */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;='''Résumé''' =&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:https://www.flickr.com/photos/pestoverde/24110102879]]&lt;br /&gt;
&lt;br /&gt;
='''Présentation générale'''=&lt;br /&gt;
&lt;br /&gt;
==Contexte==&lt;br /&gt;
&lt;br /&gt;
==Objectif==&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
='''Réalisations et résultats'''=&lt;br /&gt;
&lt;br /&gt;
='''Bilan'''=&lt;br /&gt;
&lt;br /&gt;
='''Gestion de projet'''=&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=89744</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=89744"/>
				<updated>2023-01-03T21:56:49Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : /* Résumé */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;='''Résumé''' =&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:image.jpg]]&lt;br /&gt;
&lt;br /&gt;
='''Présentation générale'''=&lt;br /&gt;
&lt;br /&gt;
==Contexte==&lt;br /&gt;
&lt;br /&gt;
==Objectif==&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
='''Réalisations et résultats'''=&lt;br /&gt;
&lt;br /&gt;
='''Bilan'''=&lt;br /&gt;
&lt;br /&gt;
='''Gestion de projet'''=&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=89743</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=89743"/>
				<updated>2023-01-03T21:48:04Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : /* Résumé */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;='''Résumé''' =&lt;br /&gt;
&lt;br /&gt;
Notre projet est de concevoir un robot mobile à deux roues ayant la faculté de s'équilibrer automatiquement. En effet, ne possédant que deux roues, l'équilibre du robot sur son axe vertical est compromis, a la manière d'un '''segway'''.&lt;br /&gt;
Afin d'empecher ce désequilibre, nous avons pensé à intégrer au robot un système de contrôle de son angle vertical, utilisant des capteurs et des actionneurs mis en relation par une boucle de régulation automatique.&lt;br /&gt;
Les composants electroniques et mécaniques du robot nous étant fournis, notre travail consiste donc surtout à étudier ce système, pour ensuite concevoir un asservissement, et l'implémenter dans notre robot.&lt;br /&gt;
&lt;br /&gt;
='''Présentation générale'''=&lt;br /&gt;
&lt;br /&gt;
==Contexte==&lt;br /&gt;
&lt;br /&gt;
==Objectif==&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
='''Réalisations et résultats'''=&lt;br /&gt;
&lt;br /&gt;
='''Bilan'''=&lt;br /&gt;
&lt;br /&gt;
='''Gestion de projet'''=&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=89742</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=89742"/>
				<updated>2023-01-03T20:02:46Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;='''Résumé''' =&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre projet ingénieur s'étalant sur 3 semestres, nous avons choisi de developper un robot mobile à deux roues auto-équilibré.&lt;br /&gt;
&lt;br /&gt;
='''Présentation générale'''=&lt;br /&gt;
&lt;br /&gt;
==Contexte==&lt;br /&gt;
&lt;br /&gt;
==Objectif==&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
='''Réalisations et résultats'''=&lt;br /&gt;
&lt;br /&gt;
='''Bilan'''=&lt;br /&gt;
&lt;br /&gt;
='''Gestion de projet'''=&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=89741</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=89741"/>
				<updated>2023-01-03T20:00:52Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;='''Résumé''' =&lt;br /&gt;
200 mots max&lt;br /&gt;
&lt;br /&gt;
='''Présentation générale'''=&lt;br /&gt;
&lt;br /&gt;
==Contexte==&lt;br /&gt;
&lt;br /&gt;
==Objectif==&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
='''Réalisations et résultats'''=&lt;br /&gt;
&lt;br /&gt;
='''Bilan'''=&lt;br /&gt;
&lt;br /&gt;
='''Gestion de projet'''=&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=89740</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=89740"/>
				<updated>2023-01-03T19:58:16Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : /* Robot Auto-Equilibré */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Robot Auto-Equilibré ==&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=89739</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=89739"/>
				<updated>2023-01-03T19:57:46Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Robot Auto-Equilibré =&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=89738</id>
		<title>IMA3/IMA4 2021/2023 P10</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2021/2023_P10&amp;diff=89738"/>
				<updated>2023-01-03T19:52:47Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : Page vide créée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Projets_IMA3_IMA4_2021/2023&amp;diff=88789</id>
		<title>Projets IMA3 IMA4 2021/2023</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Projets_IMA3_IMA4_2021/2023&amp;diff=88789"/>
				<updated>2022-10-10T10:48:39Z</updated>
		
		<summary type="html">&lt;p&gt;Rfarault : /* Répartition des projets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Répartition des projets ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Projets !! Encadrants école !! Eleves&lt;br /&gt;
|-&lt;br /&gt;
| P1 [[IMA3/IMA4 2021/2023 P1|IMA3/IMA4 2021/2023 P1]]&lt;br /&gt;
| ici nom encadrant&lt;br /&gt;
| ici etudiant 1 / etudiant 2 / ....&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| P2 [[IMA3/IMA4 2021/2023 P2|ici nom du projet]]&lt;br /&gt;
| ici nom encadrant&lt;br /&gt;
| ici etudiant 1 / etudiant 2 / ....&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| P3 [[IMA3/IMA4 2021/2023 P3|Convoyeur avec caméra]]&lt;br /&gt;
| Blaise Conrard / Othman Lakhal&lt;br /&gt;
| Brenier Timothé / Hornain François / Ling Dylan / Riffaut Mathis&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| P4 [[IMA3/IMA4 2021/2023 P4|ici nom du projet]]&lt;br /&gt;
| ici nom encadrant&lt;br /&gt;
| ici etudiant 1 / etudiant 2 / ....&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| P5 [[IMA3/IMA4 2021/2023 P3| Supervision d'un Parc d'imprimante 3D]]&lt;br /&gt;
| Rodolphe Astori / Blaise Conrard&lt;br /&gt;
| Dollet Arthur/ Touria El Azrak / Chichery Gregoire / Amoros Paul&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| P6 [[IMA3/IMA4 2021/2023 P6|Robot ramasseur de mégots]]&lt;br /&gt;
| Othman Lakhal&lt;br /&gt;
| Delannoy Jason - Deffrennes Vianney - Thomas Gabriel  &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| P7 [[IMA3/IMA4 2021/2023 P4|ici nom du projet]]&lt;br /&gt;
| ici nom encadrant&lt;br /&gt;
| ici etudiant 1 / etudiant 2 / ....&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| P8 [[IMA3/IMA4 2021/2023 P4|Vanne Piézoelectrique]]&lt;br /&gt;
| Othman Lakhal&lt;br /&gt;
| Pouillard Romain / Legendre Hugo/ Vion Antoine&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| P7 [[IMA3/IMA4 2021/2023 P4|ici nom du projet]]&lt;br /&gt;
| ici nom encadrant&lt;br /&gt;
| ici etudiant 1 / etudiant 2 / ....&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| P10 [[IMA3/IMA4 2021/2023 P4|Robot à deux roues auto équilibré]]&lt;br /&gt;
| Anne-Lise Géhin&lt;br /&gt;
| Bennani Mohamed / Farault Rémi &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| P7 [[IMA3/IMA4 2021/2023 P4|ici nom du projet]]&lt;br /&gt;
| ici nom encadrant&lt;br /&gt;
| ici etudiant 1 / etudiant 2 / ....&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| P12 [[IMA3/IMA4 2021/2023 P12|Communication entre des robots pour la gestion d'un entrepôt]]&lt;br /&gt;
| Anne-Lise Géhin&lt;br /&gt;
| Naudot François / Delétang Antoine / Sellali Amine / El Mariky Salim&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| P7 [[IMA3/IMA4 2021/2023 P4|ici nom du projet]]&lt;br /&gt;
| ici nom encadrant&lt;br /&gt;
| ici etudiant 1 / etudiant 2 / ....&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| P14 [[IMA3/IMA4 2021/2023 P14|Télé-opération d'un bras manipulateur collaboratif via un casque virtuel.]]&lt;br /&gt;
| Othman LAKHAL&lt;br /&gt;
| Julien CHARLEUX / Karl HABRE / Thomas LEFRANC / Tanguy RIDREMONT&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| P7 [[IMA3/IMA4 2021/2023 P4|ici nom du projet]]&lt;br /&gt;
| ici nom encadrant&lt;br /&gt;
| ici etudiant 1 / etudiant 2 / ....&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| P7 [[IMA3/IMA4 2021/2023 P4|ici nom du projet]]&lt;br /&gt;
| ici nom encadrant&lt;br /&gt;
| ici etudiant 1 / etudiant 2 / ....&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Rfarault</name></author>	</entry>

	</feed>