<?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=Egury</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=Egury"/>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php/Sp%C3%A9cial:Contributions/Egury"/>
		<updated>2026-05-13T18:54:30Z</updated>
		<subtitle>Contributions de l’utilisateur</subtitle>
		<generator>MediaWiki 1.29.2</generator>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85455</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85455"/>
				<updated>2021-01-07T18:01:23Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Gestion des trames */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Début projet===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Mise en place du réseau===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se connecter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
 subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
 range 192.168.42.1 192.168.42.9&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La configuration du serveur réseau s'effectue en se connectant à ce dernier en ssh:&lt;br /&gt;
 root@192.168.42.10&lt;br /&gt;
Il faut installer le &amp;quot;gateway bridge&amp;quot;, le &amp;quot;network server&amp;quot; ainsi que &amp;quot;l'application server&amp;quot; disponible sur ChirpStack. Pour se faire nous avons suivi un tutoriel à l'adresse suivante:&lt;br /&gt;
 https://www.youtube.com/watch?v=FnTP7t47DlI&lt;br /&gt;
ainsi que la documentation fournie par ChirpStack&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pour accéder au serveur réseau, nous passons par l'interface web en se connectant à l'adresse suivante (en passant par une zabeth):&lt;br /&gt;
 172.26.189.22:8080 id: admin mdp: admin&lt;br /&gt;
&lt;br /&gt;
A partir de l'interface web, nous pouvons configurer de nombreux éléments:&lt;br /&gt;
&lt;br /&gt;
-Création d'un nouveau projet&lt;br /&gt;
&lt;br /&gt;
-Ajouter des équipements aux réseau à l'aide des clefs&lt;br /&gt;
&lt;br /&gt;
-Surveiller les informations qui circulent sur notre réseau&lt;br /&gt;
&lt;br /&gt;
-...&lt;br /&gt;
&lt;br /&gt;
Enfin, en nous connectant en ssh sur les deux gateways:&lt;br /&gt;
 antenne: 192.168.42.1 mdp:pdmk-062E7A&lt;br /&gt;
 passerelle intérieur: 192.168.42.2 mdp:pdmk-030970&lt;br /&gt;
Nous avons pu mettre à jour ces dernieres en suivant le wiki Kerlink&lt;br /&gt;
La connexion au wiki Kerlink s'effectue avec:&lt;br /&gt;
 Login : univlille&lt;br /&gt;
 Mot de passe : IYBlN7QF06&lt;br /&gt;
&lt;br /&gt;
===Test du réseau===&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de notre Network Server nous avons utilisé un module GPS LoRa du commerce. En se connectant a notre Network Server (172.26.189.22:8000) nous avons pu créer une nouvelle application et ajouté un nouvel équipement. Se faisant notre Network Server génère deux clefs, une &amp;quot;application key&amp;quot; et une &amp;quot;Network Key&amp;quot;. Ces deux clefs doivent être renseigné manuellement dans notre équipement. Pour se faire on peut le connecter à un ordinateur et y ajouter les clefs via son logiciel dédié. L'équipement possédant déjà un EUI permettant de reconnaître l'équipement, nous avons du renseigner ce dernier dans l'ajout de l'équipement sur le Network Server. Suite à ce test nous avons bien pu observer la circulation de nos trames et le bon fonctionnement de notre Network Server.&lt;br /&gt;
&lt;br /&gt;
===Fabrication du End-device===&lt;br /&gt;
&lt;br /&gt;
Pour le end-device je dispose d'une carte STM32F411RE, d'un shield SX1276MB1MAS et d'un capteur ultrason HC-SR04.&lt;br /&gt;
Le développement du programme se fait sur STM32Cube.&lt;br /&gt;
Un premier programme à été mis en place sans difficultés pour récupérer les valeurs du HC-SR04 en s'appuyant sur l'exemple proposé par Arduino.&lt;br /&gt;
En revanche les problèmes sont arrivés lors du développement concernant la partie LoRaWAN. En effet STM32 propose un package LoRaWAN pour faciliter le développement d'application, le problème étant que ce package concerne seulement les cartes STM32LXXX. J'ai essayé longuement d'adapter ce package pour ma carte STM32F411RE en modifiant notamment le Makefile, les .flash mais aussi les fichiers d'inclusion sans succès malheureusement. La solution envisagée est donc un changement de carte au profit d'une STM32LXXX.&lt;br /&gt;
&lt;br /&gt;
Après changé notre carte pour une STM32L152RE, j'ai repris le package proposé par STM32 et dans le fichier Commissioning.h j'ai rensigné les clefs &lt;br /&gt;
 LORAWAN_APP_KEY&lt;br /&gt;
 LORAWAN_NWK_KEY&lt;br /&gt;
&lt;br /&gt;
Il n'y a que ces deux à renseigner étant donné que notre équipement fonctionne sur une version inférieur à la 1.1. A noter que le champ device EUI semble ne pas fonctionner. Nous avons du récuper l'EUI sur une gateway et renseigner ce dernier dans l'équipement que j'ai crée pour mon application sur l'interface web.&lt;br /&gt;
&lt;br /&gt;
Concernant le programme de l'équipement en lui même le programme est relativement simle, en se servant de la bibliothèque HAL je declare 3 PIN en input et je renvoie ainsi l'état des capteurs de manière périodique en me servant de la fonction &amp;quot;Send&amp;quot; du package STM32.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie application WEB===&lt;br /&gt;
&lt;br /&gt;
La principale difficulté de cette partie et l'absence totale de connaissances dans le développement d'application WEB. J'ai donc dû apprendre les langage HTML / CSS / PHP (quelques notions en JS) pour réaliser cette partie. Je disposais de quelques notions en base de données et SQL suit à mon année d'IMA3.&lt;br /&gt;
&lt;br /&gt;
Le but de l'application WEB est de permettre de rendre exploitable pour l'utilisateurs les informations renvoyés par les balises. Pour se faire l'application doit contenir une page de monitoring permettant de surveiller l'état de toutes les balises. De plus elle doit contenir une partie historique permettant d'accéder à l'historique d'une balise en particulier (en effectuant une recherche par id/localisation/date). Enfin elle doit aussi proposer une partie permettant d'afficher une carte avec dessus les balises et leur état.&lt;br /&gt;
&lt;br /&gt;
A l'aide de Bootstrap j'ai mis en place une application WEB avec ces trois partie. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie serveur d'application===&lt;br /&gt;
&lt;br /&gt;
====Mise en place de l'environnement====&lt;br /&gt;
&lt;br /&gt;
Concernant la partie serveur, j'ai mis en place sur une VM (172.26.189.23) un serveur apache et Postgres pour la gestion des bases mais aussi un interpreteur php.&lt;br /&gt;
Pour apache j'ai simplement mis tous mes fichiers html/php dans /var/www/html qui est le repertoir par defaut. Celui est configuré pour démarrer au lancement de la VM.&lt;br /&gt;
Concernant Postgres j'ai d'abord crée un nouvel utilisateur en me servant de l'utilisateur crée par defaut (su - postgres):&lt;br /&gt;
 createuser -d -P root (mdp: glopglop)&lt;br /&gt;
&lt;br /&gt;
Puis j'ai créé une nouvelle base:&lt;br /&gt;
 createdb -O root pfe&lt;br /&gt;
&lt;br /&gt;
Pour se connecter a la base:&lt;br /&gt;
 psql pfe (depuis l'utilsateur root ou postgres)&lt;br /&gt;
&lt;br /&gt;
Enfin j'y ai ajouté mes tables:&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE balises (ID serial PRIMARY KEY, Pays varchar(50) NOT NULL, Ville varchar(50) NOT NULL, Localisation varchar(50) NOT NULL, Coordonnees varchar(50) NOT NULL,Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE historique_balise (ID serial PRIMARY KEY, id_balise int NOT NULL, Date date NOT NULL, Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
La base contient deux tables, une première ayant pour clef primaire l'id de la balise et contenant des informations diverses sur cette dernière telles que le pays, la ville, la localisation, les coordonnée, le niveau d'eau mais surtout si cette dernière est sous l'eau ou non. La seconde table concerne l'historique des balises, elle a pour clef primaire l'indice du relevé et contient des informations comme le numéro de balise, la date du relevé etc, l'état de la balise etc..&lt;br /&gt;
&lt;br /&gt;
Pour la communication entre le serveur d'application et le serveur réseau, j'ai dans un premier temps mis en place un script python pour récuperer les relevés des capteurs via l'API REST:&lt;br /&gt;
 import requests&lt;br /&gt;
 import json&lt;br /&gt;
 #on recupere le token&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Content-Type': 'application/json',&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
 }&lt;br /&gt;
 data = '{&amp;quot;email&amp;quot;: &amp;quot;admin&amp;quot;,&amp;quot;password&amp;quot;: &amp;quot;admin&amp;quot; }'&lt;br /&gt;
 response = requests.post('http://172.26.189.22:8080/api/internal/login', headers=headers, data=data)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 #print(resp['jwt'])&lt;br /&gt;
 #diverses information sur un capteur&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
    'Grpc-Metadata-Authorization': 'Bearer'+resp['jwt'],&lt;br /&gt;
 }&lt;br /&gt;
 response = requests.get('http://172.26.189.22:8080/api/devices/0b00f4ff703a8fc5', headers=headers)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 print(resp)&lt;br /&gt;
&lt;br /&gt;
Ce script permet de un premier temps de récuperer le token pour avoir accés à l'API. Celui ci est a renseigner dans toute les requetes http. &lt;br /&gt;
En se connectant à l'API via l'interface graphique (172.26.189.22:8080/api), on peut récuperer toutes les requetes possible en cURL, j'ai donc simplement utilisé un convertisseur cURL vers python pour mettre mes requetes en place.&lt;br /&gt;
&lt;br /&gt;
Malheureusement cette solution permet de récuperer de nombreuses informations concernant l'application mais pas les relevés des capteurs. Pour récupérer ces derniers, je suis passé par l'interface graphique du serveur d'application (172.26.189.22:8080) afin d'ajouter une intégration HTTP. Il faut simplement spécifier le format de l'information (JSON dans mon cas) et l'URL à laquelle doit être envoyé la requête http POST. Dans mon cas cela sera:&lt;br /&gt;
 http://172.26.189.23/pfe/gestionPOST.php&lt;br /&gt;
&lt;br /&gt;
La base du fichier gestionPOST.php ressemble à cela: &lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 header(&amp;quot;content-type: application/json&amp;quot;);&lt;br /&gt;
 $json = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
 $obj = json_decode($json);&lt;br /&gt;
 $decoded = base64_decode(json_encode($obj-&amp;gt;data));&lt;br /&gt;
 $fp = @fopen(&amp;quot;toto.txt&amp;quot;,&amp;quot;a&amp;quot;);&lt;br /&gt;
 fwrite($fp,$decoded);&lt;br /&gt;
 fwrite($fp,&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
 fclose($fp);&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il permet via le flux php://input de récupérer le contenu de la requête POST et de l'afficher.&lt;br /&gt;
&lt;br /&gt;
La prochaine étape concerne la gestion des informations avec notamment l'ajout en base selon le type d'information recu.&lt;br /&gt;
&lt;br /&gt;
====Gestion des trames====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les trames sont envoyés au format suivant:&lt;br /&gt;
 id:niveau1:niveau2:niveau3&lt;br /&gt;
&lt;br /&gt;
A travers le script php permettant la gestion des requetes HTTP Post, en se servant de la fonction preg_match avec le regex suivant on peut récuperer toutes les informations necessaires au traitement:&lt;br /&gt;
 &amp;quot;#^([0-9]+):([0-1]{1}):([0-1]{1}):([0-1]{1})$#&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Chaque nouvelle mesure envoyée sur le serveur d'application est renseignée en base grace à la requêtes SQL suivante:&lt;br /&gt;
 UPDATE balises&lt;br /&gt;
 SET inondee=:in, niveau=:niv&lt;br /&gt;
 WHERE id=:id;&lt;br /&gt;
&lt;br /&gt;
Les requêtes en php sont réalisées par le biais des fonctions query, prepare et execute.&lt;br /&gt;
&lt;br /&gt;
Toutes les requêtes SQL sont regroupés dans un même fichier par soucis de clarté.&lt;br /&gt;
&lt;br /&gt;
Dès qu'une nouvelle mesures est transmise au script php, on récupère la date actuelle et on la compare avec le dernier relevé de cette balise enregistré dans la table historique, si le dernier relevé date de la veille on ajoute une nouvelle entrée dans la table historique_balise:&lt;br /&gt;
 &lt;br /&gt;
 $ajrd=date(&amp;quot;Y-m-d&amp;quot;);&lt;br /&gt;
 $requete=$bdd-&amp;gt;prepare('SELECT MAX(date) AS max_date&lt;br /&gt;
                         FROM historique_balise&lt;br /&gt;
                         WHERE id_balise=:id');&lt;br /&gt;
 $requete-&amp;gt;execute(array('id' =&amp;gt; $id));&lt;br /&gt;
 $resultat=$requete-&amp;gt;fetch();&lt;br /&gt;
 if($ajrd&amp;gt;$resultat['max_date']  || $resultat==FALSE){&lt;br /&gt;
      $requete=$bdd-&amp;gt;prepare('INSERT INTO historique_balise&lt;br /&gt;
                              VALUES (DEFAULT,:id,:d,:niv,:in)');&lt;br /&gt;
      $requete-&amp;gt;execute(array('id'=&amp;gt;$id,'d'=&amp;gt;$ajrd, 'niv'=&amp;gt;$niveau, 'in'=&amp;gt;$inondee));&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Lors d'une première entrée, la condition $resultat==false permet d'ajouter pour la première fois la balise dans l'historique&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Historique des balises====&lt;br /&gt;
&lt;br /&gt;
L'utilisateur peut accéder à l'ensemble des relevés des balises. Les relevés pouvant être nombreux, l'utilisateur à différents filtres à sa disposition. En effet il peut filtrer les relevés par balises, par localisation, mais surtout par date.&lt;br /&gt;
Il peut renseigner soit une plage de date, soit une seule date pour avoir tous les relevés jusqu'a cette date ou tous les relevés à partir de cette date.&lt;br /&gt;
&lt;br /&gt;
====Affichage sur la carte====&lt;br /&gt;
&lt;br /&gt;
En passant par l'API google maps il est possible d'affichir une carte sur l'appplication web et d'apporter des modifications à cette dernière&lt;br /&gt;
&lt;br /&gt;
A l'aide de JavaScript, je peux afficher sur ma carte les balises ainsi que leur etat sur la carte. Pour se faire, avant que le code JS soit executé par le client, ce dernier est preparé par un code PHP permettant de parcourir la base et de recupérer les balises, leur état et leur coordonnées avant de les afficher avec un indice couleur selon leur niveau d'inondation:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 $reponse=$bdd-&amp;gt;query('SELECT COUNT(*) FROM balises');&lt;br /&gt;
 $nbMarqueur=$reponse-&amp;gt;fetch();&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 var nbMarqueur=&amp;lt;?php echo $nbMarqueur['count'];?&amp;gt;;&lt;br /&gt;
 var locations = new Array(nbMarqueur);&lt;br /&gt;
 var coordonnees, coord1, coord2;&lt;br /&gt;
 var heatMapData = new Array(nbMarqueur);&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
  $reponse=$bdd-&amp;gt;query('SELECT localisation, coordonnees, niveau FROM balises');&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 var infos =JSON.parse('&amp;lt;?php echo json_encode($reponse-&amp;gt;fetchAll(), true); ?&amp;gt;');&lt;br /&gt;
 console.log(nbMarqueur);&lt;br /&gt;
 for(var i=0; i&amp;lt;nbMarqueur; i++){&lt;br /&gt;
 locations[i]=new Array(4);&lt;br /&gt;
 locations[i][0]=infos[i]['localisation'];&lt;br /&gt;
 coordonnees=infos[i]['coordonnees'];&lt;br /&gt;
 var pos=coordonnees.indexOf(&amp;quot;,&amp;quot;);&lt;br /&gt;
 coord1=coordonnees.slice(0,pos-1);&lt;br /&gt;
 coord2=coordonnees.slice(pos+1);&lt;br /&gt;
 locations[i][1]=coord1;&lt;br /&gt;
 locations[i][2]=coord2,&lt;br /&gt;
 locations[i][3]=i;&lt;br /&gt;
 heatMapData[i]={location: new google.maps.LatLng(coord1, coord2), weight: infos[i]['niveau']};&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Gestion utilisateur====&lt;br /&gt;
&lt;br /&gt;
Premièrement, la gestion utilisateur ne doit être accessible qu'aux personnes en ayant les droits, il est donc nécessaire de mettre en place un système de login. Tout se joue avec la fonction session_start(), avant d'envoyer la page concernant le gestion des capteurs au client, on verifie d'abord si ce dernier est connecté, i-e si la variable $_SESSION['login'] existe, sinon on redirige ce dernier vers l'ecran de connexion.&lt;br /&gt;
&lt;br /&gt;
L'utilisateur entre login et mot de passe et on compare ces derniers a ce qui est stocké dans la base de données. Par mesure de sécurité des données de l'utilisateur et en cas de faille de la base, le mot de passe est stocké en hashé.&lt;br /&gt;
Une fois connecté l'utilisateur à trois actions possibles, il peut ajouter une balise, modifier une balise et enfin supprimer une balise. En cas d'erreur de saisie, cette dernière est notifiée à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note a moi même: travail a effectuer en priorité:&lt;br /&gt;
 &lt;br /&gt;
 gerer la partie historique des balises en base (quasi fini, gérer les heures pour ajouter de manière plus fréquentes) FAIT&lt;br /&gt;
 mettre en place un mode administrateur sur l'appli pour par exemple ajouter ou retirer des balises (a voir si utile avec les profs) FAIT&lt;br /&gt;
 gerer sur la carte l'affichage des balises et l'etat de la route FAIT&lt;br /&gt;
 mettre toutes les requetes SQL dans un même fichier (fait pour la recherche historique) FAIT&lt;br /&gt;
 mise en place d'une appli android&lt;br /&gt;
 concevoir le capteur&lt;br /&gt;
 gestion ajout nouveau capteur (voir message down) FAIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Connexion à l'application====&lt;br /&gt;
&lt;br /&gt;
Pour rendre l'application accessible depuis l'extérieur et sans passer par le proxy de l'école, j'ai réutilisé la marchine virtuelle deployé en PRA, a savoir trompettedelamortdans mon cas, avec comme ip public 193.48.57.188 &lt;br /&gt;
&lt;br /&gt;
Dans bind9, j'ai ajouté un nouvel enregistrement dans /etc/bind/db.trompettedelamort.site&lt;br /&gt;
 pfe     IN	CNAME	ns1&lt;br /&gt;
&lt;br /&gt;
En faisait cela, le nom pfe.trompettedelamort.site nous retourne bien l'adresse  vers le site.&lt;br /&gt;
&lt;br /&gt;
Ensuite, il reste juste a rediriger l'utilisateur vers le bon site lorsqu'il saisie pfe.trompettedelamort.site. Pour cela, la machine trompettedelamort fait office de reverse proxy, dans /etc/apache2/sites-availables ilfaut donc ajouter une nouvelle configuration:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
        ServerName pfe.trompettedelamort.site&lt;br /&gt;
        ProxyPreserveHost On&lt;br /&gt;
        ProxyPass / http://172.26.189.23:80/&lt;br /&gt;
        ProxyPassReverse / http://172.26.189.23:80/&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ainsi lorsqu'un utilisateur souhaite accéder à pfe.trompettedelamort.site, ce dernier est résolue en 193.48.57.188:80 qui lui même redirige vers 172.26.189.23:80 qui correspond bien à l'adresse privé de notre machine hebergeant notre site.&lt;br /&gt;
&lt;br /&gt;
Petit problème, le routeur de l'ecole bloque l'accés de trompettedelamort (193.48.57.188) vers la machine hebergeant notre site (172.26.189.23). La solution consiste donc à s'attribuer une adresse sur le vlan des ZABETH et d'ajouter une route statique vers le réseau de la machine hebergeant notre site:&lt;br /&gt;
&lt;br /&gt;
 up ip address add dev eth1 172.26.145.241/24&lt;br /&gt;
 up ip route add 172.26.188.0/22 via 172.26.145.254&lt;br /&gt;
 down ip address del dev eth1 172.26.145.241/24&lt;br /&gt;
 down ip route del 172.26.188.0/22 via 172.26.145.254&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mise à jour suite aux remarques===&lt;br /&gt;
&lt;br /&gt;
Premièrement, la structure des trams a été modifiée pour être réduite à son minimum, à savoir 4 octets. Désormais ces octets contiennent uniquement les valeurs des capteur, l'id est récupéré directement dans la requête POST:&lt;br /&gt;
 $json = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
 $obj = json_decode($json);&lt;br /&gt;
 $id = bin2hex(base64_decode(json_encode($obj-&amp;gt;devEUI)));&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Deuxièmement, les id de balises qui s'auto-incrementés en base ne fonctionnent plus comme ça. L'id de la balise étant directement récupéré dans la requête POST, celui-ci est donc devenu la clef primaire de la table balises.&lt;br /&gt;
&lt;br /&gt;
Troisièmement, la table historique balise a été modifié, elle stocke désormais les relevés avec la date mais aussi avec l'heure du relevé. Dans l'ancien système des mesures étaient envoyés par les balises de manière périodique, maintenant un deuxième mode est possible (et c'est celui retenu) qui permet d'envoyer une mesure uniquement quand un niveau change, le reste du temps le capteur est en mode low_power, permettant ainsi d'economiser grandement la batterie. Ainsi le nombre de relevés étant moindre, ceux-ci sont tous stockés en base.&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85451</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85451"/>
				<updated>2021-01-07T17:52:28Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Mise à jour suite aux remarques */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Début projet===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Mise en place du réseau===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se connecter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
 subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
 range 192.168.42.1 192.168.42.9&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La configuration du serveur réseau s'effectue en se connectant à ce dernier en ssh:&lt;br /&gt;
 root@192.168.42.10&lt;br /&gt;
Il faut installer le &amp;quot;gateway bridge&amp;quot;, le &amp;quot;network server&amp;quot; ainsi que &amp;quot;l'application server&amp;quot; disponible sur ChirpStack. Pour se faire nous avons suivi un tutoriel à l'adresse suivante:&lt;br /&gt;
 https://www.youtube.com/watch?v=FnTP7t47DlI&lt;br /&gt;
ainsi que la documentation fournie par ChirpStack&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pour accéder au serveur réseau, nous passons par l'interface web en se connectant à l'adresse suivante (en passant par une zabeth):&lt;br /&gt;
 172.26.189.22:8080 id: admin mdp: admin&lt;br /&gt;
&lt;br /&gt;
A partir de l'interface web, nous pouvons configurer de nombreux éléments:&lt;br /&gt;
&lt;br /&gt;
-Création d'un nouveau projet&lt;br /&gt;
&lt;br /&gt;
-Ajouter des équipements aux réseau à l'aide des clefs&lt;br /&gt;
&lt;br /&gt;
-Surveiller les informations qui circulent sur notre réseau&lt;br /&gt;
&lt;br /&gt;
-...&lt;br /&gt;
&lt;br /&gt;
Enfin, en nous connectant en ssh sur les deux gateways:&lt;br /&gt;
 antenne: 192.168.42.1 mdp:pdmk-062E7A&lt;br /&gt;
 passerelle intérieur: 192.168.42.2 mdp:pdmk-030970&lt;br /&gt;
Nous avons pu mettre à jour ces dernieres en suivant le wiki Kerlink&lt;br /&gt;
La connexion au wiki Kerlink s'effectue avec:&lt;br /&gt;
 Login : univlille&lt;br /&gt;
 Mot de passe : IYBlN7QF06&lt;br /&gt;
&lt;br /&gt;
===Test du réseau===&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de notre Network Server nous avons utilisé un module GPS LoRa du commerce. En se connectant a notre Network Server (172.26.189.22:8000) nous avons pu créer une nouvelle application et ajouté un nouvel équipement. Se faisant notre Network Server génère deux clefs, une &amp;quot;application key&amp;quot; et une &amp;quot;Network Key&amp;quot;. Ces deux clefs doivent être renseigné manuellement dans notre équipement. Pour se faire on peut le connecter à un ordinateur et y ajouter les clefs via son logiciel dédié. L'équipement possédant déjà un EUI permettant de reconnaître l'équipement, nous avons du renseigner ce dernier dans l'ajout de l'équipement sur le Network Server. Suite à ce test nous avons bien pu observer la circulation de nos trames et le bon fonctionnement de notre Network Server.&lt;br /&gt;
&lt;br /&gt;
===Fabrication du End-device===&lt;br /&gt;
&lt;br /&gt;
Pour le end-device je dispose d'une carte STM32F411RE, d'un shield SX1276MB1MAS et d'un capteur ultrason HC-SR04.&lt;br /&gt;
Le développement du programme se fait sur STM32Cube.&lt;br /&gt;
Un premier programme à été mis en place sans difficultés pour récupérer les valeurs du HC-SR04 en s'appuyant sur l'exemple proposé par Arduino.&lt;br /&gt;
En revanche les problèmes sont arrivés lors du développement concernant la partie LoRaWAN. En effet STM32 propose un package LoRaWAN pour faciliter le développement d'application, le problème étant que ce package concerne seulement les cartes STM32LXXX. J'ai essayé longuement d'adapter ce package pour ma carte STM32F411RE en modifiant notamment le Makefile, les .flash mais aussi les fichiers d'inclusion sans succès malheureusement. La solution envisagée est donc un changement de carte au profit d'une STM32LXXX.&lt;br /&gt;
&lt;br /&gt;
Après changé notre carte pour une STM32L152RE, j'ai repris le package proposé par STM32 et dans le fichier Commissioning.h j'ai rensigné les clefs &lt;br /&gt;
 LORAWAN_APP_KEY&lt;br /&gt;
 LORAWAN_NWK_KEY&lt;br /&gt;
&lt;br /&gt;
Il n'y a que ces deux à renseigner étant donné que notre équipement fonctionne sur une version inférieur à la 1.1. A noter que le champ device EUI semble ne pas fonctionner. Nous avons du récuper l'EUI sur une gateway et renseigner ce dernier dans l'équipement que j'ai crée pour mon application sur l'interface web.&lt;br /&gt;
&lt;br /&gt;
Concernant le programme de l'équipement en lui même le programme est relativement simle, en se servant de la bibliothèque HAL je declare 3 PIN en input et je renvoie ainsi l'état des capteurs de manière périodique en me servant de la fonction &amp;quot;Send&amp;quot; du package STM32.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie application WEB===&lt;br /&gt;
&lt;br /&gt;
La principale difficulté de cette partie et l'absence totale de connaissances dans le développement d'application WEB. J'ai donc dû apprendre les langage HTML / CSS / PHP (quelques notions en JS) pour réaliser cette partie. Je disposais de quelques notions en base de données et SQL suit à mon année d'IMA3.&lt;br /&gt;
&lt;br /&gt;
Le but de l'application WEB est de permettre de rendre exploitable pour l'utilisateurs les informations renvoyés par les balises. Pour se faire l'application doit contenir une page de monitoring permettant de surveiller l'état de toutes les balises. De plus elle doit contenir une partie historique permettant d'accéder à l'historique d'une balise en particulier (en effectuant une recherche par id/localisation/date). Enfin elle doit aussi proposer une partie permettant d'afficher une carte avec dessus les balises et leur état.&lt;br /&gt;
&lt;br /&gt;
A l'aide de Bootstrap j'ai mis en place une application WEB avec ces trois partie. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie serveur d'application===&lt;br /&gt;
&lt;br /&gt;
====Mise en place de l'environnement====&lt;br /&gt;
&lt;br /&gt;
Concernant la partie serveur, j'ai mis en place sur une VM (172.26.189.23) un serveur apache et Postgres pour la gestion des bases mais aussi un interpreteur php.&lt;br /&gt;
Pour apache j'ai simplement mis tous mes fichiers html/php dans /var/www/html qui est le repertoir par defaut. Celui est configuré pour démarrer au lancement de la VM.&lt;br /&gt;
Concernant Postgres j'ai d'abord crée un nouvel utilisateur en me servant de l'utilisateur crée par defaut (su - postgres):&lt;br /&gt;
 createuser -d -P root (mdp: glopglop)&lt;br /&gt;
&lt;br /&gt;
Puis j'ai créé une nouvelle base:&lt;br /&gt;
 createdb -O root pfe&lt;br /&gt;
&lt;br /&gt;
Pour se connecter a la base:&lt;br /&gt;
 psql pfe (depuis l'utilsateur root ou postgres)&lt;br /&gt;
&lt;br /&gt;
Enfin j'y ai ajouté mes tables:&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE balises (ID serial PRIMARY KEY, Pays varchar(50) NOT NULL, Ville varchar(50) NOT NULL, Localisation varchar(50) NOT NULL, Coordonnees varchar(50) NOT NULL,Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE historique_balise (ID serial PRIMARY KEY, id_balise int NOT NULL, Date date NOT NULL, Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
La base contient deux tables, une première ayant pour clef primaire l'id de la balise et contenant des informations diverses sur cette dernière telles que le pays, la ville, la localisation, les coordonnée, le niveau d'eau mais surtout si cette dernière est sous l'eau ou non. La seconde table concerne l'historique des balises, elle a pour clef primaire l'indice du relevé et contient des informations comme le numéro de balise, la date du relevé etc, l'état de la balise etc..&lt;br /&gt;
&lt;br /&gt;
Pour la communication entre le serveur d'application et le serveur réseau, j'ai dans un premier temps mis en place un script python pour récuperer les relevés des capteurs via l'API REST:&lt;br /&gt;
 import requests&lt;br /&gt;
 import json&lt;br /&gt;
 #on recupere le token&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Content-Type': 'application/json',&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
 }&lt;br /&gt;
 data = '{&amp;quot;email&amp;quot;: &amp;quot;admin&amp;quot;,&amp;quot;password&amp;quot;: &amp;quot;admin&amp;quot; }'&lt;br /&gt;
 response = requests.post('http://172.26.189.22:8080/api/internal/login', headers=headers, data=data)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 #print(resp['jwt'])&lt;br /&gt;
 #diverses information sur un capteur&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
    'Grpc-Metadata-Authorization': 'Bearer'+resp['jwt'],&lt;br /&gt;
 }&lt;br /&gt;
 response = requests.get('http://172.26.189.22:8080/api/devices/0b00f4ff703a8fc5', headers=headers)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 print(resp)&lt;br /&gt;
&lt;br /&gt;
Ce script permet de un premier temps de récuperer le token pour avoir accés à l'API. Celui ci est a renseigner dans toute les requetes http. &lt;br /&gt;
En se connectant à l'API via l'interface graphique (172.26.189.22:8080/api), on peut récuperer toutes les requetes possible en cURL, j'ai donc simplement utilisé un convertisseur cURL vers python pour mettre mes requetes en place.&lt;br /&gt;
&lt;br /&gt;
Malheureusement cette solution permet de récuperer de nombreuses informations concernant l'application mais pas les relevés des capteurs. Pour récupérer ces derniers, je suis passé par l'interface graphique du serveur d'application (172.26.189.22:8080) afin d'ajouter une intégration HTTP. Il faut simplement spécifier le format de l'information (JSON dans mon cas) et l'URL à laquelle doit être envoyé la requête http POST. Dans mon cas cela sera:&lt;br /&gt;
 http://172.26.189.23/pfe/gestionPOST.php&lt;br /&gt;
&lt;br /&gt;
La base du fichier gestionPOST.php ressemble à cela: &lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 header(&amp;quot;content-type: application/json&amp;quot;);&lt;br /&gt;
 $json = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
 $obj = json_decode($json);&lt;br /&gt;
 $decoded = base64_decode(json_encode($obj-&amp;gt;data));&lt;br /&gt;
 $fp = @fopen(&amp;quot;toto.txt&amp;quot;,&amp;quot;a&amp;quot;);&lt;br /&gt;
 fwrite($fp,$decoded);&lt;br /&gt;
 fwrite($fp,&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
 fclose($fp);&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il permet via le flux php://input de récupérer le contenu de la requête POST et de l'afficher.&lt;br /&gt;
&lt;br /&gt;
La prochaine étape concerne la gestion des informations avec notamment l'ajout en base selon le type d'information recu.&lt;br /&gt;
&lt;br /&gt;
====Gestion des trames====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les trames sont envoyés au format suivant:&lt;br /&gt;
 id:niveau1:niveau2:niveau3&lt;br /&gt;
&lt;br /&gt;
A travers le script php permettant la gestion des requetes HTTP Post, en se servant de la fonction preg_match avec le regex suivant on peut récuperer toutes les informations necessaires au traitement:&lt;br /&gt;
 &amp;quot;#^([0-9]+):([0-1]{1}):([0-1]{1}):([0-1]{1})$#&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Chaque nouvelle mesure envoyée sur le serveur d'application est renseignée en base grace à la requêtes SQL suivante:&lt;br /&gt;
 UPDATE balises&lt;br /&gt;
 SET inondee=:in, niveau=:niv&lt;br /&gt;
 WHERE id=:id;&lt;br /&gt;
&lt;br /&gt;
Les requêtes en php sont réalisées par le biais des fonctions query, prepare et execute.&lt;br /&gt;
&lt;br /&gt;
Toutes les requêtes SQL sont regroupés dans un même fichier par soucis de clarté.&lt;br /&gt;
&lt;br /&gt;
Dès qu'une nouvelle mesures est transmise au script php, on récupère la date actuelle et on la compare avec le dernier relevé de cette balise enregistré dans la table historique, si le dernier relevé date de la veille on ajoute une nouvelle entrée dans la table historique_balise:&lt;br /&gt;
 &lt;br /&gt;
 $ajrd=date(&amp;quot;Y-m-d&amp;quot;);&lt;br /&gt;
 $requete=$bdd-&amp;gt;prepare('SELECT MAX(date) AS max_date&lt;br /&gt;
                         FROM historique_balise&lt;br /&gt;
                         WHERE id_balise=:id');&lt;br /&gt;
 $requete-&amp;gt;execute(array('id' =&amp;gt; $id));&lt;br /&gt;
 $resultat=$requete-&amp;gt;fetch();&lt;br /&gt;
 if($ajrd&amp;gt;$resultat['max_date']  || $resultat==FALSE){&lt;br /&gt;
      $requete=$bdd-&amp;gt;prepare('INSERT INTO historique_balise&lt;br /&gt;
                              VALUES (DEFAULT,:id,:d,:niv,:in)');&lt;br /&gt;
      $requete-&amp;gt;execute(array('id'=&amp;gt;$id,'d'=&amp;gt;$ajrd, 'niv'=&amp;gt;$niveau, 'in'=&amp;gt;$inondee));&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Lors d'une première entrée, la condition $resultat==false permet d'ajouter pour la première fois la balise dans l'historique&lt;br /&gt;
&lt;br /&gt;
====Affichage sur la carte====&lt;br /&gt;
&lt;br /&gt;
En passant par l'API google maps il est possible d'affichir une carte sur l'appplication web et d'apporter des modifications à cette dernière&lt;br /&gt;
&lt;br /&gt;
A l'aide de JavaScript, je peux afficher sur ma carte les balises ainsi que leur etat sur la carte. Pour se faire, avant que le code JS soit executé par le client, ce dernier est preparé par un code PHP permettant de parcourir la base et de recupérer les balises, leur état et leur coordonnées avant de les afficher avec un indice couleur selon leur niveau d'inondation:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 $reponse=$bdd-&amp;gt;query('SELECT COUNT(*) FROM balises');&lt;br /&gt;
 $nbMarqueur=$reponse-&amp;gt;fetch();&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 var nbMarqueur=&amp;lt;?php echo $nbMarqueur['count'];?&amp;gt;;&lt;br /&gt;
 var locations = new Array(nbMarqueur);&lt;br /&gt;
 var coordonnees, coord1, coord2;&lt;br /&gt;
 var heatMapData = new Array(nbMarqueur);&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
  $reponse=$bdd-&amp;gt;query('SELECT localisation, coordonnees, niveau FROM balises');&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 var infos =JSON.parse('&amp;lt;?php echo json_encode($reponse-&amp;gt;fetchAll(), true); ?&amp;gt;');&lt;br /&gt;
 console.log(nbMarqueur);&lt;br /&gt;
 for(var i=0; i&amp;lt;nbMarqueur; i++){&lt;br /&gt;
 locations[i]=new Array(4);&lt;br /&gt;
 locations[i][0]=infos[i]['localisation'];&lt;br /&gt;
 coordonnees=infos[i]['coordonnees'];&lt;br /&gt;
 var pos=coordonnees.indexOf(&amp;quot;,&amp;quot;);&lt;br /&gt;
 coord1=coordonnees.slice(0,pos-1);&lt;br /&gt;
 coord2=coordonnees.slice(pos+1);&lt;br /&gt;
 locations[i][1]=coord1;&lt;br /&gt;
 locations[i][2]=coord2,&lt;br /&gt;
 locations[i][3]=i;&lt;br /&gt;
 heatMapData[i]={location: new google.maps.LatLng(coord1, coord2), weight: infos[i]['niveau']};&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Gestion utilisateur====&lt;br /&gt;
&lt;br /&gt;
Premièrement, la gestion utilisateur ne doit être accessible qu'aux personnes en ayant les droits, il est donc nécessaire de mettre en place un système de login. Tout se joue avec la fonction session_start(), avant d'envoyer la page concernant le gestion des capteurs au client, on verifie d'abord si ce dernier est connecté, i-e si la variable $_SESSION['login'] existe, sinon on redirige ce dernier vers l'ecran de connexion.&lt;br /&gt;
&lt;br /&gt;
L'utilisateur entre login et mot de passe et on compare ces derniers a ce qui est stocké dans la base de données. Par mesure de sécurité des données de l'utilisateur et en cas de faille de la base, le mot de passe est stocké en hashé.&lt;br /&gt;
Une fois connecté l'utilisateur à trois actions possibles, il peut ajouter une balise, modifier une balise et enfin supprimer une balise. En cas d'erreur de saisie, cette dernière est notifiée à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note a moi même: travail a effectuer en priorité:&lt;br /&gt;
 &lt;br /&gt;
 gerer la partie historique des balises en base (quasi fini, gérer les heures pour ajouter de manière plus fréquentes) FAIT&lt;br /&gt;
 mettre en place un mode administrateur sur l'appli pour par exemple ajouter ou retirer des balises (a voir si utile avec les profs) FAIT&lt;br /&gt;
 gerer sur la carte l'affichage des balises et l'etat de la route FAIT&lt;br /&gt;
 mettre toutes les requetes SQL dans un même fichier (fait pour la recherche historique) FAIT&lt;br /&gt;
 mise en place d'une appli android&lt;br /&gt;
 concevoir le capteur&lt;br /&gt;
 gestion ajout nouveau capteur (voir message down) FAIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Connexion à l'application====&lt;br /&gt;
&lt;br /&gt;
Pour rendre l'application accessible depuis l'extérieur et sans passer par le proxy de l'école, j'ai réutilisé la marchine virtuelle deployé en PRA, a savoir trompettedelamortdans mon cas, avec comme ip public 193.48.57.188 &lt;br /&gt;
&lt;br /&gt;
Dans bind9, j'ai ajouté un nouvel enregistrement dans /etc/bind/db.trompettedelamort.site&lt;br /&gt;
 pfe     IN	CNAME	ns1&lt;br /&gt;
&lt;br /&gt;
En faisait cela, le nom pfe.trompettedelamort.site nous retourne bien l'adresse  vers le site.&lt;br /&gt;
&lt;br /&gt;
Ensuite, il reste juste a rediriger l'utilisateur vers le bon site lorsqu'il saisie pfe.trompettedelamort.site. Pour cela, la machine trompettedelamort fait office de reverse proxy, dans /etc/apache2/sites-availables ilfaut donc ajouter une nouvelle configuration:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
        ServerName pfe.trompettedelamort.site&lt;br /&gt;
        ProxyPreserveHost On&lt;br /&gt;
        ProxyPass / http://172.26.189.23:80/&lt;br /&gt;
        ProxyPassReverse / http://172.26.189.23:80/&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ainsi lorsqu'un utilisateur souhaite accéder à pfe.trompettedelamort.site, ce dernier est résolue en 193.48.57.188:80 qui lui même redirige vers 172.26.189.23:80 qui correspond bien à l'adresse privé de notre machine hebergeant notre site.&lt;br /&gt;
&lt;br /&gt;
Petit problème, le routeur de l'ecole bloque l'accés de trompettedelamort (193.48.57.188) vers la machine hebergeant notre site (172.26.189.23). La solution consiste donc à s'attribuer une adresse sur le vlan des ZABETH et d'ajouter une route statique vers le réseau de la machine hebergeant notre site:&lt;br /&gt;
&lt;br /&gt;
 up ip address add dev eth1 172.26.145.241/24&lt;br /&gt;
 up ip route add 172.26.188.0/22 via 172.26.145.254&lt;br /&gt;
 down ip address del dev eth1 172.26.145.241/24&lt;br /&gt;
 down ip route del 172.26.188.0/22 via 172.26.145.254&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mise à jour suite aux remarques===&lt;br /&gt;
&lt;br /&gt;
Premièrement, la structure des trams a été modifiée pour être réduite à son minimum, à savoir 4 octets. Désormais ces octets contiennent uniquement les valeurs des capteur, l'id est récupéré directement dans la requête POST:&lt;br /&gt;
 $json = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
 $obj = json_decode($json);&lt;br /&gt;
 $id = bin2hex(base64_decode(json_encode($obj-&amp;gt;devEUI)));&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Deuxièmement, les id de balises qui s'auto-incrementés en base ne fonctionnent plus comme ça. L'id de la balise étant directement récupéré dans la requête POST, celui-ci est donc devenu la clef primaire de la table balises.&lt;br /&gt;
&lt;br /&gt;
Troisièmement, la table historique balise a été modifié, elle stocke désormais les relevés avec la date mais aussi avec l'heure du relevé. Dans l'ancien système des mesures étaient envoyés par les balises de manière périodique, maintenant un deuxième mode est possible (et c'est celui retenu) qui permet d'envoyer une mesure uniquement quand un niveau change, le reste du temps le capteur est en mode low_power, permettant ainsi d'economiser grandement la batterie. Ainsi le nombre de relevés étant moindre, ceux-ci sont tous stockés en base.&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85450</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85450"/>
				<updated>2021-01-07T17:38:09Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Partie serveur d'application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Début projet===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Mise en place du réseau===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se connecter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
 subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
 range 192.168.42.1 192.168.42.9&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La configuration du serveur réseau s'effectue en se connectant à ce dernier en ssh:&lt;br /&gt;
 root@192.168.42.10&lt;br /&gt;
Il faut installer le &amp;quot;gateway bridge&amp;quot;, le &amp;quot;network server&amp;quot; ainsi que &amp;quot;l'application server&amp;quot; disponible sur ChirpStack. Pour se faire nous avons suivi un tutoriel à l'adresse suivante:&lt;br /&gt;
 https://www.youtube.com/watch?v=FnTP7t47DlI&lt;br /&gt;
ainsi que la documentation fournie par ChirpStack&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pour accéder au serveur réseau, nous passons par l'interface web en se connectant à l'adresse suivante (en passant par une zabeth):&lt;br /&gt;
 172.26.189.22:8080 id: admin mdp: admin&lt;br /&gt;
&lt;br /&gt;
A partir de l'interface web, nous pouvons configurer de nombreux éléments:&lt;br /&gt;
&lt;br /&gt;
-Création d'un nouveau projet&lt;br /&gt;
&lt;br /&gt;
-Ajouter des équipements aux réseau à l'aide des clefs&lt;br /&gt;
&lt;br /&gt;
-Surveiller les informations qui circulent sur notre réseau&lt;br /&gt;
&lt;br /&gt;
-...&lt;br /&gt;
&lt;br /&gt;
Enfin, en nous connectant en ssh sur les deux gateways:&lt;br /&gt;
 antenne: 192.168.42.1 mdp:pdmk-062E7A&lt;br /&gt;
 passerelle intérieur: 192.168.42.2 mdp:pdmk-030970&lt;br /&gt;
Nous avons pu mettre à jour ces dernieres en suivant le wiki Kerlink&lt;br /&gt;
La connexion au wiki Kerlink s'effectue avec:&lt;br /&gt;
 Login : univlille&lt;br /&gt;
 Mot de passe : IYBlN7QF06&lt;br /&gt;
&lt;br /&gt;
===Test du réseau===&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de notre Network Server nous avons utilisé un module GPS LoRa du commerce. En se connectant a notre Network Server (172.26.189.22:8000) nous avons pu créer une nouvelle application et ajouté un nouvel équipement. Se faisant notre Network Server génère deux clefs, une &amp;quot;application key&amp;quot; et une &amp;quot;Network Key&amp;quot;. Ces deux clefs doivent être renseigné manuellement dans notre équipement. Pour se faire on peut le connecter à un ordinateur et y ajouter les clefs via son logiciel dédié. L'équipement possédant déjà un EUI permettant de reconnaître l'équipement, nous avons du renseigner ce dernier dans l'ajout de l'équipement sur le Network Server. Suite à ce test nous avons bien pu observer la circulation de nos trames et le bon fonctionnement de notre Network Server.&lt;br /&gt;
&lt;br /&gt;
===Fabrication du End-device===&lt;br /&gt;
&lt;br /&gt;
Pour le end-device je dispose d'une carte STM32F411RE, d'un shield SX1276MB1MAS et d'un capteur ultrason HC-SR04.&lt;br /&gt;
Le développement du programme se fait sur STM32Cube.&lt;br /&gt;
Un premier programme à été mis en place sans difficultés pour récupérer les valeurs du HC-SR04 en s'appuyant sur l'exemple proposé par Arduino.&lt;br /&gt;
En revanche les problèmes sont arrivés lors du développement concernant la partie LoRaWAN. En effet STM32 propose un package LoRaWAN pour faciliter le développement d'application, le problème étant que ce package concerne seulement les cartes STM32LXXX. J'ai essayé longuement d'adapter ce package pour ma carte STM32F411RE en modifiant notamment le Makefile, les .flash mais aussi les fichiers d'inclusion sans succès malheureusement. La solution envisagée est donc un changement de carte au profit d'une STM32LXXX.&lt;br /&gt;
&lt;br /&gt;
Après changé notre carte pour une STM32L152RE, j'ai repris le package proposé par STM32 et dans le fichier Commissioning.h j'ai rensigné les clefs &lt;br /&gt;
 LORAWAN_APP_KEY&lt;br /&gt;
 LORAWAN_NWK_KEY&lt;br /&gt;
&lt;br /&gt;
Il n'y a que ces deux à renseigner étant donné que notre équipement fonctionne sur une version inférieur à la 1.1. A noter que le champ device EUI semble ne pas fonctionner. Nous avons du récuper l'EUI sur une gateway et renseigner ce dernier dans l'équipement que j'ai crée pour mon application sur l'interface web.&lt;br /&gt;
&lt;br /&gt;
Concernant le programme de l'équipement en lui même le programme est relativement simle, en se servant de la bibliothèque HAL je declare 3 PIN en input et je renvoie ainsi l'état des capteurs de manière périodique en me servant de la fonction &amp;quot;Send&amp;quot; du package STM32.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie application WEB===&lt;br /&gt;
&lt;br /&gt;
La principale difficulté de cette partie et l'absence totale de connaissances dans le développement d'application WEB. J'ai donc dû apprendre les langage HTML / CSS / PHP (quelques notions en JS) pour réaliser cette partie. Je disposais de quelques notions en base de données et SQL suit à mon année d'IMA3.&lt;br /&gt;
&lt;br /&gt;
Le but de l'application WEB est de permettre de rendre exploitable pour l'utilisateurs les informations renvoyés par les balises. Pour se faire l'application doit contenir une page de monitoring permettant de surveiller l'état de toutes les balises. De plus elle doit contenir une partie historique permettant d'accéder à l'historique d'une balise en particulier (en effectuant une recherche par id/localisation/date). Enfin elle doit aussi proposer une partie permettant d'afficher une carte avec dessus les balises et leur état.&lt;br /&gt;
&lt;br /&gt;
A l'aide de Bootstrap j'ai mis en place une application WEB avec ces trois partie. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie serveur d'application===&lt;br /&gt;
&lt;br /&gt;
====Mise en place de l'environnement====&lt;br /&gt;
&lt;br /&gt;
Concernant la partie serveur, j'ai mis en place sur une VM (172.26.189.23) un serveur apache et Postgres pour la gestion des bases mais aussi un interpreteur php.&lt;br /&gt;
Pour apache j'ai simplement mis tous mes fichiers html/php dans /var/www/html qui est le repertoir par defaut. Celui est configuré pour démarrer au lancement de la VM.&lt;br /&gt;
Concernant Postgres j'ai d'abord crée un nouvel utilisateur en me servant de l'utilisateur crée par defaut (su - postgres):&lt;br /&gt;
 createuser -d -P root (mdp: glopglop)&lt;br /&gt;
&lt;br /&gt;
Puis j'ai créé une nouvelle base:&lt;br /&gt;
 createdb -O root pfe&lt;br /&gt;
&lt;br /&gt;
Pour se connecter a la base:&lt;br /&gt;
 psql pfe (depuis l'utilsateur root ou postgres)&lt;br /&gt;
&lt;br /&gt;
Enfin j'y ai ajouté mes tables:&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE balises (ID serial PRIMARY KEY, Pays varchar(50) NOT NULL, Ville varchar(50) NOT NULL, Localisation varchar(50) NOT NULL, Coordonnees varchar(50) NOT NULL,Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE historique_balise (ID serial PRIMARY KEY, id_balise int NOT NULL, Date date NOT NULL, Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
La base contient deux tables, une première ayant pour clef primaire l'id de la balise et contenant des informations diverses sur cette dernière telles que le pays, la ville, la localisation, les coordonnée, le niveau d'eau mais surtout si cette dernière est sous l'eau ou non. La seconde table concerne l'historique des balises, elle a pour clef primaire l'indice du relevé et contient des informations comme le numéro de balise, la date du relevé etc, l'état de la balise etc..&lt;br /&gt;
&lt;br /&gt;
Pour la communication entre le serveur d'application et le serveur réseau, j'ai dans un premier temps mis en place un script python pour récuperer les relevés des capteurs via l'API REST:&lt;br /&gt;
 import requests&lt;br /&gt;
 import json&lt;br /&gt;
 #on recupere le token&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Content-Type': 'application/json',&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
 }&lt;br /&gt;
 data = '{&amp;quot;email&amp;quot;: &amp;quot;admin&amp;quot;,&amp;quot;password&amp;quot;: &amp;quot;admin&amp;quot; }'&lt;br /&gt;
 response = requests.post('http://172.26.189.22:8080/api/internal/login', headers=headers, data=data)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 #print(resp['jwt'])&lt;br /&gt;
 #diverses information sur un capteur&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
    'Grpc-Metadata-Authorization': 'Bearer'+resp['jwt'],&lt;br /&gt;
 }&lt;br /&gt;
 response = requests.get('http://172.26.189.22:8080/api/devices/0b00f4ff703a8fc5', headers=headers)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 print(resp)&lt;br /&gt;
&lt;br /&gt;
Ce script permet de un premier temps de récuperer le token pour avoir accés à l'API. Celui ci est a renseigner dans toute les requetes http. &lt;br /&gt;
En se connectant à l'API via l'interface graphique (172.26.189.22:8080/api), on peut récuperer toutes les requetes possible en cURL, j'ai donc simplement utilisé un convertisseur cURL vers python pour mettre mes requetes en place.&lt;br /&gt;
&lt;br /&gt;
Malheureusement cette solution permet de récuperer de nombreuses informations concernant l'application mais pas les relevés des capteurs. Pour récupérer ces derniers, je suis passé par l'interface graphique du serveur d'application (172.26.189.22:8080) afin d'ajouter une intégration HTTP. Il faut simplement spécifier le format de l'information (JSON dans mon cas) et l'URL à laquelle doit être envoyé la requête http POST. Dans mon cas cela sera:&lt;br /&gt;
 http://172.26.189.23/pfe/gestionPOST.php&lt;br /&gt;
&lt;br /&gt;
La base du fichier gestionPOST.php ressemble à cela: &lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 header(&amp;quot;content-type: application/json&amp;quot;);&lt;br /&gt;
 $json = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
 $obj = json_decode($json);&lt;br /&gt;
 $decoded = base64_decode(json_encode($obj-&amp;gt;data));&lt;br /&gt;
 $fp = @fopen(&amp;quot;toto.txt&amp;quot;,&amp;quot;a&amp;quot;);&lt;br /&gt;
 fwrite($fp,$decoded);&lt;br /&gt;
 fwrite($fp,&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
 fclose($fp);&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il permet via le flux php://input de récupérer le contenu de la requête POST et de l'afficher.&lt;br /&gt;
&lt;br /&gt;
La prochaine étape concerne la gestion des informations avec notamment l'ajout en base selon le type d'information recu.&lt;br /&gt;
&lt;br /&gt;
====Gestion des trames====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les trames sont envoyés au format suivant:&lt;br /&gt;
 id:niveau1:niveau2:niveau3&lt;br /&gt;
&lt;br /&gt;
A travers le script php permettant la gestion des requetes HTTP Post, en se servant de la fonction preg_match avec le regex suivant on peut récuperer toutes les informations necessaires au traitement:&lt;br /&gt;
 &amp;quot;#^([0-9]+):([0-1]{1}):([0-1]{1}):([0-1]{1})$#&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Chaque nouvelle mesure envoyée sur le serveur d'application est renseignée en base grace à la requêtes SQL suivante:&lt;br /&gt;
 UPDATE balises&lt;br /&gt;
 SET inondee=:in, niveau=:niv&lt;br /&gt;
 WHERE id=:id;&lt;br /&gt;
&lt;br /&gt;
Les requêtes en php sont réalisées par le biais des fonctions query, prepare et execute.&lt;br /&gt;
&lt;br /&gt;
Toutes les requêtes SQL sont regroupés dans un même fichier par soucis de clarté.&lt;br /&gt;
&lt;br /&gt;
Dès qu'une nouvelle mesures est transmise au script php, on récupère la date actuelle et on la compare avec le dernier relevé de cette balise enregistré dans la table historique, si le dernier relevé date de la veille on ajoute une nouvelle entrée dans la table historique_balise:&lt;br /&gt;
 &lt;br /&gt;
 $ajrd=date(&amp;quot;Y-m-d&amp;quot;);&lt;br /&gt;
 $requete=$bdd-&amp;gt;prepare('SELECT MAX(date) AS max_date&lt;br /&gt;
                         FROM historique_balise&lt;br /&gt;
                         WHERE id_balise=:id');&lt;br /&gt;
 $requete-&amp;gt;execute(array('id' =&amp;gt; $id));&lt;br /&gt;
 $resultat=$requete-&amp;gt;fetch();&lt;br /&gt;
 if($ajrd&amp;gt;$resultat['max_date']  || $resultat==FALSE){&lt;br /&gt;
      $requete=$bdd-&amp;gt;prepare('INSERT INTO historique_balise&lt;br /&gt;
                              VALUES (DEFAULT,:id,:d,:niv,:in)');&lt;br /&gt;
      $requete-&amp;gt;execute(array('id'=&amp;gt;$id,'d'=&amp;gt;$ajrd, 'niv'=&amp;gt;$niveau, 'in'=&amp;gt;$inondee));&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Lors d'une première entrée, la condition $resultat==false permet d'ajouter pour la première fois la balise dans l'historique&lt;br /&gt;
&lt;br /&gt;
====Affichage sur la carte====&lt;br /&gt;
&lt;br /&gt;
En passant par l'API google maps il est possible d'affichir une carte sur l'appplication web et d'apporter des modifications à cette dernière&lt;br /&gt;
&lt;br /&gt;
A l'aide de JavaScript, je peux afficher sur ma carte les balises ainsi que leur etat sur la carte. Pour se faire, avant que le code JS soit executé par le client, ce dernier est preparé par un code PHP permettant de parcourir la base et de recupérer les balises, leur état et leur coordonnées avant de les afficher avec un indice couleur selon leur niveau d'inondation:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 $reponse=$bdd-&amp;gt;query('SELECT COUNT(*) FROM balises');&lt;br /&gt;
 $nbMarqueur=$reponse-&amp;gt;fetch();&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 var nbMarqueur=&amp;lt;?php echo $nbMarqueur['count'];?&amp;gt;;&lt;br /&gt;
 var locations = new Array(nbMarqueur);&lt;br /&gt;
 var coordonnees, coord1, coord2;&lt;br /&gt;
 var heatMapData = new Array(nbMarqueur);&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
  $reponse=$bdd-&amp;gt;query('SELECT localisation, coordonnees, niveau FROM balises');&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 var infos =JSON.parse('&amp;lt;?php echo json_encode($reponse-&amp;gt;fetchAll(), true); ?&amp;gt;');&lt;br /&gt;
 console.log(nbMarqueur);&lt;br /&gt;
 for(var i=0; i&amp;lt;nbMarqueur; i++){&lt;br /&gt;
 locations[i]=new Array(4);&lt;br /&gt;
 locations[i][0]=infos[i]['localisation'];&lt;br /&gt;
 coordonnees=infos[i]['coordonnees'];&lt;br /&gt;
 var pos=coordonnees.indexOf(&amp;quot;,&amp;quot;);&lt;br /&gt;
 coord1=coordonnees.slice(0,pos-1);&lt;br /&gt;
 coord2=coordonnees.slice(pos+1);&lt;br /&gt;
 locations[i][1]=coord1;&lt;br /&gt;
 locations[i][2]=coord2,&lt;br /&gt;
 locations[i][3]=i;&lt;br /&gt;
 heatMapData[i]={location: new google.maps.LatLng(coord1, coord2), weight: infos[i]['niveau']};&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Gestion utilisateur====&lt;br /&gt;
&lt;br /&gt;
Premièrement, la gestion utilisateur ne doit être accessible qu'aux personnes en ayant les droits, il est donc nécessaire de mettre en place un système de login. Tout se joue avec la fonction session_start(), avant d'envoyer la page concernant le gestion des capteurs au client, on verifie d'abord si ce dernier est connecté, i-e si la variable $_SESSION['login'] existe, sinon on redirige ce dernier vers l'ecran de connexion.&lt;br /&gt;
&lt;br /&gt;
L'utilisateur entre login et mot de passe et on compare ces derniers a ce qui est stocké dans la base de données. Par mesure de sécurité des données de l'utilisateur et en cas de faille de la base, le mot de passe est stocké en hashé.&lt;br /&gt;
Une fois connecté l'utilisateur à trois actions possibles, il peut ajouter une balise, modifier une balise et enfin supprimer une balise. En cas d'erreur de saisie, cette dernière est notifiée à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note a moi même: travail a effectuer en priorité:&lt;br /&gt;
 &lt;br /&gt;
 gerer la partie historique des balises en base (quasi fini, gérer les heures pour ajouter de manière plus fréquentes) FAIT&lt;br /&gt;
 mettre en place un mode administrateur sur l'appli pour par exemple ajouter ou retirer des balises (a voir si utile avec les profs) FAIT&lt;br /&gt;
 gerer sur la carte l'affichage des balises et l'etat de la route FAIT&lt;br /&gt;
 mettre toutes les requetes SQL dans un même fichier (fait pour la recherche historique) FAIT&lt;br /&gt;
 mise en place d'une appli android&lt;br /&gt;
 concevoir le capteur&lt;br /&gt;
 gestion ajout nouveau capteur (voir message down) FAIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Connexion à l'application====&lt;br /&gt;
&lt;br /&gt;
Pour rendre l'application accessible depuis l'extérieur et sans passer par le proxy de l'école, j'ai réutilisé la marchine virtuelle deployé en PRA, a savoir trompettedelamortdans mon cas, avec comme ip public 193.48.57.188 &lt;br /&gt;
&lt;br /&gt;
Dans bind9, j'ai ajouté un nouvel enregistrement dans /etc/bind/db.trompettedelamort.site&lt;br /&gt;
 pfe     IN	CNAME	ns1&lt;br /&gt;
&lt;br /&gt;
En faisait cela, le nom pfe.trompettedelamort.site nous retourne bien l'adresse  vers le site.&lt;br /&gt;
&lt;br /&gt;
Ensuite, il reste juste a rediriger l'utilisateur vers le bon site lorsqu'il saisie pfe.trompettedelamort.site. Pour cela, la machine trompettedelamort fait office de reverse proxy, dans /etc/apache2/sites-availables ilfaut donc ajouter une nouvelle configuration:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
        ServerName pfe.trompettedelamort.site&lt;br /&gt;
        ProxyPreserveHost On&lt;br /&gt;
        ProxyPass / http://172.26.189.23:80/&lt;br /&gt;
        ProxyPassReverse / http://172.26.189.23:80/&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ainsi lorsqu'un utilisateur souhaite accéder à pfe.trompettedelamort.site, ce dernier est résolue en 193.48.57.188:80 qui lui même redirige vers 172.26.189.23:80 qui correspond bien à l'adresse privé de notre machine hebergeant notre site.&lt;br /&gt;
&lt;br /&gt;
Petit problème, le routeur de l'ecole bloque l'accés de trompettedelamort (193.48.57.188) vers la machine hebergeant notre site (172.26.189.23). La solution consiste donc à s'attribuer une adresse sur le vlan des ZABETH et d'ajouter une route statique vers le réseau de la machine hebergeant notre site:&lt;br /&gt;
&lt;br /&gt;
 up ip address add dev eth1 172.26.145.241/24&lt;br /&gt;
 up ip route add 172.26.188.0/22 via 172.26.145.254&lt;br /&gt;
 down ip address del dev eth1 172.26.145.241/24&lt;br /&gt;
 down ip route del 172.26.188.0/22 via 172.26.145.254&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mise à jour suite aux remarques===&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85449</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85449"/>
				<updated>2021-01-07T17:34:33Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Partie serveur d'application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Début projet===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Mise en place du réseau===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se connecter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
 subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
 range 192.168.42.1 192.168.42.9&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La configuration du serveur réseau s'effectue en se connectant à ce dernier en ssh:&lt;br /&gt;
 root@192.168.42.10&lt;br /&gt;
Il faut installer le &amp;quot;gateway bridge&amp;quot;, le &amp;quot;network server&amp;quot; ainsi que &amp;quot;l'application server&amp;quot; disponible sur ChirpStack. Pour se faire nous avons suivi un tutoriel à l'adresse suivante:&lt;br /&gt;
 https://www.youtube.com/watch?v=FnTP7t47DlI&lt;br /&gt;
ainsi que la documentation fournie par ChirpStack&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pour accéder au serveur réseau, nous passons par l'interface web en se connectant à l'adresse suivante (en passant par une zabeth):&lt;br /&gt;
 172.26.189.22:8080 id: admin mdp: admin&lt;br /&gt;
&lt;br /&gt;
A partir de l'interface web, nous pouvons configurer de nombreux éléments:&lt;br /&gt;
&lt;br /&gt;
-Création d'un nouveau projet&lt;br /&gt;
&lt;br /&gt;
-Ajouter des équipements aux réseau à l'aide des clefs&lt;br /&gt;
&lt;br /&gt;
-Surveiller les informations qui circulent sur notre réseau&lt;br /&gt;
&lt;br /&gt;
-...&lt;br /&gt;
&lt;br /&gt;
Enfin, en nous connectant en ssh sur les deux gateways:&lt;br /&gt;
 antenne: 192.168.42.1 mdp:pdmk-062E7A&lt;br /&gt;
 passerelle intérieur: 192.168.42.2 mdp:pdmk-030970&lt;br /&gt;
Nous avons pu mettre à jour ces dernieres en suivant le wiki Kerlink&lt;br /&gt;
La connexion au wiki Kerlink s'effectue avec:&lt;br /&gt;
 Login : univlille&lt;br /&gt;
 Mot de passe : IYBlN7QF06&lt;br /&gt;
&lt;br /&gt;
===Test du réseau===&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de notre Network Server nous avons utilisé un module GPS LoRa du commerce. En se connectant a notre Network Server (172.26.189.22:8000) nous avons pu créer une nouvelle application et ajouté un nouvel équipement. Se faisant notre Network Server génère deux clefs, une &amp;quot;application key&amp;quot; et une &amp;quot;Network Key&amp;quot;. Ces deux clefs doivent être renseigné manuellement dans notre équipement. Pour se faire on peut le connecter à un ordinateur et y ajouter les clefs via son logiciel dédié. L'équipement possédant déjà un EUI permettant de reconnaître l'équipement, nous avons du renseigner ce dernier dans l'ajout de l'équipement sur le Network Server. Suite à ce test nous avons bien pu observer la circulation de nos trames et le bon fonctionnement de notre Network Server.&lt;br /&gt;
&lt;br /&gt;
===Fabrication du End-device===&lt;br /&gt;
&lt;br /&gt;
Pour le end-device je dispose d'une carte STM32F411RE, d'un shield SX1276MB1MAS et d'un capteur ultrason HC-SR04.&lt;br /&gt;
Le développement du programme se fait sur STM32Cube.&lt;br /&gt;
Un premier programme à été mis en place sans difficultés pour récupérer les valeurs du HC-SR04 en s'appuyant sur l'exemple proposé par Arduino.&lt;br /&gt;
En revanche les problèmes sont arrivés lors du développement concernant la partie LoRaWAN. En effet STM32 propose un package LoRaWAN pour faciliter le développement d'application, le problème étant que ce package concerne seulement les cartes STM32LXXX. J'ai essayé longuement d'adapter ce package pour ma carte STM32F411RE en modifiant notamment le Makefile, les .flash mais aussi les fichiers d'inclusion sans succès malheureusement. La solution envisagée est donc un changement de carte au profit d'une STM32LXXX.&lt;br /&gt;
&lt;br /&gt;
Après changé notre carte pour une STM32L152RE, j'ai repris le package proposé par STM32 et dans le fichier Commissioning.h j'ai rensigné les clefs &lt;br /&gt;
 LORAWAN_APP_KEY&lt;br /&gt;
 LORAWAN_NWK_KEY&lt;br /&gt;
&lt;br /&gt;
Il n'y a que ces deux à renseigner étant donné que notre équipement fonctionne sur une version inférieur à la 1.1. A noter que le champ device EUI semble ne pas fonctionner. Nous avons du récuper l'EUI sur une gateway et renseigner ce dernier dans l'équipement que j'ai crée pour mon application sur l'interface web.&lt;br /&gt;
&lt;br /&gt;
Concernant le programme de l'équipement en lui même le programme est relativement simle, en se servant de la bibliothèque HAL je declare 3 PIN en input et je renvoie ainsi l'état des capteurs de manière périodique en me servant de la fonction &amp;quot;Send&amp;quot; du package STM32.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie application WEB===&lt;br /&gt;
&lt;br /&gt;
La principale difficulté de cette partie et l'absence totale de connaissances dans le développement d'application WEB. J'ai donc dû apprendre les langage HTML / CSS / PHP (quelques notions en JS) pour réaliser cette partie. Je disposais de quelques notions en base de données et SQL suit à mon année d'IMA3.&lt;br /&gt;
&lt;br /&gt;
Le but de l'application WEB est de permettre de rendre exploitable pour l'utilisateurs les informations renvoyés par les balises. Pour se faire l'application doit contenir une page de monitoring permettant de surveiller l'état de toutes les balises. De plus elle doit contenir une partie historique permettant d'accéder à l'historique d'une balise en particulier (en effectuant une recherche par id/localisation/date). Enfin elle doit aussi proposer une partie permettant d'afficher une carte avec dessus les balises et leur état.&lt;br /&gt;
&lt;br /&gt;
A l'aide de Bootstrap j'ai mis en place une application WEB avec ces trois partie. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie serveur d'application===&lt;br /&gt;
&lt;br /&gt;
====Mise en place de l'environnement====&lt;br /&gt;
&lt;br /&gt;
Concernant la partie serveur, j'ai mis en place sur une VM (172.26.189.23) un serveur apache et Postgres pour la gestion des bases mais aussi un interpreteur php.&lt;br /&gt;
Pour apache j'ai simplement mis tous mes fichiers html/php dans /var/www/html qui est le repertoir par defaut. Celui est configuré pour démarrer au lancement de la VM.&lt;br /&gt;
Concernant Postgres j'ai d'abord crée un nouvel utilisateur en me servant de l'utilisateur crée par defaut (su - postgres):&lt;br /&gt;
 createuser -d -P root (mdp: glopglop)&lt;br /&gt;
&lt;br /&gt;
Puis j'ai créé une nouvelle base:&lt;br /&gt;
 createdb -O root pfe&lt;br /&gt;
&lt;br /&gt;
Pour se connecter a la base:&lt;br /&gt;
 psql pfe (depuis l'utilsateur root ou postgres)&lt;br /&gt;
&lt;br /&gt;
Enfin j'y ai ajouté mes tables:&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE balises (ID serial PRIMARY KEY, Pays varchar(50) NOT NULL, Ville varchar(50) NOT NULL, Localisation varchar(50) NOT NULL, Coordonnees varchar(50) NOT NULL,Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE historique_balise (ID serial PRIMARY KEY, id_balise int NOT NULL, Date date NOT NULL, Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
La base contient deux tables, une première ayant pour clef primaire l'id de la balise et contenant des informations diverses sur cette dernière telles que le pays, la ville, la localisation, les coordonnée, le niveau d'eau mais surtout si cette dernière est sous l'eau ou non. La seconde table concerne l'historique des balises, elle a pour clef primaire l'indice du relevé et contient des informations comme le numéro de balise, la date du relevé etc, l'état de la balise etc..&lt;br /&gt;
&lt;br /&gt;
Pour la communication entre le serveur d'application et le serveur réseau, j'ai dans un premier temps mis en place un script python pour récuperer les relevés des capteurs via l'API REST:&lt;br /&gt;
 import requests&lt;br /&gt;
 import json&lt;br /&gt;
 #on recupere le token&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Content-Type': 'application/json',&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
 }&lt;br /&gt;
 data = '{&amp;quot;email&amp;quot;: &amp;quot;admin&amp;quot;,&amp;quot;password&amp;quot;: &amp;quot;admin&amp;quot; }'&lt;br /&gt;
 response = requests.post('http://172.26.189.22:8080/api/internal/login', headers=headers, data=data)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 #print(resp['jwt'])&lt;br /&gt;
 #diverses information sur un capteur&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
    'Grpc-Metadata-Authorization': 'Bearer'+resp['jwt'],&lt;br /&gt;
 }&lt;br /&gt;
 response = requests.get('http://172.26.189.22:8080/api/devices/0b00f4ff703a8fc5', headers=headers)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 print(resp)&lt;br /&gt;
&lt;br /&gt;
Ce script permet de un premier temps de récuperer le token pour avoir accés à l'API. Celui ci est a renseigner dans toute les requetes http. &lt;br /&gt;
En se connectant à l'API via l'interface graphique (172.26.189.22:8080/api), on peut récuperer toutes les requetes possible en cURL, j'ai donc simplement utilisé un convertisseur cURL vers python pour mettre mes requetes en place.&lt;br /&gt;
&lt;br /&gt;
Malheureusement cette solution permet de récuperer de nombreuses informations concernant l'application mais pas les relevés des capteurs. Pour récupérer ces derniers, je suis passé par l'interface graphique du serveur d'application (172.26.189.22:8080) afin d'ajouter une intégration HTTP. Il faut simplement spécifier le format de l'information (JSON dans mon cas) et l'URL à laquelle doit être envoyé la requête http POST. Dans mon cas cela sera:&lt;br /&gt;
 http://172.26.189.23/pfe/gestionPOST.php&lt;br /&gt;
&lt;br /&gt;
La base du fichier gestionPOST.php ressemble à cela: &lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 header(&amp;quot;content-type: application/json&amp;quot;);&lt;br /&gt;
 $json = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
 $obj = json_decode($json);&lt;br /&gt;
 $decoded = base64_decode(json_encode($obj-&amp;gt;data));&lt;br /&gt;
 $fp = @fopen(&amp;quot;toto.txt&amp;quot;,&amp;quot;a&amp;quot;);&lt;br /&gt;
 fwrite($fp,$decoded);&lt;br /&gt;
 fwrite($fp,&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
 fclose($fp);&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il permet via le flux php://input de récupérer le contenu de la requête POST et de l'afficher.&lt;br /&gt;
&lt;br /&gt;
La prochaine étape concerne la gestion des informations avec notamment l'ajout en base selon le type d'information recu.&lt;br /&gt;
&lt;br /&gt;
====Gestion des trames====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les trames sont envoyés au format suivant:&lt;br /&gt;
 id:niveau1:niveau2:niveau3&lt;br /&gt;
&lt;br /&gt;
A travers le script php permettant la gestion des requetes HTTP Post, en se servant de la fonction preg_match avec le regex suivant on peut récuperer toutes les informations necessaires au traitement:&lt;br /&gt;
 &amp;quot;#^([0-9]+):([0-1]{1}):([0-1]{1}):([0-1]{1})$#&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Chaque nouvelle mesure envoyée sur le serveur d'application est renseignée en base grace à la requêtes SQL suivante:&lt;br /&gt;
 UPDATE balises&lt;br /&gt;
 SET inondee=:in, niveau=:niv&lt;br /&gt;
 WHERE id=:id;&lt;br /&gt;
&lt;br /&gt;
Les requêtes en php sont réalisées par le biais des fonctions query, prepare et execute.&lt;br /&gt;
&lt;br /&gt;
Toutes les requêtes SQL sont regroupés dans un même fichier par soucis de clarté.&lt;br /&gt;
&lt;br /&gt;
Dès qu'une nouvelle mesures est transmise au script php, on récupère la date actuelle et on la compare avec le dernier relevé de cette balise enregistré dans la table historique, si le dernier relevé date de la veille on ajoute une nouvelle entrée dans la table historique_balise:&lt;br /&gt;
 &lt;br /&gt;
 $ajrd=date(&amp;quot;Y-m-d&amp;quot;);&lt;br /&gt;
 $requete=$bdd-&amp;gt;prepare('SELECT MAX(date) AS max_date&lt;br /&gt;
                         FROM historique_balise&lt;br /&gt;
                         WHERE id_balise=:id');&lt;br /&gt;
 $requete-&amp;gt;execute(array('id' =&amp;gt; $id));&lt;br /&gt;
 $resultat=$requete-&amp;gt;fetch();&lt;br /&gt;
 if($ajrd&amp;gt;$resultat['max_date']  || $resultat==FALSE){&lt;br /&gt;
      $requete=$bdd-&amp;gt;prepare('INSERT INTO historique_balise&lt;br /&gt;
                              VALUES (DEFAULT,:id,:d,:niv,:in)');&lt;br /&gt;
      $requete-&amp;gt;execute(array('id'=&amp;gt;$id,'d'=&amp;gt;$ajrd, 'niv'=&amp;gt;$niveau, 'in'=&amp;gt;$inondee));&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Lors d'une première entrée, la condition $resultat==false permet d'ajouter pour la première fois la balise dans l'historique&lt;br /&gt;
&lt;br /&gt;
====Affichage sur la carte====&lt;br /&gt;
&lt;br /&gt;
En passant par l'API google maps il est possible d'affichir une carte sur l'appplication web et d'apporter des modifications à cette dernière&lt;br /&gt;
&lt;br /&gt;
A l'aide de JavaScript, je peux afficher sur ma carte les balises ainsi que leur etat sur la carte. Pour se faire, avant que le code JS soit executé par le client, ce dernier est preparé par un code PHP permettant de parcourir la base et de recupérer les balises, leur état et leur coordonnées avant de les afficher avec un indice couleur selon leur niveau d'inondation:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 $reponse=$bdd-&amp;gt;query('SELECT COUNT(*) FROM balises');&lt;br /&gt;
 $nbMarqueur=$reponse-&amp;gt;fetch();&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 var nbMarqueur=&amp;lt;?php echo $nbMarqueur['count'];?&amp;gt;;&lt;br /&gt;
 var locations = new Array(nbMarqueur);&lt;br /&gt;
 var coordonnees, coord1, coord2;&lt;br /&gt;
 var heatMapData = new Array(nbMarqueur);&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
  $reponse=$bdd-&amp;gt;query('SELECT localisation, coordonnees, niveau FROM balises');&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 var infos =JSON.parse('&amp;lt;?php echo json_encode($reponse-&amp;gt;fetchAll(), true); ?&amp;gt;');&lt;br /&gt;
 console.log(nbMarqueur);&lt;br /&gt;
 for(var i=0; i&amp;lt;nbMarqueur; i++){&lt;br /&gt;
 locations[i]=new Array(4);&lt;br /&gt;
 locations[i][0]=infos[i]['localisation'];&lt;br /&gt;
 coordonnees=infos[i]['coordonnees'];&lt;br /&gt;
 var pos=coordonnees.indexOf(&amp;quot;,&amp;quot;);&lt;br /&gt;
 coord1=coordonnees.slice(0,pos-1);&lt;br /&gt;
 coord2=coordonnees.slice(pos+1);&lt;br /&gt;
 locations[i][1]=coord1;&lt;br /&gt;
 locations[i][2]=coord2,&lt;br /&gt;
 locations[i][3]=i;&lt;br /&gt;
 heatMapData[i]={location: new google.maps.LatLng(coord1, coord2), weight: infos[i]['niveau']};&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Gestion utilisateur====&lt;br /&gt;
&lt;br /&gt;
Premièrement, la gestion utilisateur ne doit être accessible qu'aux personnes en ayant les droits, il est donc nécessaire de mettre en place un système de login. Tout se joue avec la fonction session_start(), avant d'envoyer la page concernant le gestion des capteurs au client, on verifie d'abord si ce dernier est connecté, i-e si la variable $_SESSION['login'] existe, sinon on redirige ce dernier vers l'ecran de connexion.&lt;br /&gt;
&lt;br /&gt;
L'utilisateur entre login et mot de passe et on compare ces derniers a ce qui est stocké dans la base de données. Par mesure de sécurité des données de l'utilisateur et en cas de faille de la base, le mot de passe est stocké en hashé.&lt;br /&gt;
Une fois connecté l'utilisateur à trois actions possibles, il peut ajouter une balise, modifier une balise et enfin supprimer une balise. En cas d'erreur de saisie, cette dernière est notifiée à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note a moi même: travail a effectuer en priorité:&lt;br /&gt;
 &lt;br /&gt;
 gerer la partie historique des balises en base (quasi fini, gérer les heures pour ajouter de manière plus fréquentes) FAIT&lt;br /&gt;
 mettre en place un mode administrateur sur l'appli pour par exemple ajouter ou retirer des balises (a voir si utile avec les profs) FAIT&lt;br /&gt;
 gerer sur la carte l'affichage des balises et l'etat de la route FAIT&lt;br /&gt;
 mettre toutes les requetes SQL dans un même fichier (fait pour la recherche historique) FAIT&lt;br /&gt;
 mise en place d'une appli android&lt;br /&gt;
 concevoir le capteur&lt;br /&gt;
 gestion ajout nouveau capteur (voir message down) FAIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Connexion à l'application====&lt;br /&gt;
&lt;br /&gt;
Pour rendre l'application accessible depuis l'extérieur et sans passer par le proxy de l'école, j'ai réutilisé la marchine virtuelle deployé en PRA, a savoir trompettedelamortdans mon cas, avec comme ip public 193.48.57.188 &lt;br /&gt;
&lt;br /&gt;
Dans bind9, j'ai ajouté un nouvel enregistrement dans /etc/bind/db.trompettedelamort.site&lt;br /&gt;
 pfe     IN	CNAME	ns1&lt;br /&gt;
&lt;br /&gt;
En faisait cela, le nom pfe.trompettedelamort.site nous retourne bien l'adresse  vers le site.&lt;br /&gt;
&lt;br /&gt;
Ensuite, il reste juste a rediriger l'utilisateur vers le bon site lorsqu'il saisie pfe.trompettedelamort.site. Pour cela, la machine trompettedelamort fait office de reverse proxy, dans /etc/apache2/sites-availables ilfaut donc ajouter une nouvelle configuration:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
        ServerName pfe.trompettedelamort.site&lt;br /&gt;
        ProxyPreserveHost On&lt;br /&gt;
        ProxyPass / http://172.26.189.23:80/&lt;br /&gt;
        ProxyPassReverse / http://172.26.189.23:80/&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ainsi lorsqu'un utilisateur souhaite accéder à pfe.trompettedelamort.site, ce dernier est résolue en 193.48.57.188:80 qui lui même redirige vers 172.26.189.23:80 qui correspond bien à l'adresse privé de notre machine hebergeant notre site.&lt;br /&gt;
&lt;br /&gt;
Petit problème, le routeur de l'ecole bloque l'accés de trompettedelamort (193.48.57.188) vers la machine hebergeant notre site (172.26.189.23). La solution consiste donc à s'attribuer une adresse sur le vlan des ZABETH et d'ajouter une route statique vers le réseau de la machine hebergeant notre site:&lt;br /&gt;
&lt;br /&gt;
 up ip address add dev eth1 172.26.145.241/24&lt;br /&gt;
 up ip route add 172.26.188.0/22 via 172.26.145.254&lt;br /&gt;
 down ip address del dev eth1 172.26.145.241/24&lt;br /&gt;
 down ip route del 172.26.188.0/22 via 172.26.145.254&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85447</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85447"/>
				<updated>2021-01-07T17:13:07Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Gestion utilisateur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Début projet===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Mise en place du réseau===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se connecter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
 subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
 range 192.168.42.1 192.168.42.9&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La configuration du serveur réseau s'effectue en se connectant à ce dernier en ssh:&lt;br /&gt;
 root@192.168.42.10&lt;br /&gt;
Il faut installer le &amp;quot;gateway bridge&amp;quot;, le &amp;quot;network server&amp;quot; ainsi que &amp;quot;l'application server&amp;quot; disponible sur ChirpStack. Pour se faire nous avons suivi un tutoriel à l'adresse suivante:&lt;br /&gt;
 https://www.youtube.com/watch?v=FnTP7t47DlI&lt;br /&gt;
ainsi que la documentation fournie par ChirpStack&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pour accéder au serveur réseau, nous passons par l'interface web en se connectant à l'adresse suivante (en passant par une zabeth):&lt;br /&gt;
 172.26.189.22:8080 id: admin mdp: admin&lt;br /&gt;
&lt;br /&gt;
A partir de l'interface web, nous pouvons configurer de nombreux éléments:&lt;br /&gt;
&lt;br /&gt;
-Création d'un nouveau projet&lt;br /&gt;
&lt;br /&gt;
-Ajouter des équipements aux réseau à l'aide des clefs&lt;br /&gt;
&lt;br /&gt;
-Surveiller les informations qui circulent sur notre réseau&lt;br /&gt;
&lt;br /&gt;
-...&lt;br /&gt;
&lt;br /&gt;
Enfin, en nous connectant en ssh sur les deux gateways:&lt;br /&gt;
 antenne: 192.168.42.1 mdp:pdmk-062E7A&lt;br /&gt;
 passerelle intérieur: 192.168.42.2 mdp:pdmk-030970&lt;br /&gt;
Nous avons pu mettre à jour ces dernieres en suivant le wiki Kerlink&lt;br /&gt;
La connexion au wiki Kerlink s'effectue avec:&lt;br /&gt;
 Login : univlille&lt;br /&gt;
 Mot de passe : IYBlN7QF06&lt;br /&gt;
&lt;br /&gt;
===Test du réseau===&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de notre Network Server nous avons utilisé un module GPS LoRa du commerce. En se connectant a notre Network Server (172.26.189.22:8000) nous avons pu créer une nouvelle application et ajouté un nouvel équipement. Se faisant notre Network Server génère deux clefs, une &amp;quot;application key&amp;quot; et une &amp;quot;Network Key&amp;quot;. Ces deux clefs doivent être renseigné manuellement dans notre équipement. Pour se faire on peut le connecter à un ordinateur et y ajouter les clefs via son logiciel dédié. L'équipement possédant déjà un EUI permettant de reconnaître l'équipement, nous avons du renseigner ce dernier dans l'ajout de l'équipement sur le Network Server. Suite à ce test nous avons bien pu observer la circulation de nos trames et le bon fonctionnement de notre Network Server.&lt;br /&gt;
&lt;br /&gt;
===Fabrication du End-device===&lt;br /&gt;
&lt;br /&gt;
Pour le end-device je dispose d'une carte STM32F411RE, d'un shield SX1276MB1MAS et d'un capteur ultrason HC-SR04.&lt;br /&gt;
Le développement du programme se fait sur STM32Cube.&lt;br /&gt;
Un premier programme à été mis en place sans difficultés pour récupérer les valeurs du HC-SR04 en s'appuyant sur l'exemple proposé par Arduino.&lt;br /&gt;
En revanche les problèmes sont arrivés lors du développement concernant la partie LoRaWAN. En effet STM32 propose un package LoRaWAN pour faciliter le développement d'application, le problème étant que ce package concerne seulement les cartes STM32LXXX. J'ai essayé longuement d'adapter ce package pour ma carte STM32F411RE en modifiant notamment le Makefile, les .flash mais aussi les fichiers d'inclusion sans succès malheureusement. La solution envisagée est donc un changement de carte au profit d'une STM32LXXX.&lt;br /&gt;
&lt;br /&gt;
Après changé notre carte pour une STM32L152RE, j'ai repris le package proposé par STM32 et dans le fichier Commissioning.h j'ai rensigné les clefs &lt;br /&gt;
 LORAWAN_APP_KEY&lt;br /&gt;
 LORAWAN_NWK_KEY&lt;br /&gt;
&lt;br /&gt;
Il n'y a que ces deux à renseigner étant donné que notre équipement fonctionne sur une version inférieur à la 1.1. A noter que le champ device EUI semble ne pas fonctionner. Nous avons du récuper l'EUI sur une gateway et renseigner ce dernier dans l'équipement que j'ai crée pour mon application sur l'interface web.&lt;br /&gt;
&lt;br /&gt;
Concernant le programme de l'équipement en lui même le programme est relativement simle, en se servant de la bibliothèque HAL je declare 3 PIN en input et je renvoie ainsi l'état des capteurs de manière périodique en me servant de la fonction &amp;quot;Send&amp;quot; du package STM32.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie application WEB===&lt;br /&gt;
&lt;br /&gt;
La principale difficulté de cette partie et l'absence totale de connaissances dans le développement d'application WEB. J'ai donc dû apprendre les langage HTML / CSS / PHP (quelques notions en JS) pour réaliser cette partie. Je disposais de quelques notions en base de données et SQL suit à mon année d'IMA3.&lt;br /&gt;
&lt;br /&gt;
Le but de l'application WEB est de permettre de rendre exploitable pour l'utilisateurs les informations renvoyés par les balises. Pour se faire l'application doit contenir une page de monitoring permettant de surveiller l'état de toutes les balises. De plus elle doit contenir une partie historique permettant d'accéder à l'historique d'une balise en particulier (en effectuant une recherche par id/localisation/date). Enfin elle doit aussi proposer une partie permettant d'afficher une carte avec dessus les balises et leur état.&lt;br /&gt;
&lt;br /&gt;
A l'aide de Bootstrap j'ai mis en place une application WEB avec ces trois partie. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie serveur d'application===&lt;br /&gt;
&lt;br /&gt;
====Mise en place de l'environnement====&lt;br /&gt;
&lt;br /&gt;
Concernant la partie serveur, j'ai mis en place sur une VM (172.26.189.23) un serveur apache et Postgres pour la gestion des bases mais aussi un interpreteur php.&lt;br /&gt;
Pour apache j'ai simplement mis tous mes fichiers html/php dans /var/www/html qui est le repertoir par defaut. Celui est configuré pour démarrer au lancement de la VM.&lt;br /&gt;
Concernant Postgres j'ai d'abord crée un nouvel utilisateur en me servant de l'utilisateur crée par defaut (su - postgres):&lt;br /&gt;
 createuser -d -P root (mdp: glopglop)&lt;br /&gt;
&lt;br /&gt;
Puis j'ai créé une nouvelle base:&lt;br /&gt;
 createdb -O root pfe&lt;br /&gt;
&lt;br /&gt;
Pour se connecter a la base:&lt;br /&gt;
 psql pfe (depuis l'utilsateur root ou postgres)&lt;br /&gt;
&lt;br /&gt;
Enfin j'y ai ajouté mes tables:&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE balises (ID serial PRIMARY KEY, Pays varchar(50) NOT NULL, Ville varchar(50) NOT NULL, Localisation varchar(50) NOT NULL, Coordonnees varchar(50) NOT NULL,Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE historique_balise (ID serial PRIMARY KEY, id_balise int NOT NULL, Date date NOT NULL, Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
La base contient deux tables, une première ayant pour clef primaire l'id de la balise et contenant des informations diverses sur cette dernière telles que le pays, la ville, la localisation, les coordonnée, le niveau d'eau mais surtout si cette dernière est sous l'eau ou non. La seconde table concerne l'historique des balises, elle a pour clef primaire l'indice du relevé et contient des informations comme le numéro de balise, la date du relevé etc, l'état de la balise etc..&lt;br /&gt;
&lt;br /&gt;
Pour la communication entre le serveur d'application et le serveur réseau, j'ai dans un premier temps mis en place un script python pour récuperer les relevés des capteurs via l'API REST:&lt;br /&gt;
 import requests&lt;br /&gt;
 import json&lt;br /&gt;
 #on recupere le token&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Content-Type': 'application/json',&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
 }&lt;br /&gt;
 data = '{&amp;quot;email&amp;quot;: &amp;quot;admin&amp;quot;,&amp;quot;password&amp;quot;: &amp;quot;admin&amp;quot; }'&lt;br /&gt;
 response = requests.post('http://172.26.189.22:8080/api/internal/login', headers=headers, data=data)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 #print(resp['jwt'])&lt;br /&gt;
 #diverses information sur un capteur&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
    'Grpc-Metadata-Authorization': 'Bearer'+resp['jwt'],&lt;br /&gt;
 }&lt;br /&gt;
 response = requests.get('http://172.26.189.22:8080/api/devices/0b00f4ff703a8fc5', headers=headers)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 print(resp)&lt;br /&gt;
&lt;br /&gt;
Ce script permet de un premier temps de récuperer le token pour avoir accés à l'API. Celui ci est a renseigner dans toute les requetes http. &lt;br /&gt;
En se connectant à l'API via l'interface graphique (172.26.189.22:8080/api), on peut récuperer toutes les requetes possible en cURL, j'ai donc simplement utilisé un convertisseur cURL vers python pour mettre mes requetes en place.&lt;br /&gt;
&lt;br /&gt;
Malheureusement cette solution permet de récuperer de nombreuses informations concernant l'application mais pas les relevés des capteurs. Pour récupérer ces derniers, je suis passé par l'interface graphique du serveur d'application (172.26.189.22:8080) afin d'ajouter une intégration HTTP. Il faut simplement spécifier le format de l'information (JSON dans mon cas) et l'URL à laquelle doit être envoyé la requête http POST. Dans mon cas cela sera:&lt;br /&gt;
 http://172.26.189.23/pfe/gestionPOST.php&lt;br /&gt;
&lt;br /&gt;
La base du fichier gestionPOST.php ressemble à cela: &lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 header(&amp;quot;content-type: application/json&amp;quot;);&lt;br /&gt;
 $json = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
 $obj = json_decode($json);&lt;br /&gt;
 $decoded = base64_decode(json_encode($obj-&amp;gt;data));&lt;br /&gt;
 $fp = @fopen(&amp;quot;toto.txt&amp;quot;,&amp;quot;a&amp;quot;);&lt;br /&gt;
 fwrite($fp,$decoded);&lt;br /&gt;
 fwrite($fp,&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
 fclose($fp);&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il permet via le flux php://input de récupérer le contenu de la requête POST et de l'afficher.&lt;br /&gt;
&lt;br /&gt;
La prochaine étape concerne la gestion des informations avec notamment l'ajout en base selon le type d'information recu.&lt;br /&gt;
&lt;br /&gt;
====Gestion des trames====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les trames sont envoyés au format suivant:&lt;br /&gt;
 id:niveau1:niveau2:niveau3&lt;br /&gt;
&lt;br /&gt;
A travers le script php permettant la gestion des requetes HTTP Post, en se servant de la fonction preg_match avec le regex suivant on peut récuperer toutes les informations necessaires au traitement:&lt;br /&gt;
 &amp;quot;#^([0-9]+):([0-1]{1}):([0-1]{1}):([0-1]{1})$#&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Chaque nouvelle mesure envoyée sur le serveur d'application est renseignée en base grace à la requêtes SQL suivante:&lt;br /&gt;
 UPDATE balises&lt;br /&gt;
 SET inondee=:in, niveau=:niv&lt;br /&gt;
 WHERE id=:id;&lt;br /&gt;
&lt;br /&gt;
Les requêtes en php sont réalisées par le biais des fonctions query, prepare et execute.&lt;br /&gt;
&lt;br /&gt;
Toutes les requêtes SQL sont regroupés dans un même fichier par soucis de clarté.&lt;br /&gt;
&lt;br /&gt;
Dès qu'une nouvelle mesures est transmise au script php, on récupère la date actuelle et on la compare avec le dernier relevé de cette balise enregistré dans la table historique, si le dernier relevé date de la veille on ajoute une nouvelle entrée dans la table historique_balise:&lt;br /&gt;
 &lt;br /&gt;
 $ajrd=date(&amp;quot;Y-m-d&amp;quot;);&lt;br /&gt;
 $requete=$bdd-&amp;gt;prepare('SELECT MAX(date) AS max_date&lt;br /&gt;
                         FROM historique_balise&lt;br /&gt;
                         WHERE id_balise=:id');&lt;br /&gt;
 $requete-&amp;gt;execute(array('id' =&amp;gt; $id));&lt;br /&gt;
 $resultat=$requete-&amp;gt;fetch();&lt;br /&gt;
 if($ajrd&amp;gt;$resultat['max_date']  || $resultat==FALSE){&lt;br /&gt;
      $requete=$bdd-&amp;gt;prepare('INSERT INTO historique_balise&lt;br /&gt;
                              VALUES (DEFAULT,:id,:d,:niv,:in)');&lt;br /&gt;
      $requete-&amp;gt;execute(array('id'=&amp;gt;$id,'d'=&amp;gt;$ajrd, 'niv'=&amp;gt;$niveau, 'in'=&amp;gt;$inondee));&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Lors d'une première entrée, la condition $resultat==false permet d'ajouter pour la première fois la balise dans l'historique&lt;br /&gt;
&lt;br /&gt;
====Affichage sur la carte====&lt;br /&gt;
&lt;br /&gt;
En passant par l'API google maps il est possible d'affichir une carte sur l'appplication web et d'apporter des modifications à cette dernière&lt;br /&gt;
&lt;br /&gt;
A l'aide de JavaScript, je peux afficher sur ma carte les balises ainsi que leur etat sur la carte. Pour se faire, avant que le code JS soit executé par le client, ce dernier est preparé par un code PHP permettant de parcourir la base et de recupérer les balises, leur état et leur coordonnées avant de les afficher avec un indice couleur selon leur niveau d'inondation:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 $reponse=$bdd-&amp;gt;query('SELECT COUNT(*) FROM balises');&lt;br /&gt;
 $nbMarqueur=$reponse-&amp;gt;fetch();&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 var nbMarqueur=&amp;lt;?php echo $nbMarqueur['count'];?&amp;gt;;&lt;br /&gt;
 var locations = new Array(nbMarqueur);&lt;br /&gt;
 var coordonnees, coord1, coord2;&lt;br /&gt;
 var heatMapData = new Array(nbMarqueur);&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
  $reponse=$bdd-&amp;gt;query('SELECT localisation, coordonnees, niveau FROM balises');&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 var infos =JSON.parse('&amp;lt;?php echo json_encode($reponse-&amp;gt;fetchAll(), true); ?&amp;gt;');&lt;br /&gt;
 console.log(nbMarqueur);&lt;br /&gt;
 for(var i=0; i&amp;lt;nbMarqueur; i++){&lt;br /&gt;
 locations[i]=new Array(4);&lt;br /&gt;
 locations[i][0]=infos[i]['localisation'];&lt;br /&gt;
 coordonnees=infos[i]['coordonnees'];&lt;br /&gt;
 var pos=coordonnees.indexOf(&amp;quot;,&amp;quot;);&lt;br /&gt;
 coord1=coordonnees.slice(0,pos-1);&lt;br /&gt;
 coord2=coordonnees.slice(pos+1);&lt;br /&gt;
 locations[i][1]=coord1;&lt;br /&gt;
 locations[i][2]=coord2,&lt;br /&gt;
 locations[i][3]=i;&lt;br /&gt;
 heatMapData[i]={location: new google.maps.LatLng(coord1, coord2), weight: infos[i]['niveau']};&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Gestion utilisateur====&lt;br /&gt;
&lt;br /&gt;
Premièrement, la gestion utilisateur ne doit être accessible qu'aux personnes en ayant les droits, il est donc nécessaire de mettre en place un système de login. Tout se joue avec la fonction session_start(), avant d'envoyer la page concernant le gestion des capteurs au client, on verifie d'abord si ce dernier est connecté, i-e si la variable $_SESSION['login'] existe, sinon on redirige ce dernier vers l'ecran de connexion.&lt;br /&gt;
&lt;br /&gt;
L'utilisateur entre login et mot de passe et on compare ces derniers a ce qui est stocké dans la base de données. Par mesure de sécurité des données de l'utilisateur et en cas de faille de la base, le mot de passe est stocké en hashé.&lt;br /&gt;
Une fois connecté l'utilisateur à trois actions possibles, il peut ajouter une balise, modifier une balise et enfin supprimer une balise. En cas d'erreur de saisie, cette dernière est notifiée à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note a moi même: travail a effectuer en priorité:&lt;br /&gt;
 &lt;br /&gt;
 gerer la partie historique des balises en base (quasi fini, gérer les heures pour ajouter de manière plus fréquentes) FAIT&lt;br /&gt;
 mettre en place un mode administrateur sur l'appli pour par exemple ajouter ou retirer des balises (a voir si utile avec les profs) FAIT&lt;br /&gt;
 gerer sur la carte l'affichage des balises et l'etat de la route FAIT&lt;br /&gt;
 mettre toutes les requetes SQL dans un même fichier (fait pour la recherche historique) FAIT&lt;br /&gt;
 mise en place d'une appli android&lt;br /&gt;
 concevoir le capteur&lt;br /&gt;
 gestion ajout nouveau capteur (voir message down) FAIT&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85446</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85446"/>
				<updated>2021-01-07T17:12:56Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Affichage sur la carte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Début projet===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Mise en place du réseau===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se connecter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
 subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
 range 192.168.42.1 192.168.42.9&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La configuration du serveur réseau s'effectue en se connectant à ce dernier en ssh:&lt;br /&gt;
 root@192.168.42.10&lt;br /&gt;
Il faut installer le &amp;quot;gateway bridge&amp;quot;, le &amp;quot;network server&amp;quot; ainsi que &amp;quot;l'application server&amp;quot; disponible sur ChirpStack. Pour se faire nous avons suivi un tutoriel à l'adresse suivante:&lt;br /&gt;
 https://www.youtube.com/watch?v=FnTP7t47DlI&lt;br /&gt;
ainsi que la documentation fournie par ChirpStack&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pour accéder au serveur réseau, nous passons par l'interface web en se connectant à l'adresse suivante (en passant par une zabeth):&lt;br /&gt;
 172.26.189.22:8080 id: admin mdp: admin&lt;br /&gt;
&lt;br /&gt;
A partir de l'interface web, nous pouvons configurer de nombreux éléments:&lt;br /&gt;
&lt;br /&gt;
-Création d'un nouveau projet&lt;br /&gt;
&lt;br /&gt;
-Ajouter des équipements aux réseau à l'aide des clefs&lt;br /&gt;
&lt;br /&gt;
-Surveiller les informations qui circulent sur notre réseau&lt;br /&gt;
&lt;br /&gt;
-...&lt;br /&gt;
&lt;br /&gt;
Enfin, en nous connectant en ssh sur les deux gateways:&lt;br /&gt;
 antenne: 192.168.42.1 mdp:pdmk-062E7A&lt;br /&gt;
 passerelle intérieur: 192.168.42.2 mdp:pdmk-030970&lt;br /&gt;
Nous avons pu mettre à jour ces dernieres en suivant le wiki Kerlink&lt;br /&gt;
La connexion au wiki Kerlink s'effectue avec:&lt;br /&gt;
 Login : univlille&lt;br /&gt;
 Mot de passe : IYBlN7QF06&lt;br /&gt;
&lt;br /&gt;
===Test du réseau===&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de notre Network Server nous avons utilisé un module GPS LoRa du commerce. En se connectant a notre Network Server (172.26.189.22:8000) nous avons pu créer une nouvelle application et ajouté un nouvel équipement. Se faisant notre Network Server génère deux clefs, une &amp;quot;application key&amp;quot; et une &amp;quot;Network Key&amp;quot;. Ces deux clefs doivent être renseigné manuellement dans notre équipement. Pour se faire on peut le connecter à un ordinateur et y ajouter les clefs via son logiciel dédié. L'équipement possédant déjà un EUI permettant de reconnaître l'équipement, nous avons du renseigner ce dernier dans l'ajout de l'équipement sur le Network Server. Suite à ce test nous avons bien pu observer la circulation de nos trames et le bon fonctionnement de notre Network Server.&lt;br /&gt;
&lt;br /&gt;
===Fabrication du End-device===&lt;br /&gt;
&lt;br /&gt;
Pour le end-device je dispose d'une carte STM32F411RE, d'un shield SX1276MB1MAS et d'un capteur ultrason HC-SR04.&lt;br /&gt;
Le développement du programme se fait sur STM32Cube.&lt;br /&gt;
Un premier programme à été mis en place sans difficultés pour récupérer les valeurs du HC-SR04 en s'appuyant sur l'exemple proposé par Arduino.&lt;br /&gt;
En revanche les problèmes sont arrivés lors du développement concernant la partie LoRaWAN. En effet STM32 propose un package LoRaWAN pour faciliter le développement d'application, le problème étant que ce package concerne seulement les cartes STM32LXXX. J'ai essayé longuement d'adapter ce package pour ma carte STM32F411RE en modifiant notamment le Makefile, les .flash mais aussi les fichiers d'inclusion sans succès malheureusement. La solution envisagée est donc un changement de carte au profit d'une STM32LXXX.&lt;br /&gt;
&lt;br /&gt;
Après changé notre carte pour une STM32L152RE, j'ai repris le package proposé par STM32 et dans le fichier Commissioning.h j'ai rensigné les clefs &lt;br /&gt;
 LORAWAN_APP_KEY&lt;br /&gt;
 LORAWAN_NWK_KEY&lt;br /&gt;
&lt;br /&gt;
Il n'y a que ces deux à renseigner étant donné que notre équipement fonctionne sur une version inférieur à la 1.1. A noter que le champ device EUI semble ne pas fonctionner. Nous avons du récuper l'EUI sur une gateway et renseigner ce dernier dans l'équipement que j'ai crée pour mon application sur l'interface web.&lt;br /&gt;
&lt;br /&gt;
Concernant le programme de l'équipement en lui même le programme est relativement simle, en se servant de la bibliothèque HAL je declare 3 PIN en input et je renvoie ainsi l'état des capteurs de manière périodique en me servant de la fonction &amp;quot;Send&amp;quot; du package STM32.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie application WEB===&lt;br /&gt;
&lt;br /&gt;
La principale difficulté de cette partie et l'absence totale de connaissances dans le développement d'application WEB. J'ai donc dû apprendre les langage HTML / CSS / PHP (quelques notions en JS) pour réaliser cette partie. Je disposais de quelques notions en base de données et SQL suit à mon année d'IMA3.&lt;br /&gt;
&lt;br /&gt;
Le but de l'application WEB est de permettre de rendre exploitable pour l'utilisateurs les informations renvoyés par les balises. Pour se faire l'application doit contenir une page de monitoring permettant de surveiller l'état de toutes les balises. De plus elle doit contenir une partie historique permettant d'accéder à l'historique d'une balise en particulier (en effectuant une recherche par id/localisation/date). Enfin elle doit aussi proposer une partie permettant d'afficher une carte avec dessus les balises et leur état.&lt;br /&gt;
&lt;br /&gt;
A l'aide de Bootstrap j'ai mis en place une application WEB avec ces trois partie. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie serveur d'application===&lt;br /&gt;
&lt;br /&gt;
====Mise en place de l'environnement====&lt;br /&gt;
&lt;br /&gt;
Concernant la partie serveur, j'ai mis en place sur une VM (172.26.189.23) un serveur apache et Postgres pour la gestion des bases mais aussi un interpreteur php.&lt;br /&gt;
Pour apache j'ai simplement mis tous mes fichiers html/php dans /var/www/html qui est le repertoir par defaut. Celui est configuré pour démarrer au lancement de la VM.&lt;br /&gt;
Concernant Postgres j'ai d'abord crée un nouvel utilisateur en me servant de l'utilisateur crée par defaut (su - postgres):&lt;br /&gt;
 createuser -d -P root (mdp: glopglop)&lt;br /&gt;
&lt;br /&gt;
Puis j'ai créé une nouvelle base:&lt;br /&gt;
 createdb -O root pfe&lt;br /&gt;
&lt;br /&gt;
Pour se connecter a la base:&lt;br /&gt;
 psql pfe (depuis l'utilsateur root ou postgres)&lt;br /&gt;
&lt;br /&gt;
Enfin j'y ai ajouté mes tables:&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE balises (ID serial PRIMARY KEY, Pays varchar(50) NOT NULL, Ville varchar(50) NOT NULL, Localisation varchar(50) NOT NULL, Coordonnees varchar(50) NOT NULL,Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE historique_balise (ID serial PRIMARY KEY, id_balise int NOT NULL, Date date NOT NULL, Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
La base contient deux tables, une première ayant pour clef primaire l'id de la balise et contenant des informations diverses sur cette dernière telles que le pays, la ville, la localisation, les coordonnée, le niveau d'eau mais surtout si cette dernière est sous l'eau ou non. La seconde table concerne l'historique des balises, elle a pour clef primaire l'indice du relevé et contient des informations comme le numéro de balise, la date du relevé etc, l'état de la balise etc..&lt;br /&gt;
&lt;br /&gt;
Pour la communication entre le serveur d'application et le serveur réseau, j'ai dans un premier temps mis en place un script python pour récuperer les relevés des capteurs via l'API REST:&lt;br /&gt;
 import requests&lt;br /&gt;
 import json&lt;br /&gt;
 #on recupere le token&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Content-Type': 'application/json',&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
 }&lt;br /&gt;
 data = '{&amp;quot;email&amp;quot;: &amp;quot;admin&amp;quot;,&amp;quot;password&amp;quot;: &amp;quot;admin&amp;quot; }'&lt;br /&gt;
 response = requests.post('http://172.26.189.22:8080/api/internal/login', headers=headers, data=data)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 #print(resp['jwt'])&lt;br /&gt;
 #diverses information sur un capteur&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
    'Grpc-Metadata-Authorization': 'Bearer'+resp['jwt'],&lt;br /&gt;
 }&lt;br /&gt;
 response = requests.get('http://172.26.189.22:8080/api/devices/0b00f4ff703a8fc5', headers=headers)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 print(resp)&lt;br /&gt;
&lt;br /&gt;
Ce script permet de un premier temps de récuperer le token pour avoir accés à l'API. Celui ci est a renseigner dans toute les requetes http. &lt;br /&gt;
En se connectant à l'API via l'interface graphique (172.26.189.22:8080/api), on peut récuperer toutes les requetes possible en cURL, j'ai donc simplement utilisé un convertisseur cURL vers python pour mettre mes requetes en place.&lt;br /&gt;
&lt;br /&gt;
Malheureusement cette solution permet de récuperer de nombreuses informations concernant l'application mais pas les relevés des capteurs. Pour récupérer ces derniers, je suis passé par l'interface graphique du serveur d'application (172.26.189.22:8080) afin d'ajouter une intégration HTTP. Il faut simplement spécifier le format de l'information (JSON dans mon cas) et l'URL à laquelle doit être envoyé la requête http POST. Dans mon cas cela sera:&lt;br /&gt;
 http://172.26.189.23/pfe/gestionPOST.php&lt;br /&gt;
&lt;br /&gt;
La base du fichier gestionPOST.php ressemble à cela: &lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 header(&amp;quot;content-type: application/json&amp;quot;);&lt;br /&gt;
 $json = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
 $obj = json_decode($json);&lt;br /&gt;
 $decoded = base64_decode(json_encode($obj-&amp;gt;data));&lt;br /&gt;
 $fp = @fopen(&amp;quot;toto.txt&amp;quot;,&amp;quot;a&amp;quot;);&lt;br /&gt;
 fwrite($fp,$decoded);&lt;br /&gt;
 fwrite($fp,&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
 fclose($fp);&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il permet via le flux php://input de récupérer le contenu de la requête POST et de l'afficher.&lt;br /&gt;
&lt;br /&gt;
La prochaine étape concerne la gestion des informations avec notamment l'ajout en base selon le type d'information recu.&lt;br /&gt;
&lt;br /&gt;
====Gestion des trames====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les trames sont envoyés au format suivant:&lt;br /&gt;
 id:niveau1:niveau2:niveau3&lt;br /&gt;
&lt;br /&gt;
A travers le script php permettant la gestion des requetes HTTP Post, en se servant de la fonction preg_match avec le regex suivant on peut récuperer toutes les informations necessaires au traitement:&lt;br /&gt;
 &amp;quot;#^([0-9]+):([0-1]{1}):([0-1]{1}):([0-1]{1})$#&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Chaque nouvelle mesure envoyée sur le serveur d'application est renseignée en base grace à la requêtes SQL suivante:&lt;br /&gt;
 UPDATE balises&lt;br /&gt;
 SET inondee=:in, niveau=:niv&lt;br /&gt;
 WHERE id=:id;&lt;br /&gt;
&lt;br /&gt;
Les requêtes en php sont réalisées par le biais des fonctions query, prepare et execute.&lt;br /&gt;
&lt;br /&gt;
Toutes les requêtes SQL sont regroupés dans un même fichier par soucis de clarté.&lt;br /&gt;
&lt;br /&gt;
Dès qu'une nouvelle mesures est transmise au script php, on récupère la date actuelle et on la compare avec le dernier relevé de cette balise enregistré dans la table historique, si le dernier relevé date de la veille on ajoute une nouvelle entrée dans la table historique_balise:&lt;br /&gt;
 &lt;br /&gt;
 $ajrd=date(&amp;quot;Y-m-d&amp;quot;);&lt;br /&gt;
 $requete=$bdd-&amp;gt;prepare('SELECT MAX(date) AS max_date&lt;br /&gt;
                         FROM historique_balise&lt;br /&gt;
                         WHERE id_balise=:id');&lt;br /&gt;
 $requete-&amp;gt;execute(array('id' =&amp;gt; $id));&lt;br /&gt;
 $resultat=$requete-&amp;gt;fetch();&lt;br /&gt;
 if($ajrd&amp;gt;$resultat['max_date']  || $resultat==FALSE){&lt;br /&gt;
      $requete=$bdd-&amp;gt;prepare('INSERT INTO historique_balise&lt;br /&gt;
                              VALUES (DEFAULT,:id,:d,:niv,:in)');&lt;br /&gt;
      $requete-&amp;gt;execute(array('id'=&amp;gt;$id,'d'=&amp;gt;$ajrd, 'niv'=&amp;gt;$niveau, 'in'=&amp;gt;$inondee));&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Lors d'une première entrée, la condition $resultat==false permet d'ajouter pour la première fois la balise dans l'historique&lt;br /&gt;
&lt;br /&gt;
====Affichage sur la carte====&lt;br /&gt;
&lt;br /&gt;
En passant par l'API google maps il est possible d'affichir une carte sur l'appplication web et d'apporter des modifications à cette dernière&lt;br /&gt;
&lt;br /&gt;
A l'aide de JavaScript, je peux afficher sur ma carte les balises ainsi que leur etat sur la carte. Pour se faire, avant que le code JS soit executé par le client, ce dernier est preparé par un code PHP permettant de parcourir la base et de recupérer les balises, leur état et leur coordonnées avant de les afficher avec un indice couleur selon leur niveau d'inondation:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 $reponse=$bdd-&amp;gt;query('SELECT COUNT(*) FROM balises');&lt;br /&gt;
 $nbMarqueur=$reponse-&amp;gt;fetch();&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 var nbMarqueur=&amp;lt;?php echo $nbMarqueur['count'];?&amp;gt;;&lt;br /&gt;
 var locations = new Array(nbMarqueur);&lt;br /&gt;
 var coordonnees, coord1, coord2;&lt;br /&gt;
 var heatMapData = new Array(nbMarqueur);&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
  $reponse=$bdd-&amp;gt;query('SELECT localisation, coordonnees, niveau FROM balises');&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 var infos =JSON.parse('&amp;lt;?php echo json_encode($reponse-&amp;gt;fetchAll(), true); ?&amp;gt;');&lt;br /&gt;
 console.log(nbMarqueur);&lt;br /&gt;
 for(var i=0; i&amp;lt;nbMarqueur; i++){&lt;br /&gt;
 locations[i]=new Array(4);&lt;br /&gt;
 locations[i][0]=infos[i]['localisation'];&lt;br /&gt;
 coordonnees=infos[i]['coordonnees'];&lt;br /&gt;
 var pos=coordonnees.indexOf(&amp;quot;,&amp;quot;);&lt;br /&gt;
 coord1=coordonnees.slice(0,pos-1);&lt;br /&gt;
 coord2=coordonnees.slice(pos+1);&lt;br /&gt;
 locations[i][1]=coord1;&lt;br /&gt;
 locations[i][2]=coord2,&lt;br /&gt;
 locations[i][3]=i;&lt;br /&gt;
 heatMapData[i]={location: new google.maps.LatLng(coord1, coord2), weight: infos[i]['niveau']};&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Gestion utilisateur====&lt;br /&gt;
&lt;br /&gt;
 Premièrement, la gestion utilisateur ne doit être accessible qu'aux personnes en ayant les droits, il est donc nécessaire de mettre en place un système de login. Tout se joue avec la fonction session_start(), avant d'envoyer la page concernant le gestion des capteurs au client, on verifie d'abord si ce dernier est connecté, i-e si la variable $_SESSION['login'] existe, sinon on redirige ce dernier vers l'ecran de connexion.&lt;br /&gt;
&lt;br /&gt;
L'utilisateur entre login et mot de passe et on compare ces derniers a ce qui est stocké dans la base de données. Par mesure de sécurité des données de l'utilisateur et en cas de faille de la base, le mot de passe est stocké en hashé.&lt;br /&gt;
Une fois connecté l'utilisateur à trois actions possibles, il peut ajouter une balise, modifier une balise et enfin supprimer une balise. En cas d'erreur de saisie, cette dernière est notifiée à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note a moi même: travail a effectuer en priorité:&lt;br /&gt;
 &lt;br /&gt;
 gerer la partie historique des balises en base (quasi fini, gérer les heures pour ajouter de manière plus fréquentes) FAIT&lt;br /&gt;
 mettre en place un mode administrateur sur l'appli pour par exemple ajouter ou retirer des balises (a voir si utile avec les profs) FAIT&lt;br /&gt;
 gerer sur la carte l'affichage des balises et l'etat de la route FAIT&lt;br /&gt;
 mettre toutes les requetes SQL dans un même fichier (fait pour la recherche historique) FAIT&lt;br /&gt;
 mise en place d'une appli android&lt;br /&gt;
 concevoir le capteur&lt;br /&gt;
 gestion ajout nouveau capteur (voir message down) FAIT&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85445</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85445"/>
				<updated>2021-01-07T16:33:58Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Affiche sur la carte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Début projet===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Mise en place du réseau===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se connecter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
 subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
 range 192.168.42.1 192.168.42.9&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La configuration du serveur réseau s'effectue en se connectant à ce dernier en ssh:&lt;br /&gt;
 root@192.168.42.10&lt;br /&gt;
Il faut installer le &amp;quot;gateway bridge&amp;quot;, le &amp;quot;network server&amp;quot; ainsi que &amp;quot;l'application server&amp;quot; disponible sur ChirpStack. Pour se faire nous avons suivi un tutoriel à l'adresse suivante:&lt;br /&gt;
 https://www.youtube.com/watch?v=FnTP7t47DlI&lt;br /&gt;
ainsi que la documentation fournie par ChirpStack&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pour accéder au serveur réseau, nous passons par l'interface web en se connectant à l'adresse suivante (en passant par une zabeth):&lt;br /&gt;
 172.26.189.22:8080 id: admin mdp: admin&lt;br /&gt;
&lt;br /&gt;
A partir de l'interface web, nous pouvons configurer de nombreux éléments:&lt;br /&gt;
&lt;br /&gt;
-Création d'un nouveau projet&lt;br /&gt;
&lt;br /&gt;
-Ajouter des équipements aux réseau à l'aide des clefs&lt;br /&gt;
&lt;br /&gt;
-Surveiller les informations qui circulent sur notre réseau&lt;br /&gt;
&lt;br /&gt;
-...&lt;br /&gt;
&lt;br /&gt;
Enfin, en nous connectant en ssh sur les deux gateways:&lt;br /&gt;
 antenne: 192.168.42.1 mdp:pdmk-062E7A&lt;br /&gt;
 passerelle intérieur: 192.168.42.2 mdp:pdmk-030970&lt;br /&gt;
Nous avons pu mettre à jour ces dernieres en suivant le wiki Kerlink&lt;br /&gt;
La connexion au wiki Kerlink s'effectue avec:&lt;br /&gt;
 Login : univlille&lt;br /&gt;
 Mot de passe : IYBlN7QF06&lt;br /&gt;
&lt;br /&gt;
===Test du réseau===&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de notre Network Server nous avons utilisé un module GPS LoRa du commerce. En se connectant a notre Network Server (172.26.189.22:8000) nous avons pu créer une nouvelle application et ajouté un nouvel équipement. Se faisant notre Network Server génère deux clefs, une &amp;quot;application key&amp;quot; et une &amp;quot;Network Key&amp;quot;. Ces deux clefs doivent être renseigné manuellement dans notre équipement. Pour se faire on peut le connecter à un ordinateur et y ajouter les clefs via son logiciel dédié. L'équipement possédant déjà un EUI permettant de reconnaître l'équipement, nous avons du renseigner ce dernier dans l'ajout de l'équipement sur le Network Server. Suite à ce test nous avons bien pu observer la circulation de nos trames et le bon fonctionnement de notre Network Server.&lt;br /&gt;
&lt;br /&gt;
===Fabrication du End-device===&lt;br /&gt;
&lt;br /&gt;
Pour le end-device je dispose d'une carte STM32F411RE, d'un shield SX1276MB1MAS et d'un capteur ultrason HC-SR04.&lt;br /&gt;
Le développement du programme se fait sur STM32Cube.&lt;br /&gt;
Un premier programme à été mis en place sans difficultés pour récupérer les valeurs du HC-SR04 en s'appuyant sur l'exemple proposé par Arduino.&lt;br /&gt;
En revanche les problèmes sont arrivés lors du développement concernant la partie LoRaWAN. En effet STM32 propose un package LoRaWAN pour faciliter le développement d'application, le problème étant que ce package concerne seulement les cartes STM32LXXX. J'ai essayé longuement d'adapter ce package pour ma carte STM32F411RE en modifiant notamment le Makefile, les .flash mais aussi les fichiers d'inclusion sans succès malheureusement. La solution envisagée est donc un changement de carte au profit d'une STM32LXXX.&lt;br /&gt;
&lt;br /&gt;
Après changé notre carte pour une STM32L152RE, j'ai repris le package proposé par STM32 et dans le fichier Commissioning.h j'ai rensigné les clefs &lt;br /&gt;
 LORAWAN_APP_KEY&lt;br /&gt;
 LORAWAN_NWK_KEY&lt;br /&gt;
&lt;br /&gt;
Il n'y a que ces deux à renseigner étant donné que notre équipement fonctionne sur une version inférieur à la 1.1. A noter que le champ device EUI semble ne pas fonctionner. Nous avons du récuper l'EUI sur une gateway et renseigner ce dernier dans l'équipement que j'ai crée pour mon application sur l'interface web.&lt;br /&gt;
&lt;br /&gt;
Concernant le programme de l'équipement en lui même le programme est relativement simle, en se servant de la bibliothèque HAL je declare 3 PIN en input et je renvoie ainsi l'état des capteurs de manière périodique en me servant de la fonction &amp;quot;Send&amp;quot; du package STM32.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie application WEB===&lt;br /&gt;
&lt;br /&gt;
La principale difficulté de cette partie et l'absence totale de connaissances dans le développement d'application WEB. J'ai donc dû apprendre les langage HTML / CSS / PHP (quelques notions en JS) pour réaliser cette partie. Je disposais de quelques notions en base de données et SQL suit à mon année d'IMA3.&lt;br /&gt;
&lt;br /&gt;
Le but de l'application WEB est de permettre de rendre exploitable pour l'utilisateurs les informations renvoyés par les balises. Pour se faire l'application doit contenir une page de monitoring permettant de surveiller l'état de toutes les balises. De plus elle doit contenir une partie historique permettant d'accéder à l'historique d'une balise en particulier (en effectuant une recherche par id/localisation/date). Enfin elle doit aussi proposer une partie permettant d'afficher une carte avec dessus les balises et leur état.&lt;br /&gt;
&lt;br /&gt;
A l'aide de Bootstrap j'ai mis en place une application WEB avec ces trois partie. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie serveur d'application===&lt;br /&gt;
&lt;br /&gt;
====Mise en place de l'environnement====&lt;br /&gt;
&lt;br /&gt;
Concernant la partie serveur, j'ai mis en place sur une VM (172.26.189.23) un serveur apache et Postgres pour la gestion des bases mais aussi un interpreteur php.&lt;br /&gt;
Pour apache j'ai simplement mis tous mes fichiers html/php dans /var/www/html qui est le repertoir par defaut. Celui est configuré pour démarrer au lancement de la VM.&lt;br /&gt;
Concernant Postgres j'ai d'abord crée un nouvel utilisateur en me servant de l'utilisateur crée par defaut (su - postgres):&lt;br /&gt;
 createuser -d -P root (mdp: glopglop)&lt;br /&gt;
&lt;br /&gt;
Puis j'ai créé une nouvelle base:&lt;br /&gt;
 createdb -O root pfe&lt;br /&gt;
&lt;br /&gt;
Pour se connecter a la base:&lt;br /&gt;
 psql pfe (depuis l'utilsateur root ou postgres)&lt;br /&gt;
&lt;br /&gt;
Enfin j'y ai ajouté mes tables:&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE balises (ID serial PRIMARY KEY, Pays varchar(50) NOT NULL, Ville varchar(50) NOT NULL, Localisation varchar(50) NOT NULL, Coordonnees varchar(50) NOT NULL,Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE historique_balise (ID serial PRIMARY KEY, id_balise int NOT NULL, Date date NOT NULL, Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
La base contient deux tables, une première ayant pour clef primaire l'id de la balise et contenant des informations diverses sur cette dernière telles que le pays, la ville, la localisation, les coordonnée, le niveau d'eau mais surtout si cette dernière est sous l'eau ou non. La seconde table concerne l'historique des balises, elle a pour clef primaire l'indice du relevé et contient des informations comme le numéro de balise, la date du relevé etc, l'état de la balise etc..&lt;br /&gt;
&lt;br /&gt;
Pour la communication entre le serveur d'application et le serveur réseau, j'ai dans un premier temps mis en place un script python pour récuperer les relevés des capteurs via l'API REST:&lt;br /&gt;
 import requests&lt;br /&gt;
 import json&lt;br /&gt;
 #on recupere le token&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Content-Type': 'application/json',&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
 }&lt;br /&gt;
 data = '{&amp;quot;email&amp;quot;: &amp;quot;admin&amp;quot;,&amp;quot;password&amp;quot;: &amp;quot;admin&amp;quot; }'&lt;br /&gt;
 response = requests.post('http://172.26.189.22:8080/api/internal/login', headers=headers, data=data)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 #print(resp['jwt'])&lt;br /&gt;
 #diverses information sur un capteur&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
    'Grpc-Metadata-Authorization': 'Bearer'+resp['jwt'],&lt;br /&gt;
 }&lt;br /&gt;
 response = requests.get('http://172.26.189.22:8080/api/devices/0b00f4ff703a8fc5', headers=headers)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 print(resp)&lt;br /&gt;
&lt;br /&gt;
Ce script permet de un premier temps de récuperer le token pour avoir accés à l'API. Celui ci est a renseigner dans toute les requetes http. &lt;br /&gt;
En se connectant à l'API via l'interface graphique (172.26.189.22:8080/api), on peut récuperer toutes les requetes possible en cURL, j'ai donc simplement utilisé un convertisseur cURL vers python pour mettre mes requetes en place.&lt;br /&gt;
&lt;br /&gt;
Malheureusement cette solution permet de récuperer de nombreuses informations concernant l'application mais pas les relevés des capteurs. Pour récupérer ces derniers, je suis passé par l'interface graphique du serveur d'application (172.26.189.22:8080) afin d'ajouter une intégration HTTP. Il faut simplement spécifier le format de l'information (JSON dans mon cas) et l'URL à laquelle doit être envoyé la requête http POST. Dans mon cas cela sera:&lt;br /&gt;
 http://172.26.189.23/pfe/gestionPOST.php&lt;br /&gt;
&lt;br /&gt;
La base du fichier gestionPOST.php ressemble à cela: &lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 header(&amp;quot;content-type: application/json&amp;quot;);&lt;br /&gt;
 $json = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
 $obj = json_decode($json);&lt;br /&gt;
 $decoded = base64_decode(json_encode($obj-&amp;gt;data));&lt;br /&gt;
 $fp = @fopen(&amp;quot;toto.txt&amp;quot;,&amp;quot;a&amp;quot;);&lt;br /&gt;
 fwrite($fp,$decoded);&lt;br /&gt;
 fwrite($fp,&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
 fclose($fp);&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il permet via le flux php://input de récupérer le contenu de la requête POST et de l'afficher.&lt;br /&gt;
&lt;br /&gt;
La prochaine étape concerne la gestion des informations avec notamment l'ajout en base selon le type d'information recu.&lt;br /&gt;
&lt;br /&gt;
====Gestion des trames====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les trames sont envoyés au format suivant:&lt;br /&gt;
 id:niveau1:niveau2:niveau3&lt;br /&gt;
&lt;br /&gt;
A travers le script php permettant la gestion des requetes HTTP Post, en se servant de la fonction preg_match avec le regex suivant on peut récuperer toutes les informations necessaires au traitement:&lt;br /&gt;
 &amp;quot;#^([0-9]+):([0-1]{1}):([0-1]{1}):([0-1]{1})$#&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Chaque nouvelle mesure envoyée sur le serveur d'application est renseignée en base grace à la requêtes SQL suivante:&lt;br /&gt;
 UPDATE balises&lt;br /&gt;
 SET inondee=:in, niveau=:niv&lt;br /&gt;
 WHERE id=:id;&lt;br /&gt;
&lt;br /&gt;
Les requêtes en php sont réalisées par le biais des fonctions query, prepare et execute.&lt;br /&gt;
&lt;br /&gt;
Toutes les requêtes SQL sont regroupés dans un même fichier par soucis de clarté.&lt;br /&gt;
&lt;br /&gt;
Dès qu'une nouvelle mesures est transmise au script php, on récupère la date actuelle et on la compare avec le dernier relevé de cette balise enregistré dans la table historique, si le dernier relevé date de la veille on ajoute une nouvelle entrée dans la table historique_balise:&lt;br /&gt;
 &lt;br /&gt;
 $ajrd=date(&amp;quot;Y-m-d&amp;quot;);&lt;br /&gt;
 $requete=$bdd-&amp;gt;prepare('SELECT MAX(date) AS max_date&lt;br /&gt;
                         FROM historique_balise&lt;br /&gt;
                         WHERE id_balise=:id');&lt;br /&gt;
 $requete-&amp;gt;execute(array('id' =&amp;gt; $id));&lt;br /&gt;
 $resultat=$requete-&amp;gt;fetch();&lt;br /&gt;
 if($ajrd&amp;gt;$resultat['max_date']  || $resultat==FALSE){&lt;br /&gt;
      $requete=$bdd-&amp;gt;prepare('INSERT INTO historique_balise&lt;br /&gt;
                              VALUES (DEFAULT,:id,:d,:niv,:in)');&lt;br /&gt;
      $requete-&amp;gt;execute(array('id'=&amp;gt;$id,'d'=&amp;gt;$ajrd, 'niv'=&amp;gt;$niveau, 'in'=&amp;gt;$inondee));&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Lors d'une première entrée, la condition $resultat==false permet d'ajouter pour la première fois la balise dans l'historique&lt;br /&gt;
&lt;br /&gt;
====Affichage sur la carte====&lt;br /&gt;
&lt;br /&gt;
En passant par l'API google maps il est possible d'affichir une carte sur l'appplication web et d'apporter des modifications à cette dernière&lt;br /&gt;
&lt;br /&gt;
A l'aide de JavaScript, je peux afficher sur ma carte les balises ainsi que leur etat sur la carte. Pour se faire, avant que le code JS soit executé par le client, ce dernier est preparé par un code PHP permettant de parcourir la base et de recupérer les balises, leur état et leur coordonnées avant de les afficher avec un indice couleur selon leur niveau d'inondation:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 $reponse=$bdd-&amp;gt;query('SELECT COUNT(*) FROM balises');&lt;br /&gt;
 $nbMarqueur=$reponse-&amp;gt;fetch();&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 var nbMarqueur=&amp;lt;?php echo $nbMarqueur['count'];?&amp;gt;;&lt;br /&gt;
 var locations = new Array(nbMarqueur);&lt;br /&gt;
 var coordonnees, coord1, coord2;&lt;br /&gt;
 var heatMapData = new Array(nbMarqueur);&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
  $reponse=$bdd-&amp;gt;query('SELECT localisation, coordonnees, niveau FROM balises');&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 var infos =JSON.parse('&amp;lt;?php echo json_encode($reponse-&amp;gt;fetchAll(), true); ?&amp;gt;');&lt;br /&gt;
 console.log(nbMarqueur);&lt;br /&gt;
 for(var i=0; i&amp;lt;nbMarqueur; i++){&lt;br /&gt;
 locations[i]=new Array(4);&lt;br /&gt;
 locations[i][0]=infos[i]['localisation'];&lt;br /&gt;
 coordonnees=infos[i]['coordonnees'];&lt;br /&gt;
 var pos=coordonnees.indexOf(&amp;quot;,&amp;quot;);&lt;br /&gt;
 coord1=coordonnees.slice(0,pos-1);&lt;br /&gt;
 coord2=coordonnees.slice(pos+1);&lt;br /&gt;
 locations[i][1]=coord1;&lt;br /&gt;
 locations[i][2]=coord2,&lt;br /&gt;
 locations[i][3]=i;&lt;br /&gt;
 heatMapData[i]={location: new google.maps.LatLng(coord1, coord2), weight: infos[i]['niveau']};&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note a moi même: travail a effectuer en priorité:&lt;br /&gt;
 &lt;br /&gt;
 gerer la partie historique des balises en base (quasi fini, gérer les heures pour ajouter de manière plus fréquentes)&lt;br /&gt;
 mettre en place un mode administrateur sur l'appli pour par exemple ajouter ou retirer des balises (a voir si utile avec les profs)&lt;br /&gt;
 gerer sur la carte l'affichage des balises et l'etat de la route&lt;br /&gt;
 mettre toutes les requetes SQL dans un même fichier (fait pour la recherche historique)&lt;br /&gt;
 mise en place d'une appli android&lt;br /&gt;
 concevoir le capteur&lt;br /&gt;
 gestion ajout nouveau capteur (voir message down)&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85444</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85444"/>
				<updated>2021-01-07T16:33:45Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Affiche sur la carte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Début projet===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Mise en place du réseau===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se connecter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
 subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
 range 192.168.42.1 192.168.42.9&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La configuration du serveur réseau s'effectue en se connectant à ce dernier en ssh:&lt;br /&gt;
 root@192.168.42.10&lt;br /&gt;
Il faut installer le &amp;quot;gateway bridge&amp;quot;, le &amp;quot;network server&amp;quot; ainsi que &amp;quot;l'application server&amp;quot; disponible sur ChirpStack. Pour se faire nous avons suivi un tutoriel à l'adresse suivante:&lt;br /&gt;
 https://www.youtube.com/watch?v=FnTP7t47DlI&lt;br /&gt;
ainsi que la documentation fournie par ChirpStack&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pour accéder au serveur réseau, nous passons par l'interface web en se connectant à l'adresse suivante (en passant par une zabeth):&lt;br /&gt;
 172.26.189.22:8080 id: admin mdp: admin&lt;br /&gt;
&lt;br /&gt;
A partir de l'interface web, nous pouvons configurer de nombreux éléments:&lt;br /&gt;
&lt;br /&gt;
-Création d'un nouveau projet&lt;br /&gt;
&lt;br /&gt;
-Ajouter des équipements aux réseau à l'aide des clefs&lt;br /&gt;
&lt;br /&gt;
-Surveiller les informations qui circulent sur notre réseau&lt;br /&gt;
&lt;br /&gt;
-...&lt;br /&gt;
&lt;br /&gt;
Enfin, en nous connectant en ssh sur les deux gateways:&lt;br /&gt;
 antenne: 192.168.42.1 mdp:pdmk-062E7A&lt;br /&gt;
 passerelle intérieur: 192.168.42.2 mdp:pdmk-030970&lt;br /&gt;
Nous avons pu mettre à jour ces dernieres en suivant le wiki Kerlink&lt;br /&gt;
La connexion au wiki Kerlink s'effectue avec:&lt;br /&gt;
 Login : univlille&lt;br /&gt;
 Mot de passe : IYBlN7QF06&lt;br /&gt;
&lt;br /&gt;
===Test du réseau===&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de notre Network Server nous avons utilisé un module GPS LoRa du commerce. En se connectant a notre Network Server (172.26.189.22:8000) nous avons pu créer une nouvelle application et ajouté un nouvel équipement. Se faisant notre Network Server génère deux clefs, une &amp;quot;application key&amp;quot; et une &amp;quot;Network Key&amp;quot;. Ces deux clefs doivent être renseigné manuellement dans notre équipement. Pour se faire on peut le connecter à un ordinateur et y ajouter les clefs via son logiciel dédié. L'équipement possédant déjà un EUI permettant de reconnaître l'équipement, nous avons du renseigner ce dernier dans l'ajout de l'équipement sur le Network Server. Suite à ce test nous avons bien pu observer la circulation de nos trames et le bon fonctionnement de notre Network Server.&lt;br /&gt;
&lt;br /&gt;
===Fabrication du End-device===&lt;br /&gt;
&lt;br /&gt;
Pour le end-device je dispose d'une carte STM32F411RE, d'un shield SX1276MB1MAS et d'un capteur ultrason HC-SR04.&lt;br /&gt;
Le développement du programme se fait sur STM32Cube.&lt;br /&gt;
Un premier programme à été mis en place sans difficultés pour récupérer les valeurs du HC-SR04 en s'appuyant sur l'exemple proposé par Arduino.&lt;br /&gt;
En revanche les problèmes sont arrivés lors du développement concernant la partie LoRaWAN. En effet STM32 propose un package LoRaWAN pour faciliter le développement d'application, le problème étant que ce package concerne seulement les cartes STM32LXXX. J'ai essayé longuement d'adapter ce package pour ma carte STM32F411RE en modifiant notamment le Makefile, les .flash mais aussi les fichiers d'inclusion sans succès malheureusement. La solution envisagée est donc un changement de carte au profit d'une STM32LXXX.&lt;br /&gt;
&lt;br /&gt;
Après changé notre carte pour une STM32L152RE, j'ai repris le package proposé par STM32 et dans le fichier Commissioning.h j'ai rensigné les clefs &lt;br /&gt;
 LORAWAN_APP_KEY&lt;br /&gt;
 LORAWAN_NWK_KEY&lt;br /&gt;
&lt;br /&gt;
Il n'y a que ces deux à renseigner étant donné que notre équipement fonctionne sur une version inférieur à la 1.1. A noter que le champ device EUI semble ne pas fonctionner. Nous avons du récuper l'EUI sur une gateway et renseigner ce dernier dans l'équipement que j'ai crée pour mon application sur l'interface web.&lt;br /&gt;
&lt;br /&gt;
Concernant le programme de l'équipement en lui même le programme est relativement simle, en se servant de la bibliothèque HAL je declare 3 PIN en input et je renvoie ainsi l'état des capteurs de manière périodique en me servant de la fonction &amp;quot;Send&amp;quot; du package STM32.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie application WEB===&lt;br /&gt;
&lt;br /&gt;
La principale difficulté de cette partie et l'absence totale de connaissances dans le développement d'application WEB. J'ai donc dû apprendre les langage HTML / CSS / PHP (quelques notions en JS) pour réaliser cette partie. Je disposais de quelques notions en base de données et SQL suit à mon année d'IMA3.&lt;br /&gt;
&lt;br /&gt;
Le but de l'application WEB est de permettre de rendre exploitable pour l'utilisateurs les informations renvoyés par les balises. Pour se faire l'application doit contenir une page de monitoring permettant de surveiller l'état de toutes les balises. De plus elle doit contenir une partie historique permettant d'accéder à l'historique d'une balise en particulier (en effectuant une recherche par id/localisation/date). Enfin elle doit aussi proposer une partie permettant d'afficher une carte avec dessus les balises et leur état.&lt;br /&gt;
&lt;br /&gt;
A l'aide de Bootstrap j'ai mis en place une application WEB avec ces trois partie. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie serveur d'application===&lt;br /&gt;
&lt;br /&gt;
====Mise en place de l'environnement====&lt;br /&gt;
&lt;br /&gt;
Concernant la partie serveur, j'ai mis en place sur une VM (172.26.189.23) un serveur apache et Postgres pour la gestion des bases mais aussi un interpreteur php.&lt;br /&gt;
Pour apache j'ai simplement mis tous mes fichiers html/php dans /var/www/html qui est le repertoir par defaut. Celui est configuré pour démarrer au lancement de la VM.&lt;br /&gt;
Concernant Postgres j'ai d'abord crée un nouvel utilisateur en me servant de l'utilisateur crée par defaut (su - postgres):&lt;br /&gt;
 createuser -d -P root (mdp: glopglop)&lt;br /&gt;
&lt;br /&gt;
Puis j'ai créé une nouvelle base:&lt;br /&gt;
 createdb -O root pfe&lt;br /&gt;
&lt;br /&gt;
Pour se connecter a la base:&lt;br /&gt;
 psql pfe (depuis l'utilsateur root ou postgres)&lt;br /&gt;
&lt;br /&gt;
Enfin j'y ai ajouté mes tables:&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE balises (ID serial PRIMARY KEY, Pays varchar(50) NOT NULL, Ville varchar(50) NOT NULL, Localisation varchar(50) NOT NULL, Coordonnees varchar(50) NOT NULL,Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE historique_balise (ID serial PRIMARY KEY, id_balise int NOT NULL, Date date NOT NULL, Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
La base contient deux tables, une première ayant pour clef primaire l'id de la balise et contenant des informations diverses sur cette dernière telles que le pays, la ville, la localisation, les coordonnée, le niveau d'eau mais surtout si cette dernière est sous l'eau ou non. La seconde table concerne l'historique des balises, elle a pour clef primaire l'indice du relevé et contient des informations comme le numéro de balise, la date du relevé etc, l'état de la balise etc..&lt;br /&gt;
&lt;br /&gt;
Pour la communication entre le serveur d'application et le serveur réseau, j'ai dans un premier temps mis en place un script python pour récuperer les relevés des capteurs via l'API REST:&lt;br /&gt;
 import requests&lt;br /&gt;
 import json&lt;br /&gt;
 #on recupere le token&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Content-Type': 'application/json',&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
 }&lt;br /&gt;
 data = '{&amp;quot;email&amp;quot;: &amp;quot;admin&amp;quot;,&amp;quot;password&amp;quot;: &amp;quot;admin&amp;quot; }'&lt;br /&gt;
 response = requests.post('http://172.26.189.22:8080/api/internal/login', headers=headers, data=data)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 #print(resp['jwt'])&lt;br /&gt;
 #diverses information sur un capteur&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
    'Grpc-Metadata-Authorization': 'Bearer'+resp['jwt'],&lt;br /&gt;
 }&lt;br /&gt;
 response = requests.get('http://172.26.189.22:8080/api/devices/0b00f4ff703a8fc5', headers=headers)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 print(resp)&lt;br /&gt;
&lt;br /&gt;
Ce script permet de un premier temps de récuperer le token pour avoir accés à l'API. Celui ci est a renseigner dans toute les requetes http. &lt;br /&gt;
En se connectant à l'API via l'interface graphique (172.26.189.22:8080/api), on peut récuperer toutes les requetes possible en cURL, j'ai donc simplement utilisé un convertisseur cURL vers python pour mettre mes requetes en place.&lt;br /&gt;
&lt;br /&gt;
Malheureusement cette solution permet de récuperer de nombreuses informations concernant l'application mais pas les relevés des capteurs. Pour récupérer ces derniers, je suis passé par l'interface graphique du serveur d'application (172.26.189.22:8080) afin d'ajouter une intégration HTTP. Il faut simplement spécifier le format de l'information (JSON dans mon cas) et l'URL à laquelle doit être envoyé la requête http POST. Dans mon cas cela sera:&lt;br /&gt;
 http://172.26.189.23/pfe/gestionPOST.php&lt;br /&gt;
&lt;br /&gt;
La base du fichier gestionPOST.php ressemble à cela: &lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 header(&amp;quot;content-type: application/json&amp;quot;);&lt;br /&gt;
 $json = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
 $obj = json_decode($json);&lt;br /&gt;
 $decoded = base64_decode(json_encode($obj-&amp;gt;data));&lt;br /&gt;
 $fp = @fopen(&amp;quot;toto.txt&amp;quot;,&amp;quot;a&amp;quot;);&lt;br /&gt;
 fwrite($fp,$decoded);&lt;br /&gt;
 fwrite($fp,&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
 fclose($fp);&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il permet via le flux php://input de récupérer le contenu de la requête POST et de l'afficher.&lt;br /&gt;
&lt;br /&gt;
La prochaine étape concerne la gestion des informations avec notamment l'ajout en base selon le type d'information recu.&lt;br /&gt;
&lt;br /&gt;
====Gestion des trames====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les trames sont envoyés au format suivant:&lt;br /&gt;
 id:niveau1:niveau2:niveau3&lt;br /&gt;
&lt;br /&gt;
A travers le script php permettant la gestion des requetes HTTP Post, en se servant de la fonction preg_match avec le regex suivant on peut récuperer toutes les informations necessaires au traitement:&lt;br /&gt;
 &amp;quot;#^([0-9]+):([0-1]{1}):([0-1]{1}):([0-1]{1})$#&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Chaque nouvelle mesure envoyée sur le serveur d'application est renseignée en base grace à la requêtes SQL suivante:&lt;br /&gt;
 UPDATE balises&lt;br /&gt;
 SET inondee=:in, niveau=:niv&lt;br /&gt;
 WHERE id=:id;&lt;br /&gt;
&lt;br /&gt;
Les requêtes en php sont réalisées par le biais des fonctions query, prepare et execute.&lt;br /&gt;
&lt;br /&gt;
Toutes les requêtes SQL sont regroupés dans un même fichier par soucis de clarté.&lt;br /&gt;
&lt;br /&gt;
Dès qu'une nouvelle mesures est transmise au script php, on récupère la date actuelle et on la compare avec le dernier relevé de cette balise enregistré dans la table historique, si le dernier relevé date de la veille on ajoute une nouvelle entrée dans la table historique_balise:&lt;br /&gt;
 &lt;br /&gt;
 $ajrd=date(&amp;quot;Y-m-d&amp;quot;);&lt;br /&gt;
 $requete=$bdd-&amp;gt;prepare('SELECT MAX(date) AS max_date&lt;br /&gt;
                         FROM historique_balise&lt;br /&gt;
                         WHERE id_balise=:id');&lt;br /&gt;
 $requete-&amp;gt;execute(array('id' =&amp;gt; $id));&lt;br /&gt;
 $resultat=$requete-&amp;gt;fetch();&lt;br /&gt;
 if($ajrd&amp;gt;$resultat['max_date']  || $resultat==FALSE){&lt;br /&gt;
      $requete=$bdd-&amp;gt;prepare('INSERT INTO historique_balise&lt;br /&gt;
                              VALUES (DEFAULT,:id,:d,:niv,:in)');&lt;br /&gt;
      $requete-&amp;gt;execute(array('id'=&amp;gt;$id,'d'=&amp;gt;$ajrd, 'niv'=&amp;gt;$niveau, 'in'=&amp;gt;$inondee));&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Lors d'une première entrée, la condition $resultat==false permet d'ajouter pour la première fois la balise dans l'historique&lt;br /&gt;
&lt;br /&gt;
====Affiche sur la carte====&lt;br /&gt;
&lt;br /&gt;
En passant par l'API google maps il est possible d'affichir une carte sur l'appplication web et d'apporter des modifications à cette dernière&lt;br /&gt;
&lt;br /&gt;
A l'aide de JavaScript, je peux afficher sur ma carte les balises ainsi que leur etat sur la carte. Pour se faire, avant que le code JS soit executé par le client, ce dernier est preparé par un code PHP permettant de parcourir la base et de recupérer les balises, leur état et leur coordonnées avant de les afficher avec un indice couleur selon leur niveau d'inondation:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 $reponse=$bdd-&amp;gt;query('SELECT COUNT(*) FROM balises');&lt;br /&gt;
 $nbMarqueur=$reponse-&amp;gt;fetch();&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 var nbMarqueur=&amp;lt;?php echo $nbMarqueur['count'];?&amp;gt;;&lt;br /&gt;
 var locations = new Array(nbMarqueur);&lt;br /&gt;
 var coordonnees, coord1, coord2;&lt;br /&gt;
 var heatMapData = new Array(nbMarqueur);&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
  $reponse=$bdd-&amp;gt;query('SELECT localisation, coordonnees, niveau FROM balises');&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 var infos =JSON.parse('&amp;lt;?php echo json_encode($reponse-&amp;gt;fetchAll(), true); ?&amp;gt;');&lt;br /&gt;
 console.log(nbMarqueur);&lt;br /&gt;
 for(var i=0; i&amp;lt;nbMarqueur; i++){&lt;br /&gt;
 locations[i]=new Array(4);&lt;br /&gt;
 locations[i][0]=infos[i]['localisation'];&lt;br /&gt;
 coordonnees=infos[i]['coordonnees'];&lt;br /&gt;
 var pos=coordonnees.indexOf(&amp;quot;,&amp;quot;);&lt;br /&gt;
 coord1=coordonnees.slice(0,pos-1);&lt;br /&gt;
 coord2=coordonnees.slice(pos+1);&lt;br /&gt;
 locations[i][1]=coord1;&lt;br /&gt;
 locations[i][2]=coord2,&lt;br /&gt;
 locations[i][3]=i;&lt;br /&gt;
 heatMapData[i]={location: new google.maps.LatLng(coord1, coord2), weight: infos[i]['niveau']};&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note a moi même: travail a effectuer en priorité:&lt;br /&gt;
 &lt;br /&gt;
 gerer la partie historique des balises en base (quasi fini, gérer les heures pour ajouter de manière plus fréquentes)&lt;br /&gt;
 mettre en place un mode administrateur sur l'appli pour par exemple ajouter ou retirer des balises (a voir si utile avec les profs)&lt;br /&gt;
 gerer sur la carte l'affichage des balises et l'etat de la route&lt;br /&gt;
 mettre toutes les requetes SQL dans un même fichier (fait pour la recherche historique)&lt;br /&gt;
 mise en place d'une appli android&lt;br /&gt;
 concevoir le capteur&lt;br /&gt;
 gestion ajout nouveau capteur (voir message down)&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85350</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85350"/>
				<updated>2020-12-10T19:32:37Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Partie serveur d'application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Début projet===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Mise en place du réseau===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se connecter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
 subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
 range 192.168.42.1 192.168.42.9&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La configuration du serveur réseau s'effectue en se connectant à ce dernier en ssh:&lt;br /&gt;
 root@192.168.42.10&lt;br /&gt;
Il faut installer le &amp;quot;gateway bridge&amp;quot;, le &amp;quot;network server&amp;quot; ainsi que &amp;quot;l'application server&amp;quot; disponible sur ChirpStack. Pour se faire nous avons suivi un tutoriel à l'adresse suivante:&lt;br /&gt;
 https://www.youtube.com/watch?v=FnTP7t47DlI&lt;br /&gt;
ainsi que la documentation fournie par ChirpStack&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pour accéder au serveur réseau, nous passons par l'interface web en se connectant à l'adresse suivante (en passant par une zabeth):&lt;br /&gt;
 172.26.189.22:8080 id: admin mdp: admin&lt;br /&gt;
&lt;br /&gt;
A partir de l'interface web, nous pouvons configurer de nombreux éléments:&lt;br /&gt;
&lt;br /&gt;
-Création d'un nouveau projet&lt;br /&gt;
&lt;br /&gt;
-Ajouter des équipements aux réseau à l'aide des clefs&lt;br /&gt;
&lt;br /&gt;
-Surveiller les informations qui circulent sur notre réseau&lt;br /&gt;
&lt;br /&gt;
-...&lt;br /&gt;
&lt;br /&gt;
Enfin, en nous connectant en ssh sur les deux gateways:&lt;br /&gt;
 antenne: 192.168.42.1 mdp:pdmk-062E7A&lt;br /&gt;
 passerelle intérieur: 192.168.42.2 mdp:pdmk-030970&lt;br /&gt;
Nous avons pu mettre à jour ces dernieres en suivant le wiki Kerlink&lt;br /&gt;
La connexion au wiki Kerlink s'effectue avec:&lt;br /&gt;
 Login : univlille&lt;br /&gt;
 Mot de passe : IYBlN7QF06&lt;br /&gt;
&lt;br /&gt;
===Test du réseau===&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de notre Network Server nous avons utilisé un module GPS LoRa du commerce. En se connectant a notre Network Server (172.26.189.22:8000) nous avons pu créer une nouvelle application et ajouté un nouvel équipement. Se faisant notre Network Server génère deux clefs, une &amp;quot;application key&amp;quot; et une &amp;quot;Network Key&amp;quot;. Ces deux clefs doivent être renseigné manuellement dans notre équipement. Pour se faire on peut le connecter à un ordinateur et y ajouter les clefs via son logiciel dédié. L'équipement possédant déjà un EUI permettant de reconnaître l'équipement, nous avons du renseigner ce dernier dans l'ajout de l'équipement sur le Network Server. Suite à ce test nous avons bien pu observer la circulation de nos trames et le bon fonctionnement de notre Network Server.&lt;br /&gt;
&lt;br /&gt;
===Fabrication du End-device===&lt;br /&gt;
&lt;br /&gt;
Pour le end-device je dispose d'une carte STM32F411RE, d'un shield SX1276MB1MAS et d'un capteur ultrason HC-SR04.&lt;br /&gt;
Le développement du programme se fait sur STM32Cube.&lt;br /&gt;
Un premier programme à été mis en place sans difficultés pour récupérer les valeurs du HC-SR04 en s'appuyant sur l'exemple proposé par Arduino.&lt;br /&gt;
En revanche les problèmes sont arrivés lors du développement concernant la partie LoRaWAN. En effet STM32 propose un package LoRaWAN pour faciliter le développement d'application, le problème étant que ce package concerne seulement les cartes STM32LXXX. J'ai essayé longuement d'adapter ce package pour ma carte STM32F411RE en modifiant notamment le Makefile, les .flash mais aussi les fichiers d'inclusion sans succès malheureusement. La solution envisagée est donc un changement de carte au profit d'une STM32LXXX.&lt;br /&gt;
&lt;br /&gt;
Après changé notre carte pour une STM32L152RE, j'ai repris le package proposé par STM32 et dans le fichier Commissioning.h j'ai rensigné les clefs &lt;br /&gt;
 LORAWAN_APP_KEY&lt;br /&gt;
 LORAWAN_NWK_KEY&lt;br /&gt;
&lt;br /&gt;
Il n'y a que ces deux à renseigner étant donné que notre équipement fonctionne sur une version inférieur à la 1.1. A noter que le champ device EUI semble ne pas fonctionner. Nous avons du récuper l'EUI sur une gateway et renseigner ce dernier dans l'équipement que j'ai crée pour mon application sur l'interface web.&lt;br /&gt;
&lt;br /&gt;
Concernant le programme de l'équipement en lui même le programme est relativement simle, en se servant de la bibliothèque HAL je declare 3 PIN en input et je renvoie ainsi l'état des capteurs de manière périodique en me servant de la fonction &amp;quot;Send&amp;quot; du package STM32.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie application WEB===&lt;br /&gt;
&lt;br /&gt;
La principale difficulté de cette partie et l'absence totale de connaissances dans le développement d'application WEB. J'ai donc dû apprendre les langage HTML / CSS / PHP (quelques notions en JS) pour réaliser cette partie. Je disposais de quelques notions en base de données et SQL suit à mon année d'IMA3.&lt;br /&gt;
&lt;br /&gt;
Le but de l'application WEB est de permettre de rendre exploitable pour l'utilisateurs les informations renvoyés par les balises. Pour se faire l'application doit contenir une page de monitoring permettant de surveiller l'état de toutes les balises. De plus elle doit contenir une partie historique permettant d'accéder à l'historique d'une balise en particulier (en effectuant une recherche par id/localisation/date). Enfin elle doit aussi proposer une partie permettant d'afficher une carte avec dessus les balises et leur état.&lt;br /&gt;
&lt;br /&gt;
A l'aide de Bootstrap j'ai mis en place une application WEB avec ces trois partie. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie serveur d'application===&lt;br /&gt;
&lt;br /&gt;
====Mise en place de l'environnement====&lt;br /&gt;
&lt;br /&gt;
Concernant la partie serveur, j'ai mis en place sur une VM (172.26.189.23) un serveur apache et Postgres pour la gestion des bases mais aussi un interpreteur php.&lt;br /&gt;
Pour apache j'ai simplement mis tous mes fichiers html/php dans /var/www/html qui est le repertoir par defaut. Celui est configuré pour démarrer au lancement de la VM.&lt;br /&gt;
Concernant Postgres j'ai d'abord crée un nouvel utilisateur en me servant de l'utilisateur crée par defaut (su - postgres):&lt;br /&gt;
 createuser -d -P root (mdp: glopglop)&lt;br /&gt;
&lt;br /&gt;
Puis j'ai créé une nouvelle base:&lt;br /&gt;
 createdb -O root pfe&lt;br /&gt;
&lt;br /&gt;
Pour se connecter a la base:&lt;br /&gt;
 psql pfe (depuis l'utilsateur root ou postgres)&lt;br /&gt;
&lt;br /&gt;
Enfin j'y ai ajouté mes tables:&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE balises (ID serial PRIMARY KEY, Pays varchar(50) NOT NULL, Ville varchar(50) NOT NULL, Localisation varchar(50) NOT NULL, Coordonnees varchar(50) NOT NULL,Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE historique_balise (ID serial PRIMARY KEY, id_balise int NOT NULL, Date date NOT NULL, Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
La base contient deux tables, une première ayant pour clef primaire l'id de la balise et contenant des informations diverses sur cette dernière telles que le pays, la ville, la localisation, les coordonnée, le niveau d'eau mais surtout si cette dernière est sous l'eau ou non. La seconde table concerne l'historique des balises, elle a pour clef primaire l'indice du relevé et contient des informations comme le numéro de balise, la date du relevé etc, l'état de la balise etc..&lt;br /&gt;
&lt;br /&gt;
Pour la communication entre le serveur d'application et le serveur réseau, j'ai dans un premier temps mis en place un script python pour récuperer les relevés des capteurs via l'API REST:&lt;br /&gt;
 import requests&lt;br /&gt;
 import json&lt;br /&gt;
 #on recupere le token&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Content-Type': 'application/json',&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
 }&lt;br /&gt;
 data = '{&amp;quot;email&amp;quot;: &amp;quot;admin&amp;quot;,&amp;quot;password&amp;quot;: &amp;quot;admin&amp;quot; }'&lt;br /&gt;
 response = requests.post('http://172.26.189.22:8080/api/internal/login', headers=headers, data=data)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 #print(resp['jwt'])&lt;br /&gt;
 #diverses information sur un capteur&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
    'Grpc-Metadata-Authorization': 'Bearer'+resp['jwt'],&lt;br /&gt;
 }&lt;br /&gt;
 response = requests.get('http://172.26.189.22:8080/api/devices/0b00f4ff703a8fc5', headers=headers)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 print(resp)&lt;br /&gt;
&lt;br /&gt;
Ce script permet de un premier temps de récuperer le token pour avoir accés à l'API. Celui ci est a renseigner dans toute les requetes http. &lt;br /&gt;
En se connectant à l'API via l'interface graphique (172.26.189.22:8080/api), on peut récuperer toutes les requetes possible en cURL, j'ai donc simplement utilisé un convertisseur cURL vers python pour mettre mes requetes en place.&lt;br /&gt;
&lt;br /&gt;
Malheureusement cette solution permet de récuperer de nombreuses informations concernant l'application mais pas les relevés des capteurs. Pour récupérer ces derniers, je suis passé par l'interface graphique du serveur d'application (172.26.189.22:8080) afin d'ajouter une intégration HTTP. Il faut simplement spécifier le format de l'information (JSON dans mon cas) et l'URL à laquelle doit être envoyé la requête http POST. Dans mon cas cela sera:&lt;br /&gt;
 http://172.26.189.23/pfe/gestionPOST.php&lt;br /&gt;
&lt;br /&gt;
La base du fichier gestionPOST.php ressemble à cela: &lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 header(&amp;quot;content-type: application/json&amp;quot;);&lt;br /&gt;
 $json = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
 $obj = json_decode($json);&lt;br /&gt;
 $decoded = base64_decode(json_encode($obj-&amp;gt;data));&lt;br /&gt;
 $fp = @fopen(&amp;quot;toto.txt&amp;quot;,&amp;quot;a&amp;quot;);&lt;br /&gt;
 fwrite($fp,$decoded);&lt;br /&gt;
 fwrite($fp,&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
 fclose($fp);&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il permet via le flux php://input de récupérer le contenu de la requête POST et de l'afficher.&lt;br /&gt;
&lt;br /&gt;
La prochaine étape concerne la gestion des informations avec notamment l'ajout en base selon le type d'information recu.&lt;br /&gt;
&lt;br /&gt;
====Gestion des trames====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les trames sont envoyés au format suivant:&lt;br /&gt;
 id:niveau1:niveau2:niveau3&lt;br /&gt;
&lt;br /&gt;
A travers le script php permettant la gestion des requetes HTTP Post, en se servant de la fonction preg_match avec le regex suivant on peut récuperer toutes les informations necessaires au traitement:&lt;br /&gt;
 &amp;quot;#^([0-9]+):([0-1]{1}):([0-1]{1}):([0-1]{1})$#&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Chaque nouvelle mesure envoyée sur le serveur d'application est renseignée en base grace à la requêtes SQL suivante:&lt;br /&gt;
 UPDATE balises&lt;br /&gt;
 SET inondee=:in, niveau=:niv&lt;br /&gt;
 WHERE id=:id;&lt;br /&gt;
&lt;br /&gt;
Les requêtes en php sont réalisées par le biais des fonctions query, prepare et execute.&lt;br /&gt;
&lt;br /&gt;
Toutes les requêtes SQL sont regroupés dans un même fichier par soucis de clarté.&lt;br /&gt;
&lt;br /&gt;
Dès qu'une nouvelle mesures est transmise au script php, on récupère la date actuelle et on la compare avec le dernier relevé de cette balise enregistré dans la table historique, si le dernier relevé date de la veille on ajoute une nouvelle entrée dans la table historique_balise:&lt;br /&gt;
 &lt;br /&gt;
 $ajrd=date(&amp;quot;Y-m-d&amp;quot;);&lt;br /&gt;
 $requete=$bdd-&amp;gt;prepare('SELECT MAX(date) AS max_date&lt;br /&gt;
                         FROM historique_balise&lt;br /&gt;
                         WHERE id_balise=:id');&lt;br /&gt;
 $requete-&amp;gt;execute(array('id' =&amp;gt; $id));&lt;br /&gt;
 $resultat=$requete-&amp;gt;fetch();&lt;br /&gt;
 if($ajrd&amp;gt;$resultat['max_date']  || $resultat==FALSE){&lt;br /&gt;
      $requete=$bdd-&amp;gt;prepare('INSERT INTO historique_balise&lt;br /&gt;
                              VALUES (DEFAULT,:id,:d,:niv,:in)');&lt;br /&gt;
      $requete-&amp;gt;execute(array('id'=&amp;gt;$id,'d'=&amp;gt;$ajrd, 'niv'=&amp;gt;$niveau, 'in'=&amp;gt;$inondee));&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Lors d'une première entrée, la condition $resultat==false permet d'ajouter pour la première fois la balise dans l'historique&lt;br /&gt;
&lt;br /&gt;
====Affiche sur la carte====&lt;br /&gt;
&lt;br /&gt;
En passant par l'API google maps il est possible d'affichier une carte sur l'appplication web et d'apporter des modifications à cette dernière&lt;br /&gt;
&lt;br /&gt;
Note a moi même: travail a effectuer en priorité:&lt;br /&gt;
 &lt;br /&gt;
 gerer la partie historique des balises en base (quasi fini, gérer les heures pour ajouter de manière plus fréquentes)&lt;br /&gt;
 mettre en place un mode administrateur sur l'appli pour par exemple ajouter ou retirer des balises (a voir si utile avec les profs)&lt;br /&gt;
 gerer sur la carte l'affichage des balises et l'etat de la route&lt;br /&gt;
 mettre toutes les requetes SQL dans un même fichier (fait pour la recherche historique)&lt;br /&gt;
 mise en place d'une appli android&lt;br /&gt;
 concevoir le capteur&lt;br /&gt;
 gestion ajout nouveau capteur (voir message down)&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85349</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85349"/>
				<updated>2020-12-09T17:45:03Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Gestion des trames */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Début projet===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Mise en place du réseau===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se connecter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
 subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
 range 192.168.42.1 192.168.42.9&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La configuration du serveur réseau s'effectue en se connectant à ce dernier en ssh:&lt;br /&gt;
 root@192.168.42.10&lt;br /&gt;
Il faut installer le &amp;quot;gateway bridge&amp;quot;, le &amp;quot;network server&amp;quot; ainsi que &amp;quot;l'application server&amp;quot; disponible sur ChirpStack. Pour se faire nous avons suivi un tutoriel à l'adresse suivante:&lt;br /&gt;
 https://www.youtube.com/watch?v=FnTP7t47DlI&lt;br /&gt;
ainsi que la documentation fournie par ChirpStack&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pour accéder au serveur réseau, nous passons par l'interface web en se connectant à l'adresse suivante (en passant par une zabeth):&lt;br /&gt;
 172.26.189.22:8080 id: admin mdp: admin&lt;br /&gt;
&lt;br /&gt;
A partir de l'interface web, nous pouvons configurer de nombreux éléments:&lt;br /&gt;
&lt;br /&gt;
-Création d'un nouveau projet&lt;br /&gt;
&lt;br /&gt;
-Ajouter des équipements aux réseau à l'aide des clefs&lt;br /&gt;
&lt;br /&gt;
-Surveiller les informations qui circulent sur notre réseau&lt;br /&gt;
&lt;br /&gt;
-...&lt;br /&gt;
&lt;br /&gt;
Enfin, en nous connectant en ssh sur les deux gateways:&lt;br /&gt;
 antenne: 192.168.42.1 mdp:pdmk-062E7A&lt;br /&gt;
 passerelle intérieur: 192.168.42.2 mdp:pdmk-030970&lt;br /&gt;
Nous avons pu mettre à jour ces dernieres en suivant le wiki Kerlink&lt;br /&gt;
La connexion au wiki Kerlink s'effectue avec:&lt;br /&gt;
 Login : univlille&lt;br /&gt;
 Mot de passe : IYBlN7QF06&lt;br /&gt;
&lt;br /&gt;
===Test du réseau===&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de notre Network Server nous avons utilisé un module GPS LoRa du commerce. En se connectant a notre Network Server (172.26.189.22:8000) nous avons pu créer une nouvelle application et ajouté un nouvel équipement. Se faisant notre Network Server génère deux clefs, une &amp;quot;application key&amp;quot; et une &amp;quot;Network Key&amp;quot;. Ces deux clefs doivent être renseigné manuellement dans notre équipement. Pour se faire on peut le connecter à un ordinateur et y ajouter les clefs via son logiciel dédié. L'équipement possédant déjà un EUI permettant de reconnaître l'équipement, nous avons du renseigner ce dernier dans l'ajout de l'équipement sur le Network Server. Suite à ce test nous avons bien pu observer la circulation de nos trames et le bon fonctionnement de notre Network Server.&lt;br /&gt;
&lt;br /&gt;
===Fabrication du End-device===&lt;br /&gt;
&lt;br /&gt;
Pour le end-device je dispose d'une carte STM32F411RE, d'un shield SX1276MB1MAS et d'un capteur ultrason HC-SR04.&lt;br /&gt;
Le développement du programme se fait sur STM32Cube.&lt;br /&gt;
Un premier programme à été mis en place sans difficultés pour récupérer les valeurs du HC-SR04 en s'appuyant sur l'exemple proposé par Arduino.&lt;br /&gt;
En revanche les problèmes sont arrivés lors du développement concernant la partie LoRaWAN. En effet STM32 propose un package LoRaWAN pour faciliter le développement d'application, le problème étant que ce package concerne seulement les cartes STM32LXXX. J'ai essayé longuement d'adapter ce package pour ma carte STM32F411RE en modifiant notamment le Makefile, les .flash mais aussi les fichiers d'inclusion sans succès malheureusement. La solution envisagée est donc un changement de carte au profit d'une STM32LXXX.&lt;br /&gt;
&lt;br /&gt;
Après changé notre carte pour une STM32L152RE, j'ai repris le package proposé par STM32 et dans le fichier Commissioning.h j'ai rensigné les clefs &lt;br /&gt;
 LORAWAN_APP_KEY&lt;br /&gt;
 LORAWAN_NWK_KEY&lt;br /&gt;
&lt;br /&gt;
Il n'y a que ces deux à renseigner étant donné que notre équipement fonctionne sur une version inférieur à la 1.1. A noter que le champ device EUI semble ne pas fonctionner. Nous avons du récuper l'EUI sur une gateway et renseigner ce dernier dans l'équipement que j'ai crée pour mon application sur l'interface web.&lt;br /&gt;
&lt;br /&gt;
Concernant le programme de l'équipement en lui même le programme est relativement simle, en se servant de la bibliothèque HAL je declare 3 PIN en input et je renvoie ainsi l'état des capteurs de manière périodique en me servant de la fonction &amp;quot;Send&amp;quot; du package STM32.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie application WEB===&lt;br /&gt;
&lt;br /&gt;
La principale difficulté de cette partie et l'absence totale de connaissances dans le développement d'application WEB. J'ai donc dû apprendre les langage HTML / CSS / PHP (quelques notions en JS) pour réaliser cette partie. Je disposais de quelques notions en base de données et SQL suit à mon année d'IMA3.&lt;br /&gt;
&lt;br /&gt;
Le but de l'application WEB est de permettre de rendre exploitable pour l'utilisateurs les informations renvoyés par les balises. Pour se faire l'application doit contenir une page de monitoring permettant de surveiller l'état de toutes les balises. De plus elle doit contenir une partie historique permettant d'accéder à l'historique d'une balise en particulier (en effectuant une recherche par id/localisation/date). Enfin elle doit aussi proposer une partie permettant d'afficher une carte avec dessus les balises et leur état.&lt;br /&gt;
&lt;br /&gt;
A l'aide de Bootstrap j'ai mis en place une application WEB avec ces trois partie. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie serveur d'application===&lt;br /&gt;
&lt;br /&gt;
====Mise en place de l'environnement====&lt;br /&gt;
&lt;br /&gt;
Concernant la partie serveur, j'ai mis en place sur une VM (172.26.189.23) un serveur apache et Postgres pour la gestion des bases mais aussi un interpreteur php.&lt;br /&gt;
Pour apache j'ai simplement mis tous mes fichiers html/php dans /var/www/html qui est le repertoir par defaut. Celui est configuré pour démarrer au lancement de la VM.&lt;br /&gt;
Concernant Postgres j'ai d'abord crée un nouvel utilisateur en me servant de l'utilisateur crée par defaut (su - postgres):&lt;br /&gt;
 createuser -d -P root (mdp: glopglop)&lt;br /&gt;
&lt;br /&gt;
Puis j'ai créé une nouvelle base:&lt;br /&gt;
 createdb -O root pfe&lt;br /&gt;
&lt;br /&gt;
Pour se connecter a la base:&lt;br /&gt;
 psql pfe (depuis l'utilsateur root ou postgres)&lt;br /&gt;
&lt;br /&gt;
Enfin j'y ai ajouté mes tables:&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE balises (ID serial PRIMARY KEY, Pays varchar(50) NOT NULL, Ville varchar(50) NOT NULL, Localisation varchar(50) NOT NULL, Coordonnees varchar(50) NOT NULL,Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE historique_balise (ID serial PRIMARY KEY, id_balise int NOT NULL, Date date NOT NULL, Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
La base contient deux tables, une première ayant pour clef primaire l'id de la balise et contenant des informations diverses sur cette dernière telles que le pays, la ville, la localisation, les coordonnée, le niveau d'eau mais surtout si cette dernière est sous l'eau ou non. La seconde table concerne l'historique des balises, elle a pour clef primaire l'indice du relevé et contient des informations comme le numéro de balise, la date du relevé etc, l'état de la balise etc..&lt;br /&gt;
&lt;br /&gt;
Pour la communication entre le serveur d'application et le serveur réseau, j'ai dans un premier temps mis en place un script python pour récuperer les relevés des capteurs via l'API REST:&lt;br /&gt;
 import requests&lt;br /&gt;
 import json&lt;br /&gt;
 #on recupere le token&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Content-Type': 'application/json',&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
 }&lt;br /&gt;
 data = '{&amp;quot;email&amp;quot;: &amp;quot;admin&amp;quot;,&amp;quot;password&amp;quot;: &amp;quot;admin&amp;quot; }'&lt;br /&gt;
 response = requests.post('http://172.26.189.22:8080/api/internal/login', headers=headers, data=data)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 #print(resp['jwt'])&lt;br /&gt;
 #diverses information sur un capteur&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
    'Grpc-Metadata-Authorization': 'Bearer'+resp['jwt'],&lt;br /&gt;
 }&lt;br /&gt;
 response = requests.get('http://172.26.189.22:8080/api/devices/0b00f4ff703a8fc5', headers=headers)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 print(resp)&lt;br /&gt;
&lt;br /&gt;
Ce script permet de un premier temps de récuperer le token pour avoir accés à l'API. Celui ci est a renseigner dans toute les requetes http. &lt;br /&gt;
En se connectant à l'API via l'interface graphique (172.26.189.22:8080/api), on peut récuperer toutes les requetes possible en cURL, j'ai donc simplement utilisé un convertisseur cURL vers python pour mettre mes requetes en place.&lt;br /&gt;
&lt;br /&gt;
Malheureusement cette solution permet de récuperer de nombreuses informations concernant l'application mais pas les relevés des capteurs. Pour récupérer ces derniers, je suis passé par l'interface graphique du serveur d'application (172.26.189.22:8080) afin d'ajouter une intégration HTTP. Il faut simplement spécifier le format de l'information (JSON dans mon cas) et l'URL à laquelle doit être envoyé la requête http POST. Dans mon cas cela sera:&lt;br /&gt;
 http://172.26.189.23/pfe/gestionPOST.php&lt;br /&gt;
&lt;br /&gt;
La base du fichier gestionPOST.php ressemble à cela: &lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 header(&amp;quot;content-type: application/json&amp;quot;);&lt;br /&gt;
 $json = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
 $obj = json_decode($json);&lt;br /&gt;
 $decoded = base64_decode(json_encode($obj-&amp;gt;data));&lt;br /&gt;
 $fp = @fopen(&amp;quot;toto.txt&amp;quot;,&amp;quot;a&amp;quot;);&lt;br /&gt;
 fwrite($fp,$decoded);&lt;br /&gt;
 fwrite($fp,&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
 fclose($fp);&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il permet via le flux php://input de récupérer le contenu de la requête POST et de l'afficher.&lt;br /&gt;
&lt;br /&gt;
La prochaine étape concerne la gestion des informations avec notamment l'ajout en base selon le type d'information recu.&lt;br /&gt;
&lt;br /&gt;
====Gestion des trames====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les trames sont envoyés au format suivant:&lt;br /&gt;
 id:niveau1:niveau2:niveau3&lt;br /&gt;
&lt;br /&gt;
A travers le script php permettant la gestion des requetes HTTP Post, en se servant de la fonction preg_match avec le regex suivant on peut récuperer toutes les informations necessaires au traitement:&lt;br /&gt;
 &amp;quot;#^([0-9]+):([0-1]{1}):([0-1]{1}):([0-1]{1})$#&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Chaque nouvelle mesure envoyée sur le serveur d'application est renseignée en base grace à la requêtes SQL suivante:&lt;br /&gt;
 UPDATE balises&lt;br /&gt;
 SET inondee=:in, niveau=:niv&lt;br /&gt;
 WHERE id=:id;&lt;br /&gt;
&lt;br /&gt;
Les requêtes en php sont réalisées par le biais des fonctions query, prepare et execute.&lt;br /&gt;
&lt;br /&gt;
Toutes les requêtes SQL sont regroupés dans un même fichier par soucis de clarté.&lt;br /&gt;
&lt;br /&gt;
Dès qu'une nouvelle mesures est transmise au script php, on récupère la date actuelle et on la compare avec le dernier relevé de cette balise enregistré dans la table historique, si le dernier relevé date de la veille on ajoute une nouvelle entrée dans la table historique_balise:&lt;br /&gt;
 &lt;br /&gt;
 $ajrd=date(&amp;quot;Y-m-d&amp;quot;);&lt;br /&gt;
 $requete=$bdd-&amp;gt;prepare('SELECT MAX(date) AS max_date&lt;br /&gt;
                         FROM historique_balise&lt;br /&gt;
                         WHERE id_balise=:id');&lt;br /&gt;
 $requete-&amp;gt;execute(array('id' =&amp;gt; $id));&lt;br /&gt;
 $resultat=$requete-&amp;gt;fetch();&lt;br /&gt;
 if($ajrd&amp;gt;$resultat['max_date']  || $resultat==FALSE){&lt;br /&gt;
      $requete=$bdd-&amp;gt;prepare('INSERT INTO historique_balise&lt;br /&gt;
                              VALUES (DEFAULT,:id,:d,:niv,:in)');&lt;br /&gt;
      $requete-&amp;gt;execute(array('id'=&amp;gt;$id,'d'=&amp;gt;$ajrd, 'niv'=&amp;gt;$niveau, 'in'=&amp;gt;$inondee));&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Lors d'une première entrée, la condition $resultat==false permet d'ajouter pour la première fois la balise dans l'historique&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note a moi même: travail a effectuer en priorité:&lt;br /&gt;
 &lt;br /&gt;
 gerer la partie historique des balises en base (quasi fini, gérer les heures pour ajouter de manière plus fréquentes)&lt;br /&gt;
 mettre en place un mode administrateur sur l'appli pour par exemple ajouter ou retirer des balises (a voir si utile avec les profs)&lt;br /&gt;
 gerer sur la carte l'affichage des balises et l'etat de la route&lt;br /&gt;
 mettre toutes les requetes SQL dans un même fichier (fait pour la recherche historique)&lt;br /&gt;
 mise en place d'une appli android&lt;br /&gt;
 concevoir le capteur&lt;br /&gt;
 automatiser l'ajout d'un capteur quand il est inconnu (voir message down)&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85348</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85348"/>
				<updated>2020-12-09T15:05:13Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Gestion des trames */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Début projet===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Mise en place du réseau===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se connecter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
 subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
 range 192.168.42.1 192.168.42.9&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La configuration du serveur réseau s'effectue en se connectant à ce dernier en ssh:&lt;br /&gt;
 root@192.168.42.10&lt;br /&gt;
Il faut installer le &amp;quot;gateway bridge&amp;quot;, le &amp;quot;network server&amp;quot; ainsi que &amp;quot;l'application server&amp;quot; disponible sur ChirpStack. Pour se faire nous avons suivi un tutoriel à l'adresse suivante:&lt;br /&gt;
 https://www.youtube.com/watch?v=FnTP7t47DlI&lt;br /&gt;
ainsi que la documentation fournie par ChirpStack&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pour accéder au serveur réseau, nous passons par l'interface web en se connectant à l'adresse suivante (en passant par une zabeth):&lt;br /&gt;
 172.26.189.22:8080 id: admin mdp: admin&lt;br /&gt;
&lt;br /&gt;
A partir de l'interface web, nous pouvons configurer de nombreux éléments:&lt;br /&gt;
&lt;br /&gt;
-Création d'un nouveau projet&lt;br /&gt;
&lt;br /&gt;
-Ajouter des équipements aux réseau à l'aide des clefs&lt;br /&gt;
&lt;br /&gt;
-Surveiller les informations qui circulent sur notre réseau&lt;br /&gt;
&lt;br /&gt;
-...&lt;br /&gt;
&lt;br /&gt;
Enfin, en nous connectant en ssh sur les deux gateways:&lt;br /&gt;
 antenne: 192.168.42.1 mdp:pdmk-062E7A&lt;br /&gt;
 passerelle intérieur: 192.168.42.2 mdp:pdmk-030970&lt;br /&gt;
Nous avons pu mettre à jour ces dernieres en suivant le wiki Kerlink&lt;br /&gt;
La connexion au wiki Kerlink s'effectue avec:&lt;br /&gt;
 Login : univlille&lt;br /&gt;
 Mot de passe : IYBlN7QF06&lt;br /&gt;
&lt;br /&gt;
===Test du réseau===&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de notre Network Server nous avons utilisé un module GPS LoRa du commerce. En se connectant a notre Network Server (172.26.189.22:8000) nous avons pu créer une nouvelle application et ajouté un nouvel équipement. Se faisant notre Network Server génère deux clefs, une &amp;quot;application key&amp;quot; et une &amp;quot;Network Key&amp;quot;. Ces deux clefs doivent être renseigné manuellement dans notre équipement. Pour se faire on peut le connecter à un ordinateur et y ajouter les clefs via son logiciel dédié. L'équipement possédant déjà un EUI permettant de reconnaître l'équipement, nous avons du renseigner ce dernier dans l'ajout de l'équipement sur le Network Server. Suite à ce test nous avons bien pu observer la circulation de nos trames et le bon fonctionnement de notre Network Server.&lt;br /&gt;
&lt;br /&gt;
===Fabrication du End-device===&lt;br /&gt;
&lt;br /&gt;
Pour le end-device je dispose d'une carte STM32F411RE, d'un shield SX1276MB1MAS et d'un capteur ultrason HC-SR04.&lt;br /&gt;
Le développement du programme se fait sur STM32Cube.&lt;br /&gt;
Un premier programme à été mis en place sans difficultés pour récupérer les valeurs du HC-SR04 en s'appuyant sur l'exemple proposé par Arduino.&lt;br /&gt;
En revanche les problèmes sont arrivés lors du développement concernant la partie LoRaWAN. En effet STM32 propose un package LoRaWAN pour faciliter le développement d'application, le problème étant que ce package concerne seulement les cartes STM32LXXX. J'ai essayé longuement d'adapter ce package pour ma carte STM32F411RE en modifiant notamment le Makefile, les .flash mais aussi les fichiers d'inclusion sans succès malheureusement. La solution envisagée est donc un changement de carte au profit d'une STM32LXXX.&lt;br /&gt;
&lt;br /&gt;
Après changé notre carte pour une STM32L152RE, j'ai repris le package proposé par STM32 et dans le fichier Commissioning.h j'ai rensigné les clefs &lt;br /&gt;
 LORAWAN_APP_KEY&lt;br /&gt;
 LORAWAN_NWK_KEY&lt;br /&gt;
&lt;br /&gt;
Il n'y a que ces deux à renseigner étant donné que notre équipement fonctionne sur une version inférieur à la 1.1. A noter que le champ device EUI semble ne pas fonctionner. Nous avons du récuper l'EUI sur une gateway et renseigner ce dernier dans l'équipement que j'ai crée pour mon application sur l'interface web.&lt;br /&gt;
&lt;br /&gt;
Concernant le programme de l'équipement en lui même le programme est relativement simle, en se servant de la bibliothèque HAL je declare 3 PIN en input et je renvoie ainsi l'état des capteurs de manière périodique en me servant de la fonction &amp;quot;Send&amp;quot; du package STM32.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie application WEB===&lt;br /&gt;
&lt;br /&gt;
La principale difficulté de cette partie et l'absence totale de connaissances dans le développement d'application WEB. J'ai donc dû apprendre les langage HTML / CSS / PHP (quelques notions en JS) pour réaliser cette partie. Je disposais de quelques notions en base de données et SQL suit à mon année d'IMA3.&lt;br /&gt;
&lt;br /&gt;
Le but de l'application WEB est de permettre de rendre exploitable pour l'utilisateurs les informations renvoyés par les balises. Pour se faire l'application doit contenir une page de monitoring permettant de surveiller l'état de toutes les balises. De plus elle doit contenir une partie historique permettant d'accéder à l'historique d'une balise en particulier (en effectuant une recherche par id/localisation/date). Enfin elle doit aussi proposer une partie permettant d'afficher une carte avec dessus les balises et leur état.&lt;br /&gt;
&lt;br /&gt;
A l'aide de Bootstrap j'ai mis en place une application WEB avec ces trois partie. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie serveur d'application===&lt;br /&gt;
&lt;br /&gt;
====Mise en place de l'environnement====&lt;br /&gt;
&lt;br /&gt;
Concernant la partie serveur, j'ai mis en place sur une VM (172.26.189.23) un serveur apache et Postgres pour la gestion des bases mais aussi un interpreteur php.&lt;br /&gt;
Pour apache j'ai simplement mis tous mes fichiers html/php dans /var/www/html qui est le repertoir par defaut. Celui est configuré pour démarrer au lancement de la VM.&lt;br /&gt;
Concernant Postgres j'ai d'abord crée un nouvel utilisateur en me servant de l'utilisateur crée par defaut (su - postgres):&lt;br /&gt;
 createuser -d -P root (mdp: glopglop)&lt;br /&gt;
&lt;br /&gt;
Puis j'ai créé une nouvelle base:&lt;br /&gt;
 createdb -O root pfe&lt;br /&gt;
&lt;br /&gt;
Pour se connecter a la base:&lt;br /&gt;
 psql pfe (depuis l'utilsateur root ou postgres)&lt;br /&gt;
&lt;br /&gt;
Enfin j'y ai ajouté mes tables:&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE balises (ID serial PRIMARY KEY, Pays varchar(50) NOT NULL, Ville varchar(50) NOT NULL, Localisation varchar(50) NOT NULL, Coordonnees varchar(50) NOT NULL,Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE historique_balise (ID serial PRIMARY KEY, id_balise int NOT NULL, Date date NOT NULL, Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
La base contient deux tables, une première ayant pour clef primaire l'id de la balise et contenant des informations diverses sur cette dernière telles que le pays, la ville, la localisation, les coordonnée, le niveau d'eau mais surtout si cette dernière est sous l'eau ou non. La seconde table concerne l'historique des balises, elle a pour clef primaire l'indice du relevé et contient des informations comme le numéro de balise, la date du relevé etc, l'état de la balise etc..&lt;br /&gt;
&lt;br /&gt;
Pour la communication entre le serveur d'application et le serveur réseau, j'ai dans un premier temps mis en place un script python pour récuperer les relevés des capteurs via l'API REST:&lt;br /&gt;
 import requests&lt;br /&gt;
 import json&lt;br /&gt;
 #on recupere le token&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Content-Type': 'application/json',&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
 }&lt;br /&gt;
 data = '{&amp;quot;email&amp;quot;: &amp;quot;admin&amp;quot;,&amp;quot;password&amp;quot;: &amp;quot;admin&amp;quot; }'&lt;br /&gt;
 response = requests.post('http://172.26.189.22:8080/api/internal/login', headers=headers, data=data)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 #print(resp['jwt'])&lt;br /&gt;
 #diverses information sur un capteur&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
    'Grpc-Metadata-Authorization': 'Bearer'+resp['jwt'],&lt;br /&gt;
 }&lt;br /&gt;
 response = requests.get('http://172.26.189.22:8080/api/devices/0b00f4ff703a8fc5', headers=headers)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 print(resp)&lt;br /&gt;
&lt;br /&gt;
Ce script permet de un premier temps de récuperer le token pour avoir accés à l'API. Celui ci est a renseigner dans toute les requetes http. &lt;br /&gt;
En se connectant à l'API via l'interface graphique (172.26.189.22:8080/api), on peut récuperer toutes les requetes possible en cURL, j'ai donc simplement utilisé un convertisseur cURL vers python pour mettre mes requetes en place.&lt;br /&gt;
&lt;br /&gt;
Malheureusement cette solution permet de récuperer de nombreuses informations concernant l'application mais pas les relevés des capteurs. Pour récupérer ces derniers, je suis passé par l'interface graphique du serveur d'application (172.26.189.22:8080) afin d'ajouter une intégration HTTP. Il faut simplement spécifier le format de l'information (JSON dans mon cas) et l'URL à laquelle doit être envoyé la requête http POST. Dans mon cas cela sera:&lt;br /&gt;
 http://172.26.189.23/pfe/gestionPOST.php&lt;br /&gt;
&lt;br /&gt;
La base du fichier gestionPOST.php ressemble à cela: &lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 header(&amp;quot;content-type: application/json&amp;quot;);&lt;br /&gt;
 $json = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
 $obj = json_decode($json);&lt;br /&gt;
 $decoded = base64_decode(json_encode($obj-&amp;gt;data));&lt;br /&gt;
 $fp = @fopen(&amp;quot;toto.txt&amp;quot;,&amp;quot;a&amp;quot;);&lt;br /&gt;
 fwrite($fp,$decoded);&lt;br /&gt;
 fwrite($fp,&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
 fclose($fp);&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il permet via le flux php://input de récupérer le contenu de la requête POST et de l'afficher.&lt;br /&gt;
&lt;br /&gt;
La prochaine étape concerne la gestion des informations avec notamment l'ajout en base selon le type d'information recu.&lt;br /&gt;
&lt;br /&gt;
====Gestion des trames====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les trames sont envoyés au format suivant:&lt;br /&gt;
 id:niveau1:niveau2:niveau3&lt;br /&gt;
&lt;br /&gt;
A travers le script php permettant la gestion des requetes HTTP Post, en se servant de la fonction preg_match avec le regex suivant on peut récuperer toutes les informations necessaires au traitement:&lt;br /&gt;
 &amp;quot;#^([0-9]+):([0-1]{1}):([0-1]{1}):([0-1]{1})$#&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Chaque nouvelle mesure envoyée sur le serveur d'application est renseignée en base grace à la requêtes SQL suivante:&lt;br /&gt;
 UPDATE balises&lt;br /&gt;
 SET inondee=:in, niveau=:niv&lt;br /&gt;
 WHERE id=:id;&lt;br /&gt;
&lt;br /&gt;
Les requêtes en php sont réalisées par le biais des fonctions query, prepare et execute.&lt;br /&gt;
&lt;br /&gt;
Toutes les requêtes SQL sont regroupés dans un même fichier par soucis de clarté.&lt;br /&gt;
&lt;br /&gt;
Dès qu'une nouvelle mesures est transmise au script php, on récupère la date actuelle et on la compare avec le dernier relevé de cette balise enregistré dans la table historique, si le dernier relevé date de la veille on ajoute une nouvelle entrée dans la table historique_balise:&lt;br /&gt;
 &lt;br /&gt;
 $ajrd=date(&amp;quot;Y-m-d&amp;quot;);&lt;br /&gt;
 $requete=$bdd-&amp;gt;prepare('SELECT MAX(date) AS max_date&lt;br /&gt;
                         FROM historique_balise&lt;br /&gt;
                         WHERE id_balise=:id');&lt;br /&gt;
 $requete-&amp;gt;execute(array('id' =&amp;gt; $id));&lt;br /&gt;
 $resultat=$requete-&amp;gt;fetch();&lt;br /&gt;
 if($ajrd&amp;gt;$resultat['max_date']  || $resultat==FALSE){&lt;br /&gt;
      $requete=$bdd-&amp;gt;prepare('INSERT INTO historique_balise&lt;br /&gt;
                              VALUES (DEFAULT,:id,:d,:niv,:in)');&lt;br /&gt;
      $requete-&amp;gt;execute(array('id'=&amp;gt;$id,'d'=&amp;gt;$ajrd, 'niv'=&amp;gt;$niveau, 'in'=&amp;gt;$inondee));&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Lors d'une première entrée, la condition $resultat==false permet d'ajouter pour la première fois la balise dans l'historique&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note a moi même: travail a effectuer en priorité:&lt;br /&gt;
 &lt;br /&gt;
 gerer la partie historique des balises en base (quasi fini, gérer les heures pour ajouter de manière plus fréquentes)&lt;br /&gt;
 mettre en place un mode administrateur sur l'appli pour par exemple ajouter ou retirer des balises (a voir si utile avec les profs)&lt;br /&gt;
 gerer sur la carte l'affichage des balises et l'etat de la route&lt;br /&gt;
 mettre toutes les requetes SQL dans un même fichier (fait pour la recherche historique)&lt;br /&gt;
 mise en place d'une appli android&lt;br /&gt;
 concevoir le capteur&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85347</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85347"/>
				<updated>2020-12-09T15:04:28Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Gestion des trames */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Début projet===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Mise en place du réseau===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se connecter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
 subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
 range 192.168.42.1 192.168.42.9&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La configuration du serveur réseau s'effectue en se connectant à ce dernier en ssh:&lt;br /&gt;
 root@192.168.42.10&lt;br /&gt;
Il faut installer le &amp;quot;gateway bridge&amp;quot;, le &amp;quot;network server&amp;quot; ainsi que &amp;quot;l'application server&amp;quot; disponible sur ChirpStack. Pour se faire nous avons suivi un tutoriel à l'adresse suivante:&lt;br /&gt;
 https://www.youtube.com/watch?v=FnTP7t47DlI&lt;br /&gt;
ainsi que la documentation fournie par ChirpStack&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pour accéder au serveur réseau, nous passons par l'interface web en se connectant à l'adresse suivante (en passant par une zabeth):&lt;br /&gt;
 172.26.189.22:8080 id: admin mdp: admin&lt;br /&gt;
&lt;br /&gt;
A partir de l'interface web, nous pouvons configurer de nombreux éléments:&lt;br /&gt;
&lt;br /&gt;
-Création d'un nouveau projet&lt;br /&gt;
&lt;br /&gt;
-Ajouter des équipements aux réseau à l'aide des clefs&lt;br /&gt;
&lt;br /&gt;
-Surveiller les informations qui circulent sur notre réseau&lt;br /&gt;
&lt;br /&gt;
-...&lt;br /&gt;
&lt;br /&gt;
Enfin, en nous connectant en ssh sur les deux gateways:&lt;br /&gt;
 antenne: 192.168.42.1 mdp:pdmk-062E7A&lt;br /&gt;
 passerelle intérieur: 192.168.42.2 mdp:pdmk-030970&lt;br /&gt;
Nous avons pu mettre à jour ces dernieres en suivant le wiki Kerlink&lt;br /&gt;
La connexion au wiki Kerlink s'effectue avec:&lt;br /&gt;
 Login : univlille&lt;br /&gt;
 Mot de passe : IYBlN7QF06&lt;br /&gt;
&lt;br /&gt;
===Test du réseau===&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de notre Network Server nous avons utilisé un module GPS LoRa du commerce. En se connectant a notre Network Server (172.26.189.22:8000) nous avons pu créer une nouvelle application et ajouté un nouvel équipement. Se faisant notre Network Server génère deux clefs, une &amp;quot;application key&amp;quot; et une &amp;quot;Network Key&amp;quot;. Ces deux clefs doivent être renseigné manuellement dans notre équipement. Pour se faire on peut le connecter à un ordinateur et y ajouter les clefs via son logiciel dédié. L'équipement possédant déjà un EUI permettant de reconnaître l'équipement, nous avons du renseigner ce dernier dans l'ajout de l'équipement sur le Network Server. Suite à ce test nous avons bien pu observer la circulation de nos trames et le bon fonctionnement de notre Network Server.&lt;br /&gt;
&lt;br /&gt;
===Fabrication du End-device===&lt;br /&gt;
&lt;br /&gt;
Pour le end-device je dispose d'une carte STM32F411RE, d'un shield SX1276MB1MAS et d'un capteur ultrason HC-SR04.&lt;br /&gt;
Le développement du programme se fait sur STM32Cube.&lt;br /&gt;
Un premier programme à été mis en place sans difficultés pour récupérer les valeurs du HC-SR04 en s'appuyant sur l'exemple proposé par Arduino.&lt;br /&gt;
En revanche les problèmes sont arrivés lors du développement concernant la partie LoRaWAN. En effet STM32 propose un package LoRaWAN pour faciliter le développement d'application, le problème étant que ce package concerne seulement les cartes STM32LXXX. J'ai essayé longuement d'adapter ce package pour ma carte STM32F411RE en modifiant notamment le Makefile, les .flash mais aussi les fichiers d'inclusion sans succès malheureusement. La solution envisagée est donc un changement de carte au profit d'une STM32LXXX.&lt;br /&gt;
&lt;br /&gt;
Après changé notre carte pour une STM32L152RE, j'ai repris le package proposé par STM32 et dans le fichier Commissioning.h j'ai rensigné les clefs &lt;br /&gt;
 LORAWAN_APP_KEY&lt;br /&gt;
 LORAWAN_NWK_KEY&lt;br /&gt;
&lt;br /&gt;
Il n'y a que ces deux à renseigner étant donné que notre équipement fonctionne sur une version inférieur à la 1.1. A noter que le champ device EUI semble ne pas fonctionner. Nous avons du récuper l'EUI sur une gateway et renseigner ce dernier dans l'équipement que j'ai crée pour mon application sur l'interface web.&lt;br /&gt;
&lt;br /&gt;
Concernant le programme de l'équipement en lui même le programme est relativement simle, en se servant de la bibliothèque HAL je declare 3 PIN en input et je renvoie ainsi l'état des capteurs de manière périodique en me servant de la fonction &amp;quot;Send&amp;quot; du package STM32.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie application WEB===&lt;br /&gt;
&lt;br /&gt;
La principale difficulté de cette partie et l'absence totale de connaissances dans le développement d'application WEB. J'ai donc dû apprendre les langage HTML / CSS / PHP (quelques notions en JS) pour réaliser cette partie. Je disposais de quelques notions en base de données et SQL suit à mon année d'IMA3.&lt;br /&gt;
&lt;br /&gt;
Le but de l'application WEB est de permettre de rendre exploitable pour l'utilisateurs les informations renvoyés par les balises. Pour se faire l'application doit contenir une page de monitoring permettant de surveiller l'état de toutes les balises. De plus elle doit contenir une partie historique permettant d'accéder à l'historique d'une balise en particulier (en effectuant une recherche par id/localisation/date). Enfin elle doit aussi proposer une partie permettant d'afficher une carte avec dessus les balises et leur état.&lt;br /&gt;
&lt;br /&gt;
A l'aide de Bootstrap j'ai mis en place une application WEB avec ces trois partie. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie serveur d'application===&lt;br /&gt;
&lt;br /&gt;
====Mise en place de l'environnement====&lt;br /&gt;
&lt;br /&gt;
Concernant la partie serveur, j'ai mis en place sur une VM (172.26.189.23) un serveur apache et Postgres pour la gestion des bases mais aussi un interpreteur php.&lt;br /&gt;
Pour apache j'ai simplement mis tous mes fichiers html/php dans /var/www/html qui est le repertoir par defaut. Celui est configuré pour démarrer au lancement de la VM.&lt;br /&gt;
Concernant Postgres j'ai d'abord crée un nouvel utilisateur en me servant de l'utilisateur crée par defaut (su - postgres):&lt;br /&gt;
 createuser -d -P root (mdp: glopglop)&lt;br /&gt;
&lt;br /&gt;
Puis j'ai créé une nouvelle base:&lt;br /&gt;
 createdb -O root pfe&lt;br /&gt;
&lt;br /&gt;
Pour se connecter a la base:&lt;br /&gt;
 psql pfe (depuis l'utilsateur root ou postgres)&lt;br /&gt;
&lt;br /&gt;
Enfin j'y ai ajouté mes tables:&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE balises (ID serial PRIMARY KEY, Pays varchar(50) NOT NULL, Ville varchar(50) NOT NULL, Localisation varchar(50) NOT NULL, Coordonnees varchar(50) NOT NULL,Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE historique_balise (ID serial PRIMARY KEY, id_balise int NOT NULL, Date date NOT NULL, Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
La base contient deux tables, une première ayant pour clef primaire l'id de la balise et contenant des informations diverses sur cette dernière telles que le pays, la ville, la localisation, les coordonnée, le niveau d'eau mais surtout si cette dernière est sous l'eau ou non. La seconde table concerne l'historique des balises, elle a pour clef primaire l'indice du relevé et contient des informations comme le numéro de balise, la date du relevé etc, l'état de la balise etc..&lt;br /&gt;
&lt;br /&gt;
Pour la communication entre le serveur d'application et le serveur réseau, j'ai dans un premier temps mis en place un script python pour récuperer les relevés des capteurs via l'API REST:&lt;br /&gt;
 import requests&lt;br /&gt;
 import json&lt;br /&gt;
 #on recupere le token&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Content-Type': 'application/json',&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
 }&lt;br /&gt;
 data = '{&amp;quot;email&amp;quot;: &amp;quot;admin&amp;quot;,&amp;quot;password&amp;quot;: &amp;quot;admin&amp;quot; }'&lt;br /&gt;
 response = requests.post('http://172.26.189.22:8080/api/internal/login', headers=headers, data=data)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 #print(resp['jwt'])&lt;br /&gt;
 #diverses information sur un capteur&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
    'Grpc-Metadata-Authorization': 'Bearer'+resp['jwt'],&lt;br /&gt;
 }&lt;br /&gt;
 response = requests.get('http://172.26.189.22:8080/api/devices/0b00f4ff703a8fc5', headers=headers)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 print(resp)&lt;br /&gt;
&lt;br /&gt;
Ce script permet de un premier temps de récuperer le token pour avoir accés à l'API. Celui ci est a renseigner dans toute les requetes http. &lt;br /&gt;
En se connectant à l'API via l'interface graphique (172.26.189.22:8080/api), on peut récuperer toutes les requetes possible en cURL, j'ai donc simplement utilisé un convertisseur cURL vers python pour mettre mes requetes en place.&lt;br /&gt;
&lt;br /&gt;
Malheureusement cette solution permet de récuperer de nombreuses informations concernant l'application mais pas les relevés des capteurs. Pour récupérer ces derniers, je suis passé par l'interface graphique du serveur d'application (172.26.189.22:8080) afin d'ajouter une intégration HTTP. Il faut simplement spécifier le format de l'information (JSON dans mon cas) et l'URL à laquelle doit être envoyé la requête http POST. Dans mon cas cela sera:&lt;br /&gt;
 http://172.26.189.23/pfe/gestionPOST.php&lt;br /&gt;
&lt;br /&gt;
La base du fichier gestionPOST.php ressemble à cela: &lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 header(&amp;quot;content-type: application/json&amp;quot;);&lt;br /&gt;
 $json = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
 $obj = json_decode($json);&lt;br /&gt;
 $decoded = base64_decode(json_encode($obj-&amp;gt;data));&lt;br /&gt;
 $fp = @fopen(&amp;quot;toto.txt&amp;quot;,&amp;quot;a&amp;quot;);&lt;br /&gt;
 fwrite($fp,$decoded);&lt;br /&gt;
 fwrite($fp,&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
 fclose($fp);&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il permet via le flux php://input de récupérer le contenu de la requête POST et de l'afficher.&lt;br /&gt;
&lt;br /&gt;
La prochaine étape concerne la gestion des informations avec notamment l'ajout en base selon le type d'information recu.&lt;br /&gt;
&lt;br /&gt;
====Gestion des trames====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les trames sont envoyés au format suivant:&lt;br /&gt;
 id:niveau1:niveau2:niveau3&lt;br /&gt;
&lt;br /&gt;
A travers le script php permettant la gestion des requetes HTTP Post, en se servant de la fonction preg_match avec le regex suivant on peut récuperer toutes les informations necessaires au traitement:&lt;br /&gt;
 &amp;quot;#^([0-9]+):([0-1]{1}):([0-1]{1}):([0-1]{1})$#&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Chaque nouvelle mesure envoyée sur le serveur d'application est renseignée en base grace à la requêtes SQL suivante:&lt;br /&gt;
 UPDATE balises&lt;br /&gt;
 SET inondee=:in, niveau=:niv&lt;br /&gt;
 WHERE id=:id;&lt;br /&gt;
&lt;br /&gt;
Les requêtes en php sont réalisées par le biais des fonctions query, prepare et execute.&lt;br /&gt;
&lt;br /&gt;
Toutes les requêtes SQL sont regroupés dans un même fichier par soucis de clarté.&lt;br /&gt;
&lt;br /&gt;
Dès qu'une nouvelle mesures est transmise au script php, on récupère la date actuelle et on la compare avec le dernier relevé de cette balise enregistré dans la table historique, si le dernier relevé date de la veille on ajoute une nouvelle entrée dans la table historique_balise:&lt;br /&gt;
 &lt;br /&gt;
 $ajrd=date(&amp;quot;Y-m-d&amp;quot;);&lt;br /&gt;
 $requete=$bdd-&amp;gt;prepare('SELECT MAX(date) AS max_date&lt;br /&gt;
                         FROM historique_balise&lt;br /&gt;
                         WHERE id_balise=:id');&lt;br /&gt;
 $requete-&amp;gt;execute(array('id' =&amp;gt; $id));&lt;br /&gt;
 $resultat=$requete-&amp;gt;fetch();&lt;br /&gt;
 if($ajrd&amp;gt;$resultat['max_date']  || $resultat==FALSE){&lt;br /&gt;
      $requete=$bdd-&amp;gt;prepare('INSERT INTO historique_balise&lt;br /&gt;
                              VALUES (DEFAULT,:id,:d,:niv,:in)');&lt;br /&gt;
      $requete-&amp;gt;execute(array('id'=&amp;gt;$id,'d'=&amp;gt;$ajrd, 'niv'=&amp;gt;$niveau, 'in'=&amp;gt;$inondee));&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note a moi même: travail a effectuer en priorité:&lt;br /&gt;
 &lt;br /&gt;
 gerer la partie historique des balises en base (quasi fini, gérer les heures pour ajouter de manière plus fréquentes)&lt;br /&gt;
 mettre en place un mode administrateur sur l'appli pour par exemple ajouter ou retirer des balises (a voir si utile avec les profs)&lt;br /&gt;
 gerer sur la carte l'affichage des balises et l'etat de la route&lt;br /&gt;
 mettre toutes les requetes SQL dans un même fichier (fait pour la recherche historique)&lt;br /&gt;
 mise en place d'une appli android&lt;br /&gt;
 concevoir le capteur&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85346</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85346"/>
				<updated>2020-12-09T15:03:48Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Gestion des trames */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Début projet===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Mise en place du réseau===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se connecter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
 subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
 range 192.168.42.1 192.168.42.9&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La configuration du serveur réseau s'effectue en se connectant à ce dernier en ssh:&lt;br /&gt;
 root@192.168.42.10&lt;br /&gt;
Il faut installer le &amp;quot;gateway bridge&amp;quot;, le &amp;quot;network server&amp;quot; ainsi que &amp;quot;l'application server&amp;quot; disponible sur ChirpStack. Pour se faire nous avons suivi un tutoriel à l'adresse suivante:&lt;br /&gt;
 https://www.youtube.com/watch?v=FnTP7t47DlI&lt;br /&gt;
ainsi que la documentation fournie par ChirpStack&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pour accéder au serveur réseau, nous passons par l'interface web en se connectant à l'adresse suivante (en passant par une zabeth):&lt;br /&gt;
 172.26.189.22:8080 id: admin mdp: admin&lt;br /&gt;
&lt;br /&gt;
A partir de l'interface web, nous pouvons configurer de nombreux éléments:&lt;br /&gt;
&lt;br /&gt;
-Création d'un nouveau projet&lt;br /&gt;
&lt;br /&gt;
-Ajouter des équipements aux réseau à l'aide des clefs&lt;br /&gt;
&lt;br /&gt;
-Surveiller les informations qui circulent sur notre réseau&lt;br /&gt;
&lt;br /&gt;
-...&lt;br /&gt;
&lt;br /&gt;
Enfin, en nous connectant en ssh sur les deux gateways:&lt;br /&gt;
 antenne: 192.168.42.1 mdp:pdmk-062E7A&lt;br /&gt;
 passerelle intérieur: 192.168.42.2 mdp:pdmk-030970&lt;br /&gt;
Nous avons pu mettre à jour ces dernieres en suivant le wiki Kerlink&lt;br /&gt;
La connexion au wiki Kerlink s'effectue avec:&lt;br /&gt;
 Login : univlille&lt;br /&gt;
 Mot de passe : IYBlN7QF06&lt;br /&gt;
&lt;br /&gt;
===Test du réseau===&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de notre Network Server nous avons utilisé un module GPS LoRa du commerce. En se connectant a notre Network Server (172.26.189.22:8000) nous avons pu créer une nouvelle application et ajouté un nouvel équipement. Se faisant notre Network Server génère deux clefs, une &amp;quot;application key&amp;quot; et une &amp;quot;Network Key&amp;quot;. Ces deux clefs doivent être renseigné manuellement dans notre équipement. Pour se faire on peut le connecter à un ordinateur et y ajouter les clefs via son logiciel dédié. L'équipement possédant déjà un EUI permettant de reconnaître l'équipement, nous avons du renseigner ce dernier dans l'ajout de l'équipement sur le Network Server. Suite à ce test nous avons bien pu observer la circulation de nos trames et le bon fonctionnement de notre Network Server.&lt;br /&gt;
&lt;br /&gt;
===Fabrication du End-device===&lt;br /&gt;
&lt;br /&gt;
Pour le end-device je dispose d'une carte STM32F411RE, d'un shield SX1276MB1MAS et d'un capteur ultrason HC-SR04.&lt;br /&gt;
Le développement du programme se fait sur STM32Cube.&lt;br /&gt;
Un premier programme à été mis en place sans difficultés pour récupérer les valeurs du HC-SR04 en s'appuyant sur l'exemple proposé par Arduino.&lt;br /&gt;
En revanche les problèmes sont arrivés lors du développement concernant la partie LoRaWAN. En effet STM32 propose un package LoRaWAN pour faciliter le développement d'application, le problème étant que ce package concerne seulement les cartes STM32LXXX. J'ai essayé longuement d'adapter ce package pour ma carte STM32F411RE en modifiant notamment le Makefile, les .flash mais aussi les fichiers d'inclusion sans succès malheureusement. La solution envisagée est donc un changement de carte au profit d'une STM32LXXX.&lt;br /&gt;
&lt;br /&gt;
Après changé notre carte pour une STM32L152RE, j'ai repris le package proposé par STM32 et dans le fichier Commissioning.h j'ai rensigné les clefs &lt;br /&gt;
 LORAWAN_APP_KEY&lt;br /&gt;
 LORAWAN_NWK_KEY&lt;br /&gt;
&lt;br /&gt;
Il n'y a que ces deux à renseigner étant donné que notre équipement fonctionne sur une version inférieur à la 1.1. A noter que le champ device EUI semble ne pas fonctionner. Nous avons du récuper l'EUI sur une gateway et renseigner ce dernier dans l'équipement que j'ai crée pour mon application sur l'interface web.&lt;br /&gt;
&lt;br /&gt;
Concernant le programme de l'équipement en lui même le programme est relativement simle, en se servant de la bibliothèque HAL je declare 3 PIN en input et je renvoie ainsi l'état des capteurs de manière périodique en me servant de la fonction &amp;quot;Send&amp;quot; du package STM32.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie application WEB===&lt;br /&gt;
&lt;br /&gt;
La principale difficulté de cette partie et l'absence totale de connaissances dans le développement d'application WEB. J'ai donc dû apprendre les langage HTML / CSS / PHP (quelques notions en JS) pour réaliser cette partie. Je disposais de quelques notions en base de données et SQL suit à mon année d'IMA3.&lt;br /&gt;
&lt;br /&gt;
Le but de l'application WEB est de permettre de rendre exploitable pour l'utilisateurs les informations renvoyés par les balises. Pour se faire l'application doit contenir une page de monitoring permettant de surveiller l'état de toutes les balises. De plus elle doit contenir une partie historique permettant d'accéder à l'historique d'une balise en particulier (en effectuant une recherche par id/localisation/date). Enfin elle doit aussi proposer une partie permettant d'afficher une carte avec dessus les balises et leur état.&lt;br /&gt;
&lt;br /&gt;
A l'aide de Bootstrap j'ai mis en place une application WEB avec ces trois partie. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie serveur d'application===&lt;br /&gt;
&lt;br /&gt;
====Mise en place de l'environnement====&lt;br /&gt;
&lt;br /&gt;
Concernant la partie serveur, j'ai mis en place sur une VM (172.26.189.23) un serveur apache et Postgres pour la gestion des bases mais aussi un interpreteur php.&lt;br /&gt;
Pour apache j'ai simplement mis tous mes fichiers html/php dans /var/www/html qui est le repertoir par defaut. Celui est configuré pour démarrer au lancement de la VM.&lt;br /&gt;
Concernant Postgres j'ai d'abord crée un nouvel utilisateur en me servant de l'utilisateur crée par defaut (su - postgres):&lt;br /&gt;
 createuser -d -P root (mdp: glopglop)&lt;br /&gt;
&lt;br /&gt;
Puis j'ai créé une nouvelle base:&lt;br /&gt;
 createdb -O root pfe&lt;br /&gt;
&lt;br /&gt;
Pour se connecter a la base:&lt;br /&gt;
 psql pfe (depuis l'utilsateur root ou postgres)&lt;br /&gt;
&lt;br /&gt;
Enfin j'y ai ajouté mes tables:&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE balises (ID serial PRIMARY KEY, Pays varchar(50) NOT NULL, Ville varchar(50) NOT NULL, Localisation varchar(50) NOT NULL, Coordonnees varchar(50) NOT NULL,Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE historique_balise (ID serial PRIMARY KEY, id_balise int NOT NULL, Date date NOT NULL, Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
La base contient deux tables, une première ayant pour clef primaire l'id de la balise et contenant des informations diverses sur cette dernière telles que le pays, la ville, la localisation, les coordonnée, le niveau d'eau mais surtout si cette dernière est sous l'eau ou non. La seconde table concerne l'historique des balises, elle a pour clef primaire l'indice du relevé et contient des informations comme le numéro de balise, la date du relevé etc, l'état de la balise etc..&lt;br /&gt;
&lt;br /&gt;
Pour la communication entre le serveur d'application et le serveur réseau, j'ai dans un premier temps mis en place un script python pour récuperer les relevés des capteurs via l'API REST:&lt;br /&gt;
 import requests&lt;br /&gt;
 import json&lt;br /&gt;
 #on recupere le token&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Content-Type': 'application/json',&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
 }&lt;br /&gt;
 data = '{&amp;quot;email&amp;quot;: &amp;quot;admin&amp;quot;,&amp;quot;password&amp;quot;: &amp;quot;admin&amp;quot; }'&lt;br /&gt;
 response = requests.post('http://172.26.189.22:8080/api/internal/login', headers=headers, data=data)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 #print(resp['jwt'])&lt;br /&gt;
 #diverses information sur un capteur&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
    'Grpc-Metadata-Authorization': 'Bearer'+resp['jwt'],&lt;br /&gt;
 }&lt;br /&gt;
 response = requests.get('http://172.26.189.22:8080/api/devices/0b00f4ff703a8fc5', headers=headers)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 print(resp)&lt;br /&gt;
&lt;br /&gt;
Ce script permet de un premier temps de récuperer le token pour avoir accés à l'API. Celui ci est a renseigner dans toute les requetes http. &lt;br /&gt;
En se connectant à l'API via l'interface graphique (172.26.189.22:8080/api), on peut récuperer toutes les requetes possible en cURL, j'ai donc simplement utilisé un convertisseur cURL vers python pour mettre mes requetes en place.&lt;br /&gt;
&lt;br /&gt;
Malheureusement cette solution permet de récuperer de nombreuses informations concernant l'application mais pas les relevés des capteurs. Pour récupérer ces derniers, je suis passé par l'interface graphique du serveur d'application (172.26.189.22:8080) afin d'ajouter une intégration HTTP. Il faut simplement spécifier le format de l'information (JSON dans mon cas) et l'URL à laquelle doit être envoyé la requête http POST. Dans mon cas cela sera:&lt;br /&gt;
 http://172.26.189.23/pfe/gestionPOST.php&lt;br /&gt;
&lt;br /&gt;
La base du fichier gestionPOST.php ressemble à cela: &lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 header(&amp;quot;content-type: application/json&amp;quot;);&lt;br /&gt;
 $json = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
 $obj = json_decode($json);&lt;br /&gt;
 $decoded = base64_decode(json_encode($obj-&amp;gt;data));&lt;br /&gt;
 $fp = @fopen(&amp;quot;toto.txt&amp;quot;,&amp;quot;a&amp;quot;);&lt;br /&gt;
 fwrite($fp,$decoded);&lt;br /&gt;
 fwrite($fp,&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
 fclose($fp);&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il permet via le flux php://input de récupérer le contenu de la requête POST et de l'afficher.&lt;br /&gt;
&lt;br /&gt;
La prochaine étape concerne la gestion des informations avec notamment l'ajout en base selon le type d'information recu.&lt;br /&gt;
&lt;br /&gt;
====Gestion des trames====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les trames sont envoyés au format suivant:&lt;br /&gt;
 id:niveau1:niveau2:niveau3&lt;br /&gt;
&lt;br /&gt;
A travers le script php permettant la gestion des requetes HTTP Post, en se servant de la fonction preg_match avec le regex suivant on peut récuperer toutes les informations necessaires au traitement:&lt;br /&gt;
 &amp;quot;#^([0-9]+):([0-1]{1}):([0-1]{1}):([0-1]{1})$#&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Chaque nouvelle mesure envoyée sur le serveur d'application est renseignée en base grace à la requêtes SQL suivante:&lt;br /&gt;
 UPDATE balises&lt;br /&gt;
 SET inondee=:in, niveau=:niv&lt;br /&gt;
 WHERE id=:id;&lt;br /&gt;
&lt;br /&gt;
Les requêtes en php sont réalisées par le biais des fonctions query, prepare et execute.&lt;br /&gt;
&lt;br /&gt;
Toutes les requêtes SQL sont regroupés dans un même fichier par soucis de clarté.&lt;br /&gt;
&lt;br /&gt;
Dès qu'une nouvelle mesures est transmise au script php, on récupère la date actuelle et on la compare avec le dernier relevé de cette balise enregistré dans la table historique, si le dernier relevé date de la veille on ajoute une nouvelle entrée dans la table historique_balise:&lt;br /&gt;
 &lt;br /&gt;
 $ajrd=date(&amp;quot;Y-m-d&amp;quot;);&lt;br /&gt;
 $requete=$bdd-&amp;gt;prepare('SELECT MAX(date) AS max_date&lt;br /&gt;
                         FROM historique_balise&lt;br /&gt;
                         WHERE id_balise=:id');&lt;br /&gt;
 $requete-&amp;gt;execute(array('id' =&amp;gt; $id));&lt;br /&gt;
 $resultat=$requete-&amp;gt;fetch();&lt;br /&gt;
 if($ajrd&amp;gt;$resultat['max_date']  || $resultat==FALSE){&lt;br /&gt;
	$requete=$bdd-&amp;gt;prepare('INSERT INTO historique_balise&lt;br /&gt;
                                VALUES (DEFAULT,:id,:d,:niv,:in)');&lt;br /&gt;
	$requete-&amp;gt;execute(array('id'=&amp;gt;$id,'d'=&amp;gt;$ajrd, 'niv'=&amp;gt;$niveau, 'in'=&amp;gt;$inondee));&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note a moi même: travail a effectuer en priorité:&lt;br /&gt;
 &lt;br /&gt;
 gerer la partie historique des balises en base (quasi fini, gérer les heures pour ajouter de manière plus fréquentes)&lt;br /&gt;
 mettre en place un mode administrateur sur l'appli pour par exemple ajouter ou retirer des balises (a voir si utile avec les profs)&lt;br /&gt;
 gerer sur la carte l'affichage des balises et l'etat de la route&lt;br /&gt;
 mettre toutes les requetes SQL dans un même fichier (fait pour la recherche historique)&lt;br /&gt;
 mise en place d'une appli android&lt;br /&gt;
 concevoir le capteur&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85345</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85345"/>
				<updated>2020-12-09T15:03:02Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Gestion des trames */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Début projet===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Mise en place du réseau===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se connecter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
 subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
 range 192.168.42.1 192.168.42.9&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La configuration du serveur réseau s'effectue en se connectant à ce dernier en ssh:&lt;br /&gt;
 root@192.168.42.10&lt;br /&gt;
Il faut installer le &amp;quot;gateway bridge&amp;quot;, le &amp;quot;network server&amp;quot; ainsi que &amp;quot;l'application server&amp;quot; disponible sur ChirpStack. Pour se faire nous avons suivi un tutoriel à l'adresse suivante:&lt;br /&gt;
 https://www.youtube.com/watch?v=FnTP7t47DlI&lt;br /&gt;
ainsi que la documentation fournie par ChirpStack&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pour accéder au serveur réseau, nous passons par l'interface web en se connectant à l'adresse suivante (en passant par une zabeth):&lt;br /&gt;
 172.26.189.22:8080 id: admin mdp: admin&lt;br /&gt;
&lt;br /&gt;
A partir de l'interface web, nous pouvons configurer de nombreux éléments:&lt;br /&gt;
&lt;br /&gt;
-Création d'un nouveau projet&lt;br /&gt;
&lt;br /&gt;
-Ajouter des équipements aux réseau à l'aide des clefs&lt;br /&gt;
&lt;br /&gt;
-Surveiller les informations qui circulent sur notre réseau&lt;br /&gt;
&lt;br /&gt;
-...&lt;br /&gt;
&lt;br /&gt;
Enfin, en nous connectant en ssh sur les deux gateways:&lt;br /&gt;
 antenne: 192.168.42.1 mdp:pdmk-062E7A&lt;br /&gt;
 passerelle intérieur: 192.168.42.2 mdp:pdmk-030970&lt;br /&gt;
Nous avons pu mettre à jour ces dernieres en suivant le wiki Kerlink&lt;br /&gt;
La connexion au wiki Kerlink s'effectue avec:&lt;br /&gt;
 Login : univlille&lt;br /&gt;
 Mot de passe : IYBlN7QF06&lt;br /&gt;
&lt;br /&gt;
===Test du réseau===&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de notre Network Server nous avons utilisé un module GPS LoRa du commerce. En se connectant a notre Network Server (172.26.189.22:8000) nous avons pu créer une nouvelle application et ajouté un nouvel équipement. Se faisant notre Network Server génère deux clefs, une &amp;quot;application key&amp;quot; et une &amp;quot;Network Key&amp;quot;. Ces deux clefs doivent être renseigné manuellement dans notre équipement. Pour se faire on peut le connecter à un ordinateur et y ajouter les clefs via son logiciel dédié. L'équipement possédant déjà un EUI permettant de reconnaître l'équipement, nous avons du renseigner ce dernier dans l'ajout de l'équipement sur le Network Server. Suite à ce test nous avons bien pu observer la circulation de nos trames et le bon fonctionnement de notre Network Server.&lt;br /&gt;
&lt;br /&gt;
===Fabrication du End-device===&lt;br /&gt;
&lt;br /&gt;
Pour le end-device je dispose d'une carte STM32F411RE, d'un shield SX1276MB1MAS et d'un capteur ultrason HC-SR04.&lt;br /&gt;
Le développement du programme se fait sur STM32Cube.&lt;br /&gt;
Un premier programme à été mis en place sans difficultés pour récupérer les valeurs du HC-SR04 en s'appuyant sur l'exemple proposé par Arduino.&lt;br /&gt;
En revanche les problèmes sont arrivés lors du développement concernant la partie LoRaWAN. En effet STM32 propose un package LoRaWAN pour faciliter le développement d'application, le problème étant que ce package concerne seulement les cartes STM32LXXX. J'ai essayé longuement d'adapter ce package pour ma carte STM32F411RE en modifiant notamment le Makefile, les .flash mais aussi les fichiers d'inclusion sans succès malheureusement. La solution envisagée est donc un changement de carte au profit d'une STM32LXXX.&lt;br /&gt;
&lt;br /&gt;
Après changé notre carte pour une STM32L152RE, j'ai repris le package proposé par STM32 et dans le fichier Commissioning.h j'ai rensigné les clefs &lt;br /&gt;
 LORAWAN_APP_KEY&lt;br /&gt;
 LORAWAN_NWK_KEY&lt;br /&gt;
&lt;br /&gt;
Il n'y a que ces deux à renseigner étant donné que notre équipement fonctionne sur une version inférieur à la 1.1. A noter que le champ device EUI semble ne pas fonctionner. Nous avons du récuper l'EUI sur une gateway et renseigner ce dernier dans l'équipement que j'ai crée pour mon application sur l'interface web.&lt;br /&gt;
&lt;br /&gt;
Concernant le programme de l'équipement en lui même le programme est relativement simle, en se servant de la bibliothèque HAL je declare 3 PIN en input et je renvoie ainsi l'état des capteurs de manière périodique en me servant de la fonction &amp;quot;Send&amp;quot; du package STM32.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie application WEB===&lt;br /&gt;
&lt;br /&gt;
La principale difficulté de cette partie et l'absence totale de connaissances dans le développement d'application WEB. J'ai donc dû apprendre les langage HTML / CSS / PHP (quelques notions en JS) pour réaliser cette partie. Je disposais de quelques notions en base de données et SQL suit à mon année d'IMA3.&lt;br /&gt;
&lt;br /&gt;
Le but de l'application WEB est de permettre de rendre exploitable pour l'utilisateurs les informations renvoyés par les balises. Pour se faire l'application doit contenir une page de monitoring permettant de surveiller l'état de toutes les balises. De plus elle doit contenir une partie historique permettant d'accéder à l'historique d'une balise en particulier (en effectuant une recherche par id/localisation/date). Enfin elle doit aussi proposer une partie permettant d'afficher une carte avec dessus les balises et leur état.&lt;br /&gt;
&lt;br /&gt;
A l'aide de Bootstrap j'ai mis en place une application WEB avec ces trois partie. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie serveur d'application===&lt;br /&gt;
&lt;br /&gt;
====Mise en place de l'environnement====&lt;br /&gt;
&lt;br /&gt;
Concernant la partie serveur, j'ai mis en place sur une VM (172.26.189.23) un serveur apache et Postgres pour la gestion des bases mais aussi un interpreteur php.&lt;br /&gt;
Pour apache j'ai simplement mis tous mes fichiers html/php dans /var/www/html qui est le repertoir par defaut. Celui est configuré pour démarrer au lancement de la VM.&lt;br /&gt;
Concernant Postgres j'ai d'abord crée un nouvel utilisateur en me servant de l'utilisateur crée par defaut (su - postgres):&lt;br /&gt;
 createuser -d -P root (mdp: glopglop)&lt;br /&gt;
&lt;br /&gt;
Puis j'ai créé une nouvelle base:&lt;br /&gt;
 createdb -O root pfe&lt;br /&gt;
&lt;br /&gt;
Pour se connecter a la base:&lt;br /&gt;
 psql pfe (depuis l'utilsateur root ou postgres)&lt;br /&gt;
&lt;br /&gt;
Enfin j'y ai ajouté mes tables:&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE balises (ID serial PRIMARY KEY, Pays varchar(50) NOT NULL, Ville varchar(50) NOT NULL, Localisation varchar(50) NOT NULL, Coordonnees varchar(50) NOT NULL,Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE historique_balise (ID serial PRIMARY KEY, id_balise int NOT NULL, Date date NOT NULL, Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
La base contient deux tables, une première ayant pour clef primaire l'id de la balise et contenant des informations diverses sur cette dernière telles que le pays, la ville, la localisation, les coordonnée, le niveau d'eau mais surtout si cette dernière est sous l'eau ou non. La seconde table concerne l'historique des balises, elle a pour clef primaire l'indice du relevé et contient des informations comme le numéro de balise, la date du relevé etc, l'état de la balise etc..&lt;br /&gt;
&lt;br /&gt;
Pour la communication entre le serveur d'application et le serveur réseau, j'ai dans un premier temps mis en place un script python pour récuperer les relevés des capteurs via l'API REST:&lt;br /&gt;
 import requests&lt;br /&gt;
 import json&lt;br /&gt;
 #on recupere le token&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Content-Type': 'application/json',&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
 }&lt;br /&gt;
 data = '{&amp;quot;email&amp;quot;: &amp;quot;admin&amp;quot;,&amp;quot;password&amp;quot;: &amp;quot;admin&amp;quot; }'&lt;br /&gt;
 response = requests.post('http://172.26.189.22:8080/api/internal/login', headers=headers, data=data)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 #print(resp['jwt'])&lt;br /&gt;
 #diverses information sur un capteur&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
    'Grpc-Metadata-Authorization': 'Bearer'+resp['jwt'],&lt;br /&gt;
 }&lt;br /&gt;
 response = requests.get('http://172.26.189.22:8080/api/devices/0b00f4ff703a8fc5', headers=headers)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 print(resp)&lt;br /&gt;
&lt;br /&gt;
Ce script permet de un premier temps de récuperer le token pour avoir accés à l'API. Celui ci est a renseigner dans toute les requetes http. &lt;br /&gt;
En se connectant à l'API via l'interface graphique (172.26.189.22:8080/api), on peut récuperer toutes les requetes possible en cURL, j'ai donc simplement utilisé un convertisseur cURL vers python pour mettre mes requetes en place.&lt;br /&gt;
&lt;br /&gt;
Malheureusement cette solution permet de récuperer de nombreuses informations concernant l'application mais pas les relevés des capteurs. Pour récupérer ces derniers, je suis passé par l'interface graphique du serveur d'application (172.26.189.22:8080) afin d'ajouter une intégration HTTP. Il faut simplement spécifier le format de l'information (JSON dans mon cas) et l'URL à laquelle doit être envoyé la requête http POST. Dans mon cas cela sera:&lt;br /&gt;
 http://172.26.189.23/pfe/gestionPOST.php&lt;br /&gt;
&lt;br /&gt;
La base du fichier gestionPOST.php ressemble à cela: &lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 header(&amp;quot;content-type: application/json&amp;quot;);&lt;br /&gt;
 $json = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
 $obj = json_decode($json);&lt;br /&gt;
 $decoded = base64_decode(json_encode($obj-&amp;gt;data));&lt;br /&gt;
 $fp = @fopen(&amp;quot;toto.txt&amp;quot;,&amp;quot;a&amp;quot;);&lt;br /&gt;
 fwrite($fp,$decoded);&lt;br /&gt;
 fwrite($fp,&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
 fclose($fp);&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il permet via le flux php://input de récupérer le contenu de la requête POST et de l'afficher.&lt;br /&gt;
&lt;br /&gt;
La prochaine étape concerne la gestion des informations avec notamment l'ajout en base selon le type d'information recu.&lt;br /&gt;
&lt;br /&gt;
====Gestion des trames====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les trames sont envoyés au format suivant:&lt;br /&gt;
 id:niveau1:niveau2:niveau3&lt;br /&gt;
&lt;br /&gt;
A travers le script php permettant la gestion des requetes HTTP Post, en se servant de la fonction preg_match avec le regex suivant on peut récuperer toutes les informations necessaires au traitement:&lt;br /&gt;
 &amp;quot;#^([0-9]+):([0-1]{1}):([0-1]{1}):([0-1]{1})$#&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Chaque nouvelle mesure envoyée sur le serveur d'application est renseignée en base grace à la requêtes SQL suivante:&lt;br /&gt;
 UPDATE balises&lt;br /&gt;
 SET inondee=:in, niveau=:niv&lt;br /&gt;
 WHERE id=:id;&lt;br /&gt;
&lt;br /&gt;
Les requêtes en php sont réalisées par le biais des fonctions query, prepare et execute.&lt;br /&gt;
&lt;br /&gt;
Toutes les requêtes SQL sont regroupés dans un même fichier par soucis de clarté.&lt;br /&gt;
&lt;br /&gt;
Dès qu'une nouvelle mesures est transmise au script php, on récupère la date actuelle et on la compare avec le dernier relevé de cette balise enregistré dans la table historique, si le dernier relevé date de la veille on ajoute une nouvelle entrée dans la table historique_balise:&lt;br /&gt;
 &lt;br /&gt;
 $ajrd=date(&amp;quot;Y-m-d&amp;quot;);&lt;br /&gt;
 $requete=$bdd-&amp;gt;prepare('SELECT MAX(date) AS max_date&lt;br /&gt;
                         FROM historique_balise&lt;br /&gt;
                         WHERE id_balise=:id');&lt;br /&gt;
 $requete-&amp;gt;execute(array('id' =&amp;gt; $id));&lt;br /&gt;
 $resultat=$requete-&amp;gt;fetch();&lt;br /&gt;
 if($ajrd&amp;gt;$resultat['max_date']  || $resultat==FALSE){&lt;br /&gt;
	$requete=$bdd-&amp;gt;prepare('INSERT INTO historique_balise&lt;br /&gt;
				VALUES (DEFAULT,:id,:d,:niv,:in)');&lt;br /&gt;
	$requete-&amp;gt;execute(array('id'=&amp;gt;$id,'d'=&amp;gt;$ajrd, 'niv'=&amp;gt;$niveau, 'in'=&amp;gt;$inondee));&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note a moi même: travail a effectuer en priorité:&lt;br /&gt;
 &lt;br /&gt;
 gerer la partie historique des balises en base (quasi fini, gérer les heures pour ajouter de manière plus fréquentes)&lt;br /&gt;
 mettre en place un mode administrateur sur l'appli pour par exemple ajouter ou retirer des balises (a voir si utile avec les profs)&lt;br /&gt;
 gerer sur la carte l'affichage des balises et l'etat de la route&lt;br /&gt;
 mettre toutes les requetes SQL dans un même fichier (fait pour la recherche historique)&lt;br /&gt;
 mise en place d'une appli android&lt;br /&gt;
 concevoir le capteur&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85344</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85344"/>
				<updated>2020-12-09T15:02:16Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Gestion des trames */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Début projet===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Mise en place du réseau===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se connecter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
 subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
 range 192.168.42.1 192.168.42.9&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La configuration du serveur réseau s'effectue en se connectant à ce dernier en ssh:&lt;br /&gt;
 root@192.168.42.10&lt;br /&gt;
Il faut installer le &amp;quot;gateway bridge&amp;quot;, le &amp;quot;network server&amp;quot; ainsi que &amp;quot;l'application server&amp;quot; disponible sur ChirpStack. Pour se faire nous avons suivi un tutoriel à l'adresse suivante:&lt;br /&gt;
 https://www.youtube.com/watch?v=FnTP7t47DlI&lt;br /&gt;
ainsi que la documentation fournie par ChirpStack&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pour accéder au serveur réseau, nous passons par l'interface web en se connectant à l'adresse suivante (en passant par une zabeth):&lt;br /&gt;
 172.26.189.22:8080 id: admin mdp: admin&lt;br /&gt;
&lt;br /&gt;
A partir de l'interface web, nous pouvons configurer de nombreux éléments:&lt;br /&gt;
&lt;br /&gt;
-Création d'un nouveau projet&lt;br /&gt;
&lt;br /&gt;
-Ajouter des équipements aux réseau à l'aide des clefs&lt;br /&gt;
&lt;br /&gt;
-Surveiller les informations qui circulent sur notre réseau&lt;br /&gt;
&lt;br /&gt;
-...&lt;br /&gt;
&lt;br /&gt;
Enfin, en nous connectant en ssh sur les deux gateways:&lt;br /&gt;
 antenne: 192.168.42.1 mdp:pdmk-062E7A&lt;br /&gt;
 passerelle intérieur: 192.168.42.2 mdp:pdmk-030970&lt;br /&gt;
Nous avons pu mettre à jour ces dernieres en suivant le wiki Kerlink&lt;br /&gt;
La connexion au wiki Kerlink s'effectue avec:&lt;br /&gt;
 Login : univlille&lt;br /&gt;
 Mot de passe : IYBlN7QF06&lt;br /&gt;
&lt;br /&gt;
===Test du réseau===&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de notre Network Server nous avons utilisé un module GPS LoRa du commerce. En se connectant a notre Network Server (172.26.189.22:8000) nous avons pu créer une nouvelle application et ajouté un nouvel équipement. Se faisant notre Network Server génère deux clefs, une &amp;quot;application key&amp;quot; et une &amp;quot;Network Key&amp;quot;. Ces deux clefs doivent être renseigné manuellement dans notre équipement. Pour se faire on peut le connecter à un ordinateur et y ajouter les clefs via son logiciel dédié. L'équipement possédant déjà un EUI permettant de reconnaître l'équipement, nous avons du renseigner ce dernier dans l'ajout de l'équipement sur le Network Server. Suite à ce test nous avons bien pu observer la circulation de nos trames et le bon fonctionnement de notre Network Server.&lt;br /&gt;
&lt;br /&gt;
===Fabrication du End-device===&lt;br /&gt;
&lt;br /&gt;
Pour le end-device je dispose d'une carte STM32F411RE, d'un shield SX1276MB1MAS et d'un capteur ultrason HC-SR04.&lt;br /&gt;
Le développement du programme se fait sur STM32Cube.&lt;br /&gt;
Un premier programme à été mis en place sans difficultés pour récupérer les valeurs du HC-SR04 en s'appuyant sur l'exemple proposé par Arduino.&lt;br /&gt;
En revanche les problèmes sont arrivés lors du développement concernant la partie LoRaWAN. En effet STM32 propose un package LoRaWAN pour faciliter le développement d'application, le problème étant que ce package concerne seulement les cartes STM32LXXX. J'ai essayé longuement d'adapter ce package pour ma carte STM32F411RE en modifiant notamment le Makefile, les .flash mais aussi les fichiers d'inclusion sans succès malheureusement. La solution envisagée est donc un changement de carte au profit d'une STM32LXXX.&lt;br /&gt;
&lt;br /&gt;
Après changé notre carte pour une STM32L152RE, j'ai repris le package proposé par STM32 et dans le fichier Commissioning.h j'ai rensigné les clefs &lt;br /&gt;
 LORAWAN_APP_KEY&lt;br /&gt;
 LORAWAN_NWK_KEY&lt;br /&gt;
&lt;br /&gt;
Il n'y a que ces deux à renseigner étant donné que notre équipement fonctionne sur une version inférieur à la 1.1. A noter que le champ device EUI semble ne pas fonctionner. Nous avons du récuper l'EUI sur une gateway et renseigner ce dernier dans l'équipement que j'ai crée pour mon application sur l'interface web.&lt;br /&gt;
&lt;br /&gt;
Concernant le programme de l'équipement en lui même le programme est relativement simle, en se servant de la bibliothèque HAL je declare 3 PIN en input et je renvoie ainsi l'état des capteurs de manière périodique en me servant de la fonction &amp;quot;Send&amp;quot; du package STM32.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie application WEB===&lt;br /&gt;
&lt;br /&gt;
La principale difficulté de cette partie et l'absence totale de connaissances dans le développement d'application WEB. J'ai donc dû apprendre les langage HTML / CSS / PHP (quelques notions en JS) pour réaliser cette partie. Je disposais de quelques notions en base de données et SQL suit à mon année d'IMA3.&lt;br /&gt;
&lt;br /&gt;
Le but de l'application WEB est de permettre de rendre exploitable pour l'utilisateurs les informations renvoyés par les balises. Pour se faire l'application doit contenir une page de monitoring permettant de surveiller l'état de toutes les balises. De plus elle doit contenir une partie historique permettant d'accéder à l'historique d'une balise en particulier (en effectuant une recherche par id/localisation/date). Enfin elle doit aussi proposer une partie permettant d'afficher une carte avec dessus les balises et leur état.&lt;br /&gt;
&lt;br /&gt;
A l'aide de Bootstrap j'ai mis en place une application WEB avec ces trois partie. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie serveur d'application===&lt;br /&gt;
&lt;br /&gt;
====Mise en place de l'environnement====&lt;br /&gt;
&lt;br /&gt;
Concernant la partie serveur, j'ai mis en place sur une VM (172.26.189.23) un serveur apache et Postgres pour la gestion des bases mais aussi un interpreteur php.&lt;br /&gt;
Pour apache j'ai simplement mis tous mes fichiers html/php dans /var/www/html qui est le repertoir par defaut. Celui est configuré pour démarrer au lancement de la VM.&lt;br /&gt;
Concernant Postgres j'ai d'abord crée un nouvel utilisateur en me servant de l'utilisateur crée par defaut (su - postgres):&lt;br /&gt;
 createuser -d -P root (mdp: glopglop)&lt;br /&gt;
&lt;br /&gt;
Puis j'ai créé une nouvelle base:&lt;br /&gt;
 createdb -O root pfe&lt;br /&gt;
&lt;br /&gt;
Pour se connecter a la base:&lt;br /&gt;
 psql pfe (depuis l'utilsateur root ou postgres)&lt;br /&gt;
&lt;br /&gt;
Enfin j'y ai ajouté mes tables:&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE balises (ID serial PRIMARY KEY, Pays varchar(50) NOT NULL, Ville varchar(50) NOT NULL, Localisation varchar(50) NOT NULL, Coordonnees varchar(50) NOT NULL,Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE historique_balise (ID serial PRIMARY KEY, id_balise int NOT NULL, Date date NOT NULL, Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
La base contient deux tables, une première ayant pour clef primaire l'id de la balise et contenant des informations diverses sur cette dernière telles que le pays, la ville, la localisation, les coordonnée, le niveau d'eau mais surtout si cette dernière est sous l'eau ou non. La seconde table concerne l'historique des balises, elle a pour clef primaire l'indice du relevé et contient des informations comme le numéro de balise, la date du relevé etc, l'état de la balise etc..&lt;br /&gt;
&lt;br /&gt;
Pour la communication entre le serveur d'application et le serveur réseau, j'ai dans un premier temps mis en place un script python pour récuperer les relevés des capteurs via l'API REST:&lt;br /&gt;
 import requests&lt;br /&gt;
 import json&lt;br /&gt;
 #on recupere le token&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Content-Type': 'application/json',&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
 }&lt;br /&gt;
 data = '{&amp;quot;email&amp;quot;: &amp;quot;admin&amp;quot;,&amp;quot;password&amp;quot;: &amp;quot;admin&amp;quot; }'&lt;br /&gt;
 response = requests.post('http://172.26.189.22:8080/api/internal/login', headers=headers, data=data)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 #print(resp['jwt'])&lt;br /&gt;
 #diverses information sur un capteur&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
    'Grpc-Metadata-Authorization': 'Bearer'+resp['jwt'],&lt;br /&gt;
 }&lt;br /&gt;
 response = requests.get('http://172.26.189.22:8080/api/devices/0b00f4ff703a8fc5', headers=headers)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 print(resp)&lt;br /&gt;
&lt;br /&gt;
Ce script permet de un premier temps de récuperer le token pour avoir accés à l'API. Celui ci est a renseigner dans toute les requetes http. &lt;br /&gt;
En se connectant à l'API via l'interface graphique (172.26.189.22:8080/api), on peut récuperer toutes les requetes possible en cURL, j'ai donc simplement utilisé un convertisseur cURL vers python pour mettre mes requetes en place.&lt;br /&gt;
&lt;br /&gt;
Malheureusement cette solution permet de récuperer de nombreuses informations concernant l'application mais pas les relevés des capteurs. Pour récupérer ces derniers, je suis passé par l'interface graphique du serveur d'application (172.26.189.22:8080) afin d'ajouter une intégration HTTP. Il faut simplement spécifier le format de l'information (JSON dans mon cas) et l'URL à laquelle doit être envoyé la requête http POST. Dans mon cas cela sera:&lt;br /&gt;
 http://172.26.189.23/pfe/gestionPOST.php&lt;br /&gt;
&lt;br /&gt;
La base du fichier gestionPOST.php ressemble à cela: &lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 header(&amp;quot;content-type: application/json&amp;quot;);&lt;br /&gt;
 $json = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
 $obj = json_decode($json);&lt;br /&gt;
 $decoded = base64_decode(json_encode($obj-&amp;gt;data));&lt;br /&gt;
 $fp = @fopen(&amp;quot;toto.txt&amp;quot;,&amp;quot;a&amp;quot;);&lt;br /&gt;
 fwrite($fp,$decoded);&lt;br /&gt;
 fwrite($fp,&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
 fclose($fp);&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il permet via le flux php://input de récupérer le contenu de la requête POST et de l'afficher.&lt;br /&gt;
&lt;br /&gt;
La prochaine étape concerne la gestion des informations avec notamment l'ajout en base selon le type d'information recu.&lt;br /&gt;
&lt;br /&gt;
====Gestion des trames====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les trames sont envoyés au format suivant:&lt;br /&gt;
 id:niveau1:niveau2:niveau3&lt;br /&gt;
&lt;br /&gt;
A travers le script php permettant la gestion des requetes HTTP Post, en se servant de la fonction preg_match avec le regex suivant on peut récuperer toutes les informations necessaires au traitement:&lt;br /&gt;
 &amp;quot;#^([0-9]+):([0-1]{1}):([0-1]{1}):([0-1]{1})$#&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Chaque nouvelle mesure envoyée sur le serveur d'application est renseignée en base grace à la requêtes SQL suivante:&lt;br /&gt;
 UPDATE balises&lt;br /&gt;
 SET inondee=:in, niveau=:niv&lt;br /&gt;
 WHERE id=:id;&lt;br /&gt;
&lt;br /&gt;
Les requêtes en php sont réalisées par le biais des fonctions query, prepare et execute.&lt;br /&gt;
&lt;br /&gt;
Toutes les requêtes SQL sont regroupés dans un même fichier par soucis de clarté.&lt;br /&gt;
&lt;br /&gt;
Dès qu'une nouvelle mesures est transmise au script php, on récupère la date actuelle et on la compare avec le dernier relevé de cette balise enregistré dans la table historique, si le dernier relevé date de la veille on ajoute une nouvelle entrée dans la table historique_balise:&lt;br /&gt;
 &lt;br /&gt;
 $ajrd=date(&amp;quot;Y-m-d&amp;quot;);&lt;br /&gt;
 $requete=$bdd-&amp;gt;prepare('SELECT MAX(date) AS max_date&lt;br /&gt;
			FROM historique_balise&lt;br /&gt;
			WHERE id_balise=:id');&lt;br /&gt;
 $requete-&amp;gt;execute(array('id' =&amp;gt; $id));&lt;br /&gt;
 $resultat=$requete-&amp;gt;fetch();&lt;br /&gt;
 if($ajrd&amp;gt;$resultat['max_date']  || $resultat==FALSE){&lt;br /&gt;
	$requete=$bdd-&amp;gt;prepare('INSERT INTO historique_balise&lt;br /&gt;
				VALUES (DEFAULT,:id,:d,:niv,:in)');&lt;br /&gt;
	$requete-&amp;gt;execute(array('id'=&amp;gt;$id,'d'=&amp;gt;$ajrd, 'niv'=&amp;gt;$niveau, 'in'=&amp;gt;$inondee));&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note a moi même: travail a effectuer en priorité:&lt;br /&gt;
 &lt;br /&gt;
 gerer la partie historique des balises en base (quasi fini, gérer les heures pour ajouter de manière plus fréquentes)&lt;br /&gt;
 mettre en place un mode administrateur sur l'appli pour par exemple ajouter ou retirer des balises (a voir si utile avec les profs)&lt;br /&gt;
 gerer sur la carte l'affichage des balises et l'etat de la route&lt;br /&gt;
 mettre toutes les requetes SQL dans un même fichier (fait pour la recherche historique)&lt;br /&gt;
 mise en place d'une appli android&lt;br /&gt;
 concevoir le capteur&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85343</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85343"/>
				<updated>2020-12-07T17:48:48Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Gestion des trames */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Début projet===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Mise en place du réseau===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se connecter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
 subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
 range 192.168.42.1 192.168.42.9&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La configuration du serveur réseau s'effectue en se connectant à ce dernier en ssh:&lt;br /&gt;
 root@192.168.42.10&lt;br /&gt;
Il faut installer le &amp;quot;gateway bridge&amp;quot;, le &amp;quot;network server&amp;quot; ainsi que &amp;quot;l'application server&amp;quot; disponible sur ChirpStack. Pour se faire nous avons suivi un tutoriel à l'adresse suivante:&lt;br /&gt;
 https://www.youtube.com/watch?v=FnTP7t47DlI&lt;br /&gt;
ainsi que la documentation fournie par ChirpStack&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pour accéder au serveur réseau, nous passons par l'interface web en se connectant à l'adresse suivante (en passant par une zabeth):&lt;br /&gt;
 172.26.189.22:8080 id: admin mdp: admin&lt;br /&gt;
&lt;br /&gt;
A partir de l'interface web, nous pouvons configurer de nombreux éléments:&lt;br /&gt;
&lt;br /&gt;
-Création d'un nouveau projet&lt;br /&gt;
&lt;br /&gt;
-Ajouter des équipements aux réseau à l'aide des clefs&lt;br /&gt;
&lt;br /&gt;
-Surveiller les informations qui circulent sur notre réseau&lt;br /&gt;
&lt;br /&gt;
-...&lt;br /&gt;
&lt;br /&gt;
Enfin, en nous connectant en ssh sur les deux gateways:&lt;br /&gt;
 antenne: 192.168.42.1 mdp:pdmk-062E7A&lt;br /&gt;
 passerelle intérieur: 192.168.42.2 mdp:pdmk-030970&lt;br /&gt;
Nous avons pu mettre à jour ces dernieres en suivant le wiki Kerlink&lt;br /&gt;
La connexion au wiki Kerlink s'effectue avec:&lt;br /&gt;
 Login : univlille&lt;br /&gt;
 Mot de passe : IYBlN7QF06&lt;br /&gt;
&lt;br /&gt;
===Test du réseau===&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de notre Network Server nous avons utilisé un module GPS LoRa du commerce. En se connectant a notre Network Server (172.26.189.22:8000) nous avons pu créer une nouvelle application et ajouté un nouvel équipement. Se faisant notre Network Server génère deux clefs, une &amp;quot;application key&amp;quot; et une &amp;quot;Network Key&amp;quot;. Ces deux clefs doivent être renseigné manuellement dans notre équipement. Pour se faire on peut le connecter à un ordinateur et y ajouter les clefs via son logiciel dédié. L'équipement possédant déjà un EUI permettant de reconnaître l'équipement, nous avons du renseigner ce dernier dans l'ajout de l'équipement sur le Network Server. Suite à ce test nous avons bien pu observer la circulation de nos trames et le bon fonctionnement de notre Network Server.&lt;br /&gt;
&lt;br /&gt;
===Fabrication du End-device===&lt;br /&gt;
&lt;br /&gt;
Pour le end-device je dispose d'une carte STM32F411RE, d'un shield SX1276MB1MAS et d'un capteur ultrason HC-SR04.&lt;br /&gt;
Le développement du programme se fait sur STM32Cube.&lt;br /&gt;
Un premier programme à été mis en place sans difficultés pour récupérer les valeurs du HC-SR04 en s'appuyant sur l'exemple proposé par Arduino.&lt;br /&gt;
En revanche les problèmes sont arrivés lors du développement concernant la partie LoRaWAN. En effet STM32 propose un package LoRaWAN pour faciliter le développement d'application, le problème étant que ce package concerne seulement les cartes STM32LXXX. J'ai essayé longuement d'adapter ce package pour ma carte STM32F411RE en modifiant notamment le Makefile, les .flash mais aussi les fichiers d'inclusion sans succès malheureusement. La solution envisagée est donc un changement de carte au profit d'une STM32LXXX.&lt;br /&gt;
&lt;br /&gt;
Après changé notre carte pour une STM32L152RE, j'ai repris le package proposé par STM32 et dans le fichier Commissioning.h j'ai rensigné les clefs &lt;br /&gt;
 LORAWAN_APP_KEY&lt;br /&gt;
 LORAWAN_NWK_KEY&lt;br /&gt;
&lt;br /&gt;
Il n'y a que ces deux à renseigner étant donné que notre équipement fonctionne sur une version inférieur à la 1.1. A noter que le champ device EUI semble ne pas fonctionner. Nous avons du récuper l'EUI sur une gateway et renseigner ce dernier dans l'équipement que j'ai crée pour mon application sur l'interface web.&lt;br /&gt;
&lt;br /&gt;
Concernant le programme de l'équipement en lui même le programme est relativement simle, en se servant de la bibliothèque HAL je declare 3 PIN en input et je renvoie ainsi l'état des capteurs de manière périodique en me servant de la fonction &amp;quot;Send&amp;quot; du package STM32.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie application WEB===&lt;br /&gt;
&lt;br /&gt;
La principale difficulté de cette partie et l'absence totale de connaissances dans le développement d'application WEB. J'ai donc dû apprendre les langage HTML / CSS / PHP (quelques notions en JS) pour réaliser cette partie. Je disposais de quelques notions en base de données et SQL suit à mon année d'IMA3.&lt;br /&gt;
&lt;br /&gt;
Le but de l'application WEB est de permettre de rendre exploitable pour l'utilisateurs les informations renvoyés par les balises. Pour se faire l'application doit contenir une page de monitoring permettant de surveiller l'état de toutes les balises. De plus elle doit contenir une partie historique permettant d'accéder à l'historique d'une balise en particulier (en effectuant une recherche par id/localisation/date). Enfin elle doit aussi proposer une partie permettant d'afficher une carte avec dessus les balises et leur état.&lt;br /&gt;
&lt;br /&gt;
A l'aide de Bootstrap j'ai mis en place une application WEB avec ces trois partie. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie serveur d'application===&lt;br /&gt;
&lt;br /&gt;
====Mise en place de l'environnement====&lt;br /&gt;
&lt;br /&gt;
Concernant la partie serveur, j'ai mis en place sur une VM (172.26.189.23) un serveur apache et Postgres pour la gestion des bases mais aussi un interpreteur php.&lt;br /&gt;
Pour apache j'ai simplement mis tous mes fichiers html/php dans /var/www/html qui est le repertoir par defaut. Celui est configuré pour démarrer au lancement de la VM.&lt;br /&gt;
Concernant Postgres j'ai d'abord crée un nouvel utilisateur en me servant de l'utilisateur crée par defaut (su - postgres):&lt;br /&gt;
 createuser -d -P root (mdp: glopglop)&lt;br /&gt;
&lt;br /&gt;
Puis j'ai créé une nouvelle base:&lt;br /&gt;
 createdb -O root pfe&lt;br /&gt;
&lt;br /&gt;
Pour se connecter a la base:&lt;br /&gt;
 psql pfe (depuis l'utilsateur root ou postgres)&lt;br /&gt;
&lt;br /&gt;
Enfin j'y ai ajouté mes tables:&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE balises (ID serial PRIMARY KEY, Pays varchar(50) NOT NULL, Ville varchar(50) NOT NULL, Localisation varchar(50) NOT NULL, Coordonnees varchar(50) NOT NULL,Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE historique_balise (ID serial PRIMARY KEY, id_balise int NOT NULL, Date date NOT NULL, Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
La base contient deux tables, une première ayant pour clef primaire l'id de la balise et contenant des informations diverses sur cette dernière telles que le pays, la ville, la localisation, les coordonnée, le niveau d'eau mais surtout si cette dernière est sous l'eau ou non. La seconde table concerne l'historique des balises, elle a pour clef primaire l'indice du relevé et contient des informations comme le numéro de balise, la date du relevé etc, l'état de la balise etc..&lt;br /&gt;
&lt;br /&gt;
Pour la communication entre le serveur d'application et le serveur réseau, j'ai dans un premier temps mis en place un script python pour récuperer les relevés des capteurs via l'API REST:&lt;br /&gt;
 import requests&lt;br /&gt;
 import json&lt;br /&gt;
 #on recupere le token&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Content-Type': 'application/json',&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
 }&lt;br /&gt;
 data = '{&amp;quot;email&amp;quot;: &amp;quot;admin&amp;quot;,&amp;quot;password&amp;quot;: &amp;quot;admin&amp;quot; }'&lt;br /&gt;
 response = requests.post('http://172.26.189.22:8080/api/internal/login', headers=headers, data=data)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 #print(resp['jwt'])&lt;br /&gt;
 #diverses information sur un capteur&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
    'Grpc-Metadata-Authorization': 'Bearer'+resp['jwt'],&lt;br /&gt;
 }&lt;br /&gt;
 response = requests.get('http://172.26.189.22:8080/api/devices/0b00f4ff703a8fc5', headers=headers)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 print(resp)&lt;br /&gt;
&lt;br /&gt;
Ce script permet de un premier temps de récuperer le token pour avoir accés à l'API. Celui ci est a renseigner dans toute les requetes http. &lt;br /&gt;
En se connectant à l'API via l'interface graphique (172.26.189.22:8080/api), on peut récuperer toutes les requetes possible en cURL, j'ai donc simplement utilisé un convertisseur cURL vers python pour mettre mes requetes en place.&lt;br /&gt;
&lt;br /&gt;
Malheureusement cette solution permet de récuperer de nombreuses informations concernant l'application mais pas les relevés des capteurs. Pour récupérer ces derniers, je suis passé par l'interface graphique du serveur d'application (172.26.189.22:8080) afin d'ajouter une intégration HTTP. Il faut simplement spécifier le format de l'information (JSON dans mon cas) et l'URL à laquelle doit être envoyé la requête http POST. Dans mon cas cela sera:&lt;br /&gt;
 http://172.26.189.23/pfe/gestionPOST.php&lt;br /&gt;
&lt;br /&gt;
La base du fichier gestionPOST.php ressemble à cela: &lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 header(&amp;quot;content-type: application/json&amp;quot;);&lt;br /&gt;
 $json = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
 $obj = json_decode($json);&lt;br /&gt;
 $decoded = base64_decode(json_encode($obj-&amp;gt;data));&lt;br /&gt;
 $fp = @fopen(&amp;quot;toto.txt&amp;quot;,&amp;quot;a&amp;quot;);&lt;br /&gt;
 fwrite($fp,$decoded);&lt;br /&gt;
 fwrite($fp,&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
 fclose($fp);&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il permet via le flux php://input de récupérer le contenu de la requête POST et de l'afficher.&lt;br /&gt;
&lt;br /&gt;
La prochaine étape concerne la gestion des informations avec notamment l'ajout en base selon le type d'information recu.&lt;br /&gt;
&lt;br /&gt;
====Gestion des trames====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les trames sont envoyés au format suivant:&lt;br /&gt;
 id:niveau1:niveau2:niveau3&lt;br /&gt;
&lt;br /&gt;
A travers le script php permettant la gestion des requetes HTTP Post, en se servant de la fonction preg_match avec le regex suivant on peut récuperer toutes les informations necessaires au traitement:&lt;br /&gt;
 &amp;quot;#^([0-9]+):([0-1]{1}):([0-1]{1}):([0-1]{1})$#&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Chaque nouvelle mesure envoyée sur le serveur d'application est renseignée en base grace à la requêtes SQL suivante:&lt;br /&gt;
 UPDATE balises&lt;br /&gt;
 SET inondee=:in, niveau=:niv&lt;br /&gt;
 WHERE id=:id;&lt;br /&gt;
&lt;br /&gt;
Les requêtes en php sont réalisées par le biais des fonctions query, prepare et execute.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note a moi même: travail a effectuer en priorité:&lt;br /&gt;
 &lt;br /&gt;
 gerer la partie historique des balises en base&lt;br /&gt;
 mettre en place un mode administrateur sur l'appli pour par exemple ajouter ou retirer des balises (a voir si utile avec les profs)&lt;br /&gt;
 gerer sur la carte l'affichage des balises et l'etat de la route&lt;br /&gt;
 mettre toutes les requetes SQL dans un même fichier&lt;br /&gt;
 mise en place d'une appli android&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85342</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85342"/>
				<updated>2020-12-07T17:39:29Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Partie serveur d'application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Début projet===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Mise en place du réseau===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se connecter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
 subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
 range 192.168.42.1 192.168.42.9&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La configuration du serveur réseau s'effectue en se connectant à ce dernier en ssh:&lt;br /&gt;
 root@192.168.42.10&lt;br /&gt;
Il faut installer le &amp;quot;gateway bridge&amp;quot;, le &amp;quot;network server&amp;quot; ainsi que &amp;quot;l'application server&amp;quot; disponible sur ChirpStack. Pour se faire nous avons suivi un tutoriel à l'adresse suivante:&lt;br /&gt;
 https://www.youtube.com/watch?v=FnTP7t47DlI&lt;br /&gt;
ainsi que la documentation fournie par ChirpStack&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pour accéder au serveur réseau, nous passons par l'interface web en se connectant à l'adresse suivante (en passant par une zabeth):&lt;br /&gt;
 172.26.189.22:8080 id: admin mdp: admin&lt;br /&gt;
&lt;br /&gt;
A partir de l'interface web, nous pouvons configurer de nombreux éléments:&lt;br /&gt;
&lt;br /&gt;
-Création d'un nouveau projet&lt;br /&gt;
&lt;br /&gt;
-Ajouter des équipements aux réseau à l'aide des clefs&lt;br /&gt;
&lt;br /&gt;
-Surveiller les informations qui circulent sur notre réseau&lt;br /&gt;
&lt;br /&gt;
-...&lt;br /&gt;
&lt;br /&gt;
Enfin, en nous connectant en ssh sur les deux gateways:&lt;br /&gt;
 antenne: 192.168.42.1 mdp:pdmk-062E7A&lt;br /&gt;
 passerelle intérieur: 192.168.42.2 mdp:pdmk-030970&lt;br /&gt;
Nous avons pu mettre à jour ces dernieres en suivant le wiki Kerlink&lt;br /&gt;
La connexion au wiki Kerlink s'effectue avec:&lt;br /&gt;
 Login : univlille&lt;br /&gt;
 Mot de passe : IYBlN7QF06&lt;br /&gt;
&lt;br /&gt;
===Test du réseau===&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de notre Network Server nous avons utilisé un module GPS LoRa du commerce. En se connectant a notre Network Server (172.26.189.22:8000) nous avons pu créer une nouvelle application et ajouté un nouvel équipement. Se faisant notre Network Server génère deux clefs, une &amp;quot;application key&amp;quot; et une &amp;quot;Network Key&amp;quot;. Ces deux clefs doivent être renseigné manuellement dans notre équipement. Pour se faire on peut le connecter à un ordinateur et y ajouter les clefs via son logiciel dédié. L'équipement possédant déjà un EUI permettant de reconnaître l'équipement, nous avons du renseigner ce dernier dans l'ajout de l'équipement sur le Network Server. Suite à ce test nous avons bien pu observer la circulation de nos trames et le bon fonctionnement de notre Network Server.&lt;br /&gt;
&lt;br /&gt;
===Fabrication du End-device===&lt;br /&gt;
&lt;br /&gt;
Pour le end-device je dispose d'une carte STM32F411RE, d'un shield SX1276MB1MAS et d'un capteur ultrason HC-SR04.&lt;br /&gt;
Le développement du programme se fait sur STM32Cube.&lt;br /&gt;
Un premier programme à été mis en place sans difficultés pour récupérer les valeurs du HC-SR04 en s'appuyant sur l'exemple proposé par Arduino.&lt;br /&gt;
En revanche les problèmes sont arrivés lors du développement concernant la partie LoRaWAN. En effet STM32 propose un package LoRaWAN pour faciliter le développement d'application, le problème étant que ce package concerne seulement les cartes STM32LXXX. J'ai essayé longuement d'adapter ce package pour ma carte STM32F411RE en modifiant notamment le Makefile, les .flash mais aussi les fichiers d'inclusion sans succès malheureusement. La solution envisagée est donc un changement de carte au profit d'une STM32LXXX.&lt;br /&gt;
&lt;br /&gt;
Après changé notre carte pour une STM32L152RE, j'ai repris le package proposé par STM32 et dans le fichier Commissioning.h j'ai rensigné les clefs &lt;br /&gt;
 LORAWAN_APP_KEY&lt;br /&gt;
 LORAWAN_NWK_KEY&lt;br /&gt;
&lt;br /&gt;
Il n'y a que ces deux à renseigner étant donné que notre équipement fonctionne sur une version inférieur à la 1.1. A noter que le champ device EUI semble ne pas fonctionner. Nous avons du récuper l'EUI sur une gateway et renseigner ce dernier dans l'équipement que j'ai crée pour mon application sur l'interface web.&lt;br /&gt;
&lt;br /&gt;
Concernant le programme de l'équipement en lui même le programme est relativement simle, en se servant de la bibliothèque HAL je declare 3 PIN en input et je renvoie ainsi l'état des capteurs de manière périodique en me servant de la fonction &amp;quot;Send&amp;quot; du package STM32.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie application WEB===&lt;br /&gt;
&lt;br /&gt;
La principale difficulté de cette partie et l'absence totale de connaissances dans le développement d'application WEB. J'ai donc dû apprendre les langage HTML / CSS / PHP (quelques notions en JS) pour réaliser cette partie. Je disposais de quelques notions en base de données et SQL suit à mon année d'IMA3.&lt;br /&gt;
&lt;br /&gt;
Le but de l'application WEB est de permettre de rendre exploitable pour l'utilisateurs les informations renvoyés par les balises. Pour se faire l'application doit contenir une page de monitoring permettant de surveiller l'état de toutes les balises. De plus elle doit contenir une partie historique permettant d'accéder à l'historique d'une balise en particulier (en effectuant une recherche par id/localisation/date). Enfin elle doit aussi proposer une partie permettant d'afficher une carte avec dessus les balises et leur état.&lt;br /&gt;
&lt;br /&gt;
A l'aide de Bootstrap j'ai mis en place une application WEB avec ces trois partie. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie serveur d'application===&lt;br /&gt;
&lt;br /&gt;
====Mise en place de l'environnement====&lt;br /&gt;
&lt;br /&gt;
Concernant la partie serveur, j'ai mis en place sur une VM (172.26.189.23) un serveur apache et Postgres pour la gestion des bases mais aussi un interpreteur php.&lt;br /&gt;
Pour apache j'ai simplement mis tous mes fichiers html/php dans /var/www/html qui est le repertoir par defaut. Celui est configuré pour démarrer au lancement de la VM.&lt;br /&gt;
Concernant Postgres j'ai d'abord crée un nouvel utilisateur en me servant de l'utilisateur crée par defaut (su - postgres):&lt;br /&gt;
 createuser -d -P root (mdp: glopglop)&lt;br /&gt;
&lt;br /&gt;
Puis j'ai créé une nouvelle base:&lt;br /&gt;
 createdb -O root pfe&lt;br /&gt;
&lt;br /&gt;
Pour se connecter a la base:&lt;br /&gt;
 psql pfe (depuis l'utilsateur root ou postgres)&lt;br /&gt;
&lt;br /&gt;
Enfin j'y ai ajouté mes tables:&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE balises (ID serial PRIMARY KEY, Pays varchar(50) NOT NULL, Ville varchar(50) NOT NULL, Localisation varchar(50) NOT NULL, Coordonnees varchar(50) NOT NULL,Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE historique_balise (ID serial PRIMARY KEY, id_balise int NOT NULL, Date date NOT NULL, Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
La base contient deux tables, une première ayant pour clef primaire l'id de la balise et contenant des informations diverses sur cette dernière telles que le pays, la ville, la localisation, les coordonnée, le niveau d'eau mais surtout si cette dernière est sous l'eau ou non. La seconde table concerne l'historique des balises, elle a pour clef primaire l'indice du relevé et contient des informations comme le numéro de balise, la date du relevé etc, l'état de la balise etc..&lt;br /&gt;
&lt;br /&gt;
Pour la communication entre le serveur d'application et le serveur réseau, j'ai dans un premier temps mis en place un script python pour récuperer les relevés des capteurs via l'API REST:&lt;br /&gt;
 import requests&lt;br /&gt;
 import json&lt;br /&gt;
 #on recupere le token&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Content-Type': 'application/json',&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
 }&lt;br /&gt;
 data = '{&amp;quot;email&amp;quot;: &amp;quot;admin&amp;quot;,&amp;quot;password&amp;quot;: &amp;quot;admin&amp;quot; }'&lt;br /&gt;
 response = requests.post('http://172.26.189.22:8080/api/internal/login', headers=headers, data=data)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 #print(resp['jwt'])&lt;br /&gt;
 #diverses information sur un capteur&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
    'Grpc-Metadata-Authorization': 'Bearer'+resp['jwt'],&lt;br /&gt;
 }&lt;br /&gt;
 response = requests.get('http://172.26.189.22:8080/api/devices/0b00f4ff703a8fc5', headers=headers)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 print(resp)&lt;br /&gt;
&lt;br /&gt;
Ce script permet de un premier temps de récuperer le token pour avoir accés à l'API. Celui ci est a renseigner dans toute les requetes http. &lt;br /&gt;
En se connectant à l'API via l'interface graphique (172.26.189.22:8080/api), on peut récuperer toutes les requetes possible en cURL, j'ai donc simplement utilisé un convertisseur cURL vers python pour mettre mes requetes en place.&lt;br /&gt;
&lt;br /&gt;
Malheureusement cette solution permet de récuperer de nombreuses informations concernant l'application mais pas les relevés des capteurs. Pour récupérer ces derniers, je suis passé par l'interface graphique du serveur d'application (172.26.189.22:8080) afin d'ajouter une intégration HTTP. Il faut simplement spécifier le format de l'information (JSON dans mon cas) et l'URL à laquelle doit être envoyé la requête http POST. Dans mon cas cela sera:&lt;br /&gt;
 http://172.26.189.23/pfe/gestionPOST.php&lt;br /&gt;
&lt;br /&gt;
La base du fichier gestionPOST.php ressemble à cela: &lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 header(&amp;quot;content-type: application/json&amp;quot;);&lt;br /&gt;
 $json = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
 $obj = json_decode($json);&lt;br /&gt;
 $decoded = base64_decode(json_encode($obj-&amp;gt;data));&lt;br /&gt;
 $fp = @fopen(&amp;quot;toto.txt&amp;quot;,&amp;quot;a&amp;quot;);&lt;br /&gt;
 fwrite($fp,$decoded);&lt;br /&gt;
 fwrite($fp,&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
 fclose($fp);&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il permet via le flux php://input de récupérer le contenu de la requête POST et de l'afficher.&lt;br /&gt;
&lt;br /&gt;
La prochaine étape concerne la gestion des informations avec notamment l'ajout en base selon le type d'information recu.&lt;br /&gt;
&lt;br /&gt;
====Gestion des trames====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les trames sont envoyés au format suivant:&lt;br /&gt;
 id:niveau1:niveau2:niveau3&lt;br /&gt;
&lt;br /&gt;
A travers le script php permettant la gestion des requetes HTTP Post, en se servant de la fonction preg_match avec le regex suivant on peut récuperer toutes les informations necessaires au traitement:&lt;br /&gt;
 &amp;quot;#^([0-9]+):([0-1]{1}):([0-1]{1}):([0-1]{1})$#&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Chaque nouvelle mesure envoyée sur le serveur d'application est renseignée en base grace à la requêtes SQL suivante:&lt;br /&gt;
 UPDATE balises&lt;br /&gt;
 SET inondee=:in, niveau=:niv&lt;br /&gt;
 WHERE id=:id;&lt;br /&gt;
&lt;br /&gt;
Les requêtes en php sont réalisées par le biais des fonctions query, prepare et execute.&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85341</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85341"/>
				<updated>2020-12-07T17:38:56Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Partie serveur d'application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Début projet===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Mise en place du réseau===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se connecter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
 subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
 range 192.168.42.1 192.168.42.9&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La configuration du serveur réseau s'effectue en se connectant à ce dernier en ssh:&lt;br /&gt;
 root@192.168.42.10&lt;br /&gt;
Il faut installer le &amp;quot;gateway bridge&amp;quot;, le &amp;quot;network server&amp;quot; ainsi que &amp;quot;l'application server&amp;quot; disponible sur ChirpStack. Pour se faire nous avons suivi un tutoriel à l'adresse suivante:&lt;br /&gt;
 https://www.youtube.com/watch?v=FnTP7t47DlI&lt;br /&gt;
ainsi que la documentation fournie par ChirpStack&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pour accéder au serveur réseau, nous passons par l'interface web en se connectant à l'adresse suivante (en passant par une zabeth):&lt;br /&gt;
 172.26.189.22:8080 id: admin mdp: admin&lt;br /&gt;
&lt;br /&gt;
A partir de l'interface web, nous pouvons configurer de nombreux éléments:&lt;br /&gt;
&lt;br /&gt;
-Création d'un nouveau projet&lt;br /&gt;
&lt;br /&gt;
-Ajouter des équipements aux réseau à l'aide des clefs&lt;br /&gt;
&lt;br /&gt;
-Surveiller les informations qui circulent sur notre réseau&lt;br /&gt;
&lt;br /&gt;
-...&lt;br /&gt;
&lt;br /&gt;
Enfin, en nous connectant en ssh sur les deux gateways:&lt;br /&gt;
 antenne: 192.168.42.1 mdp:pdmk-062E7A&lt;br /&gt;
 passerelle intérieur: 192.168.42.2 mdp:pdmk-030970&lt;br /&gt;
Nous avons pu mettre à jour ces dernieres en suivant le wiki Kerlink&lt;br /&gt;
La connexion au wiki Kerlink s'effectue avec:&lt;br /&gt;
 Login : univlille&lt;br /&gt;
 Mot de passe : IYBlN7QF06&lt;br /&gt;
&lt;br /&gt;
===Test du réseau===&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de notre Network Server nous avons utilisé un module GPS LoRa du commerce. En se connectant a notre Network Server (172.26.189.22:8000) nous avons pu créer une nouvelle application et ajouté un nouvel équipement. Se faisant notre Network Server génère deux clefs, une &amp;quot;application key&amp;quot; et une &amp;quot;Network Key&amp;quot;. Ces deux clefs doivent être renseigné manuellement dans notre équipement. Pour se faire on peut le connecter à un ordinateur et y ajouter les clefs via son logiciel dédié. L'équipement possédant déjà un EUI permettant de reconnaître l'équipement, nous avons du renseigner ce dernier dans l'ajout de l'équipement sur le Network Server. Suite à ce test nous avons bien pu observer la circulation de nos trames et le bon fonctionnement de notre Network Server.&lt;br /&gt;
&lt;br /&gt;
===Fabrication du End-device===&lt;br /&gt;
&lt;br /&gt;
Pour le end-device je dispose d'une carte STM32F411RE, d'un shield SX1276MB1MAS et d'un capteur ultrason HC-SR04.&lt;br /&gt;
Le développement du programme se fait sur STM32Cube.&lt;br /&gt;
Un premier programme à été mis en place sans difficultés pour récupérer les valeurs du HC-SR04 en s'appuyant sur l'exemple proposé par Arduino.&lt;br /&gt;
En revanche les problèmes sont arrivés lors du développement concernant la partie LoRaWAN. En effet STM32 propose un package LoRaWAN pour faciliter le développement d'application, le problème étant que ce package concerne seulement les cartes STM32LXXX. J'ai essayé longuement d'adapter ce package pour ma carte STM32F411RE en modifiant notamment le Makefile, les .flash mais aussi les fichiers d'inclusion sans succès malheureusement. La solution envisagée est donc un changement de carte au profit d'une STM32LXXX.&lt;br /&gt;
&lt;br /&gt;
Après changé notre carte pour une STM32L152RE, j'ai repris le package proposé par STM32 et dans le fichier Commissioning.h j'ai rensigné les clefs &lt;br /&gt;
 LORAWAN_APP_KEY&lt;br /&gt;
 LORAWAN_NWK_KEY&lt;br /&gt;
&lt;br /&gt;
Il n'y a que ces deux à renseigner étant donné que notre équipement fonctionne sur une version inférieur à la 1.1. A noter que le champ device EUI semble ne pas fonctionner. Nous avons du récuper l'EUI sur une gateway et renseigner ce dernier dans l'équipement que j'ai crée pour mon application sur l'interface web.&lt;br /&gt;
&lt;br /&gt;
Concernant le programme de l'équipement en lui même le programme est relativement simle, en se servant de la bibliothèque HAL je declare 3 PIN en input et je renvoie ainsi l'état des capteurs de manière périodique en me servant de la fonction &amp;quot;Send&amp;quot; du package STM32.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie application WEB===&lt;br /&gt;
&lt;br /&gt;
La principale difficulté de cette partie et l'absence totale de connaissances dans le développement d'application WEB. J'ai donc dû apprendre les langage HTML / CSS / PHP (quelques notions en JS) pour réaliser cette partie. Je disposais de quelques notions en base de données et SQL suit à mon année d'IMA3.&lt;br /&gt;
&lt;br /&gt;
Le but de l'application WEB est de permettre de rendre exploitable pour l'utilisateurs les informations renvoyés par les balises. Pour se faire l'application doit contenir une page de monitoring permettant de surveiller l'état de toutes les balises. De plus elle doit contenir une partie historique permettant d'accéder à l'historique d'une balise en particulier (en effectuant une recherche par id/localisation/date). Enfin elle doit aussi proposer une partie permettant d'afficher une carte avec dessus les balises et leur état.&lt;br /&gt;
&lt;br /&gt;
A l'aide de Bootstrap j'ai mis en place une application WEB avec ces trois partie. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie serveur d'application===&lt;br /&gt;
&lt;br /&gt;
Concernant la partie serveur, j'ai mis en place sur une VM (172.26.189.23) un serveur apache et Postgres pour la gestion des bases mais aussi un interpreteur php.&lt;br /&gt;
Pour apache j'ai simplement mis tous mes fichiers html/php dans /var/www/html qui est le repertoir par defaut. Celui est configuré pour démarrer au lancement de la VM.&lt;br /&gt;
Concernant Postgres j'ai d'abord crée un nouvel utilisateur en me servant de l'utilisateur crée par defaut (su - postgres):&lt;br /&gt;
 createuser -d -P root (mdp: glopglop)&lt;br /&gt;
&lt;br /&gt;
Puis j'ai créé une nouvelle base:&lt;br /&gt;
 createdb -O root pfe&lt;br /&gt;
&lt;br /&gt;
Pour se connecter a la base:&lt;br /&gt;
 psql pfe (depuis l'utilsateur root ou postgres)&lt;br /&gt;
&lt;br /&gt;
Enfin j'y ai ajouté mes tables:&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE balises (ID serial PRIMARY KEY, Pays varchar(50) NOT NULL, Ville varchar(50) NOT NULL, Localisation varchar(50) NOT NULL, Coordonnees varchar(50) NOT NULL,Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE historique_balise (ID serial PRIMARY KEY, id_balise int NOT NULL, Date date NOT NULL, Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
La base contient deux tables, une première ayant pour clef primaire l'id de la balise et contenant des informations diverses sur cette dernière telles que le pays, la ville, la localisation, les coordonnée, le niveau d'eau mais surtout si cette dernière est sous l'eau ou non. La seconde table concerne l'historique des balises, elle a pour clef primaire l'indice du relevé et contient des informations comme le numéro de balise, la date du relevé etc, l'état de la balise etc..&lt;br /&gt;
&lt;br /&gt;
Pour la communication entre le serveur d'application et le serveur réseau, j'ai dans un premier temps mis en place un script python pour récuperer les relevés des capteurs via l'API REST:&lt;br /&gt;
 import requests&lt;br /&gt;
 import json&lt;br /&gt;
 #on recupere le token&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Content-Type': 'application/json',&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
 }&lt;br /&gt;
 data = '{&amp;quot;email&amp;quot;: &amp;quot;admin&amp;quot;,&amp;quot;password&amp;quot;: &amp;quot;admin&amp;quot; }'&lt;br /&gt;
 response = requests.post('http://172.26.189.22:8080/api/internal/login', headers=headers, data=data)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 #print(resp['jwt'])&lt;br /&gt;
 #diverses information sur un capteur&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
    'Grpc-Metadata-Authorization': 'Bearer'+resp['jwt'],&lt;br /&gt;
 }&lt;br /&gt;
 response = requests.get('http://172.26.189.22:8080/api/devices/0b00f4ff703a8fc5', headers=headers)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 print(resp)&lt;br /&gt;
&lt;br /&gt;
Ce script permet de un premier temps de récuperer le token pour avoir accés à l'API. Celui ci est a renseigner dans toute les requetes http. &lt;br /&gt;
En se connectant à l'API via l'interface graphique (172.26.189.22:8080/api), on peut récuperer toutes les requetes possible en cURL, j'ai donc simplement utilisé un convertisseur cURL vers python pour mettre mes requetes en place.&lt;br /&gt;
&lt;br /&gt;
Malheureusement cette solution permet de récuperer de nombreuses informations concernant l'application mais pas les relevés des capteurs. Pour récupérer ces derniers, je suis passé par l'interface graphique du serveur d'application (172.26.189.22:8080) afin d'ajouter une intégration HTTP. Il faut simplement spécifier le format de l'information (JSON dans mon cas) et l'URL à laquelle doit être envoyé la requête http POST. Dans mon cas cela sera:&lt;br /&gt;
 http://172.26.189.23/pfe/gestionPOST.php&lt;br /&gt;
&lt;br /&gt;
La base du fichier gestionPOST.php ressemble à cela: &lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 header(&amp;quot;content-type: application/json&amp;quot;);&lt;br /&gt;
 $json = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
 $obj = json_decode($json);&lt;br /&gt;
 $decoded = base64_decode(json_encode($obj-&amp;gt;data));&lt;br /&gt;
 $fp = @fopen(&amp;quot;toto.txt&amp;quot;,&amp;quot;a&amp;quot;);&lt;br /&gt;
 fwrite($fp,$decoded);&lt;br /&gt;
 fwrite($fp,&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
 fclose($fp);&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il permet via le flux php://input de récupérer le contenu de la requête POST et de l'afficher.&lt;br /&gt;
&lt;br /&gt;
La prochaine étape concerne la gestion des informations avec notamment l'ajout en base selon le type d'information recu.&lt;br /&gt;
&lt;br /&gt;
====Gestion des trames====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les trames sont envoyés au format suivant:&lt;br /&gt;
 id:niveau1:niveau2:niveau3&lt;br /&gt;
&lt;br /&gt;
A travers le script php permettant la gestion des requetes HTTP Post, en se servant de la fonction preg_match avec le regex suivant on peut récuperer toutes les informations necessaires au traitement:&lt;br /&gt;
 &amp;quot;#^([0-9]+):([0-1]{1}):([0-1]{1}):([0-1]{1})$#&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Chaque nouvelle mesure envoyée sur le serveur d'application est renseignée en base grace à la requêtes SQL suivante:&lt;br /&gt;
 UPDATE balises&lt;br /&gt;
 SET inondee=:in, niveau=:niv&lt;br /&gt;
 WHERE id=:id;&lt;br /&gt;
&lt;br /&gt;
Les requêtes en php sont réalisées par le biais des fonctions query, prepare et execute.&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85340</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85340"/>
				<updated>2020-12-07T17:38:19Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Partie serveur d'application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Début projet===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Mise en place du réseau===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se connecter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
 subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
 range 192.168.42.1 192.168.42.9&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La configuration du serveur réseau s'effectue en se connectant à ce dernier en ssh:&lt;br /&gt;
 root@192.168.42.10&lt;br /&gt;
Il faut installer le &amp;quot;gateway bridge&amp;quot;, le &amp;quot;network server&amp;quot; ainsi que &amp;quot;l'application server&amp;quot; disponible sur ChirpStack. Pour se faire nous avons suivi un tutoriel à l'adresse suivante:&lt;br /&gt;
 https://www.youtube.com/watch?v=FnTP7t47DlI&lt;br /&gt;
ainsi que la documentation fournie par ChirpStack&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pour accéder au serveur réseau, nous passons par l'interface web en se connectant à l'adresse suivante (en passant par une zabeth):&lt;br /&gt;
 172.26.189.22:8080 id: admin mdp: admin&lt;br /&gt;
&lt;br /&gt;
A partir de l'interface web, nous pouvons configurer de nombreux éléments:&lt;br /&gt;
&lt;br /&gt;
-Création d'un nouveau projet&lt;br /&gt;
&lt;br /&gt;
-Ajouter des équipements aux réseau à l'aide des clefs&lt;br /&gt;
&lt;br /&gt;
-Surveiller les informations qui circulent sur notre réseau&lt;br /&gt;
&lt;br /&gt;
-...&lt;br /&gt;
&lt;br /&gt;
Enfin, en nous connectant en ssh sur les deux gateways:&lt;br /&gt;
 antenne: 192.168.42.1 mdp:pdmk-062E7A&lt;br /&gt;
 passerelle intérieur: 192.168.42.2 mdp:pdmk-030970&lt;br /&gt;
Nous avons pu mettre à jour ces dernieres en suivant le wiki Kerlink&lt;br /&gt;
La connexion au wiki Kerlink s'effectue avec:&lt;br /&gt;
 Login : univlille&lt;br /&gt;
 Mot de passe : IYBlN7QF06&lt;br /&gt;
&lt;br /&gt;
===Test du réseau===&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de notre Network Server nous avons utilisé un module GPS LoRa du commerce. En se connectant a notre Network Server (172.26.189.22:8000) nous avons pu créer une nouvelle application et ajouté un nouvel équipement. Se faisant notre Network Server génère deux clefs, une &amp;quot;application key&amp;quot; et une &amp;quot;Network Key&amp;quot;. Ces deux clefs doivent être renseigné manuellement dans notre équipement. Pour se faire on peut le connecter à un ordinateur et y ajouter les clefs via son logiciel dédié. L'équipement possédant déjà un EUI permettant de reconnaître l'équipement, nous avons du renseigner ce dernier dans l'ajout de l'équipement sur le Network Server. Suite à ce test nous avons bien pu observer la circulation de nos trames et le bon fonctionnement de notre Network Server.&lt;br /&gt;
&lt;br /&gt;
===Fabrication du End-device===&lt;br /&gt;
&lt;br /&gt;
Pour le end-device je dispose d'une carte STM32F411RE, d'un shield SX1276MB1MAS et d'un capteur ultrason HC-SR04.&lt;br /&gt;
Le développement du programme se fait sur STM32Cube.&lt;br /&gt;
Un premier programme à été mis en place sans difficultés pour récupérer les valeurs du HC-SR04 en s'appuyant sur l'exemple proposé par Arduino.&lt;br /&gt;
En revanche les problèmes sont arrivés lors du développement concernant la partie LoRaWAN. En effet STM32 propose un package LoRaWAN pour faciliter le développement d'application, le problème étant que ce package concerne seulement les cartes STM32LXXX. J'ai essayé longuement d'adapter ce package pour ma carte STM32F411RE en modifiant notamment le Makefile, les .flash mais aussi les fichiers d'inclusion sans succès malheureusement. La solution envisagée est donc un changement de carte au profit d'une STM32LXXX.&lt;br /&gt;
&lt;br /&gt;
Après changé notre carte pour une STM32L152RE, j'ai repris le package proposé par STM32 et dans le fichier Commissioning.h j'ai rensigné les clefs &lt;br /&gt;
 LORAWAN_APP_KEY&lt;br /&gt;
 LORAWAN_NWK_KEY&lt;br /&gt;
&lt;br /&gt;
Il n'y a que ces deux à renseigner étant donné que notre équipement fonctionne sur une version inférieur à la 1.1. A noter que le champ device EUI semble ne pas fonctionner. Nous avons du récuper l'EUI sur une gateway et renseigner ce dernier dans l'équipement que j'ai crée pour mon application sur l'interface web.&lt;br /&gt;
&lt;br /&gt;
Concernant le programme de l'équipement en lui même le programme est relativement simle, en se servant de la bibliothèque HAL je declare 3 PIN en input et je renvoie ainsi l'état des capteurs de manière périodique en me servant de la fonction &amp;quot;Send&amp;quot; du package STM32.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie application WEB===&lt;br /&gt;
&lt;br /&gt;
La principale difficulté de cette partie et l'absence totale de connaissances dans le développement d'application WEB. J'ai donc dû apprendre les langage HTML / CSS / PHP (quelques notions en JS) pour réaliser cette partie. Je disposais de quelques notions en base de données et SQL suit à mon année d'IMA3.&lt;br /&gt;
&lt;br /&gt;
Le but de l'application WEB est de permettre de rendre exploitable pour l'utilisateurs les informations renvoyés par les balises. Pour se faire l'application doit contenir une page de monitoring permettant de surveiller l'état de toutes les balises. De plus elle doit contenir une partie historique permettant d'accéder à l'historique d'une balise en particulier (en effectuant une recherche par id/localisation/date). Enfin elle doit aussi proposer une partie permettant d'afficher une carte avec dessus les balises et leur état.&lt;br /&gt;
&lt;br /&gt;
A l'aide de Bootstrap j'ai mis en place une application WEB avec ces trois partie. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie serveur d'application===&lt;br /&gt;
&lt;br /&gt;
Concernant la partie serveur, j'ai mis en place sur une VM (172.26.189.23) un serveur apache et Postgres pour la gestion des bases mais aussi un interpreteur php.&lt;br /&gt;
Pour apache j'ai simplement mis tous mes fichiers html/php dans /var/www/html qui est le repertoir par defaut. Celui est configuré pour démarrer au lancement de la VM.&lt;br /&gt;
Concernant Postgres j'ai d'abord crée un nouvel utilisateur en me servant de l'utilisateur crée par defaut (su - postgres):&lt;br /&gt;
 createuser -d -P root (mdp: glopglop)&lt;br /&gt;
&lt;br /&gt;
Puis j'ai créé une nouvelle base:&lt;br /&gt;
 createdb -O root pfe&lt;br /&gt;
&lt;br /&gt;
Pour se connecter a la base:&lt;br /&gt;
 psql pfe (depuis l'utilsateur root ou postgres)&lt;br /&gt;
&lt;br /&gt;
Enfin j'y ai ajouté mes tables:&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE balises (ID serial PRIMARY KEY, Pays varchar(50) NOT NULL, Ville varchar(50) NOT NULL, Localisation varchar(50) NOT NULL, Coordonnees varchar(50) NOT NULL,Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE historique_balise (ID serial PRIMARY KEY, id_balise int NOT NULL, Date date NOT NULL, Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
La base contient deux tables, une première ayant pour clef primaire l'id de la balise et contenant des informations diverses sur cette dernière telles que le pays, la ville, la localisation, les coordonnée, le niveau d'eau mais surtout si cette dernière est sous l'eau ou non. La seconde table concerne l'historique des balises, elle a pour clef primaire l'indice du relevé et contient des informations comme le numéro de balise, la date du relevé etc, l'état de la balise etc..&lt;br /&gt;
&lt;br /&gt;
Pour la communication entre le serveur d'application et le serveur réseau, j'ai dans un premier temps mis en place un script python pour récuperer les relevés des capteurs via l'API REST:&lt;br /&gt;
 import requests&lt;br /&gt;
 import json&lt;br /&gt;
 #on recupere le token&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Content-Type': 'application/json',&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
 }&lt;br /&gt;
 data = '{&amp;quot;email&amp;quot;: &amp;quot;admin&amp;quot;,&amp;quot;password&amp;quot;: &amp;quot;admin&amp;quot; }'&lt;br /&gt;
 response = requests.post('http://172.26.189.22:8080/api/internal/login', headers=headers, data=data)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 #print(resp['jwt'])&lt;br /&gt;
 #diverses information sur un capteur&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
    'Grpc-Metadata-Authorization': 'Bearer'+resp['jwt'],&lt;br /&gt;
 }&lt;br /&gt;
 response = requests.get('http://172.26.189.22:8080/api/devices/0b00f4ff703a8fc5', headers=headers)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 print(resp)&lt;br /&gt;
&lt;br /&gt;
Ce script permet de un premier temps de récuperer le token pour avoir accés à l'API. Celui ci est a renseigner dans toute les requetes http. &lt;br /&gt;
En se connectant à l'API via l'interface graphique (172.26.189.22:8080/api), on peut récuperer toutes les requetes possible en cURL, j'ai donc simplement utilisé un convertisseur cURL vers python pour mettre mes requetes en place.&lt;br /&gt;
&lt;br /&gt;
Malheureusement cette solution permet de récuperer de nombreuses informations concernant l'application mais pas les relevés des capteurs. Pour récupérer ces derniers, je suis passé par l'interface graphique du serveur d'application (172.26.189.22:8080) afin d'ajouter une intégration HTTP. Il faut simplement spécifier le format de l'information (JSON dans mon cas) et l'URL à laquelle doit être envoyé la requête http POST. Dans mon cas cela sera:&lt;br /&gt;
 http://172.26.189.23/pfe/gestionPOST.php&lt;br /&gt;
&lt;br /&gt;
La base du fichier gestionPOST.php ressemble à cela: &lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 header(&amp;quot;content-type: application/json&amp;quot;);&lt;br /&gt;
 $json = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
 $obj = json_decode($json);&lt;br /&gt;
 $decoded = base64_decode(json_encode($obj-&amp;gt;data));&lt;br /&gt;
 $fp = @fopen(&amp;quot;toto.txt&amp;quot;,&amp;quot;a&amp;quot;);&lt;br /&gt;
 fwrite($fp,$decoded);&lt;br /&gt;
 fwrite($fp,&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
 fclose($fp);&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il permet via le flux php://input de récupérer le contenu de la requête POST et de l'afficher.&lt;br /&gt;
&lt;br /&gt;
La prochaine étape concerne la gestion des informations avec notamment l'ajout en base selon le type d'information recu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les trames sont envoyés au format suivant:&lt;br /&gt;
 id:niveau1:niveau2:niveau3&lt;br /&gt;
&lt;br /&gt;
A travers le script php permettant la gestion des requetes HTTP Post, en se servant de la fonction preg_match avec le regex suivant on peut récuperer toutes les informations necessaires au traitement:&lt;br /&gt;
 &amp;quot;#^([0-9]+):([0-1]{1}):([0-1]{1}):([0-1]{1})$#&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Chaque nouvelle mesure envoyée sur le serveur d'application est renseignée en base grace à la requêtes SQL suivante:&lt;br /&gt;
 UPDATE balises&lt;br /&gt;
 SET inondee=:in, niveau=:niv&lt;br /&gt;
 WHERE id=:id;&lt;br /&gt;
&lt;br /&gt;
Les requêtes en php sont réalisées par le biais des fonctions query, prepare et execute.&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85339</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85339"/>
				<updated>2020-12-07T17:37:14Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Partie serveur d'application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Début projet===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Mise en place du réseau===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se connecter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
 subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
 range 192.168.42.1 192.168.42.9&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La configuration du serveur réseau s'effectue en se connectant à ce dernier en ssh:&lt;br /&gt;
 root@192.168.42.10&lt;br /&gt;
Il faut installer le &amp;quot;gateway bridge&amp;quot;, le &amp;quot;network server&amp;quot; ainsi que &amp;quot;l'application server&amp;quot; disponible sur ChirpStack. Pour se faire nous avons suivi un tutoriel à l'adresse suivante:&lt;br /&gt;
 https://www.youtube.com/watch?v=FnTP7t47DlI&lt;br /&gt;
ainsi que la documentation fournie par ChirpStack&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pour accéder au serveur réseau, nous passons par l'interface web en se connectant à l'adresse suivante (en passant par une zabeth):&lt;br /&gt;
 172.26.189.22:8080 id: admin mdp: admin&lt;br /&gt;
&lt;br /&gt;
A partir de l'interface web, nous pouvons configurer de nombreux éléments:&lt;br /&gt;
&lt;br /&gt;
-Création d'un nouveau projet&lt;br /&gt;
&lt;br /&gt;
-Ajouter des équipements aux réseau à l'aide des clefs&lt;br /&gt;
&lt;br /&gt;
-Surveiller les informations qui circulent sur notre réseau&lt;br /&gt;
&lt;br /&gt;
-...&lt;br /&gt;
&lt;br /&gt;
Enfin, en nous connectant en ssh sur les deux gateways:&lt;br /&gt;
 antenne: 192.168.42.1 mdp:pdmk-062E7A&lt;br /&gt;
 passerelle intérieur: 192.168.42.2 mdp:pdmk-030970&lt;br /&gt;
Nous avons pu mettre à jour ces dernieres en suivant le wiki Kerlink&lt;br /&gt;
La connexion au wiki Kerlink s'effectue avec:&lt;br /&gt;
 Login : univlille&lt;br /&gt;
 Mot de passe : IYBlN7QF06&lt;br /&gt;
&lt;br /&gt;
===Test du réseau===&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de notre Network Server nous avons utilisé un module GPS LoRa du commerce. En se connectant a notre Network Server (172.26.189.22:8000) nous avons pu créer une nouvelle application et ajouté un nouvel équipement. Se faisant notre Network Server génère deux clefs, une &amp;quot;application key&amp;quot; et une &amp;quot;Network Key&amp;quot;. Ces deux clefs doivent être renseigné manuellement dans notre équipement. Pour se faire on peut le connecter à un ordinateur et y ajouter les clefs via son logiciel dédié. L'équipement possédant déjà un EUI permettant de reconnaître l'équipement, nous avons du renseigner ce dernier dans l'ajout de l'équipement sur le Network Server. Suite à ce test nous avons bien pu observer la circulation de nos trames et le bon fonctionnement de notre Network Server.&lt;br /&gt;
&lt;br /&gt;
===Fabrication du End-device===&lt;br /&gt;
&lt;br /&gt;
Pour le end-device je dispose d'une carte STM32F411RE, d'un shield SX1276MB1MAS et d'un capteur ultrason HC-SR04.&lt;br /&gt;
Le développement du programme se fait sur STM32Cube.&lt;br /&gt;
Un premier programme à été mis en place sans difficultés pour récupérer les valeurs du HC-SR04 en s'appuyant sur l'exemple proposé par Arduino.&lt;br /&gt;
En revanche les problèmes sont arrivés lors du développement concernant la partie LoRaWAN. En effet STM32 propose un package LoRaWAN pour faciliter le développement d'application, le problème étant que ce package concerne seulement les cartes STM32LXXX. J'ai essayé longuement d'adapter ce package pour ma carte STM32F411RE en modifiant notamment le Makefile, les .flash mais aussi les fichiers d'inclusion sans succès malheureusement. La solution envisagée est donc un changement de carte au profit d'une STM32LXXX.&lt;br /&gt;
&lt;br /&gt;
Après changé notre carte pour une STM32L152RE, j'ai repris le package proposé par STM32 et dans le fichier Commissioning.h j'ai rensigné les clefs &lt;br /&gt;
 LORAWAN_APP_KEY&lt;br /&gt;
 LORAWAN_NWK_KEY&lt;br /&gt;
&lt;br /&gt;
Il n'y a que ces deux à renseigner étant donné que notre équipement fonctionne sur une version inférieur à la 1.1. A noter que le champ device EUI semble ne pas fonctionner. Nous avons du récuper l'EUI sur une gateway et renseigner ce dernier dans l'équipement que j'ai crée pour mon application sur l'interface web.&lt;br /&gt;
&lt;br /&gt;
Concernant le programme de l'équipement en lui même le programme est relativement simle, en se servant de la bibliothèque HAL je declare 3 PIN en input et je renvoie ainsi l'état des capteurs de manière périodique en me servant de la fonction &amp;quot;Send&amp;quot; du package STM32.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie application WEB===&lt;br /&gt;
&lt;br /&gt;
La principale difficulté de cette partie et l'absence totale de connaissances dans le développement d'application WEB. J'ai donc dû apprendre les langage HTML / CSS / PHP (quelques notions en JS) pour réaliser cette partie. Je disposais de quelques notions en base de données et SQL suit à mon année d'IMA3.&lt;br /&gt;
&lt;br /&gt;
Le but de l'application WEB est de permettre de rendre exploitable pour l'utilisateurs les informations renvoyés par les balises. Pour se faire l'application doit contenir une page de monitoring permettant de surveiller l'état de toutes les balises. De plus elle doit contenir une partie historique permettant d'accéder à l'historique d'une balise en particulier (en effectuant une recherche par id/localisation/date). Enfin elle doit aussi proposer une partie permettant d'afficher une carte avec dessus les balises et leur état.&lt;br /&gt;
&lt;br /&gt;
A l'aide de Bootstrap j'ai mis en place une application WEB avec ces trois partie. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie serveur d'application===&lt;br /&gt;
&lt;br /&gt;
Concernant la partie serveur, j'ai mis en place sur une VM (172.26.189.23) un serveur apache et Postgres pour la gestion des bases mais aussi un interpreteur php.&lt;br /&gt;
Pour apache j'ai simplement mis tous mes fichiers html/php dans /var/www/html qui est le repertoir par defaut. Celui est configuré pour démarrer au lancement de la VM.&lt;br /&gt;
Concernant Postgres j'ai d'abord crée un nouvel utilisateur en me servant de l'utilisateur crée par defaut (su - postgres):&lt;br /&gt;
 createuser -d -P root (mdp: glopglop)&lt;br /&gt;
&lt;br /&gt;
Puis j'ai créé une nouvelle base:&lt;br /&gt;
 createdb -O root pfe&lt;br /&gt;
&lt;br /&gt;
Pour se connecter a la base:&lt;br /&gt;
 psql pfe (depuis l'utilsateur root ou postgres)&lt;br /&gt;
&lt;br /&gt;
Enfin j'y ai ajouté mes tables:&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE balises (ID serial PRIMARY KEY, Pays varchar(50) NOT NULL, Ville varchar(50) NOT NULL, Localisation varchar(50) NOT NULL, Coordonnees varchar(50) NOT NULL,Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE historique_balise (ID serial PRIMARY KEY, id_balise int NOT NULL, Date date NOT NULL, Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
La base contient deux tables, une première ayant pour clef primaire l'id de la balise et contenant des informations diverses sur cette dernière telles que le pays, la ville, la localisation, les coordonnée, le niveau d'eau mais surtout si cette dernière est sous l'eau ou non. La seconde table concerne l'historique des balises, elle a pour clef primaire l'indice du relevé et contient des informations comme le numéro de balise, la date du relevé etc, l'état de la balise etc..&lt;br /&gt;
&lt;br /&gt;
Pour la communication entre le serveur d'application et le serveur réseau, j'ai dans un premier temps mis en place un script python pour récuperer les relevés des capteurs via l'API REST:&lt;br /&gt;
 import requests&lt;br /&gt;
 import json&lt;br /&gt;
 #on recupere le token&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Content-Type': 'application/json',&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
 }&lt;br /&gt;
 data = '{&amp;quot;email&amp;quot;: &amp;quot;admin&amp;quot;,&amp;quot;password&amp;quot;: &amp;quot;admin&amp;quot; }'&lt;br /&gt;
 response = requests.post('http://172.26.189.22:8080/api/internal/login', headers=headers, data=data)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 #print(resp['jwt'])&lt;br /&gt;
 #diverses information sur un capteur&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
    'Grpc-Metadata-Authorization': 'Bearer'+resp['jwt'],&lt;br /&gt;
 }&lt;br /&gt;
 response = requests.get('http://172.26.189.22:8080/api/devices/0b00f4ff703a8fc5', headers=headers)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 print(resp)&lt;br /&gt;
&lt;br /&gt;
Ce script permet de un premier temps de récuperer le token pour avoir accés à l'API. Celui ci est a renseigner dans toute les requetes http. &lt;br /&gt;
En se connectant à l'API via l'interface graphique (172.26.189.22:8080/api), on peut récuperer toutes les requetes possible en cURL, j'ai donc simplement utilisé un convertisseur cURL vers python pour mettre mes requetes en place.&lt;br /&gt;
&lt;br /&gt;
Malheureusement cette solution permet de récuperer de nombreuses informations concernant l'application mais pas les relevés des capteurs. Pour récupérer ces derniers, je suis passé par l'interface graphique du serveur d'application (172.26.189.22:8080) afin d'ajouter une intégration HTTP. Il faut simplement spécifier le format de l'information (JSON dans mon cas) et l'URL à laquelle doit être envoyé la requête http POST. Dans mon cas cela sera:&lt;br /&gt;
 http://172.26.189.23/pfe/gestionPOST.php&lt;br /&gt;
&lt;br /&gt;
Le fichier gestionPOST.php ressemble pour le moment à cela: &lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 header(&amp;quot;content-type: application/json&amp;quot;);&lt;br /&gt;
 $json = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
 $obj = json_decode($json);&lt;br /&gt;
 $decoded = base64_decode(json_encode($obj-&amp;gt;data));&lt;br /&gt;
 $fp = @fopen(&amp;quot;toto.txt&amp;quot;,&amp;quot;a&amp;quot;);&lt;br /&gt;
 fwrite($fp,$decoded);&lt;br /&gt;
 fwrite($fp,&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
 fclose($fp);&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il permet via le flux php://input de récupérer le contenu de la requête POST et de l'afficher.&lt;br /&gt;
&lt;br /&gt;
La prochaine étape concerne la gestion des informations avec notamment l'ajout en base selon le type d'information recu.&lt;br /&gt;
&lt;br /&gt;
Etape 1:&lt;br /&gt;
&lt;br /&gt;
Les trames sont envoyés au format suivant:&lt;br /&gt;
 id:niveau1:niveau2:niveau3&lt;br /&gt;
&lt;br /&gt;
A travers le script php permettant la gestion des requetes HTTP Post, en se servant de la fonction preg_match avec le regex suivant on peut récuperer toutes les informations necessaires au traitement:&lt;br /&gt;
 &amp;quot;#^([0-9]+):([0-1]{1}):([0-1]{1}):([0-1]{1})$#&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Chaque nouvelle mesure envoyée sur le serveur d'application est renseignée en base grace à la requêtes SQL suivante:&lt;br /&gt;
 UPDATE balises&lt;br /&gt;
 SET inondee=:in, niveau=:niv&lt;br /&gt;
 WHERE id=:id;&lt;br /&gt;
&lt;br /&gt;
Les requêtes en php sont réalisées par le biais des fonctions query, prepare et execute.&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85338</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85338"/>
				<updated>2020-12-07T13:57:10Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Partie serveur d'application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Début projet===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Mise en place du réseau===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se connecter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
 subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
 range 192.168.42.1 192.168.42.9&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La configuration du serveur réseau s'effectue en se connectant à ce dernier en ssh:&lt;br /&gt;
 root@192.168.42.10&lt;br /&gt;
Il faut installer le &amp;quot;gateway bridge&amp;quot;, le &amp;quot;network server&amp;quot; ainsi que &amp;quot;l'application server&amp;quot; disponible sur ChirpStack. Pour se faire nous avons suivi un tutoriel à l'adresse suivante:&lt;br /&gt;
 https://www.youtube.com/watch?v=FnTP7t47DlI&lt;br /&gt;
ainsi que la documentation fournie par ChirpStack&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pour accéder au serveur réseau, nous passons par l'interface web en se connectant à l'adresse suivante (en passant par une zabeth):&lt;br /&gt;
 172.26.189.22:8080 id: admin mdp: admin&lt;br /&gt;
&lt;br /&gt;
A partir de l'interface web, nous pouvons configurer de nombreux éléments:&lt;br /&gt;
&lt;br /&gt;
-Création d'un nouveau projet&lt;br /&gt;
&lt;br /&gt;
-Ajouter des équipements aux réseau à l'aide des clefs&lt;br /&gt;
&lt;br /&gt;
-Surveiller les informations qui circulent sur notre réseau&lt;br /&gt;
&lt;br /&gt;
-...&lt;br /&gt;
&lt;br /&gt;
Enfin, en nous connectant en ssh sur les deux gateways:&lt;br /&gt;
 antenne: 192.168.42.1 mdp:pdmk-062E7A&lt;br /&gt;
 passerelle intérieur: 192.168.42.2 mdp:pdmk-030970&lt;br /&gt;
Nous avons pu mettre à jour ces dernieres en suivant le wiki Kerlink&lt;br /&gt;
La connexion au wiki Kerlink s'effectue avec:&lt;br /&gt;
 Login : univlille&lt;br /&gt;
 Mot de passe : IYBlN7QF06&lt;br /&gt;
&lt;br /&gt;
===Test du réseau===&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de notre Network Server nous avons utilisé un module GPS LoRa du commerce. En se connectant a notre Network Server (172.26.189.22:8000) nous avons pu créer une nouvelle application et ajouté un nouvel équipement. Se faisant notre Network Server génère deux clefs, une &amp;quot;application key&amp;quot; et une &amp;quot;Network Key&amp;quot;. Ces deux clefs doivent être renseigné manuellement dans notre équipement. Pour se faire on peut le connecter à un ordinateur et y ajouter les clefs via son logiciel dédié. L'équipement possédant déjà un EUI permettant de reconnaître l'équipement, nous avons du renseigner ce dernier dans l'ajout de l'équipement sur le Network Server. Suite à ce test nous avons bien pu observer la circulation de nos trames et le bon fonctionnement de notre Network Server.&lt;br /&gt;
&lt;br /&gt;
===Fabrication du End-device===&lt;br /&gt;
&lt;br /&gt;
Pour le end-device je dispose d'une carte STM32F411RE, d'un shield SX1276MB1MAS et d'un capteur ultrason HC-SR04.&lt;br /&gt;
Le développement du programme se fait sur STM32Cube.&lt;br /&gt;
Un premier programme à été mis en place sans difficultés pour récupérer les valeurs du HC-SR04 en s'appuyant sur l'exemple proposé par Arduino.&lt;br /&gt;
En revanche les problèmes sont arrivés lors du développement concernant la partie LoRaWAN. En effet STM32 propose un package LoRaWAN pour faciliter le développement d'application, le problème étant que ce package concerne seulement les cartes STM32LXXX. J'ai essayé longuement d'adapter ce package pour ma carte STM32F411RE en modifiant notamment le Makefile, les .flash mais aussi les fichiers d'inclusion sans succès malheureusement. La solution envisagée est donc un changement de carte au profit d'une STM32LXXX.&lt;br /&gt;
&lt;br /&gt;
Après changé notre carte pour une STM32L152RE, j'ai repris le package proposé par STM32 et dans le fichier Commissioning.h j'ai rensigné les clefs &lt;br /&gt;
 LORAWAN_APP_KEY&lt;br /&gt;
 LORAWAN_NWK_KEY&lt;br /&gt;
&lt;br /&gt;
Il n'y a que ces deux à renseigner étant donné que notre équipement fonctionne sur une version inférieur à la 1.1. A noter que le champ device EUI semble ne pas fonctionner. Nous avons du récuper l'EUI sur une gateway et renseigner ce dernier dans l'équipement que j'ai crée pour mon application sur l'interface web.&lt;br /&gt;
&lt;br /&gt;
Concernant le programme de l'équipement en lui même le programme est relativement simle, en se servant de la bibliothèque HAL je declare 3 PIN en input et je renvoie ainsi l'état des capteurs de manière périodique en me servant de la fonction &amp;quot;Send&amp;quot; du package STM32.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie application WEB===&lt;br /&gt;
&lt;br /&gt;
La principale difficulté de cette partie et l'absence totale de connaissances dans le développement d'application WEB. J'ai donc dû apprendre les langage HTML / CSS / PHP (quelques notions en JS) pour réaliser cette partie. Je disposais de quelques notions en base de données et SQL suit à mon année d'IMA3.&lt;br /&gt;
&lt;br /&gt;
Le but de l'application WEB est de permettre de rendre exploitable pour l'utilisateurs les informations renvoyés par les balises. Pour se faire l'application doit contenir une page de monitoring permettant de surveiller l'état de toutes les balises. De plus elle doit contenir une partie historique permettant d'accéder à l'historique d'une balise en particulier (en effectuant une recherche par id/localisation/date). Enfin elle doit aussi proposer une partie permettant d'afficher une carte avec dessus les balises et leur état.&lt;br /&gt;
&lt;br /&gt;
A l'aide de Bootstrap j'ai mis en place une application WEB avec ces trois partie. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie serveur d'application===&lt;br /&gt;
&lt;br /&gt;
Concernant la partie serveur, j'ai mis en place sur une VM (172.26.189.23) un serveur apache et Postgres pour la gestion des bases mais aussi un interpreteur php.&lt;br /&gt;
Pour apache j'ai simplement mis tous mes fichiers html/php dans /var/www/html qui est le repertoir par defaut. Celui est configuré pour démarrer au lancement de la VM.&lt;br /&gt;
Concernant Postgres j'ai d'abord crée un nouvel utilisateur en me servant de l'utilisateur crée par defaut (su - postgres):&lt;br /&gt;
 createuser -d -P root (mdp: glopglop)&lt;br /&gt;
&lt;br /&gt;
Puis j'ai créé une nouvelle base:&lt;br /&gt;
 createdb -O root pfe&lt;br /&gt;
&lt;br /&gt;
Pour se connecter a la base:&lt;br /&gt;
 psql pfe (depuis l'utilsateur root ou postgres)&lt;br /&gt;
&lt;br /&gt;
Enfin j'y ai ajouté mes tables:&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE balises (ID serial PRIMARY KEY, Pays varchar(50) NOT NULL, Ville varchar(50) NOT NULL, Localisation varchar(50) NOT NULL, Coordonnees varchar(50) NOT NULL,Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE historique_balise (ID serial PRIMARY KEY, id_balise int NOT NULL, Date date NOT NULL, Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
La base contient deux tables, une première ayant pour clef primaire l'id de la balise et contenant des informations diverses sur cette dernière telles que le pays, la ville, la localisation, les coordonnée, le niveau d'eau mais surtout si cette dernière est sous l'eau ou non. La seconde table concerne l'historique des balises, elle a pour clef primaire l'indice du relevé et contient des informations comme le numéro de balise, la date du relevé etc, l'état de la balise etc..&lt;br /&gt;
&lt;br /&gt;
Pour la communication entre le serveur d'application et le serveur réseau, j'ai dans un premier temps mis en place un script python pour récuperer les relevés des capteurs via l'API REST:&lt;br /&gt;
 import requests&lt;br /&gt;
 import json&lt;br /&gt;
 #on recupere le token&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Content-Type': 'application/json',&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
 }&lt;br /&gt;
 data = '{&amp;quot;email&amp;quot;: &amp;quot;admin&amp;quot;,&amp;quot;password&amp;quot;: &amp;quot;admin&amp;quot; }'&lt;br /&gt;
 response = requests.post('http://172.26.189.22:8080/api/internal/login', headers=headers, data=data)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 #print(resp['jwt'])&lt;br /&gt;
 #diverses information sur un capteur&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
    'Grpc-Metadata-Authorization': 'Bearer'+resp['jwt'],&lt;br /&gt;
 }&lt;br /&gt;
 response = requests.get('http://172.26.189.22:8080/api/devices/0b00f4ff703a8fc5', headers=headers)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 print(resp)&lt;br /&gt;
&lt;br /&gt;
Ce script permet de un premier temps de récuperer le token pour avoir accés à l'API. Celui ci est a renseigner dans toute les requetes http. &lt;br /&gt;
En se connectant à l'API via l'interface graphique (172.26.189.22:8080/api), on peut récuperer toutes les requetes possible en cURL, j'ai donc simplement utilisé un convertisseur cURL vers python pour mettre mes requetes en place.&lt;br /&gt;
&lt;br /&gt;
Malheureusement cette solution permet de récuperer de nombreuses informations concernant l'application mais pas les relevés des capteurs. Pour récupérer ces derniers, je suis passé par l'interface graphique du serveur d'application (172.26.189.22:8080) afin d'ajouter une intégration HTTP. Il faut simplement spécifier le format de l'information (JSON dans mon cas) et l'URL à laquelle doit être envoyé la requête http POST. Dans mon cas cela sera:&lt;br /&gt;
 http://172.26.189.23/pfe/gestionPOST.php&lt;br /&gt;
&lt;br /&gt;
Le fichier gestionPOST.php ressemble pour le moment à cela: &lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 header(&amp;quot;content-type: application/json&amp;quot;);&lt;br /&gt;
 $json = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
 $obj = json_decode($json);&lt;br /&gt;
 $decoded = base64_decode(json_encode($obj-&amp;gt;data));&lt;br /&gt;
 $fp = @fopen(&amp;quot;toto.txt&amp;quot;,&amp;quot;a&amp;quot;);&lt;br /&gt;
 fwrite($fp,$decoded);&lt;br /&gt;
 fwrite($fp,&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
 fclose($fp);&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il permet via le flux php://input de récupérer le contenu de la requête POST et de l'afficher.&lt;br /&gt;
&lt;br /&gt;
La prochaine étape concerne la gestion des informations avec notamment l'ajout en base selon le type d'information recu.&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85335</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85335"/>
				<updated>2020-11-26T17:17:08Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Partie serveur d'application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Début projet===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Mise en place du réseau===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se connecter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
 subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
 range 192.168.42.1 192.168.42.9&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La configuration du serveur réseau s'effectue en se connectant à ce dernier en ssh:&lt;br /&gt;
 root@192.168.42.10&lt;br /&gt;
Il faut installer le &amp;quot;gateway bridge&amp;quot;, le &amp;quot;network server&amp;quot; ainsi que &amp;quot;l'application server&amp;quot; disponible sur ChirpStack. Pour se faire nous avons suivi un tutoriel à l'adresse suivante:&lt;br /&gt;
 https://www.youtube.com/watch?v=FnTP7t47DlI&lt;br /&gt;
ainsi que la documentation fournie par ChirpStack&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pour accéder au serveur réseau, nous passons par l'interface web en se connectant à l'adresse suivante (en passant par une zabeth):&lt;br /&gt;
 172.26.189.22:8080 id: admin mdp: admin&lt;br /&gt;
&lt;br /&gt;
A partir de l'interface web, nous pouvons configurer de nombreux éléments:&lt;br /&gt;
&lt;br /&gt;
-Création d'un nouveau projet&lt;br /&gt;
&lt;br /&gt;
-Ajouter des équipements aux réseau à l'aide des clefs&lt;br /&gt;
&lt;br /&gt;
-Surveiller les informations qui circulent sur notre réseau&lt;br /&gt;
&lt;br /&gt;
-...&lt;br /&gt;
&lt;br /&gt;
Enfin, en nous connectant en ssh sur les deux gateways:&lt;br /&gt;
 antenne: 192.168.42.1 mdp:pdmk-062E7A&lt;br /&gt;
 passerelle intérieur: 192.168.42.2 mdp:pdmk-030970&lt;br /&gt;
Nous avons pu mettre à jour ces dernieres en suivant le wiki Kerlink&lt;br /&gt;
La connexion au wiki Kerlink s'effectue avec:&lt;br /&gt;
 Login : univlille&lt;br /&gt;
 Mot de passe : IYBlN7QF06&lt;br /&gt;
&lt;br /&gt;
===Test du réseau===&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de notre Network Server nous avons utilisé un module GPS LoRa du commerce. En se connectant a notre Network Server (172.26.189.22:8000) nous avons pu créer une nouvelle application et ajouté un nouvel équipement. Se faisant notre Network Server génère deux clefs, une &amp;quot;application key&amp;quot; et une &amp;quot;Network Key&amp;quot;. Ces deux clefs doivent être renseigné manuellement dans notre équipement. Pour se faire on peut le connecter à un ordinateur et y ajouter les clefs via son logiciel dédié. L'équipement possédant déjà un EUI permettant de reconnaître l'équipement, nous avons du renseigner ce dernier dans l'ajout de l'équipement sur le Network Server. Suite à ce test nous avons bien pu observer la circulation de nos trames et le bon fonctionnement de notre Network Server.&lt;br /&gt;
&lt;br /&gt;
===Fabrication du End-device===&lt;br /&gt;
&lt;br /&gt;
Pour le end-device je dispose d'une carte STM32F411RE, d'un shield SX1276MB1MAS et d'un capteur ultrason HC-SR04.&lt;br /&gt;
Le développement du programme se fait sur STM32Cube.&lt;br /&gt;
Un premier programme à été mis en place sans difficultés pour récupérer les valeurs du HC-SR04 en s'appuyant sur l'exemple proposé par Arduino.&lt;br /&gt;
En revanche les problèmes sont arrivés lors du développement concernant la partie LoRaWAN. En effet STM32 propose un package LoRaWAN pour faciliter le développement d'application, le problème étant que ce package concerne seulement les cartes STM32LXXX. J'ai essayé longuement d'adapter ce package pour ma carte STM32F411RE en modifiant notamment le Makefile, les .flash mais aussi les fichiers d'inclusion sans succès malheureusement. La solution envisagée est donc un changement de carte au profit d'une STM32LXXX.&lt;br /&gt;
&lt;br /&gt;
Après changé notre carte pour une STM32L152RE, j'ai repris le package proposé par STM32 et dans le fichier Commissioning.h j'ai rensigné les clefs &lt;br /&gt;
 LORAWAN_APP_KEY&lt;br /&gt;
 LORAWAN_NWK_KEY&lt;br /&gt;
&lt;br /&gt;
Il n'y a que ces deux à renseigner étant donné que notre équipement fonctionne sur une version inférieur à la 1.1. A noter que le champ device EUI semble ne pas fonctionner. Nous avons du récuper l'EUI sur une gateway et renseigner ce dernier dans l'équipement que j'ai crée pour mon application sur l'interface web.&lt;br /&gt;
&lt;br /&gt;
Concernant le programme de l'équipement en lui même le programme est relativement simle, en se servant de la bibliothèque HAL je declare 3 PIN en input et je renvoie ainsi l'état des capteurs de manière périodique en me servant de la fonction &amp;quot;Send&amp;quot; du package STM32.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie application WEB===&lt;br /&gt;
&lt;br /&gt;
La principale difficulté de cette partie et l'absence totale de connaissances dans le développement d'application WEB. J'ai donc dû apprendre les langage HTML / CSS / PHP (quelques notions en JS) pour réaliser cette partie. Je disposais de quelques notions en base de données et SQL suit à mon année d'IMA3.&lt;br /&gt;
&lt;br /&gt;
Le but de l'application WEB est de permettre de rendre exploitable pour l'utilisateurs les informations renvoyés par les balises. Pour se faire l'application doit contenir une page de monitoring permettant de surveiller l'état de toutes les balises. De plus elle doit contenir une partie historique permettant d'accéder à l'historique d'une balise en particulier (en effectuant une recherche par id/localisation/date). Enfin elle doit aussi proposer une partie permettant d'afficher une carte avec dessus les balises et leur état.&lt;br /&gt;
&lt;br /&gt;
A l'aide de Bootstrap j'ai mis en place une application WEB avec ces trois partie. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie serveur d'application===&lt;br /&gt;
&lt;br /&gt;
Concernant la partie serveur, j'ai mis en place sur une VM (172.26.189.23) un serveur apache et Postgres pour la gestion des bases mais aussi un interpreteur php.&lt;br /&gt;
Pour apache j'ai simplement mis tous mes fichiers html/php dans /var/www/html qui est le repertoir par defaut. Celui est configuré pour démarrer au lancement de la VM.&lt;br /&gt;
Concernant Postgres j'ai d'abord crée un nouvel utilisateur en me servant de l'utilisateur crée par defaut (su - postgres):&lt;br /&gt;
 createuser -d -P root (mdp: glopglop)&lt;br /&gt;
&lt;br /&gt;
Puis j'ai créé une nouvelle base:&lt;br /&gt;
 createdb -O root pfe&lt;br /&gt;
&lt;br /&gt;
Pour se connecter a la base:&lt;br /&gt;
 psql pfe (depuis l'utilsateur root ou postgres)&lt;br /&gt;
&lt;br /&gt;
Enfin j'y ai ajouté mes tables:&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE historique_balise (ID serial PRIMARY KEY, id_balise int NOT NULL, Date date NOT NULL, Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE historique_balise (ID serial PRIMARY KEY, id_balise int NOT NULL, Date date NOT NULL, Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
La base contient deux tables, une première ayant pour clef primaire l'id de la balise et contenant des informations diverses sur cette dernière telles que le pays, la ville, la localisation, les coordonnée, le niveau d'eau mais surtout si cette dernière est sous l'eau ou non. La seconde table concerne l'historique des balises, elle a pour clef primaire l'indice du relevé et contient des informations comme le numéro de balise, la date du relevé etc, l'état de la balise etc..&lt;br /&gt;
&lt;br /&gt;
Pour la communication entre le serveur d'application et le serveur réseau, j'ai dans un premier temps mis en place un script python pour récuperer les relevés des capteurs via l'API REST:&lt;br /&gt;
 import requests&lt;br /&gt;
 import json&lt;br /&gt;
 #on recupere le token&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Content-Type': 'application/json',&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
 }&lt;br /&gt;
 data = '{&amp;quot;email&amp;quot;: &amp;quot;admin&amp;quot;,&amp;quot;password&amp;quot;: &amp;quot;admin&amp;quot; }'&lt;br /&gt;
 response = requests.post('http://172.26.189.22:8080/api/internal/login', headers=headers, data=data)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 #print(resp['jwt'])&lt;br /&gt;
 #diverses information sur un capteur&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
    'Grpc-Metadata-Authorization': 'Bearer'+resp['jwt'],&lt;br /&gt;
 }&lt;br /&gt;
 response = requests.get('http://172.26.189.22:8080/api/devices/0b00f4ff703a8fc5', headers=headers)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 print(resp)&lt;br /&gt;
&lt;br /&gt;
Ce script permet de un premier temps de récuperer le token pour avoir accés à l'API. Celui ci est a renseigner dans toute les requetes http. &lt;br /&gt;
En se connectant à l'API via l'interface graphique (172.26.189.22:8080/api), on peut récuperer toutes les requetes possible en cURL, j'ai donc simplement utilisé un convertisseur cURL vers python pour mettre mes requetes en place.&lt;br /&gt;
&lt;br /&gt;
Malheureusement cette solution permet de récuperer de nombreuses informations concernant l'application mais pas les relevés des capteurs. Pour récupérer ces derniers, je suis passé par l'interface graphique du serveur d'application (172.26.189.22:8080) afin d'ajouter une intégration HTTP. Il faut simplement spécifier le format de l'information (JSON dans mon cas) et l'URL à laquelle doit être envoyé la requête http POST. Dans mon cas cela sera:&lt;br /&gt;
 http://172.26.189.23/pfe/gestionPOST.php&lt;br /&gt;
&lt;br /&gt;
Le fichier gestionPOST.php ressemble pour le moment à cela: &lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 header(&amp;quot;content-type: application/json&amp;quot;);&lt;br /&gt;
 $json = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
 $obj = json_decode($json);&lt;br /&gt;
 $decoded = base64_decode(json_encode($obj-&amp;gt;data));&lt;br /&gt;
 $fp = @fopen(&amp;quot;toto.txt&amp;quot;,&amp;quot;a&amp;quot;);&lt;br /&gt;
 fwrite($fp,$decoded);&lt;br /&gt;
 fwrite($fp,&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
 fclose($fp);&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il permet via le flux php://input de récupérer le contenu de la requête POST et de l'afficher.&lt;br /&gt;
&lt;br /&gt;
La prochaine étape concerne la gestion des informations avec notamment l'ajout en base selon le type d'information recu.&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85334</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85334"/>
				<updated>2020-11-26T17:14:06Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Projet de fin d'étude */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Début projet===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Mise en place du réseau===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se connecter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
 subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
 range 192.168.42.1 192.168.42.9&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La configuration du serveur réseau s'effectue en se connectant à ce dernier en ssh:&lt;br /&gt;
 root@192.168.42.10&lt;br /&gt;
Il faut installer le &amp;quot;gateway bridge&amp;quot;, le &amp;quot;network server&amp;quot; ainsi que &amp;quot;l'application server&amp;quot; disponible sur ChirpStack. Pour se faire nous avons suivi un tutoriel à l'adresse suivante:&lt;br /&gt;
 https://www.youtube.com/watch?v=FnTP7t47DlI&lt;br /&gt;
ainsi que la documentation fournie par ChirpStack&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pour accéder au serveur réseau, nous passons par l'interface web en se connectant à l'adresse suivante (en passant par une zabeth):&lt;br /&gt;
 172.26.189.22:8080 id: admin mdp: admin&lt;br /&gt;
&lt;br /&gt;
A partir de l'interface web, nous pouvons configurer de nombreux éléments:&lt;br /&gt;
&lt;br /&gt;
-Création d'un nouveau projet&lt;br /&gt;
&lt;br /&gt;
-Ajouter des équipements aux réseau à l'aide des clefs&lt;br /&gt;
&lt;br /&gt;
-Surveiller les informations qui circulent sur notre réseau&lt;br /&gt;
&lt;br /&gt;
-...&lt;br /&gt;
&lt;br /&gt;
Enfin, en nous connectant en ssh sur les deux gateways:&lt;br /&gt;
 antenne: 192.168.42.1 mdp:pdmk-062E7A&lt;br /&gt;
 passerelle intérieur: 192.168.42.2 mdp:pdmk-030970&lt;br /&gt;
Nous avons pu mettre à jour ces dernieres en suivant le wiki Kerlink&lt;br /&gt;
La connexion au wiki Kerlink s'effectue avec:&lt;br /&gt;
 Login : univlille&lt;br /&gt;
 Mot de passe : IYBlN7QF06&lt;br /&gt;
&lt;br /&gt;
===Test du réseau===&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de notre Network Server nous avons utilisé un module GPS LoRa du commerce. En se connectant a notre Network Server (172.26.189.22:8000) nous avons pu créer une nouvelle application et ajouté un nouvel équipement. Se faisant notre Network Server génère deux clefs, une &amp;quot;application key&amp;quot; et une &amp;quot;Network Key&amp;quot;. Ces deux clefs doivent être renseigné manuellement dans notre équipement. Pour se faire on peut le connecter à un ordinateur et y ajouter les clefs via son logiciel dédié. L'équipement possédant déjà un EUI permettant de reconnaître l'équipement, nous avons du renseigner ce dernier dans l'ajout de l'équipement sur le Network Server. Suite à ce test nous avons bien pu observer la circulation de nos trames et le bon fonctionnement de notre Network Server.&lt;br /&gt;
&lt;br /&gt;
===Fabrication du End-device===&lt;br /&gt;
&lt;br /&gt;
Pour le end-device je dispose d'une carte STM32F411RE, d'un shield SX1276MB1MAS et d'un capteur ultrason HC-SR04.&lt;br /&gt;
Le développement du programme se fait sur STM32Cube.&lt;br /&gt;
Un premier programme à été mis en place sans difficultés pour récupérer les valeurs du HC-SR04 en s'appuyant sur l'exemple proposé par Arduino.&lt;br /&gt;
En revanche les problèmes sont arrivés lors du développement concernant la partie LoRaWAN. En effet STM32 propose un package LoRaWAN pour faciliter le développement d'application, le problème étant que ce package concerne seulement les cartes STM32LXXX. J'ai essayé longuement d'adapter ce package pour ma carte STM32F411RE en modifiant notamment le Makefile, les .flash mais aussi les fichiers d'inclusion sans succès malheureusement. La solution envisagée est donc un changement de carte au profit d'une STM32LXXX.&lt;br /&gt;
&lt;br /&gt;
Après changé notre carte pour une STM32L152RE, j'ai repris le package proposé par STM32 et dans le fichier Commissioning.h j'ai rensigné les clefs &lt;br /&gt;
 LORAWAN_APP_KEY&lt;br /&gt;
 LORAWAN_NWK_KEY&lt;br /&gt;
&lt;br /&gt;
Il n'y a que ces deux à renseigner étant donné que notre équipement fonctionne sur une version inférieur à la 1.1. A noter que le champ device EUI semble ne pas fonctionner. Nous avons du récuper l'EUI sur une gateway et renseigner ce dernier dans l'équipement que j'ai crée pour mon application sur l'interface web.&lt;br /&gt;
&lt;br /&gt;
Concernant le programme de l'équipement en lui même le programme est relativement simle, en se servant de la bibliothèque HAL je declare 3 PIN en input et je renvoie ainsi l'état des capteurs de manière périodique en me servant de la fonction &amp;quot;Send&amp;quot; du package STM32.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie application WEB===&lt;br /&gt;
&lt;br /&gt;
La principale difficulté de cette partie et l'absence totale de connaissances dans le développement d'application WEB. J'ai donc dû apprendre les langage HTML / CSS / PHP (quelques notions en JS) pour réaliser cette partie. Je disposais de quelques notions en base de données et SQL suit à mon année d'IMA3.&lt;br /&gt;
&lt;br /&gt;
Le but de l'application WEB est de permettre de rendre exploitable pour l'utilisateurs les informations renvoyés par les balises. Pour se faire l'application doit contenir une page de monitoring permettant de surveiller l'état de toutes les balises. De plus elle doit contenir une partie historique permettant d'accéder à l'historique d'une balise en particulier (en effectuant une recherche par id/localisation/date). Enfin elle doit aussi proposer une partie permettant d'afficher une carte avec dessus les balises et leur état.&lt;br /&gt;
&lt;br /&gt;
A l'aide de Bootstrap j'ai mis en place une application WEB avec ces trois partie. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie serveur d'application===&lt;br /&gt;
&lt;br /&gt;
Concernant la partie serveur, j'ai mis en place sur une VM (172.26.189.23) un serveur apache et Postgres pour la gestion des bases mais aussi un interpreteur php.&lt;br /&gt;
Pour apache j'ai simplement mis tous mes fichiers html/php dans /var/www/html qui est le repertoir par defaut. Celui est configuré pour démarrer au lancement de la VM.&lt;br /&gt;
Concernant Postgres j'ai d'abord crée un nouvel utilisateur en me servant de l'utilisateur crée par defaut (su - postgres):&lt;br /&gt;
 createuser -d -P root (mdp: glopglop)&lt;br /&gt;
&lt;br /&gt;
Puis j'ai créé une nouvelle base:&lt;br /&gt;
 createdb -O root pfe&lt;br /&gt;
&lt;br /&gt;
Pour se connecter a la base:&lt;br /&gt;
 psql pfe (depuis l'utilsateur root ou postgres)&lt;br /&gt;
&lt;br /&gt;
Enfin j'y ai ajouté mes tables:&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE historique_balise (ID serial PRIMARY KEY, id_balise int NOT NULL, Date date NOT NULL, Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE historique_balise (ID serial PRIMARY KEY, id_balise int NOT NULL, Date date NOT NULL, Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
La base contient deux tables, une première ayant pour clef primaire l'id de la balise et contenant des informations diverses sur cette dernière telles que le pays, la ville, la localisation, les coordonnée, le niveau d'eau mais surtout si cette dernière est sous l'eau ou non. La seconde table concerne l'historique des balises, elle a pour clef primaire l'indice du relevé et contient des informations comme le numéro de balise, la date du relevé etc, l'état de la balise etc..&lt;br /&gt;
&lt;br /&gt;
Pour la communication entre le serveur d'application et le serveur réseau, j'ai dans un premier temps mis en place un script python pour récuperer les relevés des capteurs via l'API REST:&lt;br /&gt;
 import requests&lt;br /&gt;
 import json&lt;br /&gt;
 #on recupere le token&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Content-Type': 'application/json',&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 data = '{&amp;quot;email&amp;quot;: &amp;quot;admin&amp;quot;,&amp;quot;password&amp;quot;: &amp;quot;admin&amp;quot; }'&lt;br /&gt;
&lt;br /&gt;
 response = requests.post('http://172.26.189.22:8080/api/internal/login', headers=headers, data=data)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 #print(resp['jwt'])&lt;br /&gt;
&lt;br /&gt;
 #diverses information sur un capteur&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
    'Grpc-Metadata-Authorization': 'Bearer'+resp['jwt'],&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 response = requests.get('http://172.26.189.22:8080/api/devices/0b00f4ff703a8fc5', headers=headers)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 print(resp)&lt;br /&gt;
&lt;br /&gt;
Ce script permet de un premier temps de récuperer le token pour avoir accés à l'API. Celui ci est a renseigner dans toute les requetes http. &lt;br /&gt;
En se connectant à l'API via l'interface graphique (172.26.189.22:8080/api), on peut récuperer toutes les requetes possible en cURL, j'ai donc simplement utilisé un convertisseur cURL vers python pour mettre mes requetes en place.&lt;br /&gt;
&lt;br /&gt;
Malheureusement cette solution permet de récuperer de nombreuses informations concernant l'application mais pas les relevés des capteurs. Pour récupérer ces derniers, je suis passé par l'interface graphique du serveur d'application (172.26.189.22:8080) afin d'ajouter une intégration HTTP. Il faut simplement spécifier le format de l'information (JSON dans mon cas) et l'URL à laquelle doit être envoyé la requête http POST. Dans mon cas cela sera:&lt;br /&gt;
 http://172.26.189.23/pfe/gestionPOST.php&lt;br /&gt;
&lt;br /&gt;
Le fichier gestionPOST.php ressemble pour le moment à cela: &lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 header(&amp;quot;content-type: application/json&amp;quot;);&lt;br /&gt;
 $json = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
 $obj = json_decode($json);&lt;br /&gt;
 $decoded = base64_decode(json_encode($obj-&amp;gt;data));&lt;br /&gt;
&lt;br /&gt;
 $fp = @fopen(&amp;quot;toto.txt&amp;quot;,&amp;quot;a&amp;quot;);&lt;br /&gt;
 fwrite($fp,$decoded);&lt;br /&gt;
 fwrite($fp,&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
 fclose($fp);&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il permet via le flux php://input de récupérer le contenu de la requête POST et de l'afficher.&lt;br /&gt;
&lt;br /&gt;
La prochaine étape concerne la gestion des informations avec notamment l'ajout en base selon le type d'information recu.&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85333</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85333"/>
				<updated>2020-11-26T17:13:49Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Projet de fin d'étude */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Début projet===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Mise en place du réseau===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se connecter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
 subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
 range 192.168.42.1 192.168.42.9&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La configuration du serveur réseau s'effectue en se connectant à ce dernier en ssh:&lt;br /&gt;
 root@192.168.42.10&lt;br /&gt;
Il faut installer le &amp;quot;gateway bridge&amp;quot;, le &amp;quot;network server&amp;quot; ainsi que &amp;quot;l'application server&amp;quot; disponible sur ChirpStack. Pour se faire nous avons suivi un tutoriel à l'adresse suivante:&lt;br /&gt;
 https://www.youtube.com/watch?v=FnTP7t47DlI&lt;br /&gt;
ainsi que la documentation fournie par ChirpStack&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pour accéder au serveur réseau, nous passons par l'interface web en se connectant à l'adresse suivante (en passant par une zabeth):&lt;br /&gt;
 172.26.189.22:8080 id: admin mdp: admin&lt;br /&gt;
&lt;br /&gt;
A partir de l'interface web, nous pouvons configurer de nombreux éléments:&lt;br /&gt;
&lt;br /&gt;
-Création d'un nouveau projet&lt;br /&gt;
&lt;br /&gt;
-Ajouter des équipements aux réseau à l'aide des clefs&lt;br /&gt;
&lt;br /&gt;
-Surveiller les informations qui circulent sur notre réseau&lt;br /&gt;
&lt;br /&gt;
-...&lt;br /&gt;
&lt;br /&gt;
Enfin, en nous connectant en ssh sur les deux gateways:&lt;br /&gt;
 antenne: 192.168.42.1 mdp:pdmk-062E7A&lt;br /&gt;
 passerelle intérieur: 192.168.42.2 mdp:pdmk-030970&lt;br /&gt;
Nous avons pu mettre à jour ces dernieres en suivant le wiki Kerlink&lt;br /&gt;
La connexion au wiki Kerlink s'effectue avec:&lt;br /&gt;
 Login : univlille&lt;br /&gt;
 Mot de passe : IYBlN7QF06&lt;br /&gt;
&lt;br /&gt;
===Test du réseau===&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de notre Network Server nous avons utilisé un module GPS LoRa du commerce. En se connectant a notre Network Server (172.26.189.22:8000) nous avons pu créer une nouvelle application et ajouté un nouvel équipement. Se faisant notre Network Server génère deux clefs, une &amp;quot;application key&amp;quot; et une &amp;quot;Network Key&amp;quot;. Ces deux clefs doivent être renseigné manuellement dans notre équipement. Pour se faire on peut le connecter à un ordinateur et y ajouter les clefs via son logiciel dédié. L'équipement possédant déjà un EUI permettant de reconnaître l'équipement, nous avons du renseigner ce dernier dans l'ajout de l'équipement sur le Network Server. Suite à ce test nous avons bien pu observer la circulation de nos trames et le bon fonctionnement de notre Network Server.&lt;br /&gt;
&lt;br /&gt;
===Fabrication du End-device===&lt;br /&gt;
&lt;br /&gt;
Pour le end-device je dispose d'une carte STM32F411RE, d'un shield SX1276MB1MAS et d'un capteur ultrason HC-SR04.&lt;br /&gt;
Le développement du programme se fait sur STM32Cube.&lt;br /&gt;
Un premier programme à été mis en place sans difficultés pour récupérer les valeurs du HC-SR04 en s'appuyant sur l'exemple proposé par Arduino.&lt;br /&gt;
En revanche les problèmes sont arrivés lors du développement concernant la partie LoRaWAN. En effet STM32 propose un package LoRaWAN pour faciliter le développement d'application, le problème étant que ce package concerne seulement les cartes STM32LXXX. J'ai essayé longuement d'adapter ce package pour ma carte STM32F411RE en modifiant notamment le Makefile, les .flash mais aussi les fichiers d'inclusion sans succès malheureusement. La solution envisagée est donc un changement de carte au profit d'une STM32LXXX.&lt;br /&gt;
&lt;br /&gt;
Après changé notre carte pour une STM32L152RE, j'ai repris le package proposé par STM32 et dans le fichier Commissioning.h j'ai rensigné les clefs &lt;br /&gt;
 LORAWAN_APP_KEY&lt;br /&gt;
 LORAWAN_NWK_KEY&lt;br /&gt;
&lt;br /&gt;
Il n'y a que ces deux à renseigner étant donné que notre équipement fonctionne sur une version inférieur à la 1.1. A noter que le champ device EUI semble ne pas fonctionner. Nous avons du récuper l'EUI sur une gateway et renseigner ce dernier dans l'équipement que j'ai crée pour mon application sur l'interface web.&lt;br /&gt;
&lt;br /&gt;
Concernant le programme de l'équipement en lui même le programme est relativement simle, en se servant de la bibliothèque HAL je declare 3 PIN en input et je renvoie ainsi l'état des capteurs de manière périodique en me servant de la fonction &amp;quot;Send&amp;quot; du package STM32.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie application WEB===&lt;br /&gt;
&lt;br /&gt;
La principale difficulté de cette partie et l'absence totale de connaissances dans le développement d'application WEB. J'ai donc dû apprendre les langage HTML / CSS / PHP (quelques notions en JS) pour réaliser cette partie. Je disposais de quelques notions en base de données et SQL suit à mon année d'IMA3.&lt;br /&gt;
&lt;br /&gt;
Le but de l'application WEB est de permettre de rendre exploitable pour l'utilisateurs les informations renvoyés par les balises. Pour se faire l'application doit contenir une page de monitoring permettant de surveiller l'état de toutes les balises. De plus elle doit contenir une partie historique permettant d'accéder à l'historique d'une balise en particulier (en effectuant une recherche par id/localisation/date). Enfin elle doit aussi proposer une partie permettant d'afficher une carte avec dessus les balises et leur état.&lt;br /&gt;
&lt;br /&gt;
A l'aide de Bootstrap j'ai mis en place une application WEB avec ces trois partie. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie serveur d'application===&lt;br /&gt;
&lt;br /&gt;
Concernant la partie serveur, j'ai mis en place sur une VM (172.26.189.23) un serveur apache et Postgres pour la gestion des bases mais aussi un interpreteur php.&lt;br /&gt;
Pour apache j'ai simplement mis tous mes fichiers html/php dans /var/www/html qui est le repertoir par defaut. Celui est configuré pour démarrer au lancement de la VM.&lt;br /&gt;
Concernant Postgres j'ai d'abord crée un nouvel utilisateur en me servant de l'utilisateur crée par defaut (su - postgres):&lt;br /&gt;
 createuser -d -P root (mdp: glopglop)&lt;br /&gt;
&lt;br /&gt;
Puis j'ai créé une nouvelle base:&lt;br /&gt;
 createdb -O root pfe&lt;br /&gt;
&lt;br /&gt;
Pour se connecter a la base:&lt;br /&gt;
 psql pfe (depuis l'utilsateur root ou postgres)&lt;br /&gt;
&lt;br /&gt;
Enfin j'y ai ajouté mes tables:&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE historique_balise (ID serial PRIMARY KEY, id_balise int NOT NULL, Date date NOT NULL, Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE historique_balise (ID serial PRIMARY KEY, id_balise int NOT NULL, Date date NOT NULL, Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
La base contient deux tables, une première ayant pour clef primaire l'id de la balise et contenant des informations diverses sur cette dernière telles que le pays, la ville, la localisation, les coordonnée, le niveau d'eau mais surtout si cette dernière est sous l'eau ou non. La seconde table concerne l'historique des balises, elle a pour clef primaire l'indice du relevé et contient des informations comme le numéro de balise, la date du relevé etc, l'état de la balise etc..&lt;br /&gt;
&lt;br /&gt;
Pour la communication entre le serveur d'application et le serveur réseau, j'ai dans un premier temps mis en place un script python pour récuperer les relevés des capteurs via l'API REST:&lt;br /&gt;
 import requests&lt;br /&gt;
 import json&lt;br /&gt;
 #on recupere le token&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Content-Type': 'application/json',&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 data = '{&amp;quot;email&amp;quot;: &amp;quot;admin&amp;quot;,&amp;quot;password&amp;quot;: &amp;quot;admin&amp;quot; }'&lt;br /&gt;
&lt;br /&gt;
 response = requests.post('http://172.26.189.22:8080/api/internal/login', headers=headers, data=data)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 #print(resp['jwt'])&lt;br /&gt;
&lt;br /&gt;
 #diverses information sur un capteur&lt;br /&gt;
 headers = {&lt;br /&gt;
    'Accept': 'application/json',&lt;br /&gt;
    'Grpc-Metadata-Authorization': 'Bearer'+resp['jwt'],&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 response = requests.get('http://172.26.189.22:8080/api/devices/0b00f4ff703a8fc5', headers=headers)&lt;br /&gt;
 resp=response.json()&lt;br /&gt;
 print(resp)&lt;br /&gt;
&lt;br /&gt;
Ce script permet de un premier temps de récuperer le token pour avoir accés à l'API. Celui ci est a renseigner dans toute les requetes http. &lt;br /&gt;
En se connectant à l'API via l'interface graphique (172.26.189.22:8080/api), on peut récuperer toutes les requetes possible en cURL, j'ai donc simplement utilisé un convertisseur cURL vers python pour mettre mes requetes en place.&lt;br /&gt;
&lt;br /&gt;
Malheureusement cette solution permet de récuperer de nombreuses informations concernant l'application mais pas les relevés des capteurs. Pour récupérer ces derniers, je suis passé par l'interface graphique du serveur d'application (172.26.189.22:8080) afin d'ajouter une intégration HTTP. Il faut simplement spécifier le format de l'information (JSON dans mon cas) et l'URL à laquelle doit être envoyé la requête http POST. Dans mon cas cela sera:&lt;br /&gt;
 http://172.26.189.23/pfe/gestionPOST.php&lt;br /&gt;
&lt;br /&gt;
Le fichier gestionPOST.php ressemble pour le moment à cela: &lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 header(&amp;quot;content-type: application/json&amp;quot;);&lt;br /&gt;
 $json = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
 $obj = json_decode($json);&lt;br /&gt;
 $decoded = base64_decode(json_encode($obj-&amp;gt;data));&lt;br /&gt;
&lt;br /&gt;
 $fp = @fopen(&amp;quot;toto.txt&amp;quot;,&amp;quot;a&amp;quot;);&lt;br /&gt;
 fwrite($fp,$decoded);&lt;br /&gt;
 fwrite($fp,&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
 fclose($fp);&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il permet via le flux php://input de récupérer le contenu de la requête POST et de l'afficher.&lt;br /&gt;
La prochaine étape concerne la gestion des informations avec notamment l'ajout en base selon le type d'information recu.&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85332</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85332"/>
				<updated>2020-11-25T16:44:37Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Partie application WEB */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Début projet===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Mise en place du réseau===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se connecter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
 subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
 range 192.168.42.1 192.168.42.9&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La configuration du serveur réseau s'effectue en se connectant à ce dernier en ssh:&lt;br /&gt;
 root@192.168.42.10&lt;br /&gt;
Il faut installer le &amp;quot;gateway bridge&amp;quot;, le &amp;quot;network server&amp;quot; ainsi que &amp;quot;l'application server&amp;quot; disponible sur ChirpStack. Pour se faire nous avons suivi un tutoriel à l'adresse suivante:&lt;br /&gt;
 https://www.youtube.com/watch?v=FnTP7t47DlI&lt;br /&gt;
ainsi que la documentation fournie par ChirpStack&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pour accéder au serveur réseau, nous passons par l'interface web en se connectant à l'adresse suivante (en passant par une zabeth):&lt;br /&gt;
 172.26.189.22:8080 id: admin mdp: admin&lt;br /&gt;
&lt;br /&gt;
A partir de l'interface web, nous pouvons configurer de nombreux éléments:&lt;br /&gt;
&lt;br /&gt;
-Création d'un nouveau projet&lt;br /&gt;
&lt;br /&gt;
-Ajouter des équipements aux réseau à l'aide des clefs&lt;br /&gt;
&lt;br /&gt;
-Surveiller les informations qui circulent sur notre réseau&lt;br /&gt;
&lt;br /&gt;
-...&lt;br /&gt;
&lt;br /&gt;
Enfin, en nous connectant en ssh sur les deux gateways:&lt;br /&gt;
 antenne: 192.168.42.1 mdp:pdmk-062E7A&lt;br /&gt;
 passerelle intérieur: 192.168.42.2 mdp:pdmk-030970&lt;br /&gt;
Nous avons pu mettre à jour ces dernieres en suivant le wiki Kerlink&lt;br /&gt;
La connexion au wiki Kerlink s'effectue avec:&lt;br /&gt;
 Login : univlille&lt;br /&gt;
 Mot de passe : IYBlN7QF06&lt;br /&gt;
&lt;br /&gt;
===Test du réseau===&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de notre Network Server nous avons utilisé un module GPS LoRa du commerce. En se connectant a notre Network Server (172.26.189.22:8000) nous avons pu créer une nouvelle application et ajouté un nouvel équipement. Se faisant notre Network Server génère deux clefs, une &amp;quot;application key&amp;quot; et une &amp;quot;Network Key&amp;quot;. Ces deux clefs doivent être renseigné manuellement dans notre équipement. Pour se faire on peut le connecter à un ordinateur et y ajouter les clefs via son logiciel dédié. L'équipement possédant déjà un EUI permettant de reconnaître l'équipement, nous avons du renseigner ce dernier dans l'ajout de l'équipement sur le Network Server. Suite à ce test nous avons bien pu observer la circulation de nos trames et le bon fonctionnement de notre Network Server.&lt;br /&gt;
&lt;br /&gt;
===Fabrication du End-device===&lt;br /&gt;
&lt;br /&gt;
Pour le end-device je dispose d'une carte STM32F411RE, d'un shield SX1276MB1MAS et d'un capteur ultrason HC-SR04.&lt;br /&gt;
Le développement du programme se fait sur STM32Cube.&lt;br /&gt;
Un premier programme à été mis en place sans difficultés pour récupérer les valeurs du HC-SR04 en s'appuyant sur l'exemple proposé par Arduino.&lt;br /&gt;
En revanche les problèmes sont arrivés lors du développement concernant la partie LoRaWAN. En effet STM32 propose un package LoRaWAN pour faciliter le développement d'application, le problème étant que ce package concerne seulement les cartes STM32LXXX. J'ai essayé longuement d'adapter ce package pour ma carte STM32F411RE en modifiant notamment le Makefile, les .flash mais aussi les fichiers d'inclusion sans succès malheureusement. La solution envisagée est donc un changement de carte au profit d'une STM32LXXX.&lt;br /&gt;
&lt;br /&gt;
Après changé notre carte pour une STM32L152RE, j'ai repris le package proposé par STM32 et dans le fichier Commissioning.h j'ai rensigné les clefs &lt;br /&gt;
 LORAWAN_APP_KEY&lt;br /&gt;
 LORAWAN_NWK_KEY&lt;br /&gt;
&lt;br /&gt;
Il n'y a que ces deux à renseigner étant donné que notre équipement fonctionne sur une version inférieur à la 1.1. A noter que le champ device EUI semble ne pas fonctionner. Nous avons du récuper l'EUI sur une gateway et renseigner ce dernier dans l'équipement que j'ai crée pour mon application sur l'interface web.&lt;br /&gt;
&lt;br /&gt;
Concernant le programme de l'équipement en lui même le programme est relativement simle, en se servant de la bibliothèque HAL je declare 3 PIN en input et je renvoie ainsi l'état des capteurs de manière périodique en me servant de la fonction &amp;quot;Send&amp;quot; du package STM32.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie application WEB===&lt;br /&gt;
&lt;br /&gt;
La principale difficulté de cette partie et l'absence totale de connaissances dans le développement d'application WEB. J'ai donc dû apprendre les langage HTML / CSS / PHP (quelques notions en JS) pour réaliser cette partie. Je disposais de quelques notions en base de données et SQL suit à mon année d'IMA3.&lt;br /&gt;
&lt;br /&gt;
Le but de l'application WEB est de permettre de rendre exploitable pour l'utilisateurs les informations renvoyés par les balises. Pour se faire l'application doit contenir une page de monitoring permettant de surveiller l'état de toutes les balises. De plus elle doit contenir une partie historique permettant d'accéder à l'historique d'une balise en particulier (en effectuant une recherche par id/localisation/date). Enfin elle doit aussi proposer une partie permettant d'afficher une carte avec dessus les balises et leur état.&lt;br /&gt;
&lt;br /&gt;
A l'aide de Bootstrap j'ai mis en place une application WEB avec ces trois partie. Concernant la partie serveur, j'ai mis en place sur une VM (172.26.189.23) un serveur apache et Postgres pour la gestion des bases mais aussi un interpreteur php.&lt;br /&gt;
Concernant apache j'ai simplement mis tous mes fichiers html/php dans /var/www/html qui est le repertoir par defaut. Celui est configuré pour démarrer au lancement de la VM.&lt;br /&gt;
Concernant Postgres j'ai d'abord crée un nouvel utilisateur en me servant de l'utilisateur crée par defaut (su - postgres):&lt;br /&gt;
 createuser -d -P root (mdp: glopglop)&lt;br /&gt;
&lt;br /&gt;
Puis j'ai créé une nouvelle base:&lt;br /&gt;
 createdb -O root pfe&lt;br /&gt;
&lt;br /&gt;
Pour se connecter a la base:&lt;br /&gt;
 psql pfe (depuis l'utilsateur root ou postgres)&lt;br /&gt;
&lt;br /&gt;
Enfin j'y ai ajouté mes tables:&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE historique_balise (ID serial PRIMARY KEY, id_balise int NOT NULL, Date date NOT NULL, Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE historique_balise (ID serial PRIMARY KEY, id_balise int NOT NULL, Date date NOT NULL, Niveau int NOT NULL, Inondee varchar(50) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
La base contient deux tables, une première ayant pour clef primaire l'id de la balise et contenant des informations diverses sur cette dernière telles que le pays, la ville, la localisation, les coordonnée, le niveau d'eau mais surtout si cette dernière est sous l'eau ou non. La seconde table concerne l'historique des balises, elle a pour clef primaire l'indice du relevé et contient des informations comme le numéro de balise, la date du relevé etc, l'état de la balise etc..&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85331</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85331"/>
				<updated>2020-11-25T10:28:42Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Projet de fin d'étude */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Début projet===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Mise en place du réseau===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se connecter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
 subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
 range 192.168.42.1 192.168.42.9&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La configuration du serveur réseau s'effectue en se connectant à ce dernier en ssh:&lt;br /&gt;
 root@192.168.42.10&lt;br /&gt;
Il faut installer le &amp;quot;gateway bridge&amp;quot;, le &amp;quot;network server&amp;quot; ainsi que &amp;quot;l'application server&amp;quot; disponible sur ChirpStack. Pour se faire nous avons suivi un tutoriel à l'adresse suivante:&lt;br /&gt;
 https://www.youtube.com/watch?v=FnTP7t47DlI&lt;br /&gt;
ainsi que la documentation fournie par ChirpStack&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pour accéder au serveur réseau, nous passons par l'interface web en se connectant à l'adresse suivante (en passant par une zabeth):&lt;br /&gt;
 172.26.189.22:8080 id: admin mdp: admin&lt;br /&gt;
&lt;br /&gt;
A partir de l'interface web, nous pouvons configurer de nombreux éléments:&lt;br /&gt;
&lt;br /&gt;
-Création d'un nouveau projet&lt;br /&gt;
&lt;br /&gt;
-Ajouter des équipements aux réseau à l'aide des clefs&lt;br /&gt;
&lt;br /&gt;
-Surveiller les informations qui circulent sur notre réseau&lt;br /&gt;
&lt;br /&gt;
-...&lt;br /&gt;
&lt;br /&gt;
Enfin, en nous connectant en ssh sur les deux gateways:&lt;br /&gt;
 antenne: 192.168.42.1 mdp:pdmk-062E7A&lt;br /&gt;
 passerelle intérieur: 192.168.42.2 mdp:pdmk-030970&lt;br /&gt;
Nous avons pu mettre à jour ces dernieres en suivant le wiki Kerlink&lt;br /&gt;
La connexion au wiki Kerlink s'effectue avec:&lt;br /&gt;
 Login : univlille&lt;br /&gt;
 Mot de passe : IYBlN7QF06&lt;br /&gt;
&lt;br /&gt;
===Test du réseau===&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de notre Network Server nous avons utilisé un module GPS LoRa du commerce. En se connectant a notre Network Server (172.26.189.22:8000) nous avons pu créer une nouvelle application et ajouté un nouvel équipement. Se faisant notre Network Server génère deux clefs, une &amp;quot;application key&amp;quot; et une &amp;quot;Network Key&amp;quot;. Ces deux clefs doivent être renseigné manuellement dans notre équipement. Pour se faire on peut le connecter à un ordinateur et y ajouter les clefs via son logiciel dédié. L'équipement possédant déjà un EUI permettant de reconnaître l'équipement, nous avons du renseigner ce dernier dans l'ajout de l'équipement sur le Network Server. Suite à ce test nous avons bien pu observer la circulation de nos trames et le bon fonctionnement de notre Network Server.&lt;br /&gt;
&lt;br /&gt;
===Fabrication du End-device===&lt;br /&gt;
&lt;br /&gt;
Pour le end-device je dispose d'une carte STM32F411RE, d'un shield SX1276MB1MAS et d'un capteur ultrason HC-SR04.&lt;br /&gt;
Le développement du programme se fait sur STM32Cube.&lt;br /&gt;
Un premier programme à été mis en place sans difficultés pour récupérer les valeurs du HC-SR04 en s'appuyant sur l'exemple proposé par Arduino.&lt;br /&gt;
En revanche les problèmes sont arrivés lors du développement concernant la partie LoRaWAN. En effet STM32 propose un package LoRaWAN pour faciliter le développement d'application, le problème étant que ce package concerne seulement les cartes STM32LXXX. J'ai essayé longuement d'adapter ce package pour ma carte STM32F411RE en modifiant notamment le Makefile, les .flash mais aussi les fichiers d'inclusion sans succès malheureusement. La solution envisagée est donc un changement de carte au profit d'une STM32LXXX.&lt;br /&gt;
&lt;br /&gt;
Après changé notre carte pour une STM32L152RE, j'ai repris le package proposé par STM32 et dans le fichier Commissioning.h j'ai rensigné les clefs &lt;br /&gt;
 LORAWAN_APP_KEY&lt;br /&gt;
 LORAWAN_NWK_KEY&lt;br /&gt;
&lt;br /&gt;
Il n'y a que ces deux à renseigner étant donné que notre équipement fonctionne sur une version inférieur à la 1.1. A noter que le champ device EUI semble ne pas fonctionner. Nous avons du récuper l'EUI sur une gateway et renseigner ce dernier dans l'équipement que j'ai crée pour mon application sur l'interface web.&lt;br /&gt;
&lt;br /&gt;
Concernant le programme de l'équipement en lui même le programme est relativement simle, en se servant de la bibliothèque HAL je declare 3 PIN en input et je renvoie ainsi l'état des capteurs de manière périodique en me servant de la fonction &amp;quot;Send&amp;quot; du package STM32.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Partie application WEB===&lt;br /&gt;
&lt;br /&gt;
La principale difficulté de cette partie et l'absence totale de connaissances dans le développement d'application WEB. J'ai donc dû apprendre les langage HTML / CSS / PHP (quelques notions en JS) pour réaliser cette partie. Je disposais de quelques notions en base de données et SQL suit à mon année d'IMA3.&lt;br /&gt;
&lt;br /&gt;
Le but de l'application WEB est de permettre de rendre exploitable pour l'utilisateurs les informations renvoyés par les balises. Pour se faire l'application doit contenir une page de monitoring permettant de surveiller l'état de toutes les balises. De plus elle doit contenir une partie historique permettant d'accéder à l'historique d'une balise en particulier (en effectuant une recherche par id/localisation/date). Enfin elle doit aussi proposer une partie permettant d'afficher une carte avec dessus les balises et leur état.&lt;br /&gt;
&lt;br /&gt;
A l'aide de Bootstrap j'ai mis en place une application WEB avec ces trois partie. Le serveur applicatif n'étant pas au point, j'ai du manuellement remplir la base de donnée pour mettre en place l'application WEB. La base contient deux tables, une première ayant pour clef primaire l'id de la balise et contenant des informations diverses sur cette dernière telles que le pays, la ville, la localisation, les coordonnée, le niveau d'eau mais surtout si cette dernière est sous l'eau ou non. La seconde table concerne l'historique des balises, elle a pour clef primaire l'indice du relevé et contient des informations comme le numéro de balise, la date du relevé etc, l'état de la balise etc..&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85329</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85329"/>
				<updated>2020-11-24T17:19:23Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Fabrication du End-device */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Début projet===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Mise en place du réseau===&lt;br /&gt;
&lt;br /&gt;
f4 11 0e 99 cc bb 9d 76 f1 8b a1 49 ff d1 ba f4&lt;br /&gt;
&lt;br /&gt;
0b00f4ff703a8fc5&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se connecter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
 subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
 range 192.168.42.1 192.168.42.9&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La configuration du serveur réseau s'effectue en se connectant à ce dernier en ssh:&lt;br /&gt;
 root@192.168.42.10&lt;br /&gt;
Il faut installer le &amp;quot;gateway bridge&amp;quot;, le &amp;quot;network server&amp;quot; ainsi que &amp;quot;l'application server&amp;quot; disponible sur ChirpStack. Pour se faire nous avons suivi un tutoriel à l'adresse suivante:&lt;br /&gt;
 https://www.youtube.com/watch?v=FnTP7t47DlI&lt;br /&gt;
ainsi que la documentation fournie par ChirpStack&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pour accéder au serveur réseau, nous passons par l'interface web en se connectant à l'adresse suivante (en passant par une zabeth):&lt;br /&gt;
 172.26.189.22:8080 id: admin mdp: admin&lt;br /&gt;
&lt;br /&gt;
A partir de l'interface web, nous pouvons configurer de nombreux éléments:&lt;br /&gt;
&lt;br /&gt;
-Création d'un nouveau projet&lt;br /&gt;
&lt;br /&gt;
-Ajouter des équipements aux réseau à l'aide des clefs&lt;br /&gt;
&lt;br /&gt;
-Surveiller les informations qui circulent sur notre réseau&lt;br /&gt;
&lt;br /&gt;
-...&lt;br /&gt;
&lt;br /&gt;
Enfin, en nous connectant en ssh sur les deux gateways:&lt;br /&gt;
 antenne: 192.168.42.1 mdp:pdmk-062E7A&lt;br /&gt;
 passerelle intérieur: 192.168.42.2 mdp:pdmk-030970&lt;br /&gt;
Nous avons pu mettre à jour ces dernieres en suivant le wiki Kerlink&lt;br /&gt;
La connexion au wiki Kerlink s'effectue avec:&lt;br /&gt;
 Login : univlille&lt;br /&gt;
 Mot de passe : IYBlN7QF06&lt;br /&gt;
&lt;br /&gt;
===Test du réseau===&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de notre Network Server nous avons utilisé un module GPS LoRa du commerce. En se connectant a notre Network Server (172.26.189.22:8000) nous avons pu créer une nouvelle application et ajouté un nouvel équipement. Se faisant notre Network Server génère deux clefs, une &amp;quot;application key&amp;quot; et une &amp;quot;Network Key&amp;quot;. Ces deux clefs doivent être renseigné manuellement dans notre équipement. Pour se faire on peut le connecter à un ordinateur et y ajouter les clefs via son logiciel dédié. L'équipement possédant déjà un EUI permettant de reconnaître l'équipement, nous avons du renseigner ce dernier dans l'ajout de l'équipement sur le Network Server. Suite à ce test nous avons bien pu observer la circulation de nos trames et le bon fonctionnement de notre Network Server.&lt;br /&gt;
&lt;br /&gt;
===Fabrication du End-device===&lt;br /&gt;
&lt;br /&gt;
Pour le end-device je dispose d'une carte STM32F411RE, d'un shield SX1276MB1MAS et d'un capteur ultrason HC-SR04.&lt;br /&gt;
Le développement du programme se fait sur STM32Cube.&lt;br /&gt;
Un premier programme à été mis en place sans difficultés pour récupérer les valeurs du HC-SR04 en s'appuyant sur l'exemple proposé par Arduino.&lt;br /&gt;
En revanche les problèmes sont arrivés lors du développement concernant la partie LoRaWAN. En effet STM32 propose un package LoRaWAN pour faciliter le développement d'application, le problème étant que ce package concerne seulement les cartes STM32LXXX. J'ai essayé longuement d'adapter ce package pour ma carte STM32F411RE en modifiant notamment le Makefile, les .flash mais aussi les fichiers d'inclusion sans succès malheureusement. La solution envisagée est donc un changement de carte au profit d'une STM32LXXX.&lt;br /&gt;
&lt;br /&gt;
Après changé notre carte pour une STM32L152RE, nous avons repris le package proposé par STM32 et dans le fichier Commissioning.h nous avons modifié&lt;br /&gt;
&lt;br /&gt;
===Partie application WEB===&lt;br /&gt;
&lt;br /&gt;
La principale difficulté de cette partie et l'absence totale de connaissances dans le développement d'application WEB. J'ai donc dû apprendre les langage HTML / CSS / PHP (quelques notions en JS) pour réaliser cette partie. Je disposais de quelques notions en base de données et SQL suit à mon année d'IMA3.&lt;br /&gt;
&lt;br /&gt;
Le but de l'application WEB est de permettre de rendre exploitable pour l'utilisateurs les informations renvoyés par les balises. Pour se faire l'application doit contenir une page de monitoring permettant de surveiller l'état de toutes les balises. De plus elle doit contenir une partie historique permettant d'accéder à l'historique d'une balise en particulier (en effectuant une recherche par id/localisation/date). Enfin elle doit aussi proposer une partie permettant d'afficher une carte avec dessus les balises et leur état.&lt;br /&gt;
&lt;br /&gt;
A l'aide de Bootstrap j'ai mis en place une application WEB avec ces trois partie. Le serveur applicatif n'étant pas au point, j'ai du manuellement remplir la base de donnée pour mettre en place l'application WEB. La base contient deux tables, une première ayant pour clef primaire l'id de la balise et contenant des informations diverses sur cette dernière telles que le pays, la ville, la localisation, les coordonnée, le niveau d'eau mais surtout si cette dernière est sous l'eau ou non. La seconde table concerne l'historique des balises, elle a pour clef primaire l'indice du relevé et contient des informations comme le numéro de balise, la date du relevé etc, l'état de la balise etc..&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85325</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85325"/>
				<updated>2020-11-24T11:37:44Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Mise en place du réseau */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Début projet===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Mise en place du réseau===&lt;br /&gt;
&lt;br /&gt;
f4 11 0e 99 cc bb 9d 76 f1 8b a1 49 ff d1 ba f4&lt;br /&gt;
&lt;br /&gt;
0b00f4ff703a8fc5&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se connecter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
 subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
 range 192.168.42.1 192.168.42.9&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La configuration du serveur réseau s'effectue en se connectant à ce dernier en ssh:&lt;br /&gt;
 root@192.168.42.10&lt;br /&gt;
Il faut installer le &amp;quot;gateway bridge&amp;quot;, le &amp;quot;network server&amp;quot; ainsi que &amp;quot;l'application server&amp;quot; disponible sur ChirpStack. Pour se faire nous avons suivi un tutoriel à l'adresse suivante:&lt;br /&gt;
 https://www.youtube.com/watch?v=FnTP7t47DlI&lt;br /&gt;
ainsi que la documentation fournie par ChirpStack&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pour accéder au serveur réseau, nous passons par l'interface web en se connectant à l'adresse suivante (en passant par une zabeth):&lt;br /&gt;
 172.26.189.22:8080 id: admin mdp: admin&lt;br /&gt;
&lt;br /&gt;
A partir de l'interface web, nous pouvons configurer de nombreux éléments:&lt;br /&gt;
&lt;br /&gt;
-Création d'un nouveau projet&lt;br /&gt;
&lt;br /&gt;
-Ajouter des équipements aux réseau à l'aide des clefs&lt;br /&gt;
&lt;br /&gt;
-Surveiller les informations qui circulent sur notre réseau&lt;br /&gt;
&lt;br /&gt;
-...&lt;br /&gt;
&lt;br /&gt;
Enfin, en nous connectant en ssh sur les deux gateways:&lt;br /&gt;
 antenne: 192.168.42.1 mdp:pdmk-062E7A&lt;br /&gt;
 passerelle intérieur: 192.168.42.2 mdp:pdmk-030970&lt;br /&gt;
Nous avons pu mettre à jour ces dernieres en suivant le wiki Kerlink&lt;br /&gt;
La connexion au wiki Kerlink s'effectue avec:&lt;br /&gt;
 Login : univlille&lt;br /&gt;
 Mot de passe : IYBlN7QF06&lt;br /&gt;
&lt;br /&gt;
===Test du réseau===&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de notre Network Server nous avons utilisé un module GPS LoRa du commerce. En se connectant a notre Network Server (172.26.189.22:8000) nous avons pu créer une nouvelle application et ajouté un nouvel équipement. Se faisant notre Network Server génère deux clefs, une &amp;quot;application key&amp;quot; et une &amp;quot;Network Key&amp;quot;. Ces deux clefs doivent être renseigné manuellement dans notre équipement. Pour se faire on peut le connecter à un ordinateur et y ajouter les clefs via son logiciel dédié. L'équipement possédant déjà un EUI permettant de reconnaître l'équipement, nous avons du renseigner ce dernier dans l'ajout de l'équipement sur le Network Server. Suite à ce test nous avons bien pu observer la circulation de nos trames et le bon fonctionnement de notre Network Server.&lt;br /&gt;
&lt;br /&gt;
===Fabrication du End-device===&lt;br /&gt;
&lt;br /&gt;
Pour le end-device je dispose d'une carte STM32F411RE, d'un shield SX1276MB1MAS et d'un capteur ultrason HC-SR04.&lt;br /&gt;
Le développement du programme se fait sur STM32Cube.&lt;br /&gt;
Un premier programme à été mis en place sans difficultés pour récupérer les valeurs du HC-SR04 en s'appuyant sur l'exemple proposé par Arduino.&lt;br /&gt;
En revanche les problèmes sont arrivés lors du développement concernant la partie LoRaWAN. En effet STM32 propose un package LoRaWAN pour faciliter le développement d'application, le problème étant que ce package concerne seulement les cartes STM32LXXX. J'ai essayé longuement d'adapter ce package pour ma carte STM32F411RE en modifiant notamment le Makefile, les .flash mais aussi les fichiers d'inclusion sans succès malheureusement. La solution envisagée est donc un changement de carte au profit d'une STM32LXXX.&lt;br /&gt;
&lt;br /&gt;
===Partie application WEB===&lt;br /&gt;
&lt;br /&gt;
La principale difficulté de cette partie et l'absence totale de connaissances dans le développement d'application WEB. J'ai donc dû apprendre les langage HTML / CSS / PHP (quelques notions en JS) pour réaliser cette partie. Je disposais de quelques notions en base de données et SQL suit à mon année d'IMA3.&lt;br /&gt;
&lt;br /&gt;
Le but de l'application WEB est de permettre de rendre exploitable pour l'utilisateurs les informations renvoyés par les balises. Pour se faire l'application doit contenir une page de monitoring permettant de surveiller l'état de toutes les balises. De plus elle doit contenir une partie historique permettant d'accéder à l'historique d'une balise en particulier (en effectuant une recherche par id/localisation/date). Enfin elle doit aussi proposer une partie permettant d'afficher une carte avec dessus les balises et leur état.&lt;br /&gt;
&lt;br /&gt;
A l'aide de Bootstrap j'ai mis en place une application WEB avec ces trois partie. Le serveur applicatif n'étant pas au point, j'ai du manuellement remplir la base de donnée pour mettre en place l'application WEB. La base contient deux tables, une première ayant pour clef primaire l'id de la balise et contenant des informations diverses sur cette dernière telles que le pays, la ville, la localisation, les coordonnée, le niveau d'eau mais surtout si cette dernière est sous l'eau ou non. La seconde table concerne l'historique des balises, elle a pour clef primaire l'indice du relevé et contient des informations comme le numéro de balise, la date du relevé etc, l'état de la balise etc..&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85324</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85324"/>
				<updated>2020-11-24T11:37:08Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Mise en place du réseau */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Début projet===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Mise en place du réseau===&lt;br /&gt;
&lt;br /&gt;
f4 11 0e 99 cc bb 9d 76 f1 8b a1 49 ff d1 ba f4&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se connecter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
 subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
 range 192.168.42.1 192.168.42.9&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La configuration du serveur réseau s'effectue en se connectant à ce dernier en ssh:&lt;br /&gt;
 root@192.168.42.10&lt;br /&gt;
Il faut installer le &amp;quot;gateway bridge&amp;quot;, le &amp;quot;network server&amp;quot; ainsi que &amp;quot;l'application server&amp;quot; disponible sur ChirpStack. Pour se faire nous avons suivi un tutoriel à l'adresse suivante:&lt;br /&gt;
 https://www.youtube.com/watch?v=FnTP7t47DlI&lt;br /&gt;
ainsi que la documentation fournie par ChirpStack&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pour accéder au serveur réseau, nous passons par l'interface web en se connectant à l'adresse suivante (en passant par une zabeth):&lt;br /&gt;
 172.26.189.22:8080 id: admin mdp: admin&lt;br /&gt;
&lt;br /&gt;
A partir de l'interface web, nous pouvons configurer de nombreux éléments:&lt;br /&gt;
&lt;br /&gt;
-Création d'un nouveau projet&lt;br /&gt;
&lt;br /&gt;
-Ajouter des équipements aux réseau à l'aide des clefs&lt;br /&gt;
&lt;br /&gt;
-Surveiller les informations qui circulent sur notre réseau&lt;br /&gt;
&lt;br /&gt;
-...&lt;br /&gt;
&lt;br /&gt;
Enfin, en nous connectant en ssh sur les deux gateways:&lt;br /&gt;
 antenne: 192.168.42.1 mdp:pdmk-062E7A&lt;br /&gt;
 passerelle intérieur: 192.168.42.2 mdp:pdmk-030970&lt;br /&gt;
Nous avons pu mettre à jour ces dernieres en suivant le wiki Kerlink&lt;br /&gt;
La connexion au wiki Kerlink s'effectue avec:&lt;br /&gt;
 Login : univlille&lt;br /&gt;
 Mot de passe : IYBlN7QF06&lt;br /&gt;
&lt;br /&gt;
===Test du réseau===&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de notre Network Server nous avons utilisé un module GPS LoRa du commerce. En se connectant a notre Network Server (172.26.189.22:8000) nous avons pu créer une nouvelle application et ajouté un nouvel équipement. Se faisant notre Network Server génère deux clefs, une &amp;quot;application key&amp;quot; et une &amp;quot;Network Key&amp;quot;. Ces deux clefs doivent être renseigné manuellement dans notre équipement. Pour se faire on peut le connecter à un ordinateur et y ajouter les clefs via son logiciel dédié. L'équipement possédant déjà un EUI permettant de reconnaître l'équipement, nous avons du renseigner ce dernier dans l'ajout de l'équipement sur le Network Server. Suite à ce test nous avons bien pu observer la circulation de nos trames et le bon fonctionnement de notre Network Server.&lt;br /&gt;
&lt;br /&gt;
===Fabrication du End-device===&lt;br /&gt;
&lt;br /&gt;
Pour le end-device je dispose d'une carte STM32F411RE, d'un shield SX1276MB1MAS et d'un capteur ultrason HC-SR04.&lt;br /&gt;
Le développement du programme se fait sur STM32Cube.&lt;br /&gt;
Un premier programme à été mis en place sans difficultés pour récupérer les valeurs du HC-SR04 en s'appuyant sur l'exemple proposé par Arduino.&lt;br /&gt;
En revanche les problèmes sont arrivés lors du développement concernant la partie LoRaWAN. En effet STM32 propose un package LoRaWAN pour faciliter le développement d'application, le problème étant que ce package concerne seulement les cartes STM32LXXX. J'ai essayé longuement d'adapter ce package pour ma carte STM32F411RE en modifiant notamment le Makefile, les .flash mais aussi les fichiers d'inclusion sans succès malheureusement. La solution envisagée est donc un changement de carte au profit d'une STM32LXXX.&lt;br /&gt;
&lt;br /&gt;
===Partie application WEB===&lt;br /&gt;
&lt;br /&gt;
La principale difficulté de cette partie et l'absence totale de connaissances dans le développement d'application WEB. J'ai donc dû apprendre les langage HTML / CSS / PHP (quelques notions en JS) pour réaliser cette partie. Je disposais de quelques notions en base de données et SQL suit à mon année d'IMA3.&lt;br /&gt;
&lt;br /&gt;
Le but de l'application WEB est de permettre de rendre exploitable pour l'utilisateurs les informations renvoyés par les balises. Pour se faire l'application doit contenir une page de monitoring permettant de surveiller l'état de toutes les balises. De plus elle doit contenir une partie historique permettant d'accéder à l'historique d'une balise en particulier (en effectuant une recherche par id/localisation/date). Enfin elle doit aussi proposer une partie permettant d'afficher une carte avec dessus les balises et leur état.&lt;br /&gt;
&lt;br /&gt;
A l'aide de Bootstrap j'ai mis en place une application WEB avec ces trois partie. Le serveur applicatif n'étant pas au point, j'ai du manuellement remplir la base de donnée pour mettre en place l'application WEB. La base contient deux tables, une première ayant pour clef primaire l'id de la balise et contenant des informations diverses sur cette dernière telles que le pays, la ville, la localisation, les coordonnée, le niveau d'eau mais surtout si cette dernière est sous l'eau ou non. La seconde table concerne l'historique des balises, elle a pour clef primaire l'indice du relevé et contient des informations comme le numéro de balise, la date du relevé etc, l'état de la balise etc..&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85323</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85323"/>
				<updated>2020-11-24T11:32:37Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Mise en place du réseau */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Début projet===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Mise en place du réseau===&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se connecter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
 subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
 range 192.168.42.1 192.168.42.9&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La configuration du serveur réseau s'effectue en se connectant à ce dernier en ssh:&lt;br /&gt;
 root@192.168.42.10&lt;br /&gt;
Il faut installer le &amp;quot;gateway bridge&amp;quot;, le &amp;quot;network server&amp;quot; ainsi que &amp;quot;l'application server&amp;quot; disponible sur ChirpStack. Pour se faire nous avons suivi un tutoriel à l'adresse suivante:&lt;br /&gt;
 https://www.youtube.com/watch?v=FnTP7t47DlI&lt;br /&gt;
ainsi que la documentation fournie par ChirpStack&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pour accéder au serveur réseau, nous passons par l'interface web en se connectant à l'adresse suivante (en passant par une zabeth):&lt;br /&gt;
 172.26.189.22:8080 id: admin mdp: admin&lt;br /&gt;
&lt;br /&gt;
A partir de l'interface web, nous pouvons configurer de nombreux éléments:&lt;br /&gt;
&lt;br /&gt;
-Création d'un nouveau projet&lt;br /&gt;
&lt;br /&gt;
-Ajouter des équipements aux réseau à l'aide des clefs&lt;br /&gt;
&lt;br /&gt;
-Surveiller les informations qui circulent sur notre réseau&lt;br /&gt;
&lt;br /&gt;
-...&lt;br /&gt;
&lt;br /&gt;
Enfin, en nous connectant en ssh sur les deux gateways:&lt;br /&gt;
 antenne: 192.168.42.1 mdp:pdmk-062E7A&lt;br /&gt;
 passerelle intérieur: 192.168.42.2 mdp:pdmk-030970&lt;br /&gt;
Nous avons pu mettre à jour ces dernieres en suivant le wiki Kerlink&lt;br /&gt;
La connexion au wiki Kerlink s'effectue avec:&lt;br /&gt;
 Login : univlille&lt;br /&gt;
 Mot de passe : IYBlN7QF06&lt;br /&gt;
&lt;br /&gt;
===Test du réseau===&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de notre Network Server nous avons utilisé un module GPS LoRa du commerce. En se connectant a notre Network Server (172.26.189.22:8000) nous avons pu créer une nouvelle application et ajouté un nouvel équipement. Se faisant notre Network Server génère deux clefs, une &amp;quot;application key&amp;quot; et une &amp;quot;Network Key&amp;quot;. Ces deux clefs doivent être renseigné manuellement dans notre équipement. Pour se faire on peut le connecter à un ordinateur et y ajouter les clefs via son logiciel dédié. L'équipement possédant déjà un EUI permettant de reconnaître l'équipement, nous avons du renseigner ce dernier dans l'ajout de l'équipement sur le Network Server. Suite à ce test nous avons bien pu observer la circulation de nos trames et le bon fonctionnement de notre Network Server.&lt;br /&gt;
&lt;br /&gt;
===Fabrication du End-device===&lt;br /&gt;
&lt;br /&gt;
Pour le end-device je dispose d'une carte STM32F411RE, d'un shield SX1276MB1MAS et d'un capteur ultrason HC-SR04.&lt;br /&gt;
Le développement du programme se fait sur STM32Cube.&lt;br /&gt;
Un premier programme à été mis en place sans difficultés pour récupérer les valeurs du HC-SR04 en s'appuyant sur l'exemple proposé par Arduino.&lt;br /&gt;
En revanche les problèmes sont arrivés lors du développement concernant la partie LoRaWAN. En effet STM32 propose un package LoRaWAN pour faciliter le développement d'application, le problème étant que ce package concerne seulement les cartes STM32LXXX. J'ai essayé longuement d'adapter ce package pour ma carte STM32F411RE en modifiant notamment le Makefile, les .flash mais aussi les fichiers d'inclusion sans succès malheureusement. La solution envisagée est donc un changement de carte au profit d'une STM32LXXX.&lt;br /&gt;
&lt;br /&gt;
===Partie application WEB===&lt;br /&gt;
&lt;br /&gt;
La principale difficulté de cette partie et l'absence totale de connaissances dans le développement d'application WEB. J'ai donc dû apprendre les langage HTML / CSS / PHP (quelques notions en JS) pour réaliser cette partie. Je disposais de quelques notions en base de données et SQL suit à mon année d'IMA3.&lt;br /&gt;
&lt;br /&gt;
Le but de l'application WEB est de permettre de rendre exploitable pour l'utilisateurs les informations renvoyés par les balises. Pour se faire l'application doit contenir une page de monitoring permettant de surveiller l'état de toutes les balises. De plus elle doit contenir une partie historique permettant d'accéder à l'historique d'une balise en particulier (en effectuant une recherche par id/localisation/date). Enfin elle doit aussi proposer une partie permettant d'afficher une carte avec dessus les balises et leur état.&lt;br /&gt;
&lt;br /&gt;
A l'aide de Bootstrap j'ai mis en place une application WEB avec ces trois partie. Le serveur applicatif n'étant pas au point, j'ai du manuellement remplir la base de donnée pour mettre en place l'application WEB. La base contient deux tables, une première ayant pour clef primaire l'id de la balise et contenant des informations diverses sur cette dernière telles que le pays, la ville, la localisation, les coordonnée, le niveau d'eau mais surtout si cette dernière est sous l'eau ou non. La seconde table concerne l'historique des balises, elle a pour clef primaire l'indice du relevé et contient des informations comme le numéro de balise, la date du relevé etc, l'état de la balise etc..&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85315</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85315"/>
				<updated>2020-11-09T21:51:56Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Projet de fin d'étude */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Début projet===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Mise en place du réseau===&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se connecter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
 subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
 range 192.168.42.1 192.168.42.9&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La configuration du serveur réseau s'effectue en se connectant à ce dernier en ssh:&lt;br /&gt;
 root@192.168.42.10&lt;br /&gt;
Il faut installer le &amp;quot;gateway bridge&amp;quot;, le &amp;quot;network server&amp;quot; ainsi que &amp;quot;l'application server&amp;quot; disponible sur ChirpStack. Pour se faire nous avons suivi un tutoriel à l'adresse suivante:&lt;br /&gt;
 https://www.youtube.com/watch?v=FnTP7t47DlI&lt;br /&gt;
ainsi que la documentation fournie par ChirpStack&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pour accéder au serveur réseau, nous passons par l'interface web en se connectant à l'adresse suivante (en passant par une zabeth):&lt;br /&gt;
 172.26.189.22:8000&lt;br /&gt;
&lt;br /&gt;
A partir de l'interface web, nous pouvons configurer de nombreux éléments:&lt;br /&gt;
-Création d'un nouveau projet&lt;br /&gt;
-Ajouter des équipements aux réseau à l'aide des clefs&lt;br /&gt;
-Surveiller les informations qui circulent sur notre réseau&lt;br /&gt;
-...&lt;br /&gt;
&lt;br /&gt;
Enfin, en nous connectant en ssh sur les deux gateways:&lt;br /&gt;
 antenne: 192.168.42.1 mdp:pdmk-062E7A&lt;br /&gt;
 passerelle intérieur: 192.168.42.2 mdp:pdmk-030970&lt;br /&gt;
Nous avons pu mettre à jour ces dernieres en suivant le wiki Kerlink&lt;br /&gt;
La connexion au wiki Kerlink s'effectue avec:&lt;br /&gt;
 Login : univlille&lt;br /&gt;
 Mot de passe : IYBlN7QF06&lt;br /&gt;
&lt;br /&gt;
===Test du réseau===&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de notre Network Server nous avons utilisé un module GPS LoRa du commerce. En se connectant a notre Network Server (172.26.189.22:8000) nous avons pu créer une nouvelle application et ajouté un nouvel équipement. Se faisant notre Network Server génère deux clefs, une &amp;quot;application key&amp;quot; et une &amp;quot;Network Key&amp;quot;. Ces deux clefs doivent être renseigné manuellement dans notre équipement. Pour se faire on peut le connecter à un ordinateur et y ajouter les clefs via son logiciel dédié. L'équipement possédant déjà un EUI permettant de reconnaître l'équipement, nous avons du renseigner ce dernier dans l'ajout de l'équipement sur le Network Server. Suite à ce test nous avons bien pu observer la circulation de nos trames et le bon fonctionnement de notre Network Server.&lt;br /&gt;
&lt;br /&gt;
===Fabrication du End-device===&lt;br /&gt;
&lt;br /&gt;
Pour le end-device je dispose d'une carte STM32F411RE, d'un shield SX1276MB1MAS et d'un capteur ultrason HC-SR04.&lt;br /&gt;
Le développement du programme se fait sur STM32Cube.&lt;br /&gt;
Un premier programme à été mis en place sans difficultés pour récupérer les valeurs du HC-SR04 en s'appuyant sur l'exemple proposé par Arduino.&lt;br /&gt;
En revanche les problèmes sont arrivés lors du développement concernant la partie LoRaWAN. En effet STM32 propose un package LoRaWAN pour faciliter le développement d'application, le problème étant que ce package concerne seulement les cartes STM32LXXX. J'ai essayé longuement d'adapter ce package pour ma carte STM32F411RE en modifiant notamment le Makefile, les .flash mais aussi les fichiers d'inclusion sans succès malheureusement. La solution envisagée est donc un changement de carte au profit d'une STM32LXXX.&lt;br /&gt;
&lt;br /&gt;
===Partie application WEB===&lt;br /&gt;
&lt;br /&gt;
La principale difficulté de cette partie et l'absence totale de connaissances dans le développement d'application WEB. J'ai donc dû apprendre les langage HTML / CSS / PHP (quelques notions en JS) pour réaliser cette partie. Je disposais de quelques notions en base de données et SQL suit à mon année d'IMA3.&lt;br /&gt;
&lt;br /&gt;
Le but de l'application WEB est de permettre de rendre exploitable pour l'utilisateurs les informations renvoyés par les balises. Pour se faire l'application doit contenir une page de monitoring permettant de surveiller l'état de toutes les balises. De plus elle doit contenir une partie historique permettant d'accéder à l'historique d'une balise en particulier (en effectuant une recherche par id/localisation/date). Enfin elle doit aussi proposer une partie permettant d'afficher une carte avec dessus les balises et leur état.&lt;br /&gt;
&lt;br /&gt;
A l'aide de Bootstrap j'ai mis en place une application WEB avec ces trois partie. Le serveur applicatif n'étant pas au point, j'ai du manuellement remplir la base de donnée pour mettre en place l'application WEB. La base contient deux tables, une première ayant pour clef primaire l'id de la balise et contenant des informations diverses sur cette dernière telles que le pays, la ville, la localisation, les coordonnée, le niveau d'eau mais surtout si cette dernière est sous l'eau ou non. La seconde table concerne l'historique des balises, elle a pour clef primaire l'indice du relevé et contient des informations comme le numéro de balise, la date du relevé etc, l'état de la balise etc..&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85314</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85314"/>
				<updated>2020-11-09T21:12:39Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Semaine 3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Semaine 1 et 2===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3===&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se conneter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
 subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
 range 192.168.42.1 192.168.42.9&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La configuration du serveur réseau s'effectue en se connectant à ce dernier en ssh:&lt;br /&gt;
 root@192.168.42.10&lt;br /&gt;
Il faut installer le &amp;quot;gateway bridge&amp;quot;, le &amp;quot;network server&amp;quot; ainsi que &amp;quot;l'application server&amp;quot; disponible sur ChirpStack. Pour se faire nous avons suivi un tutoriel à l'adresse suivante:&lt;br /&gt;
 https://www.youtube.com/watch?v=FnTP7t47DlI&lt;br /&gt;
ainsi que la documentation fournie par ChirpStack&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pour accéder au serveur réseau, nous passons par l'interface web en se connectant à l'adresse suivante (en passant par une zabeth):&lt;br /&gt;
 172.26.189.22:8000&lt;br /&gt;
&lt;br /&gt;
A partir de l'interface web, nous pouvons configurer de nombreux éléments:&lt;br /&gt;
-Création d'un nouveau projet&lt;br /&gt;
-Ajouter des équipements aux réseau à l'aide des clefs&lt;br /&gt;
-Surveiller les informations qui circulent sur notre réseau&lt;br /&gt;
-...&lt;br /&gt;
&lt;br /&gt;
Enfin, en nous connectant en ssh sur les deux gateways:&lt;br /&gt;
 antenne: 192.168.42.1 mdp:pdmk-062E7A&lt;br /&gt;
 passerelle intérieur: 192.168.42.2 mdp:pdmk-030970&lt;br /&gt;
Nous avons pu mettre à jour ces dernieres en suivant le wiki Kerlink&lt;br /&gt;
La connexion au wiki Kerlink s'effectue avec:&lt;br /&gt;
 Login : univlille&lt;br /&gt;
 Mot de passe : IYBlN7QF06&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85272</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85272"/>
				<updated>2020-10-08T16:03:26Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Semaine 3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Semaine 1 et 2===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3===&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se conneter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
 subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
 range 192.168.42.1 192.168.42.9&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La configuration du serveur réseau s'effectue en se connectant à ce dernier en ssh:&lt;br /&gt;
 root@192.168.42.10&lt;br /&gt;
Ensuite il faut installer le &amp;quot;gateway bridge&amp;quot;, le &amp;quot;network server&amp;quot; ainsi que &amp;quot;l'application server&amp;quot; disponible sur ChirpStack. Pour se faire nous avons suivi un tutoriel à l'adresse suivante:&lt;br /&gt;
 https://www.youtube.com/watch?v=FnTP7t47DlI&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pour configurer le serveur réseau, nous passons par l'interface web en se connectant à l'adresse suivante (en passant par une zabeth):&lt;br /&gt;
 172.26.189.22:8000&lt;br /&gt;
&lt;br /&gt;
A partir de l'interface web, nous avons configuré:&lt;br /&gt;
 -&lt;br /&gt;
 -&lt;br /&gt;
 -&lt;br /&gt;
 -&lt;br /&gt;
Enfin, en nous connectant en ssh sur les deux gateways:&lt;br /&gt;
 antenne: 192.168.42.1&lt;br /&gt;
 passerelle intérieur: 192.168.42.1.2&lt;br /&gt;
Nous avons pu mettre à jour ces dernieres en suivant le wiki Kerlink&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85271</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85271"/>
				<updated>2020-10-08T16:01:00Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Semaine 3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Semaine 1 et 2===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3===&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se conneter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
 subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
 range 192.168.42.1 192.168.42.9&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La configuration du serveur réseau s'effectue en se connectant à ce dernier en ssh:&lt;br /&gt;
 root@192.168.42.10&lt;br /&gt;
Ensuite il faut installer le &amp;quot;gateway bridge&amp;quot;, le &amp;quot;network server&amp;quot; ainsi que &amp;quot;l'application server&amp;quot; disponible sur ChirpStack. Pour se faire nous avons suivi un tutoriel à l'adresse suivante:&lt;br /&gt;
 https://www.youtube.com/watch?v=FnTP7t47DlI&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pour configurer le serveur réseau, nous passons par l'interface web en se connectant à l'adresse suivante (en passant par une zabeth):&lt;br /&gt;
 172.26.189.22:8000&lt;br /&gt;
&lt;br /&gt;
A partir de l'interface web, nous avons configuré:&lt;br /&gt;
 -&lt;br /&gt;
 -&lt;br /&gt;
 -&lt;br /&gt;
 -&lt;br /&gt;
Enfin, en nous connectant en ssh sur les deux gateways:&lt;br /&gt;
 antenne: 192.168.42.2&lt;br /&gt;
 passerelle intérieur: 192.168.42.1.1&lt;br /&gt;
Nous avons pu mettre à jour ces dernieres en suivant le wiki Kerlink&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85270</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85270"/>
				<updated>2020-10-08T15:51:14Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Semaine 3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Semaine 1 et 2===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3===&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se conneter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
 subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
 range 192.168.42.1 192.168.42.9&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La configuration du serveur réseau s'effectue en se connectant à ce dernier en ssh:&lt;br /&gt;
 root@192.168.42.10&lt;br /&gt;
Ensuite il faut installer le &amp;quot;gateway bridge&amp;quot;, le &amp;quot;network server&amp;quot; ainsi que &amp;quot;l'application server&amp;quot; disponible sur ChirpStack. Pour se faire nous avons suivi un tutoriel à l'adresse suivante:&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pour configurer le serveur réseau, nous passons par l'interface web en se connectant à l'adresse suivante (en passant par une zabeth):&lt;br /&gt;
 172.26.189.22:8000&lt;br /&gt;
&lt;br /&gt;
A partir de l'interface web, nous avons configuré:&lt;br /&gt;
 -&lt;br /&gt;
 -&lt;br /&gt;
 -&lt;br /&gt;
 -&lt;br /&gt;
Enfin, en nous connectant en ssh sur les deux gateways:&lt;br /&gt;
 antenne: 192.168.42.2&lt;br /&gt;
 passerelle intérieur: 192.168.42.1.1&lt;br /&gt;
Nous avons pu mettre à jour ces dernieres en suivant le wiki Kerlink&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85269</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85269"/>
				<updated>2020-10-08T13:51:56Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Semaine 3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Semaine 1 et 2===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3===&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se conneter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
 subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
 range 192.168.42.1 192.168.42.9&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85263</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85263"/>
				<updated>2020-10-05T16:46:24Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Présentation générale */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet de fin d'étude==&lt;br /&gt;
&lt;br /&gt;
===Semaine 1 et 2===&lt;br /&gt;
&lt;br /&gt;
Les semaines 1 et 2 ont été très limité en terme de travail à cause du Covid, cependant lors de la première semaine et apres rendez vous avec Mr Boé, j'ai pu dresser le cahier des charges et concernant la seconde semaine après un second rendez vous j'ai pas récuperer le matériel LoRaWAN et des microcontroleurs Mbed pour m'aider dans la première partie du projet mais aussi rédiger le cahier des spécifications.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3===&lt;br /&gt;
&lt;br /&gt;
Grâce à l'aide du binôme Loic Ringot et Théo Evrard, le serveur réseau à été configuré sur la machine virtuelle. Pour se faire dans un premier temps nous avons installé un serveur DHCP sur la machine virtuelle afin de pouvoir s'adresser aux différents équipements du réseau. Le serveur DHCP a été configuré de tel manière à attribuer des adresses allant de 192.168.42.1 à  192.168.42.9. Pour se faire, il a fallu dans un premier se conneter au serveur réseau en ssh puis de modifier configurer le serveur DHCP (/etc/dhcp/dhcpd.conf) et d'ajouter les lignes suivantes :&lt;br /&gt;
--subnet 192.168.42.0 netmask 255.255.255.0{&lt;br /&gt;
--range 192.168.42.1 192.168.42.9&lt;br /&gt;
--}&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85262</id>
		<title>IMA5 2020/2021 P1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA5_2020/2021_P1&amp;diff=85262"/>
				<updated>2020-10-05T16:26:00Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Présentation générale */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre des projets de fin d'étude, j'ai choisi le projet &amp;quot;Réseau de capteurs autonomes pour mesures aquatiques&amp;quot;. Ce dernier à pour but de mesurer le niveau d'eau dans une zone, de mettre en forme l'information et de l'envoyer sur un serveur réseau via la technologie LoRa. A l'aide d'un serveur applicatif et d'une application, l'information sera disponible à l'utilisateur sous diverses forme (information diverses sur la balise, affichage sur une carte...).&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
Le projet va se découper en quatre partie. Premièrement il va falloir concevoir un capteur permettant de mesurer le niveau de l'eau et aussi le système permettant d'envoyer l'information via un réseau LoRaWAN. Dans un second temps, une machine virtuelle est mis à ma disposition afin de deployer le serveur réseau, il est donc nécessaire de configurer ce dernier. Dans un troisième temps sur le même principe que le serveur reseau, une machine virtuelle est mise à ma disposition afin de deployer le serveur applicatif. Enfin pour la quatrième partie, une application web devra être mise au point afin de données l'accés aux informations à l'utilisateur.&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2018/2020_P4&amp;diff=84629</id>
		<title>IMA3/IMA4 2018/2020 P4</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2018/2020_P4&amp;diff=84629"/>
				<updated>2020-05-03T14:28:18Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Semaine 13 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;include nopre noesc src=&amp;quot;/home/pedago/pimasc/include/video-ConstructionDroneIMA32018-iframe.html&amp;quot; /&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre du projet IMA3/4, nous avons choisi le sujet P4 : '''Construction d'un drone volant'''. Notre groupe se compose de Maxime CLAUDEL, Lukas FAUCHOIS, Evan GURY et Richard Simonin.&lt;br /&gt;
Nous avions dans un premier temps décidé de réaliser notre projet autour d'un drone servant à la livraison de petit colis, cependant dans un souci concernant la matériel mis à notre disposition et de budget, nous avons finalement opté pour un drone &amp;quot;loisir&amp;quot;.&lt;br /&gt;
Ce dernier sera destiné à un public amateur, dans un but d'apprentissage et/ou d'amusement et sera ainsi plus en adéquation avec nos contraintes et compétences, de plus amples informations sont décrites ci-dessous dans la partie '''Objectifs''' de notre présentation.&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
A terme, l'objectif principal de ce projet est de concevoir et construire entièrement un drone &amp;quot;made in Polytech Lille&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nous allons alors répartir notre travail en deux sessions, une première réalisée en IMA (S6) et une seconde en IMA4.&lt;br /&gt;
&lt;br /&gt;
Pour la fin de cette première session de projet, nous avons pour objectif de faire voler notre drone. Pour ce faire, nous n'avons évidemment pas le temps de nous occuper de la partie concernant le vol nous-mêmes, c'est pour quoi nous avons opté pour l'utilisation d'un contrôleur de vol n'ayant qu'à être configuré.&lt;br /&gt;
&lt;br /&gt;
Parallèlement à cela, nous comptons réaliser nous-mêmes la commande permettant de communiquer avec ce dernier pendant qu'une autre partie des membres du projet s’attellera à la partie mécanique et électrique du drone.&lt;br /&gt;
&lt;br /&gt;
Ce faisant et si tout se passe bien, nous pourrons avoir pour débuter l'année prochaine une base solide pour concevoir nous-mêmes notre contrôleur de vol. Ce qui nous amène à notre second point, puisque nous comptons dans un second temps réaliser notre propre contrôleur de vol, une fois le premier objectif atteint.&lt;br /&gt;
&lt;br /&gt;
=Analyse du projet=&lt;br /&gt;
&lt;br /&gt;
==Positionnement par rapport à l'existant==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:parrot.jpg|right|thumb|PARROT AR.DRONE 2.0]]&lt;br /&gt;
[[Fichier:udi.jpg|right|thumb|UDI U818S]]&lt;br /&gt;
&lt;br /&gt;
===Analyse du premier concurrent : PARROT AR.DRONE 2.0===&lt;br /&gt;
&lt;br /&gt;
Le [https://www.parrot.com/fr/drones/parrot-ardrone-20-elite-edition PARROT AR.DRONE 2.0], tout comme le notre, est destiné à un usage ludique. En dehors de la camera que nous n'envisageons pas d'intégrer à notre drone pour le moment, il dispose de toutes les caractéristiques que nous souhaiterions obtenir. A savoir une portée d'environ 100m, une autonomie de plus de 10min et une vitesse moyenne d'environ 20 km/h pour un prix avoisinant les 100 euros.&lt;br /&gt;
&lt;br /&gt;
Notre avantage peut se jouer sur la camera, en effet, en enlevant cette dernière nous pouvons réaliser des économies. De plus, si une personne recherche un drone simplement pour prendre du plaisir à le faire voler, il ne souhaitera pas forcément gaspiller son argent dans une camera qu'il n'aurait surement de base pas voulu.&lt;br /&gt;
&lt;br /&gt;
===Analyse du second concurrent : UDI U818S===&lt;br /&gt;
&lt;br /&gt;
Fabriqué par la marque UDI, le [https://www.maisondudrone.com/prod/udi-u818s-avec-camera-hd-2-0mp-blanc-1400.html UDI U818S] est un drone au caractéristiques similaires au précédent, à l'exception de la camera.&lt;br /&gt;
En effet, cette fois nous sommes face à un concurrent qui tout comme nous, propose simplement la fonctionnalité de base d'un drone, à savoir voler et cela se fait ressentir sur le prix puisque nous passons sur un prix d'environ 50 euros.&lt;br /&gt;
Face à un concurrent proposant un produit similaire au notre et à un prix au plus bas pour ces caractéristiques, difficile de faire mieux sur le plan technique. Peut être serait il alors plus judicieux de proposer un produit plus haute gamme, plus chère, mais destiné à un public désireux de s'amuser avec un produit de qualité.&lt;br /&gt;
&lt;br /&gt;
==Scénario d'usage du produit ou du concept envisagé==&lt;br /&gt;
&lt;br /&gt;
'''A qui notre drone peut-il servir ?'''&lt;br /&gt;
&lt;br /&gt;
Le drone &amp;quot;made in Polytech Lille&amp;quot; s'adresse à tout public n'ayant que pour objectif l'amusement''&lt;br /&gt;
&lt;br /&gt;
Toute personne souhaitant débuter avec un drone de qualité, sans s'encombrer de fonctionnalité ne s'avérant pas utiles peut être amenées a utiliser notre drone.&lt;br /&gt;
&lt;br /&gt;
'''Pour quel type d'utilisation ?'''&lt;br /&gt;
&lt;br /&gt;
Nombre de notre génération ont déjà reçu comme cadeau une voiture RC. Cette dernière n'avait que pour objectif de rouler à toute vitesse pour nous satisfaire. Nul besoin d'embarquer des caméras, stabilisateurs et nombres d'autres gadgets inutile à la vocation initiale de notre voiture, rouler. &lt;br /&gt;
&lt;br /&gt;
Avec notre drone, nous voulons remettre cela en avant, le simple plaisir de piloter une voiture RC appliqué aux drones. Alors enfant, adultes et nostalgiques pourront par le biais de notre produit découvrir ou redécouvrir le plaisir de piloter un engin motorisé, qui plus est cette-ci fois dans les airs.&lt;br /&gt;
&lt;br /&gt;
==Réponse à la question difficile==&lt;br /&gt;
&lt;br /&gt;
'''Qu'en est-il du dimensionnement des composants pour permettre à votre drone de porter une telle charge ?'''&lt;br /&gt;
&lt;br /&gt;
Nos contraintes et objectif ayant totalement changé, la question ne se pose plus vraiment. En effet nous avons suites à notre présentation réalisé des calculs en terme de puissance et nous nous sommes très vite rendu compte de l'impossibilité à réaliser notre projet.&lt;br /&gt;
&lt;br /&gt;
En effet, au vu de notre budget, l'achat d'un seul des quatre moteurs nécessaire à l'atteinte des chiffres que nous avions avancés était déjà impossible. Nous avons donc totalement changé d'objectif et avons récupéré du matériel déjà présent à Polytech, à savoir quatre moteurs et leur ESC. Nous avons pris le problème à l'envers et avons réfléchi à ce que nous pouvions réaliser avec le budget et le matériel à disposition.&lt;br /&gt;
&lt;br /&gt;
C'est de cette manière que nous avons eu l'idée d'un drone &amp;quot;loisir&amp;quot;, effaçant ainsi la question de la charge.&lt;br /&gt;
&lt;br /&gt;
==Bibliographie et webographie==&lt;br /&gt;
&lt;br /&gt;
===Arducopter===&lt;br /&gt;
&lt;br /&gt;
 https://www.digi.com/resources/documentation/digidocs/PDFs/90000976.pdf&lt;br /&gt;
 http://jeromeabel.net/wiki/xbee/xbee-arduino.pdf&lt;br /&gt;
 https://www.digi.com/resources/documentation/digidocs/pdfs/90001942-13.pdf&lt;br /&gt;
 https://www.arduino.cc/en/Reference/Servo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Manuel d'utilisation&lt;br /&gt;
 http://ardupilot.org/copter/index.html&lt;br /&gt;
&lt;br /&gt;
* Tutoriels vidéos&lt;br /&gt;
 Première installation et setup : https://www.youtube.com/watch?v=30cCs4aHdB0&amp;amp;t=754s&lt;br /&gt;
 Alimentation de l'Ardupilot : https://www.youtube.com/watch?v=TS4OWAcfAQY&amp;amp;t=270s&lt;br /&gt;
 Calibration des ESC : https://youtu.be/gYoknRObfOg&lt;br /&gt;
&lt;br /&gt;
=Préparation du projet=&lt;br /&gt;
&lt;br /&gt;
==Cahier des charges du groupe==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Diagramme bête à cornes'''&lt;br /&gt;
&lt;br /&gt;
Le diagramme bête à cornes nous permet de faire une analyse fonctionnelle du besoin. Notre drone permet à utilisateur de découvrir l'aéronautique à travers une activité ludique à l'aide d'une télécommande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bete_a_cornes.png | center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Diagramme en pieuvre'''&lt;br /&gt;
&lt;br /&gt;
Le diagramme en pieuvre permet quant à lui de répertorier toutes les fonctions (principales et de service) et d'analyser l'importance des besoins de notre projet&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pieuvredrone.png | center]]&lt;br /&gt;
&lt;br /&gt;
'''Tableau de fonctions'''&lt;br /&gt;
&lt;br /&gt;
Le tableau ci-dessous liste les fonctions principales (FP) et les fonctions contraintes (FC), dans l'orde d'importance, les accompagnant d'une petite description.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tableau_fonctions.jpeg | 500px | center]]&lt;br /&gt;
&lt;br /&gt;
==Cahier des charges des équipes==&lt;br /&gt;
===Equipe 1 : Gestion de la commande (Evan Gury et Richard Simonin)===&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie, est de créer une télécommande ainsi que le récepteur. Nous devons lire les valeurs des potentiomètres, créer des trames, envoyer les trames et analyser les trames reçus. Notre système doit être performant en matière de vitesse ainsi qu'en précision.&lt;br /&gt;
&lt;br /&gt;
===Equipe 2 : Contrôleur de vol (Maxime Claudel et Lukas Fauchois)===&lt;br /&gt;
&lt;br /&gt;
L'objectif de l'équipe est d'utiliser une carte de contrôle pouvant être liée à un logiciel de contrôle de vol. Etant donné notre projet, la carte doit respecter certaines contraintes : être adaptée à un drone à quatre hélices (quadcopter), fonctionner sur batterie (car positionnée sur le chassis du drone), être déjà programmée et relativement simple d'utilisation. Le logiciel doit quant à lui nous permettre de gérer le vol du drone et de calibrer les commandes.&lt;br /&gt;
&lt;br /&gt;
==Choix techniques : matériel et logiciel==&lt;br /&gt;
===Equipe 1===&lt;br /&gt;
&lt;br /&gt;
'''Émetteur'''&lt;br /&gt;
&lt;br /&gt;
Pour la réalisation de l'émetteur, nous avons choisi de travailler avec une Arduino ainsi que '''deux joysticks''' et un '''émetteur Xbee'''. Nous voulons une télécommande petite c'est pourquoi nous avons pris avec une '''Arduino NANO'''. Le drone a besoin de deux joysticks pour être dirigé selon 3 axes.&lt;br /&gt;
&lt;br /&gt;
'''Récepteur'''&lt;br /&gt;
&lt;br /&gt;
Pour la réalisation du récepteur, qui sera situé sur le drone nous avons commencé par utiliser une '''Arduino UNO''' mais nous souhaitons changer pour une NANO afin d'optimiser le poids ainsi que l'espace. Nous avons aussi besoin d'un '''récepteur Xbee''' afin de recevoir les trames.&lt;br /&gt;
&lt;br /&gt;
===Equipe 2===&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi pour notre carte de contrôle un '''Ardupilot 2.8''', son prix est raisonnable (une trentaine d'euros) et nous trouvons beaucoup de tutoriels l'utilisant sur YouTube.&lt;br /&gt;
&lt;br /&gt;
Pour le logiciel, deux choix relativement similaires s'offraient à nous : Mission Planner ou APM Planner. Les deux logiciels ont à peu près la même interface et permettent tous les deux d'effectuer les mêmes étapes de calibrage de l'Ardupilot et des commandes avant le premier vol.&lt;br /&gt;
&lt;br /&gt;
Nous avons d'abord commencé sur Mission Planner mais des problèmes de mises à jour du firmware de l'Ardupilot nous ont empêché de calibrer les '''ESC du drone'''. Nous sommes donc ensuite passés sur '''APM Planner''' car il permet d'éviter ce problème de mises à jour.&lt;br /&gt;
&lt;br /&gt;
===Bilan===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:materieldrone.jpg|right|thumb|Matériel nécessaire à la conception]]&lt;br /&gt;
&lt;br /&gt;
* '''Matériel''' :&lt;br /&gt;
**2 joysticks&lt;br /&gt;
**Emetteur Xbee&lt;br /&gt;
**Récepteur Xbee&lt;br /&gt;
**Arduino NANO&lt;br /&gt;
**Arduino UNO&lt;br /&gt;
**Ardupilot 2.8&lt;br /&gt;
**Câblage&lt;br /&gt;
&lt;br /&gt;
* '''Logiciels''' :&lt;br /&gt;
**Arduino&lt;br /&gt;
**Mission Planner&lt;br /&gt;
**APM Planner 2.0&lt;br /&gt;
&lt;br /&gt;
==Liste des tâches à effectuer==&lt;br /&gt;
===Equipe 1===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser la partie gestion de la commande, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Analyse du projet&lt;br /&gt;
* Découverte Xbee&lt;br /&gt;
* Prise en main Xbee&lt;br /&gt;
* Envoi de trames&lt;br /&gt;
* Réception de trames&lt;br /&gt;
* Optimisation de la programmation&lt;br /&gt;
* Test sur maquette&lt;br /&gt;
* Réalisation du PCB&lt;br /&gt;
* Mise en œuvre sur notre drone&lt;br /&gt;
&lt;br /&gt;
===Equipe 2===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser la partie contrôleur de vol, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Analyse du projet&lt;br /&gt;
* Choix d'une carte de contrôle&lt;br /&gt;
* Documentation, recherche d'un software&lt;br /&gt;
* Calibration de la carte&lt;br /&gt;
* Réalisation des branchements&lt;br /&gt;
* Mise en application sur la maquette&lt;br /&gt;
* Mise en relation avec la partie commande&lt;br /&gt;
&lt;br /&gt;
==Calendrier prévisionnel==&lt;br /&gt;
Nous avons décidé de réaliser un diagramme de GANTT pour chacun des calendriers prévisionnels (un par équipe). Sur chaque tâche, nous avions prévu un temps de travail en bleu dans les diagrammes et le temps réel consacré en jaune.&lt;br /&gt;
===Equipe 1 : Calendrier prévisionnel pour la gestion de la commande===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:equipe1cal.jpg|500px|center|&amp;quot;Calendrier de l'Equipe 1&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Equipe 2 : Calendrier prévisionnel pour le contrôleur de vol===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:equipe2cal.jpg|500px|center|&amp;quot;Calendrier de l'Equipe 2&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet S6==&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 et 6===&lt;br /&gt;
&lt;br /&gt;
Avant de scinder le groupe en deux équipes, nous avons passés les deux premières séances à évaluer les besoins de conception de notre projet pour pouvoir ensuite réaliser un cahier des charges et établir un calendrier prévisionnel des tâches à effectuer.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:xbeedrone.jpg|200px|thumb|Xbee]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Etant donné que nous avons décidé d'utiliser des modules XBee, nous avons consacrés cette semaine à la documentation, afin de comprendre comment configurer et utiliser ces derniers.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ardupilot28.jpeg|300px|right|thumb|Ardupilot 2.8]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Sur le principe de la semaine 7, nous nous sommes documentés sur les XBee afin de comprendre comment les configurer et les utiliser.&lt;br /&gt;
&lt;br /&gt;
Pour la configuration, nous avons retenu le logiciel XCTU qui est celui recommandé pour configurer les XBee. Cependant, nous gardons quand même de côté Legacy XCTU qui est l'ancienne version XCTU mais qui reste tout de même viable.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Nous avons consacré cette séance de documentation à la recherche d'une carte de contrôle de vol satisfaisant nos exigences. Nous cherchions donc une carte facilement connectable avec un Arduino Uno/Micro. Nous avons opté pour l'Ardupilot 2.8. Il comprend tout le nécessaire pour diriger un drone quadcopter, centrale gyroscopique, accéléromètres, interface de radiocommande. &lt;br /&gt;
Nous avons donc commandé l'Ardupilot via le site Alibaba.com (30€) et nous l'avons reçu trois semaines plus tard.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Après avoir effectués diverses recherches sur les modules XBee et effectué de nombreux tests (XCTU, legacy XCTU), nous avons abandonné l'utilisation du logiciel XCTU, étant donné que nous n'utilisons que deux XBee, nous pouvons les initialiser directement dans le programme avec le programme suivant:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:inixbeedrone.png]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
En attendant la réception du colis de l'Ardupilot, nous nous sommes documentés sur les différents logiciels de contrôle de vol à notre disposition. L'objectif étant de trouver un logiciel compatible avec l'Ardupilot 2.8 et avec suffisamment de documentation et tutoriels d'utilisation. Les deux logiciels qui sont ressortis le plus dans nos recherches sont Mission Planner et APM Planner 2. Ces deux logiciels sont très similaires au niveau de l'interface et des options de calibration de la carte de vol à laquelle ils sont connectés.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:apm20.png|300px|center]][[Fichier:missionplanner.jpg|300px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En connectant l'Ardupilot via un câble USB, le logiciel le reconnait et une démarche de calibration peut être entamée : boussole, accéléromètres, radiocommande, ESC.&lt;br /&gt;
&lt;br /&gt;
===Semaine 10===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur la transmission, la réception et le traitement des trames.&lt;br /&gt;
&lt;br /&gt;
Pour la transmission, nous avons mis en place le système suivant:&lt;br /&gt;
&lt;br /&gt;
*On lit la valeur des potentiomètres&lt;br /&gt;
*On convertit la valeur en une chaîne de caractère et on lui attribue un indice qui est propre à chaque position des joysticks.&lt;br /&gt;
*On envoie la chaîne de caractère par liaison série.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la réception, nous avons mis en place le système suivant:&lt;br /&gt;
&lt;br /&gt;
*On reçoit un tableau de caractère qui contient la consigne entre 0 et 1023 et un indice pour dire à quel joystick et quelle position la consigne correspond.&lt;br /&gt;
*On converti le tableau en entier et à l'aide de la fonction map on adapte la consigne pour qu'elle est une valeur entre 0 et 180.&lt;br /&gt;
*On transmet la consigne à l'ardupilot.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Idem semaine 9.&lt;br /&gt;
&lt;br /&gt;
===Semaine 11===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Débogage de la communication entre les modules XBee et l'ardupilot.&lt;br /&gt;
&lt;br /&gt;
En utilisant deux terminaux, la communication était réalisé entre les deux XBee  cependant une fois branché sur l'ardupilot nous avons eu des difficultés à traiter les trames, du au fait d'une transmission trop rapide.&lt;br /&gt;
&lt;br /&gt;
De plus nous avons passé un certains temps à vouloir utiliser une arduino micro mais avons finalement décidé de laisser tomber, puisque nous n'avons pas réussi à réceptionner les trames XBee.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Idem semaine 9.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Optimisation du format des trames et réglage de la vitesse de transmission.&lt;br /&gt;
&lt;br /&gt;
Passage d'une Arduino UNO à une Arduino Nano pour l'envoie des trames dans l'optique de réaliser un PCB pour la commande.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
A ce stade du projet nous ne pouvions qu'expérimenter les calibrations de la boussole et des accéléromètres de l'Ardupilot car la partie commande n'était pas terminée.&lt;br /&gt;
&lt;br /&gt;
La calibration de la boussole s'effectue en bougeant l'Ardupilot selon tous ces axes pendant une période de temps donnée jusqu'à ce que les informations nécessaires soient récoltées.&lt;br /&gt;
La calibration des accéléromètres s'effectue en positionnant l'Ardupilot dans des positions définies (sur le côté gauche, sur la face avant, etc.). (cliquer sur l'image ci-dessous pour lancer le GIF)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:compasscalib.gif|300px|center]][[Fichier:compasscalib.png|300px|center]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Réglage des trames pour la commande du prototype.&lt;br /&gt;
&lt;br /&gt;
Nous avons rencontré quelques problème de sensibilité au niveau des joysticks et du traitement du signal de commande transmis à l'ardupilot.&lt;br /&gt;
&lt;br /&gt;
En effet, ayant trouvé très peu de documentation sur l'ardupilot, nous avons eu du mal à générer les bons signaux de commande.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes ensuite consacrés à la partie alimentation de l'Ardupilot et du drone. En se documentant sur le site servant de manuel d'utilisation d'Ardupilot et des logiciels Mission Planner et APM Planner 2, nous avons trouvé que l'Ardupilot pouvait être alimenté via les ESC.&lt;br /&gt;
Une batterie LiPo alimente les ESC qui elles-mêmes alimentent l'Ardupilot via les broches Output. L'Ardupilot alimente ensuite l'Arduino qui réceptionne les trames reçues par le récepteur Xbee. Sur les sorties (Output) de l'Ardupilot sont aussi branchés les fils permettant la réception du signal envoyé aux moteurs.&lt;br /&gt;
Ainsi, tous les composants nécessaires au drone sont alimentés.&lt;br /&gt;
&lt;br /&gt;
===Semaine 14===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Conception du PCB pour la commande en essayant de limiter le plus possible les vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pcbdrone.png|400px|PCB]]&lt;br /&gt;
&lt;br /&gt;
Vérification de l'envoie des trames à l'aide de l'ordinateur et test de réception sur l'Ardupilot.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Branchements comme indiqués à la semaine précédente, alimentation et tests de bon fonctionnement des moteurs, Ardupilot et Arduino.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:branchementesc.jpg|300px]][[Fichier:branchementardu.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 15===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Fabrication de la manette&lt;br /&gt;
&lt;br /&gt;
[[Fichier:manettedrone.jpg|400px|PCB]]&lt;br /&gt;
&lt;br /&gt;
Modification de l'envoie des trames. Tests de transmission.&lt;br /&gt;
Implémentation du programme sur le prototype.&lt;br /&gt;
&lt;br /&gt;
Les deux équipes ont passé la semaine à réunir leur travail, nous avons ainsi tous pu réaliser de nombreux tests du prototype, avec réussite, hormis un léger accident qui à entraîné la destruction de deux hélices. &lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
A ce stade, la commande étant terminée et nous avons pu nous lier à l'équipe 1 pour mettre en relation la télécommande et l'Ardupilot. Après avoir utilisé Mission Planner pendant plusieurs semaines, un problème de mise-à-jour du software de l'Ardupilot nous empêchait toujours d'effectuer la calibration de la radiocommande. Nous sommes donc passés sur APM Planner 2 et la mise-à-jour n'était plus demandée, nous avons donc enfin pu terminer l'intégralité de la phase de calibration. Comme expliqué ci-dessus, nous avons effectué de nombreux tests pour atteindre notre objectif.&lt;br /&gt;
&lt;br /&gt;
===Documents Rendus===&lt;br /&gt;
&lt;br /&gt;
Rapport : [[fichier:rapport_groupe_4.pdf]]&lt;br /&gt;
&lt;br /&gt;
==Projet S7==&lt;br /&gt;
&lt;br /&gt;
===De nouveaux objectifs===&lt;br /&gt;
&lt;br /&gt;
Durant le semestre 6, nous avons réussi à concevoir un drone volant fonctionnel régulé à l'aide d'une carte de contrôle OpenSource '''Ardupilot 2.8'''. Concernant la commande, nous avions fait le choix d'utiliser une carte communication Xbee ainsi qu'une Arduino NANO et des joysticks.&lt;br /&gt;
&lt;br /&gt;
Cette année, nous avons décidé de développer plus amplement notre projet et de pratiquement repartir du point de départ. En effet, nos objectifs cette année sont :&lt;br /&gt;
*'''d'utiliser de nouveaux composants dont nous connaissons les propriétés (moteurs, ESCs, etc)'''&lt;br /&gt;
*'''d'utiliser une télécommande de modélisme ainsi qu'un récepteur adapté à des portées plus élevées que celles que permettait l'Xbee'''&lt;br /&gt;
*'''de concevoir notre propre contrôleur de vol'''&lt;br /&gt;
*'''Bonus''' : d'intégrer une régulation GPS et un mode automatique en cas de perte de signal&lt;br /&gt;
&lt;br /&gt;
===Reprise du cahier des charges===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 : Gestion de la commande et initialisation (Richard Simonin &amp;amp; Lukas Fauchois)'''&lt;br /&gt;
&lt;br /&gt;
L'objectif de la nouvelle gestion de la commande est d'utiliser une télécommande de modélisme capable de transmettre les différentes données nécessaires (Throttle, Yaw, Pitch) à un récepteur relié à une Arduino UNO, ce qui nous permettra d'être performant en terme de vitesse et de précision. De plus, cette partie de la conception consiste également à calibrer les quatre ESCs que nous utilisons. &lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 : Contrôleur de vol (Evan Gury &amp;amp; Maxime Claudel)&lt;br /&gt;
&lt;br /&gt;
L'objectif ici est d'implémenter notre propre contrôleur de vol (software et hardware) à l'aide de composants individuels, principalement d'une centrale inertielle 3 axes ainsi que d'un accéléromètre 3 axes.&lt;br /&gt;
&lt;br /&gt;
===Nouveaux choix techniques===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
Pour réaliser la commande du drone, nous avons décidé d'utiliser une télécommande [https://fr.banggood.com/Flysky-FS-i6X-2_4GHz-10CH-AFHDS-2A-RC-Transmitter-With-X6B-i-BUS-Receiver-p-1090406.html?rmmds=myorder&amp;amp;ID=42482530817&amp;amp;cur_warehouse=CN '''Flysky FS-I6X'''] accompagnée de son récepteur '''FS-X6B''' qui possède une portée assez élevée pour la réalisation de notre projet. Ce récepteur sera alors relié à une carte '''Arduino UNO''' (qui servira également au contrôleur de vol).&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
Concernant la réalisation du contrôleur de vol, nous choisissons d'utiliser une centrale inertielle [https://fr.banggood.com/3pcs-6DOF-MPU-6050-3-Axis-Gyro-With-Accelerometer-Sensor-Controller-Module-For-Arduino-p-1430733.html?rmmds=search&amp;amp;cur_warehouse=CN '''MPU6050'''] possédant un accéléromètre 3 axes ainsi qu'un gyroscope 3 axes, ce qui convient parfaitement à l'utilisation que l'on veut en faire. De plus, c'est une centrale qui est documentée et à coût raisonnable, elle dispose de son propre processeur, ce qui réduit considérablement la quantité de calculs à effectuer par notre micro-contrôleur. Nous relierons également cette centrale inertielle à la carte '''Arduino UNO'''.&lt;br /&gt;
&lt;br /&gt;
'''Conception générale du drone :'''&lt;br /&gt;
&lt;br /&gt;
Comme évoqué précédemment, pour le coeur d'une drone, nous utiliserons une carte '''Arduino UNO''' qui possède un nombre suffisant de ports d'interruptions, de ports PWM et d'une puissance de calcul suffisante pour traiter toutes les informations des différents capteurs.&lt;br /&gt;
&lt;br /&gt;
Nous avons également décidé de fabriquer notre propre chassis basé sur le design du précédent et d'utiliser de nouveaux ESCs dédiés spécialement au drone volant ([https://fr.banggood.com/EMAX-BLHeli-Series-6A-12A-20A-30A-ESC-p-963634.html?rmmds=search&amp;amp;ID=45170&amp;amp;cur_warehouse=CN '''EMAX BLHELI SERIES 20A''']). Nous avons également choisi de nouveaux moteurs brushless : les [https://fr.banggood.com/1000KV-Brushless-Motor-3_17mm-Shaft-Electric-Motor-p-1102054.html?rmmds=search&amp;amp;cur_warehouse=CN '''A2212/13T'''].&lt;br /&gt;
&lt;br /&gt;
'''Bilan'''&lt;br /&gt;
*'''Matériel'''&lt;br /&gt;
**Chassis&lt;br /&gt;
**4 ESCs EMAX BLHELI 20A&lt;br /&gt;
**4 moteurs A2212/13T&lt;br /&gt;
**Batterie LI-PO 11,1V - 2700mAh&lt;br /&gt;
**Arduino UNO&lt;br /&gt;
**Télécommande Flysky FS-I6X&lt;br /&gt;
**Récepteur FS-X6B&lt;br /&gt;
**Centrale inertielle MPU6050&lt;br /&gt;
*'''Logiciel'''&lt;br /&gt;
**Arduino&lt;br /&gt;
&lt;br /&gt;
'''Note''' : grâce au travail d'Evan Gury, nous avons pu acquérir tout ce matériel et il a pu concevoir le chassis avant même le commencement du semestre 7, ce qui nous a permis de nous avancer sur le travail à réaliser.&lt;br /&gt;
&lt;br /&gt;
===Liste des tâches à effectuer===&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser la nouvelle gestion de la commande et l'initialisation, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Découverte télécommande Flysky FS-I6X et son récepteur FS-X6B&lt;br /&gt;
* Configurer la télécommande&lt;br /&gt;
* Lecture des joysticks par Arduino&lt;br /&gt;
* Initialiser les extremums des joysticks&lt;br /&gt;
* Optimisation de la programmation&lt;br /&gt;
* Test de transmission sur les ESCs&lt;br /&gt;
* Mise en œuvre sur notre drone&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser le contrôleur de vol, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Découverte du MPU6050&lt;br /&gt;
* Configuration des registres du MPU6050&lt;br /&gt;
* Récupération des mesures angulaires en °/s&lt;br /&gt;
* Intégration des mesures pour récupérer les positions en degrés&lt;br /&gt;
* Calcul de la consigne&lt;br /&gt;
* Calcul de l'erreur&lt;br /&gt;
* Calcul du correcteur&lt;br /&gt;
* Application de la correction aux ESCs&lt;br /&gt;
&lt;br /&gt;
===Semaine 45===&lt;br /&gt;
&lt;br /&gt;
[[Fichier: flyskyFSI6X.jpg|200px|right|thumb|Flysky FS-I6X et FS-X6B]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Lors de la première semaine, nous avons fait le choix d'utiliser un mode de transmission existant et d'abandonner la télécommande conçue au semestre précédent. Nous avons alors choisi d'utiliser la télécommande de modélisme Flysky FS-I6X et son récepteur FS-X6B. &lt;br /&gt;
&lt;br /&gt;
*Nous avons dû dans un premier temps configurer la télécommande et comprendre comment transmettre les informations des deux joysticks.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Nous avons passé la première séance à nous documenter le plus possible sur le MPU6050 qui est le cœur de notre contrôleur de vol.&lt;br /&gt;
*Nous avons ainsi pu trouver de nombreux documents concernant la configuration des différents registre du MPU6050, de manière à avoir une utilisation correspondant au mieux à un drone volant.&lt;br /&gt;
&lt;br /&gt;
===Semaine 46===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Pour la réception des informations et le traitement des données, nous avons branché le récepteur sur une carte Arduino. Deux choix s'offraient à nous, utiliser des broches PWM ou une broche PPM. Le PPM a pour avantage d'utiliser un unique câble, tous les canaux sont transmis à la suite contrairement au PWM, un câble est nécessaire à chaque canal. L'Arduino UNO ne nous limitant pas pour l'utilisation de 1 broche ou 4 broches, nous avons décider d'utiliser le PWM.&lt;br /&gt;
&lt;br /&gt;
*Nous avons programmé notre Arduino UNO afin de récupérer les informations sur nos canaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Nous avons passé tout notre temps à tenter de récuperer les coordonnées YAW-PITCH-ROLL du mpu6050 et ce de la manière la plus rapide possible afin d'optimiser au mieux la régulation.&lt;br /&gt;
&lt;br /&gt;
===Semaine 47===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Nous avons finalisé la conception de notre drone, nous avons finalisé le câblage et ainsi pu faire des tests sur le prototype.&lt;br /&gt;
&lt;br /&gt;
*Pour commander les moteurs, les ESCs sont nécessaires. L'utilisation est plutôt simple car ils s'utilisent comme des servomoteurs, ainsi la bibliothèque ''servo.h'' d'Arduino nous a permis de les initialiser et donc de faire tourner les moteurs.&lt;br /&gt;
&lt;br /&gt;
*Le projet avance vite et nous avons beaucoup d'ambition et d'idées pour la suite.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Même si le MPU6050 est très bien documenté nous avons passé de nombreuses heures a tenter de récupérer les coordonnées YAW, PITCH et ROLL pour notre drone mais sans succès. Le principal problème était que deux des trois MPUs que nous avions commandés sur Banggood ne marchaient pas correctement.&lt;br /&gt;
*Au final nous arrivons désormais à récupérer ces informations suffisamment vite pour pouvoir espérer effectuer une correction correcte.&lt;br /&gt;
&lt;br /&gt;
===Semaine 48===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Correction du calibrage des ESCs à travers l'Arduino.&lt;br /&gt;
*Début de la commande des moteurs grâce à notre télécommande Flysky. Cependant, nous avons rencontré quelques soucis dans notre programme, il nous faut alors revoir ce code Arduino pour réussir cette étape.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Mise en commun de la partie programmation Arduino avec l'équipe 1. &lt;br /&gt;
*Première prise de renseignements sur les GPS dans l'optique d'en utiliser un pour commander le drone s'il nous reste du temps en fin de projet.&lt;br /&gt;
&lt;br /&gt;
===Documents Rendus===&lt;br /&gt;
&lt;br /&gt;
Soutenance : [[fichier:soutenance_S7_P4.pdf]]&lt;br /&gt;
&lt;br /&gt;
==Projet S8==&lt;br /&gt;
&lt;br /&gt;
[[Fichier: pcb_drone_p4.png|400px|right|thumb|PCB réalisé sur Altium]]&lt;br /&gt;
&lt;br /&gt;
===Liste des tâches à effectuer===&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Après analyse du travail réalisé au S7, nous devons désormais réaliser les tâches suivantes :&lt;br /&gt;
*Conception d'un PCB (pour l'ensemble du système)&lt;br /&gt;
*Optimiser la distribution de la puissance (esthétiquement)&lt;br /&gt;
*Finition de la partie communication envoie/reception de trame validé&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Après analyse du travail réalisé au S7, nous devons désormais réaliser les tâches suivantes :&lt;br /&gt;
*Mise en place et réglage de la régulation PID: &lt;br /&gt;
**Calcul de la consigne  &lt;br /&gt;
**Calcul des erreurs  &lt;br /&gt;
**Calcul des consignes à appliquer aux moteurs après correction&lt;br /&gt;
**Application des consignes&lt;br /&gt;
&lt;br /&gt;
*Implémenter un système de guidage GPS (à voir avec le temps dont on disposera)&lt;br /&gt;
&lt;br /&gt;
===Semaine 3===&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Réflexion et réalisation du PCB sur ''Altium Designer''&lt;br /&gt;
*Mise en relation des différentes variables de notre programme avec celui de l'équipe 2&lt;br /&gt;
*Choix et commande d'un distributeur de puissance (PDB) pour câbler plus proprement les ESCs&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Finalisation du programme, y compris la partie régulation PID&lt;br /&gt;
*Reste encore à régler les coefficients du PID&lt;br /&gt;
*Mise en relation du programme avec l'équipe 1&lt;br /&gt;
&lt;br /&gt;
===Semaine 4===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
* Finition du PCB sur altium et création du même PCB sur Fritzing.&lt;br /&gt;
* Reprise de l'ancienne maquette pour effectuer la régulation&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Réalisation d'un programme Arduino permettant de lire la valeur de 3 potentiomètres afin de pouvoir régler les coefficients du PID.&lt;br /&gt;
*Mise en place d'une maquette à base de potentiomètres et d'interrupteurs pour régler le PID.&lt;br /&gt;
*Possibilité de faire fonctionner le drone en mode normal ou en mode réglage PID par simple utilisation d'un interrupteur.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5===&lt;br /&gt;
&lt;br /&gt;
[[Fichier: testregubar.mp4|350px|right|thumb|Essai de calibration sur deux axes avec le premier dispositif (drone fixé par le haut et le bas grâce à des câbles)]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Impression du PCB et branchement sur la maquette (2)&lt;br /&gt;
*Début des tests de régulation en mode suspendu (sans grande réussite pour le moment)&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Tests de régulation en mode suspendu (avec l'équipe 1)&lt;br /&gt;
*Début de conception d'un PCB permettant de fixer l'ensemble des composants (les nombreux fils commencent à devenir trop gênants pour les tests)&lt;br /&gt;
&lt;br /&gt;
===Semaine 6===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Modification du programme afin de détecter l'arrêt du microcontrôleur Atemega 328P. &lt;br /&gt;
* Resolution de l'erreur lié à la carte et au programme, suspicion de l'ISR mais le problème était du à un câble défectueux (Problème de maquette avec le MPU 6050).  &lt;br /&gt;
&lt;br /&gt;
[[Fichier: calibration-un-axe.mp4|250px|right|thumb|Essai de calibration sur un axe avec le deuxième dispositif]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Mise en place de support en PVC (voir photo) afin de ne laisser au drone qu'un seul degrés de liberté et ainsi permettre de le réguler plus facilement, suite à l'échec de la régulation suspendue.&lt;br /&gt;
*Problème sur un moteur ou un ESC de notre nouveau drone, un des moteurs ne tourne pas lorsque nous montons l'hélice dessus.&lt;br /&gt;
*Problème sur un moteur du nouveau drone qui se coupe totalement à une consigne bien précise et redémarre ensuite.&lt;br /&gt;
&lt;br /&gt;
[[Fichier: testesc.jpg|400px|center|thumb|Test des valeurs de courant reçues par les ESC]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 : coupure pédagogique===&lt;br /&gt;
&lt;br /&gt;
===Semaine 8===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 &amp;amp; 2 :'''&lt;br /&gt;
&lt;br /&gt;
* Lors de cette semaine, nous nous sommes penchés sur les problèmes physiques rencontrés précédemment. &lt;br /&gt;
Pour cela nous avons utilisé un oscilloscope équipé d'une sonde afin de relever les valeurs clés de tension et de courant.&lt;br /&gt;
Nous utilisons un programme qui envoie la même consigne aux 4 moteurs afin de comparer les vitesses de rotation.&lt;br /&gt;
Nous nous sommes aperçu que sur la maquette n°1, les 4 moteurs fonctionnent correctement mais qu'un ESC (Contrôleur moteur) est défaillant.&lt;br /&gt;
Sur la maquette n°2, un moteur et un ESC sont obsolètes. &lt;br /&gt;
Nous avons essayé de mixer les deux maquettes pour faire fonctionner un drone.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 &amp;amp; 2 :'''&lt;br /&gt;
&lt;br /&gt;
* Commande et attente des ESC pour finaliser la régulation.&lt;br /&gt;
* Création d'un boitier PID pour simplifier la régulation. Ce boiter va nous permettre de modifier facilement les valeurs des coefficients de notre PID numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Le boitier comporte 3 potentiomètres, un pour la valeur du I, un autre pour la valeur du P et le dernier pour la valeur du D.&lt;br /&gt;
*Les valeurs du PID varient entre des plages bien précises: P: I: D:&lt;br /&gt;
&lt;br /&gt;
===Semaine 10===&lt;br /&gt;
&lt;br /&gt;
Re-structuration du projet suite aux événements du COVID-19:&lt;br /&gt;
&lt;br /&gt;
* Régulation sur deux ESCs : Lukas (dispose de tout le matériel)&lt;br /&gt;
* Création application mobile, communication entre téléphone et le drone. (Richard et Evan)&lt;br /&gt;
* Simuler le drone en C. (Maxime)&lt;br /&gt;
&lt;br /&gt;
===Semaine 11===&lt;br /&gt;
&lt;br /&gt;
'''Régulation avec 2 ESCs (Lukas) :'''&lt;br /&gt;
&lt;br /&gt;
* Test du boîtier permettant le contrôle des différents coefficients du PID. En effet, lors de sa conception, un faux contact avait été constaté : problème résolu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Pid_controller_P4.jpg|300px|center|thumb|Boîtier de contrôle du PID]]&lt;br /&gt;
&lt;br /&gt;
'''Application mobile :'''&lt;br /&gt;
&lt;br /&gt;
* Début de l'apprentissage de la création d'une application Android à l'aide de ANDROID STUDIO&lt;br /&gt;
&lt;br /&gt;
===Semaine 12===&lt;br /&gt;
&lt;br /&gt;
[[Fichier: regulation_4_esc.mp4|300px|left|thumb|Régulation presque adaptée sur 4 ESCs]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Application mobile :'''&lt;br /&gt;
*Réalisation d'une application Android, sous Android Studio, permettant de simuler une commande afin de piloter le drone.&lt;br /&gt;
*Les joysticks envoient une consigne variant de 1000 à 2000 pour le throttle et les axes Yaw, Pitch, Roll, valeurs attendues par le drone afin de générer les signaux PWM pour les ESCs.&lt;br /&gt;
*L'interface de l'application est terminée, il reste désormais à programmer la partie concernant l'ESP-32.&lt;br /&gt;
[[Fichier: applicationAndroid.mp4|520px|center|thumb|Présentation de l'application]]&lt;br /&gt;
&lt;br /&gt;
'''Régulation avec 2 ESCs'''&lt;br /&gt;
*Test de régulation sur le banc d'essai avec les valeurs du PID testée sur les derniers tests à 4 ESCs : vidéo ci-contre&lt;br /&gt;
*Test du programme utilisant le boitier PID permettant de modifier nos valeurs en direct&lt;br /&gt;
&lt;br /&gt;
===Semaine 13===&lt;br /&gt;
&lt;br /&gt;
* Reception d'un ESP32 et debut de la programmation. Création d'un Serveur WIFI, il reste à faire communiquer l'application et l'ESP32.&lt;br /&gt;
&lt;br /&gt;
* Modification du code pour appliquer la régulation uniquement sur deux moteurs.&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 et 15 : coupure pédagogique===&lt;br /&gt;
&lt;br /&gt;
* Communication telephone-ESP32  fonctionnelle à partir d'un serveur WEB. Communication de l'application vers ESP32 impossible. Nous n'avons pas réussi à nous connecter à la socket créé sur l'esp32.&lt;br /&gt;
&lt;br /&gt;
* La communication entre l'application mobile et l'ESP32 est fonctionnelle, nous envoyons ainsi un message formé des consignes sur la socket.&lt;br /&gt;
&lt;br /&gt;
'''Régulation avec deux moteurs'''&lt;br /&gt;
&lt;br /&gt;
Après avoir constaté que la fonction compensateBatteryDrop (fonction permettant de prendre en compte la décharge de la batterie dans le calcul de la correction) était devenue obsolète en raison de l'ajout de notre PDB (Power Distributor Board), nous avons décidé de l'enlever de notre programme. Cependant la fonction est resté un certains temps dans notre programme, notamment pendant des tests, et nous pensions alors que la tension étant stable, cette fonction n’influençait pas sur le bon fonctionnement du programme. Cependant un pin était utilisé dans cette fonction pour récupérer la tension, et ayant laissé tombé cette fonction, nous avons aussi ignoré l'utilisation de ce pin et de ce fait nous avons faussait les calculs de correction. Finalement cette suppression nous a permis, de constater une nette amélioration de la régulation.&lt;br /&gt;
&lt;br /&gt;
Lukas a alors pu réguler le drone avec deux moteurs sur un axe (Roll). Cette régulation a été menée à bien et le drone se stabilise sur un axe. Malheureusement nous somme tombé à court de batterie (nous nous rechargions à Robotech) et nous ne disposons pas d'alimentation 12V pouvant supporter le courant demandé par les moteurs. Il reste donc encore l'axe pitch à réguler. Le roll est régulé avec les valeurs suivantes :&lt;br /&gt;
*kp Roll = 1.25  ki Roll = 0.05  kd Roll = 22.00&lt;br /&gt;
&lt;br /&gt;
L'objectif maintenant est, dès qu'on le pourra, après la fin du semestre de se réunir, d'installer les 4 nouveaux ESC et d'effectuer une régulation complète afin de finir complètement la conception de notre drone.&lt;br /&gt;
&lt;br /&gt;
===Documents Rendus===&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2018/2020_P4&amp;diff=84628</id>
		<title>IMA3/IMA4 2018/2020 P4</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2018/2020_P4&amp;diff=84628"/>
				<updated>2020-05-03T14:24:00Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Semaine 14 et 15 : coupure pédagogique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;include nopre noesc src=&amp;quot;/home/pedago/pimasc/include/video-ConstructionDroneIMA32018-iframe.html&amp;quot; /&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre du projet IMA3/4, nous avons choisi le sujet P4 : '''Construction d'un drone volant'''. Notre groupe se compose de Maxime CLAUDEL, Lukas FAUCHOIS, Evan GURY et Richard Simonin.&lt;br /&gt;
Nous avions dans un premier temps décidé de réaliser notre projet autour d'un drone servant à la livraison de petit colis, cependant dans un souci concernant la matériel mis à notre disposition et de budget, nous avons finalement opté pour un drone &amp;quot;loisir&amp;quot;.&lt;br /&gt;
Ce dernier sera destiné à un public amateur, dans un but d'apprentissage et/ou d'amusement et sera ainsi plus en adéquation avec nos contraintes et compétences, de plus amples informations sont décrites ci-dessous dans la partie '''Objectifs''' de notre présentation.&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
A terme, l'objectif principal de ce projet est de concevoir et construire entièrement un drone &amp;quot;made in Polytech Lille&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nous allons alors répartir notre travail en deux sessions, une première réalisée en IMA (S6) et une seconde en IMA4.&lt;br /&gt;
&lt;br /&gt;
Pour la fin de cette première session de projet, nous avons pour objectif de faire voler notre drone. Pour ce faire, nous n'avons évidemment pas le temps de nous occuper de la partie concernant le vol nous-mêmes, c'est pour quoi nous avons opté pour l'utilisation d'un contrôleur de vol n'ayant qu'à être configuré.&lt;br /&gt;
&lt;br /&gt;
Parallèlement à cela, nous comptons réaliser nous-mêmes la commande permettant de communiquer avec ce dernier pendant qu'une autre partie des membres du projet s’attellera à la partie mécanique et électrique du drone.&lt;br /&gt;
&lt;br /&gt;
Ce faisant et si tout se passe bien, nous pourrons avoir pour débuter l'année prochaine une base solide pour concevoir nous-mêmes notre contrôleur de vol. Ce qui nous amène à notre second point, puisque nous comptons dans un second temps réaliser notre propre contrôleur de vol, une fois le premier objectif atteint.&lt;br /&gt;
&lt;br /&gt;
=Analyse du projet=&lt;br /&gt;
&lt;br /&gt;
==Positionnement par rapport à l'existant==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:parrot.jpg|right|thumb|PARROT AR.DRONE 2.0]]&lt;br /&gt;
[[Fichier:udi.jpg|right|thumb|UDI U818S]]&lt;br /&gt;
&lt;br /&gt;
===Analyse du premier concurrent : PARROT AR.DRONE 2.0===&lt;br /&gt;
&lt;br /&gt;
Le [https://www.parrot.com/fr/drones/parrot-ardrone-20-elite-edition PARROT AR.DRONE 2.0], tout comme le notre, est destiné à un usage ludique. En dehors de la camera que nous n'envisageons pas d'intégrer à notre drone pour le moment, il dispose de toutes les caractéristiques que nous souhaiterions obtenir. A savoir une portée d'environ 100m, une autonomie de plus de 10min et une vitesse moyenne d'environ 20 km/h pour un prix avoisinant les 100 euros.&lt;br /&gt;
&lt;br /&gt;
Notre avantage peut se jouer sur la camera, en effet, en enlevant cette dernière nous pouvons réaliser des économies. De plus, si une personne recherche un drone simplement pour prendre du plaisir à le faire voler, il ne souhaitera pas forcément gaspiller son argent dans une camera qu'il n'aurait surement de base pas voulu.&lt;br /&gt;
&lt;br /&gt;
===Analyse du second concurrent : UDI U818S===&lt;br /&gt;
&lt;br /&gt;
Fabriqué par la marque UDI, le [https://www.maisondudrone.com/prod/udi-u818s-avec-camera-hd-2-0mp-blanc-1400.html UDI U818S] est un drone au caractéristiques similaires au précédent, à l'exception de la camera.&lt;br /&gt;
En effet, cette fois nous sommes face à un concurrent qui tout comme nous, propose simplement la fonctionnalité de base d'un drone, à savoir voler et cela se fait ressentir sur le prix puisque nous passons sur un prix d'environ 50 euros.&lt;br /&gt;
Face à un concurrent proposant un produit similaire au notre et à un prix au plus bas pour ces caractéristiques, difficile de faire mieux sur le plan technique. Peut être serait il alors plus judicieux de proposer un produit plus haute gamme, plus chère, mais destiné à un public désireux de s'amuser avec un produit de qualité.&lt;br /&gt;
&lt;br /&gt;
==Scénario d'usage du produit ou du concept envisagé==&lt;br /&gt;
&lt;br /&gt;
'''A qui notre drone peut-il servir ?'''&lt;br /&gt;
&lt;br /&gt;
Le drone &amp;quot;made in Polytech Lille&amp;quot; s'adresse à tout public n'ayant que pour objectif l'amusement''&lt;br /&gt;
&lt;br /&gt;
Toute personne souhaitant débuter avec un drone de qualité, sans s'encombrer de fonctionnalité ne s'avérant pas utiles peut être amenées a utiliser notre drone.&lt;br /&gt;
&lt;br /&gt;
'''Pour quel type d'utilisation ?'''&lt;br /&gt;
&lt;br /&gt;
Nombre de notre génération ont déjà reçu comme cadeau une voiture RC. Cette dernière n'avait que pour objectif de rouler à toute vitesse pour nous satisfaire. Nul besoin d'embarquer des caméras, stabilisateurs et nombres d'autres gadgets inutile à la vocation initiale de notre voiture, rouler. &lt;br /&gt;
&lt;br /&gt;
Avec notre drone, nous voulons remettre cela en avant, le simple plaisir de piloter une voiture RC appliqué aux drones. Alors enfant, adultes et nostalgiques pourront par le biais de notre produit découvrir ou redécouvrir le plaisir de piloter un engin motorisé, qui plus est cette-ci fois dans les airs.&lt;br /&gt;
&lt;br /&gt;
==Réponse à la question difficile==&lt;br /&gt;
&lt;br /&gt;
'''Qu'en est-il du dimensionnement des composants pour permettre à votre drone de porter une telle charge ?'''&lt;br /&gt;
&lt;br /&gt;
Nos contraintes et objectif ayant totalement changé, la question ne se pose plus vraiment. En effet nous avons suites à notre présentation réalisé des calculs en terme de puissance et nous nous sommes très vite rendu compte de l'impossibilité à réaliser notre projet.&lt;br /&gt;
&lt;br /&gt;
En effet, au vu de notre budget, l'achat d'un seul des quatre moteurs nécessaire à l'atteinte des chiffres que nous avions avancés était déjà impossible. Nous avons donc totalement changé d'objectif et avons récupéré du matériel déjà présent à Polytech, à savoir quatre moteurs et leur ESC. Nous avons pris le problème à l'envers et avons réfléchi à ce que nous pouvions réaliser avec le budget et le matériel à disposition.&lt;br /&gt;
&lt;br /&gt;
C'est de cette manière que nous avons eu l'idée d'un drone &amp;quot;loisir&amp;quot;, effaçant ainsi la question de la charge.&lt;br /&gt;
&lt;br /&gt;
==Bibliographie et webographie==&lt;br /&gt;
&lt;br /&gt;
===Arducopter===&lt;br /&gt;
&lt;br /&gt;
 https://www.digi.com/resources/documentation/digidocs/PDFs/90000976.pdf&lt;br /&gt;
 http://jeromeabel.net/wiki/xbee/xbee-arduino.pdf&lt;br /&gt;
 https://www.digi.com/resources/documentation/digidocs/pdfs/90001942-13.pdf&lt;br /&gt;
 https://www.arduino.cc/en/Reference/Servo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Manuel d'utilisation&lt;br /&gt;
 http://ardupilot.org/copter/index.html&lt;br /&gt;
&lt;br /&gt;
* Tutoriels vidéos&lt;br /&gt;
 Première installation et setup : https://www.youtube.com/watch?v=30cCs4aHdB0&amp;amp;t=754s&lt;br /&gt;
 Alimentation de l'Ardupilot : https://www.youtube.com/watch?v=TS4OWAcfAQY&amp;amp;t=270s&lt;br /&gt;
 Calibration des ESC : https://youtu.be/gYoknRObfOg&lt;br /&gt;
&lt;br /&gt;
=Préparation du projet=&lt;br /&gt;
&lt;br /&gt;
==Cahier des charges du groupe==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Diagramme bête à cornes'''&lt;br /&gt;
&lt;br /&gt;
Le diagramme bête à cornes nous permet de faire une analyse fonctionnelle du besoin. Notre drone permet à utilisateur de découvrir l'aéronautique à travers une activité ludique à l'aide d'une télécommande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bete_a_cornes.png | center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Diagramme en pieuvre'''&lt;br /&gt;
&lt;br /&gt;
Le diagramme en pieuvre permet quant à lui de répertorier toutes les fonctions (principales et de service) et d'analyser l'importance des besoins de notre projet&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pieuvredrone.png | center]]&lt;br /&gt;
&lt;br /&gt;
'''Tableau de fonctions'''&lt;br /&gt;
&lt;br /&gt;
Le tableau ci-dessous liste les fonctions principales (FP) et les fonctions contraintes (FC), dans l'orde d'importance, les accompagnant d'une petite description.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tableau_fonctions.jpeg | 500px | center]]&lt;br /&gt;
&lt;br /&gt;
==Cahier des charges des équipes==&lt;br /&gt;
===Equipe 1 : Gestion de la commande (Evan Gury et Richard Simonin)===&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie, est de créer une télécommande ainsi que le récepteur. Nous devons lire les valeurs des potentiomètres, créer des trames, envoyer les trames et analyser les trames reçus. Notre système doit être performant en matière de vitesse ainsi qu'en précision.&lt;br /&gt;
&lt;br /&gt;
===Equipe 2 : Contrôleur de vol (Maxime Claudel et Lukas Fauchois)===&lt;br /&gt;
&lt;br /&gt;
L'objectif de l'équipe est d'utiliser une carte de contrôle pouvant être liée à un logiciel de contrôle de vol. Etant donné notre projet, la carte doit respecter certaines contraintes : être adaptée à un drone à quatre hélices (quadcopter), fonctionner sur batterie (car positionnée sur le chassis du drone), être déjà programmée et relativement simple d'utilisation. Le logiciel doit quant à lui nous permettre de gérer le vol du drone et de calibrer les commandes.&lt;br /&gt;
&lt;br /&gt;
==Choix techniques : matériel et logiciel==&lt;br /&gt;
===Equipe 1===&lt;br /&gt;
&lt;br /&gt;
'''Émetteur'''&lt;br /&gt;
&lt;br /&gt;
Pour la réalisation de l'émetteur, nous avons choisi de travailler avec une Arduino ainsi que '''deux joysticks''' et un '''émetteur Xbee'''. Nous voulons une télécommande petite c'est pourquoi nous avons pris avec une '''Arduino NANO'''. Le drone a besoin de deux joysticks pour être dirigé selon 3 axes.&lt;br /&gt;
&lt;br /&gt;
'''Récepteur'''&lt;br /&gt;
&lt;br /&gt;
Pour la réalisation du récepteur, qui sera situé sur le drone nous avons commencé par utiliser une '''Arduino UNO''' mais nous souhaitons changer pour une NANO afin d'optimiser le poids ainsi que l'espace. Nous avons aussi besoin d'un '''récepteur Xbee''' afin de recevoir les trames.&lt;br /&gt;
&lt;br /&gt;
===Equipe 2===&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi pour notre carte de contrôle un '''Ardupilot 2.8''', son prix est raisonnable (une trentaine d'euros) et nous trouvons beaucoup de tutoriels l'utilisant sur YouTube.&lt;br /&gt;
&lt;br /&gt;
Pour le logiciel, deux choix relativement similaires s'offraient à nous : Mission Planner ou APM Planner. Les deux logiciels ont à peu près la même interface et permettent tous les deux d'effectuer les mêmes étapes de calibrage de l'Ardupilot et des commandes avant le premier vol.&lt;br /&gt;
&lt;br /&gt;
Nous avons d'abord commencé sur Mission Planner mais des problèmes de mises à jour du firmware de l'Ardupilot nous ont empêché de calibrer les '''ESC du drone'''. Nous sommes donc ensuite passés sur '''APM Planner''' car il permet d'éviter ce problème de mises à jour.&lt;br /&gt;
&lt;br /&gt;
===Bilan===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:materieldrone.jpg|right|thumb|Matériel nécessaire à la conception]]&lt;br /&gt;
&lt;br /&gt;
* '''Matériel''' :&lt;br /&gt;
**2 joysticks&lt;br /&gt;
**Emetteur Xbee&lt;br /&gt;
**Récepteur Xbee&lt;br /&gt;
**Arduino NANO&lt;br /&gt;
**Arduino UNO&lt;br /&gt;
**Ardupilot 2.8&lt;br /&gt;
**Câblage&lt;br /&gt;
&lt;br /&gt;
* '''Logiciels''' :&lt;br /&gt;
**Arduino&lt;br /&gt;
**Mission Planner&lt;br /&gt;
**APM Planner 2.0&lt;br /&gt;
&lt;br /&gt;
==Liste des tâches à effectuer==&lt;br /&gt;
===Equipe 1===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser la partie gestion de la commande, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Analyse du projet&lt;br /&gt;
* Découverte Xbee&lt;br /&gt;
* Prise en main Xbee&lt;br /&gt;
* Envoi de trames&lt;br /&gt;
* Réception de trames&lt;br /&gt;
* Optimisation de la programmation&lt;br /&gt;
* Test sur maquette&lt;br /&gt;
* Réalisation du PCB&lt;br /&gt;
* Mise en œuvre sur notre drone&lt;br /&gt;
&lt;br /&gt;
===Equipe 2===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser la partie contrôleur de vol, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Analyse du projet&lt;br /&gt;
* Choix d'une carte de contrôle&lt;br /&gt;
* Documentation, recherche d'un software&lt;br /&gt;
* Calibration de la carte&lt;br /&gt;
* Réalisation des branchements&lt;br /&gt;
* Mise en application sur la maquette&lt;br /&gt;
* Mise en relation avec la partie commande&lt;br /&gt;
&lt;br /&gt;
==Calendrier prévisionnel==&lt;br /&gt;
Nous avons décidé de réaliser un diagramme de GANTT pour chacun des calendriers prévisionnels (un par équipe). Sur chaque tâche, nous avions prévu un temps de travail en bleu dans les diagrammes et le temps réel consacré en jaune.&lt;br /&gt;
===Equipe 1 : Calendrier prévisionnel pour la gestion de la commande===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:equipe1cal.jpg|500px|center|&amp;quot;Calendrier de l'Equipe 1&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Equipe 2 : Calendrier prévisionnel pour le contrôleur de vol===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:equipe2cal.jpg|500px|center|&amp;quot;Calendrier de l'Equipe 2&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet S6==&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 et 6===&lt;br /&gt;
&lt;br /&gt;
Avant de scinder le groupe en deux équipes, nous avons passés les deux premières séances à évaluer les besoins de conception de notre projet pour pouvoir ensuite réaliser un cahier des charges et établir un calendrier prévisionnel des tâches à effectuer.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:xbeedrone.jpg|200px|thumb|Xbee]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Etant donné que nous avons décidé d'utiliser des modules XBee, nous avons consacrés cette semaine à la documentation, afin de comprendre comment configurer et utiliser ces derniers.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ardupilot28.jpeg|300px|right|thumb|Ardupilot 2.8]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Sur le principe de la semaine 7, nous nous sommes documentés sur les XBee afin de comprendre comment les configurer et les utiliser.&lt;br /&gt;
&lt;br /&gt;
Pour la configuration, nous avons retenu le logiciel XCTU qui est celui recommandé pour configurer les XBee. Cependant, nous gardons quand même de côté Legacy XCTU qui est l'ancienne version XCTU mais qui reste tout de même viable.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Nous avons consacré cette séance de documentation à la recherche d'une carte de contrôle de vol satisfaisant nos exigences. Nous cherchions donc une carte facilement connectable avec un Arduino Uno/Micro. Nous avons opté pour l'Ardupilot 2.8. Il comprend tout le nécessaire pour diriger un drone quadcopter, centrale gyroscopique, accéléromètres, interface de radiocommande. &lt;br /&gt;
Nous avons donc commandé l'Ardupilot via le site Alibaba.com (30€) et nous l'avons reçu trois semaines plus tard.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Après avoir effectués diverses recherches sur les modules XBee et effectué de nombreux tests (XCTU, legacy XCTU), nous avons abandonné l'utilisation du logiciel XCTU, étant donné que nous n'utilisons que deux XBee, nous pouvons les initialiser directement dans le programme avec le programme suivant:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:inixbeedrone.png]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
En attendant la réception du colis de l'Ardupilot, nous nous sommes documentés sur les différents logiciels de contrôle de vol à notre disposition. L'objectif étant de trouver un logiciel compatible avec l'Ardupilot 2.8 et avec suffisamment de documentation et tutoriels d'utilisation. Les deux logiciels qui sont ressortis le plus dans nos recherches sont Mission Planner et APM Planner 2. Ces deux logiciels sont très similaires au niveau de l'interface et des options de calibration de la carte de vol à laquelle ils sont connectés.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:apm20.png|300px|center]][[Fichier:missionplanner.jpg|300px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En connectant l'Ardupilot via un câble USB, le logiciel le reconnait et une démarche de calibration peut être entamée : boussole, accéléromètres, radiocommande, ESC.&lt;br /&gt;
&lt;br /&gt;
===Semaine 10===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur la transmission, la réception et le traitement des trames.&lt;br /&gt;
&lt;br /&gt;
Pour la transmission, nous avons mis en place le système suivant:&lt;br /&gt;
&lt;br /&gt;
*On lit la valeur des potentiomètres&lt;br /&gt;
*On convertit la valeur en une chaîne de caractère et on lui attribue un indice qui est propre à chaque position des joysticks.&lt;br /&gt;
*On envoie la chaîne de caractère par liaison série.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la réception, nous avons mis en place le système suivant:&lt;br /&gt;
&lt;br /&gt;
*On reçoit un tableau de caractère qui contient la consigne entre 0 et 1023 et un indice pour dire à quel joystick et quelle position la consigne correspond.&lt;br /&gt;
*On converti le tableau en entier et à l'aide de la fonction map on adapte la consigne pour qu'elle est une valeur entre 0 et 180.&lt;br /&gt;
*On transmet la consigne à l'ardupilot.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Idem semaine 9.&lt;br /&gt;
&lt;br /&gt;
===Semaine 11===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Débogage de la communication entre les modules XBee et l'ardupilot.&lt;br /&gt;
&lt;br /&gt;
En utilisant deux terminaux, la communication était réalisé entre les deux XBee  cependant une fois branché sur l'ardupilot nous avons eu des difficultés à traiter les trames, du au fait d'une transmission trop rapide.&lt;br /&gt;
&lt;br /&gt;
De plus nous avons passé un certains temps à vouloir utiliser une arduino micro mais avons finalement décidé de laisser tomber, puisque nous n'avons pas réussi à réceptionner les trames XBee.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Idem semaine 9.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Optimisation du format des trames et réglage de la vitesse de transmission.&lt;br /&gt;
&lt;br /&gt;
Passage d'une Arduino UNO à une Arduino Nano pour l'envoie des trames dans l'optique de réaliser un PCB pour la commande.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
A ce stade du projet nous ne pouvions qu'expérimenter les calibrations de la boussole et des accéléromètres de l'Ardupilot car la partie commande n'était pas terminée.&lt;br /&gt;
&lt;br /&gt;
La calibration de la boussole s'effectue en bougeant l'Ardupilot selon tous ces axes pendant une période de temps donnée jusqu'à ce que les informations nécessaires soient récoltées.&lt;br /&gt;
La calibration des accéléromètres s'effectue en positionnant l'Ardupilot dans des positions définies (sur le côté gauche, sur la face avant, etc.). (cliquer sur l'image ci-dessous pour lancer le GIF)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:compasscalib.gif|300px|center]][[Fichier:compasscalib.png|300px|center]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Réglage des trames pour la commande du prototype.&lt;br /&gt;
&lt;br /&gt;
Nous avons rencontré quelques problème de sensibilité au niveau des joysticks et du traitement du signal de commande transmis à l'ardupilot.&lt;br /&gt;
&lt;br /&gt;
En effet, ayant trouvé très peu de documentation sur l'ardupilot, nous avons eu du mal à générer les bons signaux de commande.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes ensuite consacrés à la partie alimentation de l'Ardupilot et du drone. En se documentant sur le site servant de manuel d'utilisation d'Ardupilot et des logiciels Mission Planner et APM Planner 2, nous avons trouvé que l'Ardupilot pouvait être alimenté via les ESC.&lt;br /&gt;
Une batterie LiPo alimente les ESC qui elles-mêmes alimentent l'Ardupilot via les broches Output. L'Ardupilot alimente ensuite l'Arduino qui réceptionne les trames reçues par le récepteur Xbee. Sur les sorties (Output) de l'Ardupilot sont aussi branchés les fils permettant la réception du signal envoyé aux moteurs.&lt;br /&gt;
Ainsi, tous les composants nécessaires au drone sont alimentés.&lt;br /&gt;
&lt;br /&gt;
===Semaine 14===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Conception du PCB pour la commande en essayant de limiter le plus possible les vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pcbdrone.png|400px|PCB]]&lt;br /&gt;
&lt;br /&gt;
Vérification de l'envoie des trames à l'aide de l'ordinateur et test de réception sur l'Ardupilot.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Branchements comme indiqués à la semaine précédente, alimentation et tests de bon fonctionnement des moteurs, Ardupilot et Arduino.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:branchementesc.jpg|300px]][[Fichier:branchementardu.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 15===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Fabrication de la manette&lt;br /&gt;
&lt;br /&gt;
[[Fichier:manettedrone.jpg|400px|PCB]]&lt;br /&gt;
&lt;br /&gt;
Modification de l'envoie des trames. Tests de transmission.&lt;br /&gt;
Implémentation du programme sur le prototype.&lt;br /&gt;
&lt;br /&gt;
Les deux équipes ont passé la semaine à réunir leur travail, nous avons ainsi tous pu réaliser de nombreux tests du prototype, avec réussite, hormis un léger accident qui à entraîné la destruction de deux hélices. &lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
A ce stade, la commande étant terminée et nous avons pu nous lier à l'équipe 1 pour mettre en relation la télécommande et l'Ardupilot. Après avoir utilisé Mission Planner pendant plusieurs semaines, un problème de mise-à-jour du software de l'Ardupilot nous empêchait toujours d'effectuer la calibration de la radiocommande. Nous sommes donc passés sur APM Planner 2 et la mise-à-jour n'était plus demandée, nous avons donc enfin pu terminer l'intégralité de la phase de calibration. Comme expliqué ci-dessus, nous avons effectué de nombreux tests pour atteindre notre objectif.&lt;br /&gt;
&lt;br /&gt;
===Documents Rendus===&lt;br /&gt;
&lt;br /&gt;
Rapport : [[fichier:rapport_groupe_4.pdf]]&lt;br /&gt;
&lt;br /&gt;
==Projet S7==&lt;br /&gt;
&lt;br /&gt;
===De nouveaux objectifs===&lt;br /&gt;
&lt;br /&gt;
Durant le semestre 6, nous avons réussi à concevoir un drone volant fonctionnel régulé à l'aide d'une carte de contrôle OpenSource '''Ardupilot 2.8'''. Concernant la commande, nous avions fait le choix d'utiliser une carte communication Xbee ainsi qu'une Arduino NANO et des joysticks.&lt;br /&gt;
&lt;br /&gt;
Cette année, nous avons décidé de développer plus amplement notre projet et de pratiquement repartir du point de départ. En effet, nos objectifs cette année sont :&lt;br /&gt;
*'''d'utiliser de nouveaux composants dont nous connaissons les propriétés (moteurs, ESCs, etc)'''&lt;br /&gt;
*'''d'utiliser une télécommande de modélisme ainsi qu'un récepteur adapté à des portées plus élevées que celles que permettait l'Xbee'''&lt;br /&gt;
*'''de concevoir notre propre contrôleur de vol'''&lt;br /&gt;
*'''Bonus''' : d'intégrer une régulation GPS et un mode automatique en cas de perte de signal&lt;br /&gt;
&lt;br /&gt;
===Reprise du cahier des charges===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 : Gestion de la commande et initialisation (Richard Simonin &amp;amp; Lukas Fauchois)'''&lt;br /&gt;
&lt;br /&gt;
L'objectif de la nouvelle gestion de la commande est d'utiliser une télécommande de modélisme capable de transmettre les différentes données nécessaires (Throttle, Yaw, Pitch) à un récepteur relié à une Arduino UNO, ce qui nous permettra d'être performant en terme de vitesse et de précision. De plus, cette partie de la conception consiste également à calibrer les quatre ESCs que nous utilisons. &lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 : Contrôleur de vol (Evan Gury &amp;amp; Maxime Claudel)&lt;br /&gt;
&lt;br /&gt;
L'objectif ici est d'implémenter notre propre contrôleur de vol (software et hardware) à l'aide de composants individuels, principalement d'une centrale inertielle 3 axes ainsi que d'un accéléromètre 3 axes.&lt;br /&gt;
&lt;br /&gt;
===Nouveaux choix techniques===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
Pour réaliser la commande du drone, nous avons décidé d'utiliser une télécommande [https://fr.banggood.com/Flysky-FS-i6X-2_4GHz-10CH-AFHDS-2A-RC-Transmitter-With-X6B-i-BUS-Receiver-p-1090406.html?rmmds=myorder&amp;amp;ID=42482530817&amp;amp;cur_warehouse=CN '''Flysky FS-I6X'''] accompagnée de son récepteur '''FS-X6B''' qui possède une portée assez élevée pour la réalisation de notre projet. Ce récepteur sera alors relié à une carte '''Arduino UNO''' (qui servira également au contrôleur de vol).&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
Concernant la réalisation du contrôleur de vol, nous choisissons d'utiliser une centrale inertielle [https://fr.banggood.com/3pcs-6DOF-MPU-6050-3-Axis-Gyro-With-Accelerometer-Sensor-Controller-Module-For-Arduino-p-1430733.html?rmmds=search&amp;amp;cur_warehouse=CN '''MPU6050'''] possédant un accéléromètre 3 axes ainsi qu'un gyroscope 3 axes, ce qui convient parfaitement à l'utilisation que l'on veut en faire. De plus, c'est une centrale qui est documentée et à coût raisonnable, elle dispose de son propre processeur, ce qui réduit considérablement la quantité de calculs à effectuer par notre micro-contrôleur. Nous relierons également cette centrale inertielle à la carte '''Arduino UNO'''.&lt;br /&gt;
&lt;br /&gt;
'''Conception générale du drone :'''&lt;br /&gt;
&lt;br /&gt;
Comme évoqué précédemment, pour le coeur d'une drone, nous utiliserons une carte '''Arduino UNO''' qui possède un nombre suffisant de ports d'interruptions, de ports PWM et d'une puissance de calcul suffisante pour traiter toutes les informations des différents capteurs.&lt;br /&gt;
&lt;br /&gt;
Nous avons également décidé de fabriquer notre propre chassis basé sur le design du précédent et d'utiliser de nouveaux ESCs dédiés spécialement au drone volant ([https://fr.banggood.com/EMAX-BLHeli-Series-6A-12A-20A-30A-ESC-p-963634.html?rmmds=search&amp;amp;ID=45170&amp;amp;cur_warehouse=CN '''EMAX BLHELI SERIES 20A''']). Nous avons également choisi de nouveaux moteurs brushless : les [https://fr.banggood.com/1000KV-Brushless-Motor-3_17mm-Shaft-Electric-Motor-p-1102054.html?rmmds=search&amp;amp;cur_warehouse=CN '''A2212/13T'''].&lt;br /&gt;
&lt;br /&gt;
'''Bilan'''&lt;br /&gt;
*'''Matériel'''&lt;br /&gt;
**Chassis&lt;br /&gt;
**4 ESCs EMAX BLHELI 20A&lt;br /&gt;
**4 moteurs A2212/13T&lt;br /&gt;
**Batterie LI-PO 11,1V - 2700mAh&lt;br /&gt;
**Arduino UNO&lt;br /&gt;
**Télécommande Flysky FS-I6X&lt;br /&gt;
**Récepteur FS-X6B&lt;br /&gt;
**Centrale inertielle MPU6050&lt;br /&gt;
*'''Logiciel'''&lt;br /&gt;
**Arduino&lt;br /&gt;
&lt;br /&gt;
'''Note''' : grâce au travail d'Evan Gury, nous avons pu acquérir tout ce matériel et il a pu concevoir le chassis avant même le commencement du semestre 7, ce qui nous a permis de nous avancer sur le travail à réaliser.&lt;br /&gt;
&lt;br /&gt;
===Liste des tâches à effectuer===&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser la nouvelle gestion de la commande et l'initialisation, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Découverte télécommande Flysky FS-I6X et son récepteur FS-X6B&lt;br /&gt;
* Configurer la télécommande&lt;br /&gt;
* Lecture des joysticks par Arduino&lt;br /&gt;
* Initialiser les extremums des joysticks&lt;br /&gt;
* Optimisation de la programmation&lt;br /&gt;
* Test de transmission sur les ESCs&lt;br /&gt;
* Mise en œuvre sur notre drone&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser le contrôleur de vol, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Découverte du MPU6050&lt;br /&gt;
* Configuration des registres du MPU6050&lt;br /&gt;
* Récupération des mesures angulaires en °/s&lt;br /&gt;
* Intégration des mesures pour récupérer les positions en degrés&lt;br /&gt;
* Calcul de la consigne&lt;br /&gt;
* Calcul de l'erreur&lt;br /&gt;
* Calcul du correcteur&lt;br /&gt;
* Application de la correction aux ESCs&lt;br /&gt;
&lt;br /&gt;
===Semaine 45===&lt;br /&gt;
&lt;br /&gt;
[[Fichier: flyskyFSI6X.jpg|200px|right|thumb|Flysky FS-I6X et FS-X6B]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Lors de la première semaine, nous avons fait le choix d'utiliser un mode de transmission existant et d'abandonner la télécommande conçue au semestre précédent. Nous avons alors choisi d'utiliser la télécommande de modélisme Flysky FS-I6X et son récepteur FS-X6B. &lt;br /&gt;
&lt;br /&gt;
*Nous avons dû dans un premier temps configurer la télécommande et comprendre comment transmettre les informations des deux joysticks.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Nous avons passé la première séance à nous documenter le plus possible sur le MPU6050 qui est le cœur de notre contrôleur de vol.&lt;br /&gt;
*Nous avons ainsi pu trouver de nombreux documents concernant la configuration des différents registre du MPU6050, de manière à avoir une utilisation correspondant au mieux à un drone volant.&lt;br /&gt;
&lt;br /&gt;
===Semaine 46===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Pour la réception des informations et le traitement des données, nous avons branché le récepteur sur une carte Arduino. Deux choix s'offraient à nous, utiliser des broches PWM ou une broche PPM. Le PPM a pour avantage d'utiliser un unique câble, tous les canaux sont transmis à la suite contrairement au PWM, un câble est nécessaire à chaque canal. L'Arduino UNO ne nous limitant pas pour l'utilisation de 1 broche ou 4 broches, nous avons décider d'utiliser le PWM.&lt;br /&gt;
&lt;br /&gt;
*Nous avons programmé notre Arduino UNO afin de récupérer les informations sur nos canaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Nous avons passé tout notre temps à tenter de récuperer les coordonnées YAW-PITCH-ROLL du mpu6050 et ce de la manière la plus rapide possible afin d'optimiser au mieux la régulation.&lt;br /&gt;
&lt;br /&gt;
===Semaine 47===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Nous avons finalisé la conception de notre drone, nous avons finalisé le câblage et ainsi pu faire des tests sur le prototype.&lt;br /&gt;
&lt;br /&gt;
*Pour commander les moteurs, les ESCs sont nécessaires. L'utilisation est plutôt simple car ils s'utilisent comme des servomoteurs, ainsi la bibliothèque ''servo.h'' d'Arduino nous a permis de les initialiser et donc de faire tourner les moteurs.&lt;br /&gt;
&lt;br /&gt;
*Le projet avance vite et nous avons beaucoup d'ambition et d'idées pour la suite.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Même si le MPU6050 est très bien documenté nous avons passé de nombreuses heures a tenter de récupérer les coordonnées YAW, PITCH et ROLL pour notre drone mais sans succès. Le principal problème était que deux des trois MPUs que nous avions commandés sur Banggood ne marchaient pas correctement.&lt;br /&gt;
*Au final nous arrivons désormais à récupérer ces informations suffisamment vite pour pouvoir espérer effectuer une correction correcte.&lt;br /&gt;
&lt;br /&gt;
===Semaine 48===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Correction du calibrage des ESCs à travers l'Arduino.&lt;br /&gt;
*Début de la commande des moteurs grâce à notre télécommande Flysky. Cependant, nous avons rencontré quelques soucis dans notre programme, il nous faut alors revoir ce code Arduino pour réussir cette étape.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Mise en commun de la partie programmation Arduino avec l'équipe 1. &lt;br /&gt;
*Première prise de renseignements sur les GPS dans l'optique d'en utiliser un pour commander le drone s'il nous reste du temps en fin de projet.&lt;br /&gt;
&lt;br /&gt;
===Documents Rendus===&lt;br /&gt;
&lt;br /&gt;
Soutenance : [[fichier:soutenance_S7_P4.pdf]]&lt;br /&gt;
&lt;br /&gt;
==Projet S8==&lt;br /&gt;
&lt;br /&gt;
[[Fichier: pcb_drone_p4.png|400px|right|thumb|PCB réalisé sur Altium]]&lt;br /&gt;
&lt;br /&gt;
===Liste des tâches à effectuer===&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Après analyse du travail réalisé au S7, nous devons désormais réaliser les tâches suivantes :&lt;br /&gt;
*Conception d'un PCB (pour l'ensemble du système)&lt;br /&gt;
*Optimiser la distribution de la puissance (esthétiquement)&lt;br /&gt;
*Finition de la partie communication envoie/reception de trame validé&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Après analyse du travail réalisé au S7, nous devons désormais réaliser les tâches suivantes :&lt;br /&gt;
*Mise en place et réglage de la régulation PID: &lt;br /&gt;
**Calcul de la consigne  &lt;br /&gt;
**Calcul des erreurs  &lt;br /&gt;
**Calcul des consignes à appliquer aux moteurs après correction&lt;br /&gt;
**Application des consignes&lt;br /&gt;
&lt;br /&gt;
*Implémenter un système de guidage GPS (à voir avec le temps dont on disposera)&lt;br /&gt;
&lt;br /&gt;
===Semaine 3===&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Réflexion et réalisation du PCB sur ''Altium Designer''&lt;br /&gt;
*Mise en relation des différentes variables de notre programme avec celui de l'équipe 2&lt;br /&gt;
*Choix et commande d'un distributeur de puissance (PDB) pour câbler plus proprement les ESCs&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Finalisation du programme, y compris la partie régulation PID&lt;br /&gt;
*Reste encore à régler les coefficients du PID&lt;br /&gt;
*Mise en relation du programme avec l'équipe 1&lt;br /&gt;
&lt;br /&gt;
===Semaine 4===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
* Finition du PCB sur altium et création du même PCB sur Fritzing.&lt;br /&gt;
* Reprise de l'ancienne maquette pour effectuer la régulation&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Réalisation d'un programme Arduino permettant de lire la valeur de 3 potentiomètres afin de pouvoir régler les coefficients du PID.&lt;br /&gt;
*Mise en place d'une maquette à base de potentiomètres et d'interrupteurs pour régler le PID.&lt;br /&gt;
*Possibilité de faire fonctionner le drone en mode normal ou en mode réglage PID par simple utilisation d'un interrupteur.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5===&lt;br /&gt;
&lt;br /&gt;
[[Fichier: testregubar.mp4|350px|right|thumb|Essai de calibration sur deux axes avec le premier dispositif (drone fixé par le haut et le bas grâce à des câbles)]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Impression du PCB et branchement sur la maquette (2)&lt;br /&gt;
*Début des tests de régulation en mode suspendu (sans grande réussite pour le moment)&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Tests de régulation en mode suspendu (avec l'équipe 1)&lt;br /&gt;
*Début de conception d'un PCB permettant de fixer l'ensemble des composants (les nombreux fils commencent à devenir trop gênants pour les tests)&lt;br /&gt;
&lt;br /&gt;
===Semaine 6===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Modification du programme afin de détecter l'arrêt du microcontrôleur Atemega 328P. &lt;br /&gt;
* Resolution de l'erreur lié à la carte et au programme, suspicion de l'ISR mais le problème était du à un câble défectueux (Problème de maquette avec le MPU 6050).  &lt;br /&gt;
&lt;br /&gt;
[[Fichier: calibration-un-axe.mp4|250px|right|thumb|Essai de calibration sur un axe avec le deuxième dispositif]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Mise en place de support en PVC (voir photo) afin de ne laisser au drone qu'un seul degrés de liberté et ainsi permettre de le réguler plus facilement, suite à l'échec de la régulation suspendue.&lt;br /&gt;
*Problème sur un moteur ou un ESC de notre nouveau drone, un des moteurs ne tourne pas lorsque nous montons l'hélice dessus.&lt;br /&gt;
*Problème sur un moteur du nouveau drone qui se coupe totalement à une consigne bien précise et redémarre ensuite.&lt;br /&gt;
&lt;br /&gt;
[[Fichier: testesc.jpg|400px|center|thumb|Test des valeurs de courant reçues par les ESC]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 : coupure pédagogique===&lt;br /&gt;
&lt;br /&gt;
===Semaine 8===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 &amp;amp; 2 :'''&lt;br /&gt;
&lt;br /&gt;
* Lors de cette semaine, nous nous sommes penchés sur les problèmes physiques rencontrés précédemment. &lt;br /&gt;
Pour cela nous avons utilisé un oscilloscope équipé d'une sonde afin de relever les valeurs clés de tension et de courant.&lt;br /&gt;
Nous utilisons un programme qui envoie la même consigne aux 4 moteurs afin de comparer les vitesses de rotation.&lt;br /&gt;
Nous nous sommes aperçu que sur la maquette n°1, les 4 moteurs fonctionnent correctement mais qu'un ESC (Contrôleur moteur) est défaillant.&lt;br /&gt;
Sur la maquette n°2, un moteur et un ESC sont obsolètes. &lt;br /&gt;
Nous avons essayé de mixer les deux maquettes pour faire fonctionner un drone.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 &amp;amp; 2 :'''&lt;br /&gt;
&lt;br /&gt;
* Commande et attente des ESC pour finaliser la régulation.&lt;br /&gt;
* Création d'un boitier PID pour simplifier la régulation. Ce boiter va nous permettre de modifier facilement les valeurs des coefficients de notre PID numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Le boitier comporte 3 potentiomètres, un pour la valeur du I, un autre pour la valeur du P et le dernier pour la valeur du D.&lt;br /&gt;
*Les valeurs du PID varient entre des plages bien précises: P: I: D:&lt;br /&gt;
&lt;br /&gt;
===Semaine 10===&lt;br /&gt;
&lt;br /&gt;
Re-structuration du projet suite aux événements du COVID-19:&lt;br /&gt;
&lt;br /&gt;
* Régulation sur deux ESCs : Lukas (dispose de tout le matériel)&lt;br /&gt;
* Création application mobile, communication entre téléphone et le drone. (Richard et Evan)&lt;br /&gt;
* Simuler le drone en C. (Maxime)&lt;br /&gt;
&lt;br /&gt;
===Semaine 11===&lt;br /&gt;
&lt;br /&gt;
'''Régulation avec 2 ESCs (Lukas) :'''&lt;br /&gt;
&lt;br /&gt;
* Test du boîtier permettant le contrôle des différents coefficients du PID. En effet, lors de sa conception, un faux contact avait été constaté : problème résolu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Pid_controller_P4.jpg|300px|center|thumb|Boîtier de contrôle du PID]]&lt;br /&gt;
&lt;br /&gt;
'''Application mobile :'''&lt;br /&gt;
&lt;br /&gt;
* Début de l'apprentissage de la création d'une application Android à l'aide de ANDROID STUDIO&lt;br /&gt;
&lt;br /&gt;
===Semaine 12===&lt;br /&gt;
&lt;br /&gt;
[[Fichier: regulation_4_esc.mp4|300px|left|thumb|Régulation presque adaptée sur 4 ESCs]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Application mobile :'''&lt;br /&gt;
*Réalisation d'une application Android, sous Android Studio, permettant de simuler une commande afin de piloter le drone.&lt;br /&gt;
*Les joysticks envoient une consigne variant de 1000 à 2000 pour le throttle et les axes Yaw, Pitch, Roll, valeurs attendues par le drone afin de générer les signaux PWM pour les ESCs.&lt;br /&gt;
*L'interface de l'application est terminée, il reste désormais à programmer la partie concernant l'ESP-32.&lt;br /&gt;
[[Fichier: applicationAndroid.mp4|520px|center|thumb|Présentation de l'application]]&lt;br /&gt;
&lt;br /&gt;
'''Régulation avec 2 ESCs'''&lt;br /&gt;
*Test de régulation sur le banc d'essai avec les valeurs du PID testée sur les derniers tests à 4 ESCs : vidéo ci-contre&lt;br /&gt;
*Test du programme utilisant le boitier PID permettant de modifier nos valeurs en direct&lt;br /&gt;
&lt;br /&gt;
===Semaine 13===&lt;br /&gt;
&lt;br /&gt;
* Reception d'un ESP32 et debut de la programmation. Création d'un Serveur WIFI, il reste à faire communiquer l'application et l'ESP32.&lt;br /&gt;
&lt;br /&gt;
* Modification du code pour réguler deux moteurs&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 et 15 : coupure pédagogique===&lt;br /&gt;
&lt;br /&gt;
* Communication telephone-ESP32  fonctionnelle à partir d'un serveur WEB. Communication de l'application vers ESP32 impossible. Nous n'avons pas réussi à nous connecter à la socket créé sur l'esp32.&lt;br /&gt;
&lt;br /&gt;
* La communication entre l'application mobile et l'ESP32 est fonctionnelle, nous envoyons ainsi un message formé des consignes sur la socket.&lt;br /&gt;
&lt;br /&gt;
'''Régulation avec deux moteurs'''&lt;br /&gt;
&lt;br /&gt;
Après avoir constaté que la fonction compensateBatteryDrop (fonction permettant de prendre en compte la décharge de la batterie dans le calcul de la correction) était devenue obsolète en raison de l'ajout de notre PDB (Power Distributor Board), nous avons décidé de l'enlever de notre programme. Cependant la fonction est resté un certains temps dans notre programme, notamment pendant des tests, et nous pensions alors que la tension étant stable, cette fonction n’influençait pas sur le bon fonctionnement du programme. Cependant un pin était utilisé dans cette fonction pour récupérer la tension, et ayant laissé tombé cette fonction, nous avons aussi ignoré l'utilisation de ce pin et de ce fait nous avons faussait les calculs de correction. Finalement cette suppression nous a permis, de constater une nette amélioration de la régulation.&lt;br /&gt;
&lt;br /&gt;
Lukas a alors pu réguler le drone avec deux moteurs sur un axe (Roll). Cette régulation a été menée à bien et le drone se stabilise sur un axe. Malheureusement nous somme tombé à court de batterie (nous nous rechargions à Robotech) et nous ne disposons pas d'alimentation 12V pouvant supporter le courant demandé par les moteurs. Il reste donc encore l'axe pitch à réguler. Le roll est régulé avec les valeurs suivantes :&lt;br /&gt;
*kp Roll = 1.25  ki Roll = 0.05  kd Roll = 22.00&lt;br /&gt;
&lt;br /&gt;
L'objectif maintenant est, dès qu'on le pourra, après la fin du semestre de se réunir, d'installer les 4 nouveaux ESC et d'effectuer une régulation complète afin de finir complètement la conception de notre drone.&lt;br /&gt;
&lt;br /&gt;
===Documents Rendus===&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2018/2020_P4&amp;diff=84623</id>
		<title>IMA3/IMA4 2018/2020 P4</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2018/2020_P4&amp;diff=84623"/>
				<updated>2020-05-03T14:02:26Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Semaine 9 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;include nopre noesc src=&amp;quot;/home/pedago/pimasc/include/video-ConstructionDroneIMA32018-iframe.html&amp;quot; /&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre du projet IMA3/4, nous avons choisi le sujet P4 : '''Construction d'un drone volant'''. Notre groupe se compose de Maxime CLAUDEL, Lukas FAUCHOIS, Evan GURY et Richard Simonin.&lt;br /&gt;
Nous avions dans un premier temps décidé de réaliser notre projet autour d'un drone servant à la livraison de petit colis, cependant dans un souci concernant la matériel mis à notre disposition et de budget, nous avons finalement opté pour un drone &amp;quot;loisir&amp;quot;.&lt;br /&gt;
Ce dernier sera destiné à un public amateur, dans un but d'apprentissage et/ou d'amusement et sera ainsi plus en adéquation avec nos contraintes et compétences, de plus amples informations sont décrites ci-dessous dans la partie '''Objectifs''' de notre présentation.&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
A terme, l'objectif principal de ce projet est de concevoir et construire entièrement un drone &amp;quot;made in Polytech Lille&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nous allons alors répartir notre travail en deux sessions, une première réalisée en IMA (S6) et une seconde en IMA4.&lt;br /&gt;
&lt;br /&gt;
Pour la fin de cette première session de projet, nous avons pour objectif de faire voler notre drone. Pour ce faire, nous n'avons évidemment pas le temps de nous occuper de la partie concernant le vol nous-mêmes, c'est pour quoi nous avons opté pour l'utilisation d'un contrôleur de vol n'ayant qu'à être configuré.&lt;br /&gt;
&lt;br /&gt;
Parallèlement à cela, nous comptons réaliser nous-mêmes la commande permettant de communiquer avec ce dernier pendant qu'une autre partie des membres du projet s’attellera à la partie mécanique et électrique du drone.&lt;br /&gt;
&lt;br /&gt;
Ce faisant et si tout se passe bien, nous pourrons avoir pour débuter l'année prochaine une base solide pour concevoir nous-mêmes notre contrôleur de vol. Ce qui nous amène à notre second point, puisque nous comptons dans un second temps réaliser notre propre contrôleur de vol, une fois le premier objectif atteint.&lt;br /&gt;
&lt;br /&gt;
=Analyse du projet=&lt;br /&gt;
&lt;br /&gt;
==Positionnement par rapport à l'existant==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:parrot.jpg|right|thumb|PARROT AR.DRONE 2.0]]&lt;br /&gt;
[[Fichier:udi.jpg|right|thumb|UDI U818S]]&lt;br /&gt;
&lt;br /&gt;
===Analyse du premier concurrent : PARROT AR.DRONE 2.0===&lt;br /&gt;
&lt;br /&gt;
Le [https://www.parrot.com/fr/drones/parrot-ardrone-20-elite-edition PARROT AR.DRONE 2.0], tout comme le notre, est destiné à un usage ludique. En dehors de la camera que nous n'envisageons pas d'intégrer à notre drone pour le moment, il dispose de toutes les caractéristiques que nous souhaiterions obtenir. A savoir une portée d'environ 100m, une autonomie de plus de 10min et une vitesse moyenne d'environ 20 km/h pour un prix avoisinant les 100 euros.&lt;br /&gt;
&lt;br /&gt;
Notre avantage peut se jouer sur la camera, en effet, en enlevant cette dernière nous pouvons réaliser des économies. De plus, si une personne recherche un drone simplement pour prendre du plaisir à le faire voler, il ne souhaitera pas forcément gaspiller son argent dans une camera qu'il n'aurait surement de base pas voulu.&lt;br /&gt;
&lt;br /&gt;
===Analyse du second concurrent : UDI U818S===&lt;br /&gt;
&lt;br /&gt;
Fabriqué par la marque UDI, le [https://www.maisondudrone.com/prod/udi-u818s-avec-camera-hd-2-0mp-blanc-1400.html UDI U818S] est un drone au caractéristiques similaires au précédent, à l'exception de la camera.&lt;br /&gt;
En effet, cette fois nous sommes face à un concurrent qui tout comme nous, propose simplement la fonctionnalité de base d'un drone, à savoir voler et cela se fait ressentir sur le prix puisque nous passons sur un prix d'environ 50 euros.&lt;br /&gt;
Face à un concurrent proposant un produit similaire au notre et à un prix au plus bas pour ces caractéristiques, difficile de faire mieux sur le plan technique. Peut être serait il alors plus judicieux de proposer un produit plus haute gamme, plus chère, mais destiné à un public désireux de s'amuser avec un produit de qualité.&lt;br /&gt;
&lt;br /&gt;
==Scénario d'usage du produit ou du concept envisagé==&lt;br /&gt;
&lt;br /&gt;
'''A qui notre drone peut-il servir ?'''&lt;br /&gt;
&lt;br /&gt;
Le drone &amp;quot;made in Polytech Lille&amp;quot; s'adresse à tout public n'ayant que pour objectif l'amusement''&lt;br /&gt;
&lt;br /&gt;
Toute personne souhaitant débuter avec un drone de qualité, sans s'encombrer de fonctionnalité ne s'avérant pas utiles peut être amenées a utiliser notre drone.&lt;br /&gt;
&lt;br /&gt;
'''Pour quel type d'utilisation ?'''&lt;br /&gt;
&lt;br /&gt;
Nombre de notre génération ont déjà reçu comme cadeau une voiture RC. Cette dernière n'avait que pour objectif de rouler à toute vitesse pour nous satisfaire. Nul besoin d'embarquer des caméras, stabilisateurs et nombres d'autres gadgets inutile à la vocation initiale de notre voiture, rouler. &lt;br /&gt;
&lt;br /&gt;
Avec notre drone, nous voulons remettre cela en avant, le simple plaisir de piloter une voiture RC appliqué aux drones. Alors enfant, adultes et nostalgiques pourront par le biais de notre produit découvrir ou redécouvrir le plaisir de piloter un engin motorisé, qui plus est cette-ci fois dans les airs.&lt;br /&gt;
&lt;br /&gt;
==Réponse à la question difficile==&lt;br /&gt;
&lt;br /&gt;
'''Qu'en est-il du dimensionnement des composants pour permettre à votre drone de porter une telle charge ?'''&lt;br /&gt;
&lt;br /&gt;
Nos contraintes et objectif ayant totalement changé, la question ne se pose plus vraiment. En effet nous avons suites à notre présentation réalisé des calculs en terme de puissance et nous nous sommes très vite rendu compte de l'impossibilité à réaliser notre projet.&lt;br /&gt;
&lt;br /&gt;
En effet, au vu de notre budget, l'achat d'un seul des quatre moteurs nécessaire à l'atteinte des chiffres que nous avions avancés était déjà impossible. Nous avons donc totalement changé d'objectif et avons récupéré du matériel déjà présent à Polytech, à savoir quatre moteurs et leur ESC. Nous avons pris le problème à l'envers et avons réfléchi à ce que nous pouvions réaliser avec le budget et le matériel à disposition.&lt;br /&gt;
&lt;br /&gt;
C'est de cette manière que nous avons eu l'idée d'un drone &amp;quot;loisir&amp;quot;, effaçant ainsi la question de la charge.&lt;br /&gt;
&lt;br /&gt;
==Bibliographie et webographie==&lt;br /&gt;
&lt;br /&gt;
===Arducopter===&lt;br /&gt;
&lt;br /&gt;
 https://www.digi.com/resources/documentation/digidocs/PDFs/90000976.pdf&lt;br /&gt;
 http://jeromeabel.net/wiki/xbee/xbee-arduino.pdf&lt;br /&gt;
 https://www.digi.com/resources/documentation/digidocs/pdfs/90001942-13.pdf&lt;br /&gt;
 https://www.arduino.cc/en/Reference/Servo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Manuel d'utilisation&lt;br /&gt;
 http://ardupilot.org/copter/index.html&lt;br /&gt;
&lt;br /&gt;
* Tutoriels vidéos&lt;br /&gt;
 Première installation et setup : https://www.youtube.com/watch?v=30cCs4aHdB0&amp;amp;t=754s&lt;br /&gt;
 Alimentation de l'Ardupilot : https://www.youtube.com/watch?v=TS4OWAcfAQY&amp;amp;t=270s&lt;br /&gt;
 Calibration des ESC : https://youtu.be/gYoknRObfOg&lt;br /&gt;
&lt;br /&gt;
=Préparation du projet=&lt;br /&gt;
&lt;br /&gt;
==Cahier des charges du groupe==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Diagramme bête à cornes'''&lt;br /&gt;
&lt;br /&gt;
Le diagramme bête à cornes nous permet de faire une analyse fonctionnelle du besoin. Notre drone permet à utilisateur de découvrir l'aéronautique à travers une activité ludique à l'aide d'une télécommande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bete_a_cornes.png | center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Diagramme en pieuvre'''&lt;br /&gt;
&lt;br /&gt;
Le diagramme en pieuvre permet quant à lui de répertorier toutes les fonctions (principales et de service) et d'analyser l'importance des besoins de notre projet&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pieuvredrone.png | center]]&lt;br /&gt;
&lt;br /&gt;
'''Tableau de fonctions'''&lt;br /&gt;
&lt;br /&gt;
Le tableau ci-dessous liste les fonctions principales (FP) et les fonctions contraintes (FC), dans l'orde d'importance, les accompagnant d'une petite description.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tableau_fonctions.jpeg | 500px | center]]&lt;br /&gt;
&lt;br /&gt;
==Cahier des charges des équipes==&lt;br /&gt;
===Equipe 1 : Gestion de la commande (Evan Gury et Richard Simonin)===&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie, est de créer une télécommande ainsi que le récepteur. Nous devons lire les valeurs des potentiomètres, créer des trames, envoyer les trames et analyser les trames reçus. Notre système doit être performant en matière de vitesse ainsi qu'en précision.&lt;br /&gt;
&lt;br /&gt;
===Equipe 2 : Contrôleur de vol (Maxime Claudel et Lukas Fauchois)===&lt;br /&gt;
&lt;br /&gt;
L'objectif de l'équipe est d'utiliser une carte de contrôle pouvant être liée à un logiciel de contrôle de vol. Etant donné notre projet, la carte doit respecter certaines contraintes : être adaptée à un drone à quatre hélices (quadcopter), fonctionner sur batterie (car positionnée sur le chassis du drone), être déjà programmée et relativement simple d'utilisation. Le logiciel doit quant à lui nous permettre de gérer le vol du drone et de calibrer les commandes.&lt;br /&gt;
&lt;br /&gt;
==Choix techniques : matériel et logiciel==&lt;br /&gt;
===Equipe 1===&lt;br /&gt;
&lt;br /&gt;
'''Émetteur'''&lt;br /&gt;
&lt;br /&gt;
Pour la réalisation de l'émetteur, nous avons choisi de travailler avec une Arduino ainsi que '''deux joysticks''' et un '''émetteur Xbee'''. Nous voulons une télécommande petite c'est pourquoi nous avons pris avec une '''Arduino NANO'''. Le drone a besoin de deux joysticks pour être dirigé selon 3 axes.&lt;br /&gt;
&lt;br /&gt;
'''Récepteur'''&lt;br /&gt;
&lt;br /&gt;
Pour la réalisation du récepteur, qui sera situé sur le drone nous avons commencé par utiliser une '''Arduino UNO''' mais nous souhaitons changer pour une NANO afin d'optimiser le poids ainsi que l'espace. Nous avons aussi besoin d'un '''récepteur Xbee''' afin de recevoir les trames.&lt;br /&gt;
&lt;br /&gt;
===Equipe 2===&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi pour notre carte de contrôle un '''Ardupilot 2.8''', son prix est raisonnable (une trentaine d'euros) et nous trouvons beaucoup de tutoriels l'utilisant sur YouTube.&lt;br /&gt;
&lt;br /&gt;
Pour le logiciel, deux choix relativement similaires s'offraient à nous : Mission Planner ou APM Planner. Les deux logiciels ont à peu près la même interface et permettent tous les deux d'effectuer les mêmes étapes de calibrage de l'Ardupilot et des commandes avant le premier vol.&lt;br /&gt;
&lt;br /&gt;
Nous avons d'abord commencé sur Mission Planner mais des problèmes de mises à jour du firmware de l'Ardupilot nous ont empêché de calibrer les '''ESC du drone'''. Nous sommes donc ensuite passés sur '''APM Planner''' car il permet d'éviter ce problème de mises à jour.&lt;br /&gt;
&lt;br /&gt;
===Bilan===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:materieldrone.jpg|right|thumb|Matériel nécessaire à la conception]]&lt;br /&gt;
&lt;br /&gt;
* '''Matériel''' :&lt;br /&gt;
**2 joysticks&lt;br /&gt;
**Emetteur Xbee&lt;br /&gt;
**Récepteur Xbee&lt;br /&gt;
**Arduino NANO&lt;br /&gt;
**Arduino UNO&lt;br /&gt;
**Ardupilot 2.8&lt;br /&gt;
**Câblage&lt;br /&gt;
&lt;br /&gt;
* '''Logiciels''' :&lt;br /&gt;
**Arduino&lt;br /&gt;
**Mission Planner&lt;br /&gt;
**APM Planner 2.0&lt;br /&gt;
&lt;br /&gt;
==Liste des tâches à effectuer==&lt;br /&gt;
===Equipe 1===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser la partie gestion de la commande, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Analyse du projet&lt;br /&gt;
* Découverte Xbee&lt;br /&gt;
* Prise en main Xbee&lt;br /&gt;
* Envoi de trames&lt;br /&gt;
* Réception de trames&lt;br /&gt;
* Optimisation de la programmation&lt;br /&gt;
* Test sur maquette&lt;br /&gt;
* Réalisation du PCB&lt;br /&gt;
* Mise en œuvre sur notre drone&lt;br /&gt;
&lt;br /&gt;
===Equipe 2===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser la partie contrôleur de vol, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Analyse du projet&lt;br /&gt;
* Choix d'une carte de contrôle&lt;br /&gt;
* Documentation, recherche d'un software&lt;br /&gt;
* Calibration de la carte&lt;br /&gt;
* Réalisation des branchements&lt;br /&gt;
* Mise en application sur la maquette&lt;br /&gt;
* Mise en relation avec la partie commande&lt;br /&gt;
&lt;br /&gt;
==Calendrier prévisionnel==&lt;br /&gt;
Nous avons décidé de réaliser un diagramme de GANTT pour chacun des calendriers prévisionnels (un par équipe). Sur chaque tâche, nous avions prévu un temps de travail en bleu dans les diagrammes et le temps réel consacré en jaune.&lt;br /&gt;
===Equipe 1 : Calendrier prévisionnel pour la gestion de la commande===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:equipe1cal.jpg|500px|center|&amp;quot;Calendrier de l'Equipe 1&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Equipe 2 : Calendrier prévisionnel pour le contrôleur de vol===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:equipe2cal.jpg|500px|center|&amp;quot;Calendrier de l'Equipe 2&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet S6==&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 et 6===&lt;br /&gt;
&lt;br /&gt;
Avant de scinder le groupe en deux équipes, nous avons passés les deux premières séances à évaluer les besoins de conception de notre projet pour pouvoir ensuite réaliser un cahier des charges et établir un calendrier prévisionnel des tâches à effectuer.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:xbeedrone.jpg|200px|thumb|Xbee]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Etant donné que nous avons décidé d'utiliser des modules XBee, nous avons consacrés cette semaine à la documentation, afin de comprendre comment configurer et utiliser ces derniers.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ardupilot28.jpeg|300px|right|thumb|Ardupilot 2.8]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Sur le principe de la semaine 7, nous nous sommes documentés sur les XBee afin de comprendre comment les configurer et les utiliser.&lt;br /&gt;
&lt;br /&gt;
Pour la configuration, nous avons retenu le logiciel XCTU qui est celui recommandé pour configurer les XBee. Cependant, nous gardons quand même de côté Legacy XCTU qui est l'ancienne version XCTU mais qui reste tout de même viable.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Nous avons consacré cette séance de documentation à la recherche d'une carte de contrôle de vol satisfaisant nos exigences. Nous cherchions donc une carte facilement connectable avec un Arduino Uno/Micro. Nous avons opté pour l'Ardupilot 2.8. Il comprend tout le nécessaire pour diriger un drone quadcopter, centrale gyroscopique, accéléromètres, interface de radiocommande. &lt;br /&gt;
Nous avons donc commandé l'Ardupilot via le site Alibaba.com (30€) et nous l'avons reçu trois semaines plus tard.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Après avoir effectués diverses recherches sur les modules XBee et effectué de nombreux tests (XCTU, legacy XCTU), nous avons abandonné l'utilisation du logiciel XCTU, étant donné que nous n'utilisons que deux XBee, nous pouvons les initialiser directement dans le programme avec le programme suivant:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:inixbeedrone.png]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
En attendant la réception du colis de l'Ardupilot, nous nous sommes documentés sur les différents logiciels de contrôle de vol à notre disposition. L'objectif étant de trouver un logiciel compatible avec l'Ardupilot 2.8 et avec suffisamment de documentation et tutoriels d'utilisation. Les deux logiciels qui sont ressortis le plus dans nos recherches sont Mission Planner et APM Planner 2. Ces deux logiciels sont très similaires au niveau de l'interface et des options de calibration de la carte de vol à laquelle ils sont connectés.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:apm20.png|300px|center]][[Fichier:missionplanner.jpg|300px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En connectant l'Ardupilot via un câble USB, le logiciel le reconnait et une démarche de calibration peut être entamée : boussole, accéléromètres, radiocommande, ESC.&lt;br /&gt;
&lt;br /&gt;
===Semaine 10===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur la transmission, la réception et le traitement des trames.&lt;br /&gt;
&lt;br /&gt;
Pour la transmission, nous avons mis en place le système suivant:&lt;br /&gt;
&lt;br /&gt;
*On lit la valeur des potentiomètres&lt;br /&gt;
*On convertit la valeur en une chaîne de caractère et on lui attribue un indice qui est propre à chaque position des joysticks.&lt;br /&gt;
*On envoie la chaîne de caractère par liaison série.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la réception, nous avons mis en place le système suivant:&lt;br /&gt;
&lt;br /&gt;
*On reçoit un tableau de caractère qui contient la consigne entre 0 et 1023 et un indice pour dire à quel joystick et quelle position la consigne correspond.&lt;br /&gt;
*On converti le tableau en entier et à l'aide de la fonction map on adapte la consigne pour qu'elle est une valeur entre 0 et 180.&lt;br /&gt;
*On transmet la consigne à l'ardupilot.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Idem semaine 9.&lt;br /&gt;
&lt;br /&gt;
===Semaine 11===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Débogage de la communication entre les modules XBee et l'ardupilot.&lt;br /&gt;
&lt;br /&gt;
En utilisant deux terminaux, la communication était réalisé entre les deux XBee  cependant une fois branché sur l'ardupilot nous avons eu des difficultés à traiter les trames, du au fait d'une transmission trop rapide.&lt;br /&gt;
&lt;br /&gt;
De plus nous avons passé un certains temps à vouloir utiliser une arduino micro mais avons finalement décidé de laisser tomber, puisque nous n'avons pas réussi à réceptionner les trames XBee.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Idem semaine 9.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Optimisation du format des trames et réglage de la vitesse de transmission.&lt;br /&gt;
&lt;br /&gt;
Passage d'une Arduino UNO à une Arduino Nano pour l'envoie des trames dans l'optique de réaliser un PCB pour la commande.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
A ce stade du projet nous ne pouvions qu'expérimenter les calibrations de la boussole et des accéléromètres de l'Ardupilot car la partie commande n'était pas terminée.&lt;br /&gt;
&lt;br /&gt;
La calibration de la boussole s'effectue en bougeant l'Ardupilot selon tous ces axes pendant une période de temps donnée jusqu'à ce que les informations nécessaires soient récoltées.&lt;br /&gt;
La calibration des accéléromètres s'effectue en positionnant l'Ardupilot dans des positions définies (sur le côté gauche, sur la face avant, etc.). (cliquer sur l'image ci-dessous pour lancer le GIF)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:compasscalib.gif|300px|center]][[Fichier:compasscalib.png|300px|center]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Réglage des trames pour la commande du prototype.&lt;br /&gt;
&lt;br /&gt;
Nous avons rencontré quelques problème de sensibilité au niveau des joysticks et du traitement du signal de commande transmis à l'ardupilot.&lt;br /&gt;
&lt;br /&gt;
En effet, ayant trouvé très peu de documentation sur l'ardupilot, nous avons eu du mal à générer les bons signaux de commande.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes ensuite consacrés à la partie alimentation de l'Ardupilot et du drone. En se documentant sur le site servant de manuel d'utilisation d'Ardupilot et des logiciels Mission Planner et APM Planner 2, nous avons trouvé que l'Ardupilot pouvait être alimenté via les ESC.&lt;br /&gt;
Une batterie LiPo alimente les ESC qui elles-mêmes alimentent l'Ardupilot via les broches Output. L'Ardupilot alimente ensuite l'Arduino qui réceptionne les trames reçues par le récepteur Xbee. Sur les sorties (Output) de l'Ardupilot sont aussi branchés les fils permettant la réception du signal envoyé aux moteurs.&lt;br /&gt;
Ainsi, tous les composants nécessaires au drone sont alimentés.&lt;br /&gt;
&lt;br /&gt;
===Semaine 14===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Conception du PCB pour la commande en essayant de limiter le plus possible les vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pcbdrone.png|400px|PCB]]&lt;br /&gt;
&lt;br /&gt;
Vérification de l'envoie des trames à l'aide de l'ordinateur et test de réception sur l'Ardupilot.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Branchements comme indiqués à la semaine précédente, alimentation et tests de bon fonctionnement des moteurs, Ardupilot et Arduino.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:branchementesc.jpg|300px]][[Fichier:branchementardu.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 15===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Fabrication de la manette&lt;br /&gt;
&lt;br /&gt;
[[Fichier:manettedrone.jpg|400px|PCB]]&lt;br /&gt;
&lt;br /&gt;
Modification de l'envoie des trames. Tests de transmission.&lt;br /&gt;
Implémentation du programme sur le prototype.&lt;br /&gt;
&lt;br /&gt;
Les deux équipes ont passé la semaine à réunir leur travail, nous avons ainsi tous pu réaliser de nombreux tests du prototype, avec réussite, hormis un léger accident qui à entraîné la destruction de deux hélices. &lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
A ce stade, la commande étant terminée et nous avons pu nous lier à l'équipe 1 pour mettre en relation la télécommande et l'Ardupilot. Après avoir utilisé Mission Planner pendant plusieurs semaines, un problème de mise-à-jour du software de l'Ardupilot nous empêchait toujours d'effectuer la calibration de la radiocommande. Nous sommes donc passés sur APM Planner 2 et la mise-à-jour n'était plus demandée, nous avons donc enfin pu terminer l'intégralité de la phase de calibration. Comme expliqué ci-dessus, nous avons effectué de nombreux tests pour atteindre notre objectif.&lt;br /&gt;
&lt;br /&gt;
===Documents Rendus===&lt;br /&gt;
&lt;br /&gt;
Rapport : [[fichier:rapport_groupe_4.pdf]]&lt;br /&gt;
&lt;br /&gt;
==Projet S7==&lt;br /&gt;
&lt;br /&gt;
===De nouveaux objectifs===&lt;br /&gt;
&lt;br /&gt;
Durant le semestre 6, nous avons réussi à concevoir un drone volant fonctionnel régulé à l'aide d'une carte de contrôle OpenSource '''Ardupilot 2.8'''. Concernant la commande, nous avions fait le choix d'utiliser une carte communication Xbee ainsi qu'une Arduino NANO et des joysticks.&lt;br /&gt;
&lt;br /&gt;
Cette année, nous avons décidé de développer plus amplement notre projet et de pratiquement repartir du point de départ. En effet, nos objectifs cette année sont :&lt;br /&gt;
*'''d'utiliser de nouveaux composants dont nous connaissons les propriétés (moteurs, ESCs, etc)'''&lt;br /&gt;
*'''d'utiliser une télécommande de modélisme ainsi qu'un récepteur adapté à des portées plus élevées que celles que permettait l'Xbee'''&lt;br /&gt;
*'''de concevoir notre propre contrôleur de vol'''&lt;br /&gt;
*'''Bonus''' : d'intégrer une régulation GPS et un mode automatique en cas de perte de signal&lt;br /&gt;
&lt;br /&gt;
===Reprise du cahier des charges===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 : Gestion de la commande et initialisation (Richard Simonin &amp;amp; Lukas Fauchois)'''&lt;br /&gt;
&lt;br /&gt;
L'objectif de la nouvelle gestion de la commande est d'utiliser une télécommande de modélisme capable de transmettre les différentes données nécessaires (Throttle, Yaw, Pitch) à un récepteur relié à une Arduino UNO, ce qui nous permettra d'être performant en terme de vitesse et de précision. De plus, cette partie de la conception consiste également à calibrer les quatre ESCs que nous utilisons. &lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 : Contrôleur de vol (Evan Gury &amp;amp; Maxime Claudel)&lt;br /&gt;
&lt;br /&gt;
L'objectif ici est d'implémenter notre propre contrôleur de vol (software et hardware) à l'aide de composants individuels, principalement d'une centrale inertielle 3 axes ainsi que d'un accéléromètre 3 axes.&lt;br /&gt;
&lt;br /&gt;
===Nouveaux choix techniques===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
Pour réaliser la commande du drone, nous avons décidé d'utiliser une télécommande [https://fr.banggood.com/Flysky-FS-i6X-2_4GHz-10CH-AFHDS-2A-RC-Transmitter-With-X6B-i-BUS-Receiver-p-1090406.html?rmmds=myorder&amp;amp;ID=42482530817&amp;amp;cur_warehouse=CN '''Flysky FS-I6X'''] accompagnée de son récepteur '''FS-X6B''' qui possède une portée assez élevée pour la réalisation de notre projet. Ce récepteur sera alors relié à une carte '''Arduino UNO''' (qui servira également au contrôleur de vol).&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
Concernant la réalisation du contrôleur de vol, nous choisissons d'utiliser une centrale inertielle [https://fr.banggood.com/3pcs-6DOF-MPU-6050-3-Axis-Gyro-With-Accelerometer-Sensor-Controller-Module-For-Arduino-p-1430733.html?rmmds=search&amp;amp;cur_warehouse=CN '''MPU6050'''] possédant un accéléromètre 3 axes ainsi qu'un gyroscope 3 axes, ce qui convient parfaitement à l'utilisation que l'on veut en faire. De plus, c'est une centrale qui est documentée et à coût raisonnable, elle dispose de son propre processeur, ce qui réduit considérablement la quantité de calculs à effectuer par notre micro-contrôleur. Nous relierons également cette centrale inertielle à la carte '''Arduino UNO'''.&lt;br /&gt;
&lt;br /&gt;
'''Conception générale du drone :'''&lt;br /&gt;
&lt;br /&gt;
Comme évoqué précédemment, pour le coeur d'une drone, nous utiliserons une carte '''Arduino UNO''' qui possède un nombre suffisant de ports d'interruptions, de ports PWM et d'une puissance de calcul suffisante pour traiter toutes les informations des différents capteurs.&lt;br /&gt;
&lt;br /&gt;
Nous avons également décidé de fabriquer notre propre chassis basé sur le design du précédent et d'utiliser de nouveaux ESCs dédiés spécialement au drone volant ([https://fr.banggood.com/EMAX-BLHeli-Series-6A-12A-20A-30A-ESC-p-963634.html?rmmds=search&amp;amp;ID=45170&amp;amp;cur_warehouse=CN '''EMAX BLHELI SERIES 20A''']). Nous avons également choisi de nouveaux moteurs brushless : les [https://fr.banggood.com/1000KV-Brushless-Motor-3_17mm-Shaft-Electric-Motor-p-1102054.html?rmmds=search&amp;amp;cur_warehouse=CN '''A2212/13T'''].&lt;br /&gt;
&lt;br /&gt;
'''Bilan'''&lt;br /&gt;
*'''Matériel'''&lt;br /&gt;
**Chassis&lt;br /&gt;
**4 ESCs EMAX BLHELI 20A&lt;br /&gt;
**4 moteurs A2212/13T&lt;br /&gt;
**Batterie LI-PO 11,1V - 2700mAh&lt;br /&gt;
**Arduino UNO&lt;br /&gt;
**Télécommande Flysky FS-I6X&lt;br /&gt;
**Récepteur FS-X6B&lt;br /&gt;
**Centrale inertielle MPU6050&lt;br /&gt;
*'''Logiciel'''&lt;br /&gt;
**Arduino&lt;br /&gt;
&lt;br /&gt;
'''Note''' : grâce au travail d'Evan Gury, nous avons pu acquérir tout ce matériel et il a pu concevoir le chassis avant même le commencement du semestre 7, ce qui nous a permis de nous avancer sur le travail à réaliser.&lt;br /&gt;
&lt;br /&gt;
===Liste des tâches à effectuer===&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser la nouvelle gestion de la commande et l'initialisation, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Découverte télécommande Flysky FS-I6X et son récepteur FS-X6B&lt;br /&gt;
* Configurer la télécommande&lt;br /&gt;
* Lecture des joysticks par Arduino&lt;br /&gt;
* Initialiser les extremums des joysticks&lt;br /&gt;
* Optimisation de la programmation&lt;br /&gt;
* Test de transmission sur les ESCs&lt;br /&gt;
* Mise en œuvre sur notre drone&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser le contrôleur de vol, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Découverte du MPU6050&lt;br /&gt;
* Configuration des registres du MPU6050&lt;br /&gt;
* Récupération des mesures angulaires en °/s&lt;br /&gt;
* Intégration des mesures pour récupérer les positions en degrés&lt;br /&gt;
* Calcul de la consigne&lt;br /&gt;
* Calcul de l'erreur&lt;br /&gt;
* Calcul du correcteur&lt;br /&gt;
* Application de la correction aux ESCs&lt;br /&gt;
&lt;br /&gt;
===Semaine 45===&lt;br /&gt;
&lt;br /&gt;
[[Fichier: flyskyFSI6X.jpg|200px|right|thumb|Flysky FS-I6X et FS-X6B]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Lors de la première semaine, nous avons fait le choix d'utiliser un mode de transmission existant et d'abandonner la télécommande conçue au semestre précédent. Nous avons alors choisi d'utiliser la télécommande de modélisme Flysky FS-I6X et son récepteur FS-X6B. &lt;br /&gt;
&lt;br /&gt;
*Nous avons dû dans un premier temps configurer la télécommande et comprendre comment transmettre les informations des deux joysticks.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Nous avons passé la première séance à nous documenter le plus possible sur le MPU6050 qui est le cœur de notre contrôleur de vol.&lt;br /&gt;
*Nous avons ainsi pu trouver de nombreux documents concernant la configuration des différents registre du MPU6050, de manière à avoir une utilisation correspondant au mieux à un drone volant.&lt;br /&gt;
&lt;br /&gt;
===Semaine 46===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Pour la réception des informations et le traitement des données, nous avons branché le récepteur sur une carte Arduino. Deux choix s'offraient à nous, utiliser des broches PWM ou une broche PPM. Le PPM a pour avantage d'utiliser un unique câble, tous les canaux sont transmis à la suite contrairement au PWM, un câble est nécessaire à chaque canal. L'Arduino UNO ne nous limitant pas pour l'utilisation de 1 broche ou 4 broches, nous avons décider d'utiliser le PWM.&lt;br /&gt;
&lt;br /&gt;
*Nous avons programmé notre Arduino UNO afin de récupérer les informations sur nos canaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Nous avons passé tout notre temps à tenter de récuperer les coordonnées YAW-PITCH-ROLL du mpu6050 et ce de la manière la plus rapide possible afin d'optimiser au mieux la régulation.&lt;br /&gt;
&lt;br /&gt;
===Semaine 47===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Nous avons finalisé la conception de notre drone, nous avons finalisé le câblage et ainsi pu faire des tests sur le prototype.&lt;br /&gt;
&lt;br /&gt;
*Pour commander les moteurs, les ESCs sont nécessaires. L'utilisation est plutôt simple car ils s'utilisent comme des servomoteurs, ainsi la bibliothèque ''servo.h'' d'Arduino nous a permis de les initialiser et donc de faire tourner les moteurs.&lt;br /&gt;
&lt;br /&gt;
*Le projet avance vite et nous avons beaucoup d'ambition et d'idées pour la suite.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Même si le MPU6050 est très bien documenté nous avons passé de nombreuses heures a tenter de récupérer les coordonnées YAW, PITCH et ROLL pour notre drone mais sans succès. Le principal problème était que deux des trois MPUs que nous avions commandés sur Banggood ne marchaient pas correctement.&lt;br /&gt;
*Au final nous arrivons désormais à récupérer ces informations suffisamment vite pour pouvoir espérer effectuer une correction correcte.&lt;br /&gt;
&lt;br /&gt;
===Semaine 48===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Correction du calibrage des ESCs à travers l'Arduino.&lt;br /&gt;
*Début de la commande des moteurs grâce à notre télécommande Flysky. Cependant, nous avons rencontré quelques soucis dans notre programme, il nous faut alors revoir ce code Arduino pour réussir cette étape.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Mise en commun de la partie programmation Arduino avec l'équipe 1. &lt;br /&gt;
*Première prise de renseignements sur les GPS dans l'optique d'en utiliser un pour commander le drone s'il nous reste du temps en fin de projet.&lt;br /&gt;
&lt;br /&gt;
===Documents Rendus===&lt;br /&gt;
&lt;br /&gt;
Soutenance : [[fichier:soutenance_S7_P4.pdf]]&lt;br /&gt;
&lt;br /&gt;
==Projet S8==&lt;br /&gt;
&lt;br /&gt;
[[Fichier: pcb_drone_p4.png|400px|right|thumb|PCB réalisé sur Altium]]&lt;br /&gt;
&lt;br /&gt;
===Liste des tâches à effectuer===&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Après analyse du travail réalisé au S7, nous devons désormais réaliser les tâches suivantes :&lt;br /&gt;
*Conception d'un PCB (pour l'ensemble du système)&lt;br /&gt;
*Optimiser la distribution de la puissance (esthétiquement)&lt;br /&gt;
*Finition de la partie communication envoie/reception de trame validé&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Après analyse du travail réalisé au S7, nous devons désormais réaliser les tâches suivantes :&lt;br /&gt;
*Mise en place et réglage de la régulation PID: &lt;br /&gt;
**Calcul de la consigne  &lt;br /&gt;
**Calcul des erreurs  &lt;br /&gt;
**Calcul des consignes à appliquer aux moteurs après correction&lt;br /&gt;
**Application des consignes&lt;br /&gt;
&lt;br /&gt;
*Implémenter un système de guidage GPS (à voir avec le temps dont on disposera)&lt;br /&gt;
&lt;br /&gt;
===Semaine 3===&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Réflexion et réalisation du PCB sur ''Altium Designer''&lt;br /&gt;
*Mise en relation des différentes variables de notre programme avec celui de l'équipe 2&lt;br /&gt;
*Choix et commande d'un distributeur de puissance (PDB) pour câbler plus proprement les ESCs&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Finalisation du programme, y compris la partie régulation PID&lt;br /&gt;
*Reste encore à régler les coefficients du PID&lt;br /&gt;
*Mise en relation du programme avec l'équipe 1&lt;br /&gt;
&lt;br /&gt;
===Semaine 4===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
* Finition du PCB sur altium et création du même PCB sur Fritzing.&lt;br /&gt;
* Reprise de l'ancienne maquette pour effectuer la régulation&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Réalisation d'un programme Arduino permettant de lire la valeur de 3 potentiomètres afin de pouvoir régler les coefficients du PID.&lt;br /&gt;
*Mise en place d'une maquette à base de potentiomètres et d'interrupteurs pour régler le PID.&lt;br /&gt;
*Possibilité de faire fonctionner le drone en mode normal ou en mode réglage PID par simple utilisation d'un interrupteur.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5===&lt;br /&gt;
&lt;br /&gt;
[[Fichier: testregubar.mp4|350px|right|thumb|Essai de calibration sur deux axes avec le premier dispositif (drone fixé par le haut et le bas grâce à des câbles)]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Impression du PCB et branchement sur la maquette (2)&lt;br /&gt;
*Début des tests de régulation en mode suspendu (sans grande réussite pour le moment)&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Tests de régulation en mode suspendu (avec l'équipe 1)&lt;br /&gt;
*Début de conception d'un PCB permettant de fixer l'ensemble des composants (les nombreux fils commencent à devenir trop gênants pour les tests)&lt;br /&gt;
&lt;br /&gt;
===Semaine 6===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Modification du programme afin de détecter l'arrêt du microcontrôleur Atemega 328P. &lt;br /&gt;
* Resolution de l'erreur lié à la carte et au programme, suspicion de l'ISR mais le problème était du à un câble défectueux (Problème de maquette avec le MPU 6050).  &lt;br /&gt;
&lt;br /&gt;
[[Fichier: calibration-un-axe.mp4|250px|right|thumb|Essai de calibration sur un axe avec le deuxième dispositif]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Mise en place de support en PVC (voir photo) afin de ne laisser au drone qu'un seul degrés de liberté et ainsi permettre de le réguler plus facilement, suite à l'échec de la régulation suspendue.&lt;br /&gt;
*Problème sur un moteur ou un ESC de notre nouveau drone, un des moteurs ne tourne pas lorsque nous montons l'hélice dessus.&lt;br /&gt;
*Problème sur un moteur du nouveau drone qui se coupe totalement à une consigne bien précise et redémarre ensuite.&lt;br /&gt;
&lt;br /&gt;
[[Fichier: testesc.jpg|400px|center|thumb|Test des valeurs de courant reçues par les ESC]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 : coupure pédagogique===&lt;br /&gt;
&lt;br /&gt;
===Semaine 8===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 &amp;amp; 2 :'''&lt;br /&gt;
&lt;br /&gt;
* Lors de cette semaine, nous nous sommes penchés sur les problèmes physiques rencontrés précédemment. &lt;br /&gt;
Pour cela nous avons utilisé un oscilloscope équipé d'une sonde afin de relever les valeurs clés de tension et de courant.&lt;br /&gt;
Nous utilisons un programme qui envoie la même consigne aux 4 moteurs afin de comparer les vitesses de rotation.&lt;br /&gt;
Nous nous sommes aperçu que sur la maquette n°1, les 4 moteurs fonctionnent correctement mais qu'un ESC (Contrôleur moteur) est défaillant.&lt;br /&gt;
Sur la maquette n°2, un moteur et un ESC sont obsolètes. &lt;br /&gt;
Nous avons essayé de mixer les deux maquettes pour faire fonctionner un drone.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 &amp;amp; 2 :'''&lt;br /&gt;
&lt;br /&gt;
* Commande et attente des ESC pour finaliser la régulation.&lt;br /&gt;
* Création d'un boitier PID pour simplifier la régulation. Ce boiter va nous permettre de modifier facilement les valeurs des coefficients de notre PID numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Le boitier comporte 3 potentiomètres, un pour la valeur du I, un autre pour la valeur du P et le dernier pour la valeur du D.&lt;br /&gt;
*Les valeurs du PID varient entre des plages bien précises: P: I: D:&lt;br /&gt;
&lt;br /&gt;
===Semaine 10===&lt;br /&gt;
&lt;br /&gt;
Re-structuration du projet suite aux événements du COVID-19:&lt;br /&gt;
&lt;br /&gt;
* Régulation sur deux ESCs : Lukas (dispose de tout le matériel)&lt;br /&gt;
* Création application mobile, communication entre téléphone et le drone. (Richard et Evan)&lt;br /&gt;
* Simuler le drone en C. (Maxime)&lt;br /&gt;
&lt;br /&gt;
===Semaine 11===&lt;br /&gt;
&lt;br /&gt;
'''Régulation avec 2 ESCs (Lukas) :'''&lt;br /&gt;
&lt;br /&gt;
* Test du boîtier permettant le contrôle des différents coefficients du PID. En effet, lors de sa conception, un faux contact avait été constaté : problème résolu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Pid_controller_P4.jpg|300px|center|thumb|Boîtier de contrôle du PID]]&lt;br /&gt;
&lt;br /&gt;
'''Application mobile :'''&lt;br /&gt;
&lt;br /&gt;
* Début de l'apprentissage de la création d'une application Android à l'aide de ANDROID STUDIO&lt;br /&gt;
&lt;br /&gt;
===Semaine 12===&lt;br /&gt;
&lt;br /&gt;
[[Fichier: regulation_4_esc.mp4|300px|left|thumb|Régulation presque adaptée sur 4 ESCs]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Application mobile :'''&lt;br /&gt;
*Réalisation d'une application Android, sous Android Studio, permettant de simuler une commande afin de piloter le drone.&lt;br /&gt;
*Les joysticks envoient une consigne variant de 1000 à 2000 pour le throttle et les axes Yaw, Pitch, Roll, valeurs attendues par le drone afin de générer les signaux PWM pour les ESCs.&lt;br /&gt;
*L'interface de l'application est terminée, il reste désormais à programmer la partie concernant l'ESP-32.&lt;br /&gt;
[[Fichier: applicationAndroid.mp4|520px|center|thumb|Présentation de l'application]]&lt;br /&gt;
&lt;br /&gt;
'''Régulation avec 2 ESCs'''&lt;br /&gt;
*Test de régulation sur le banc d'essai avec les valeurs du PID testée sur les derniers tests à 4 ESCs : vidéo ci-contre&lt;br /&gt;
*Test du programme utilisant le boitier PID permettant de modifier nos valeurs en direct&lt;br /&gt;
&lt;br /&gt;
===Semaine 13===&lt;br /&gt;
&lt;br /&gt;
* Reception d'un ESP32 et debut de la programmation. Création d'un Serveur WIFI, il reste à faire communiquer l'application et l'ESP32.&lt;br /&gt;
&lt;br /&gt;
* Modification du code pour réguler deux moteurs&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 et 15 : coupure pédagogique===&lt;br /&gt;
&lt;br /&gt;
* Communication telephone-ESP32  fonctionnelle à partir d'un serveur WEB. Communication de l'application vers ESP32 impossible. Nous n'avons pas réussi à nous connecter à la socket créé sur l'esp32.&lt;br /&gt;
&lt;br /&gt;
* La communication entre l'application mobile et l'ESP32 est fonctionnelle, nous envoyons ainsi un message formé des consignes sur la socket.&lt;br /&gt;
&lt;br /&gt;
'''Régulation avec deux moteurs'''&lt;br /&gt;
&lt;br /&gt;
Après avoir constaté que la fonction compensateBatteryDrop() était devenue obsolète en raison de l'ajout de notre PDB (Power Distributor Board), nous avons décidé de l'enlever de notre boucle (void loop()) améliorer les performances de notre programme. De plus, un pin était utilisé et faussait les calculs. Cette suppression nous a permis, effectivement, de constater une nette amélioration dans la gestion de la régulation.&lt;br /&gt;
&lt;br /&gt;
Lukas a alors pu réguler le drone avec deux moteurs sur un axe (Roll). Cette régulation a été menée à bien et le drone se stabilise sur un axe jusqu'à ce que nous soyons à court de batterie (nous nous rechargions à Robotech) avec les valeurs suivantes :&lt;br /&gt;
*kp Roll = 1.25  ki Roll = 0.05  kd Roll = 22.00&lt;br /&gt;
&lt;br /&gt;
L'objectif maintenant est, dès qu'on le pourra, après la fin du semestre de se réunir, d'installer les 4 nouveaux ESC et d'effectuer une régulation complète afin de finir complètement la conception de notre drone.&lt;br /&gt;
&lt;br /&gt;
===Documents Rendus===&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2018/2020_P4&amp;diff=84622</id>
		<title>IMA3/IMA4 2018/2020 P4</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2018/2020_P4&amp;diff=84622"/>
				<updated>2020-05-03T14:01:17Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Semaine 9 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;include nopre noesc src=&amp;quot;/home/pedago/pimasc/include/video-ConstructionDroneIMA32018-iframe.html&amp;quot; /&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre du projet IMA3/4, nous avons choisi le sujet P4 : '''Construction d'un drone volant'''. Notre groupe se compose de Maxime CLAUDEL, Lukas FAUCHOIS, Evan GURY et Richard Simonin.&lt;br /&gt;
Nous avions dans un premier temps décidé de réaliser notre projet autour d'un drone servant à la livraison de petit colis, cependant dans un souci concernant la matériel mis à notre disposition et de budget, nous avons finalement opté pour un drone &amp;quot;loisir&amp;quot;.&lt;br /&gt;
Ce dernier sera destiné à un public amateur, dans un but d'apprentissage et/ou d'amusement et sera ainsi plus en adéquation avec nos contraintes et compétences, de plus amples informations sont décrites ci-dessous dans la partie '''Objectifs''' de notre présentation.&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
A terme, l'objectif principal de ce projet est de concevoir et construire entièrement un drone &amp;quot;made in Polytech Lille&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nous allons alors répartir notre travail en deux sessions, une première réalisée en IMA (S6) et une seconde en IMA4.&lt;br /&gt;
&lt;br /&gt;
Pour la fin de cette première session de projet, nous avons pour objectif de faire voler notre drone. Pour ce faire, nous n'avons évidemment pas le temps de nous occuper de la partie concernant le vol nous-mêmes, c'est pour quoi nous avons opté pour l'utilisation d'un contrôleur de vol n'ayant qu'à être configuré.&lt;br /&gt;
&lt;br /&gt;
Parallèlement à cela, nous comptons réaliser nous-mêmes la commande permettant de communiquer avec ce dernier pendant qu'une autre partie des membres du projet s’attellera à la partie mécanique et électrique du drone.&lt;br /&gt;
&lt;br /&gt;
Ce faisant et si tout se passe bien, nous pourrons avoir pour débuter l'année prochaine une base solide pour concevoir nous-mêmes notre contrôleur de vol. Ce qui nous amène à notre second point, puisque nous comptons dans un second temps réaliser notre propre contrôleur de vol, une fois le premier objectif atteint.&lt;br /&gt;
&lt;br /&gt;
=Analyse du projet=&lt;br /&gt;
&lt;br /&gt;
==Positionnement par rapport à l'existant==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:parrot.jpg|right|thumb|PARROT AR.DRONE 2.0]]&lt;br /&gt;
[[Fichier:udi.jpg|right|thumb|UDI U818S]]&lt;br /&gt;
&lt;br /&gt;
===Analyse du premier concurrent : PARROT AR.DRONE 2.0===&lt;br /&gt;
&lt;br /&gt;
Le [https://www.parrot.com/fr/drones/parrot-ardrone-20-elite-edition PARROT AR.DRONE 2.0], tout comme le notre, est destiné à un usage ludique. En dehors de la camera que nous n'envisageons pas d'intégrer à notre drone pour le moment, il dispose de toutes les caractéristiques que nous souhaiterions obtenir. A savoir une portée d'environ 100m, une autonomie de plus de 10min et une vitesse moyenne d'environ 20 km/h pour un prix avoisinant les 100 euros.&lt;br /&gt;
&lt;br /&gt;
Notre avantage peut se jouer sur la camera, en effet, en enlevant cette dernière nous pouvons réaliser des économies. De plus, si une personne recherche un drone simplement pour prendre du plaisir à le faire voler, il ne souhaitera pas forcément gaspiller son argent dans une camera qu'il n'aurait surement de base pas voulu.&lt;br /&gt;
&lt;br /&gt;
===Analyse du second concurrent : UDI U818S===&lt;br /&gt;
&lt;br /&gt;
Fabriqué par la marque UDI, le [https://www.maisondudrone.com/prod/udi-u818s-avec-camera-hd-2-0mp-blanc-1400.html UDI U818S] est un drone au caractéristiques similaires au précédent, à l'exception de la camera.&lt;br /&gt;
En effet, cette fois nous sommes face à un concurrent qui tout comme nous, propose simplement la fonctionnalité de base d'un drone, à savoir voler et cela se fait ressentir sur le prix puisque nous passons sur un prix d'environ 50 euros.&lt;br /&gt;
Face à un concurrent proposant un produit similaire au notre et à un prix au plus bas pour ces caractéristiques, difficile de faire mieux sur le plan technique. Peut être serait il alors plus judicieux de proposer un produit plus haute gamme, plus chère, mais destiné à un public désireux de s'amuser avec un produit de qualité.&lt;br /&gt;
&lt;br /&gt;
==Scénario d'usage du produit ou du concept envisagé==&lt;br /&gt;
&lt;br /&gt;
'''A qui notre drone peut-il servir ?'''&lt;br /&gt;
&lt;br /&gt;
Le drone &amp;quot;made in Polytech Lille&amp;quot; s'adresse à tout public n'ayant que pour objectif l'amusement''&lt;br /&gt;
&lt;br /&gt;
Toute personne souhaitant débuter avec un drone de qualité, sans s'encombrer de fonctionnalité ne s'avérant pas utiles peut être amenées a utiliser notre drone.&lt;br /&gt;
&lt;br /&gt;
'''Pour quel type d'utilisation ?'''&lt;br /&gt;
&lt;br /&gt;
Nombre de notre génération ont déjà reçu comme cadeau une voiture RC. Cette dernière n'avait que pour objectif de rouler à toute vitesse pour nous satisfaire. Nul besoin d'embarquer des caméras, stabilisateurs et nombres d'autres gadgets inutile à la vocation initiale de notre voiture, rouler. &lt;br /&gt;
&lt;br /&gt;
Avec notre drone, nous voulons remettre cela en avant, le simple plaisir de piloter une voiture RC appliqué aux drones. Alors enfant, adultes et nostalgiques pourront par le biais de notre produit découvrir ou redécouvrir le plaisir de piloter un engin motorisé, qui plus est cette-ci fois dans les airs.&lt;br /&gt;
&lt;br /&gt;
==Réponse à la question difficile==&lt;br /&gt;
&lt;br /&gt;
'''Qu'en est-il du dimensionnement des composants pour permettre à votre drone de porter une telle charge ?'''&lt;br /&gt;
&lt;br /&gt;
Nos contraintes et objectif ayant totalement changé, la question ne se pose plus vraiment. En effet nous avons suites à notre présentation réalisé des calculs en terme de puissance et nous nous sommes très vite rendu compte de l'impossibilité à réaliser notre projet.&lt;br /&gt;
&lt;br /&gt;
En effet, au vu de notre budget, l'achat d'un seul des quatre moteurs nécessaire à l'atteinte des chiffres que nous avions avancés était déjà impossible. Nous avons donc totalement changé d'objectif et avons récupéré du matériel déjà présent à Polytech, à savoir quatre moteurs et leur ESC. Nous avons pris le problème à l'envers et avons réfléchi à ce que nous pouvions réaliser avec le budget et le matériel à disposition.&lt;br /&gt;
&lt;br /&gt;
C'est de cette manière que nous avons eu l'idée d'un drone &amp;quot;loisir&amp;quot;, effaçant ainsi la question de la charge.&lt;br /&gt;
&lt;br /&gt;
==Bibliographie et webographie==&lt;br /&gt;
&lt;br /&gt;
===Arducopter===&lt;br /&gt;
&lt;br /&gt;
 https://www.digi.com/resources/documentation/digidocs/PDFs/90000976.pdf&lt;br /&gt;
 http://jeromeabel.net/wiki/xbee/xbee-arduino.pdf&lt;br /&gt;
 https://www.digi.com/resources/documentation/digidocs/pdfs/90001942-13.pdf&lt;br /&gt;
 https://www.arduino.cc/en/Reference/Servo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Manuel d'utilisation&lt;br /&gt;
 http://ardupilot.org/copter/index.html&lt;br /&gt;
&lt;br /&gt;
* Tutoriels vidéos&lt;br /&gt;
 Première installation et setup : https://www.youtube.com/watch?v=30cCs4aHdB0&amp;amp;t=754s&lt;br /&gt;
 Alimentation de l'Ardupilot : https://www.youtube.com/watch?v=TS4OWAcfAQY&amp;amp;t=270s&lt;br /&gt;
 Calibration des ESC : https://youtu.be/gYoknRObfOg&lt;br /&gt;
&lt;br /&gt;
=Préparation du projet=&lt;br /&gt;
&lt;br /&gt;
==Cahier des charges du groupe==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Diagramme bête à cornes'''&lt;br /&gt;
&lt;br /&gt;
Le diagramme bête à cornes nous permet de faire une analyse fonctionnelle du besoin. Notre drone permet à utilisateur de découvrir l'aéronautique à travers une activité ludique à l'aide d'une télécommande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bete_a_cornes.png | center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Diagramme en pieuvre'''&lt;br /&gt;
&lt;br /&gt;
Le diagramme en pieuvre permet quant à lui de répertorier toutes les fonctions (principales et de service) et d'analyser l'importance des besoins de notre projet&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pieuvredrone.png | center]]&lt;br /&gt;
&lt;br /&gt;
'''Tableau de fonctions'''&lt;br /&gt;
&lt;br /&gt;
Le tableau ci-dessous liste les fonctions principales (FP) et les fonctions contraintes (FC), dans l'orde d'importance, les accompagnant d'une petite description.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tableau_fonctions.jpeg | 500px | center]]&lt;br /&gt;
&lt;br /&gt;
==Cahier des charges des équipes==&lt;br /&gt;
===Equipe 1 : Gestion de la commande (Evan Gury et Richard Simonin)===&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie, est de créer une télécommande ainsi que le récepteur. Nous devons lire les valeurs des potentiomètres, créer des trames, envoyer les trames et analyser les trames reçus. Notre système doit être performant en matière de vitesse ainsi qu'en précision.&lt;br /&gt;
&lt;br /&gt;
===Equipe 2 : Contrôleur de vol (Maxime Claudel et Lukas Fauchois)===&lt;br /&gt;
&lt;br /&gt;
L'objectif de l'équipe est d'utiliser une carte de contrôle pouvant être liée à un logiciel de contrôle de vol. Etant donné notre projet, la carte doit respecter certaines contraintes : être adaptée à un drone à quatre hélices (quadcopter), fonctionner sur batterie (car positionnée sur le chassis du drone), être déjà programmée et relativement simple d'utilisation. Le logiciel doit quant à lui nous permettre de gérer le vol du drone et de calibrer les commandes.&lt;br /&gt;
&lt;br /&gt;
==Choix techniques : matériel et logiciel==&lt;br /&gt;
===Equipe 1===&lt;br /&gt;
&lt;br /&gt;
'''Émetteur'''&lt;br /&gt;
&lt;br /&gt;
Pour la réalisation de l'émetteur, nous avons choisi de travailler avec une Arduino ainsi que '''deux joysticks''' et un '''émetteur Xbee'''. Nous voulons une télécommande petite c'est pourquoi nous avons pris avec une '''Arduino NANO'''. Le drone a besoin de deux joysticks pour être dirigé selon 3 axes.&lt;br /&gt;
&lt;br /&gt;
'''Récepteur'''&lt;br /&gt;
&lt;br /&gt;
Pour la réalisation du récepteur, qui sera situé sur le drone nous avons commencé par utiliser une '''Arduino UNO''' mais nous souhaitons changer pour une NANO afin d'optimiser le poids ainsi que l'espace. Nous avons aussi besoin d'un '''récepteur Xbee''' afin de recevoir les trames.&lt;br /&gt;
&lt;br /&gt;
===Equipe 2===&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi pour notre carte de contrôle un '''Ardupilot 2.8''', son prix est raisonnable (une trentaine d'euros) et nous trouvons beaucoup de tutoriels l'utilisant sur YouTube.&lt;br /&gt;
&lt;br /&gt;
Pour le logiciel, deux choix relativement similaires s'offraient à nous : Mission Planner ou APM Planner. Les deux logiciels ont à peu près la même interface et permettent tous les deux d'effectuer les mêmes étapes de calibrage de l'Ardupilot et des commandes avant le premier vol.&lt;br /&gt;
&lt;br /&gt;
Nous avons d'abord commencé sur Mission Planner mais des problèmes de mises à jour du firmware de l'Ardupilot nous ont empêché de calibrer les '''ESC du drone'''. Nous sommes donc ensuite passés sur '''APM Planner''' car il permet d'éviter ce problème de mises à jour.&lt;br /&gt;
&lt;br /&gt;
===Bilan===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:materieldrone.jpg|right|thumb|Matériel nécessaire à la conception]]&lt;br /&gt;
&lt;br /&gt;
* '''Matériel''' :&lt;br /&gt;
**2 joysticks&lt;br /&gt;
**Emetteur Xbee&lt;br /&gt;
**Récepteur Xbee&lt;br /&gt;
**Arduino NANO&lt;br /&gt;
**Arduino UNO&lt;br /&gt;
**Ardupilot 2.8&lt;br /&gt;
**Câblage&lt;br /&gt;
&lt;br /&gt;
* '''Logiciels''' :&lt;br /&gt;
**Arduino&lt;br /&gt;
**Mission Planner&lt;br /&gt;
**APM Planner 2.0&lt;br /&gt;
&lt;br /&gt;
==Liste des tâches à effectuer==&lt;br /&gt;
===Equipe 1===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser la partie gestion de la commande, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Analyse du projet&lt;br /&gt;
* Découverte Xbee&lt;br /&gt;
* Prise en main Xbee&lt;br /&gt;
* Envoi de trames&lt;br /&gt;
* Réception de trames&lt;br /&gt;
* Optimisation de la programmation&lt;br /&gt;
* Test sur maquette&lt;br /&gt;
* Réalisation du PCB&lt;br /&gt;
* Mise en œuvre sur notre drone&lt;br /&gt;
&lt;br /&gt;
===Equipe 2===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser la partie contrôleur de vol, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Analyse du projet&lt;br /&gt;
* Choix d'une carte de contrôle&lt;br /&gt;
* Documentation, recherche d'un software&lt;br /&gt;
* Calibration de la carte&lt;br /&gt;
* Réalisation des branchements&lt;br /&gt;
* Mise en application sur la maquette&lt;br /&gt;
* Mise en relation avec la partie commande&lt;br /&gt;
&lt;br /&gt;
==Calendrier prévisionnel==&lt;br /&gt;
Nous avons décidé de réaliser un diagramme de GANTT pour chacun des calendriers prévisionnels (un par équipe). Sur chaque tâche, nous avions prévu un temps de travail en bleu dans les diagrammes et le temps réel consacré en jaune.&lt;br /&gt;
===Equipe 1 : Calendrier prévisionnel pour la gestion de la commande===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:equipe1cal.jpg|500px|center|&amp;quot;Calendrier de l'Equipe 1&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Equipe 2 : Calendrier prévisionnel pour le contrôleur de vol===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:equipe2cal.jpg|500px|center|&amp;quot;Calendrier de l'Equipe 2&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet S6==&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 et 6===&lt;br /&gt;
&lt;br /&gt;
Avant de scinder le groupe en deux équipes, nous avons passés les deux premières séances à évaluer les besoins de conception de notre projet pour pouvoir ensuite réaliser un cahier des charges et établir un calendrier prévisionnel des tâches à effectuer.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:xbeedrone.jpg|200px|thumb|Xbee]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Etant donné que nous avons décidé d'utiliser des modules XBee, nous avons consacrés cette semaine à la documentation, afin de comprendre comment configurer et utiliser ces derniers.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ardupilot28.jpeg|300px|right|thumb|Ardupilot 2.8]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Sur le principe de la semaine 7, nous nous sommes documentés sur les XBee afin de comprendre comment les configurer et les utiliser.&lt;br /&gt;
&lt;br /&gt;
Pour la configuration, nous avons retenu le logiciel XCTU qui est celui recommandé pour configurer les XBee. Cependant, nous gardons quand même de côté Legacy XCTU qui est l'ancienne version XCTU mais qui reste tout de même viable.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Nous avons consacré cette séance de documentation à la recherche d'une carte de contrôle de vol satisfaisant nos exigences. Nous cherchions donc une carte facilement connectable avec un Arduino Uno/Micro. Nous avons opté pour l'Ardupilot 2.8. Il comprend tout le nécessaire pour diriger un drone quadcopter, centrale gyroscopique, accéléromètres, interface de radiocommande. &lt;br /&gt;
Nous avons donc commandé l'Ardupilot via le site Alibaba.com (30€) et nous l'avons reçu trois semaines plus tard.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Après avoir effectués diverses recherches sur les modules XBee et effectué de nombreux tests (XCTU, legacy XCTU), nous avons abandonné l'utilisation du logiciel XCTU, étant donné que nous n'utilisons que deux XBee, nous pouvons les initialiser directement dans le programme avec le programme suivant:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:inixbeedrone.png]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
En attendant la réception du colis de l'Ardupilot, nous nous sommes documentés sur les différents logiciels de contrôle de vol à notre disposition. L'objectif étant de trouver un logiciel compatible avec l'Ardupilot 2.8 et avec suffisamment de documentation et tutoriels d'utilisation. Les deux logiciels qui sont ressortis le plus dans nos recherches sont Mission Planner et APM Planner 2. Ces deux logiciels sont très similaires au niveau de l'interface et des options de calibration de la carte de vol à laquelle ils sont connectés.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:apm20.png|300px|center]][[Fichier:missionplanner.jpg|300px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En connectant l'Ardupilot via un câble USB, le logiciel le reconnait et une démarche de calibration peut être entamée : boussole, accéléromètres, radiocommande, ESC.&lt;br /&gt;
&lt;br /&gt;
===Semaine 10===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur la transmission, la réception et le traitement des trames.&lt;br /&gt;
&lt;br /&gt;
Pour la transmission, nous avons mis en place le système suivant:&lt;br /&gt;
&lt;br /&gt;
*On lit la valeur des potentiomètres&lt;br /&gt;
*On convertit la valeur en une chaîne de caractère et on lui attribue un indice qui est propre à chaque position des joysticks.&lt;br /&gt;
*On envoie la chaîne de caractère par liaison série.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la réception, nous avons mis en place le système suivant:&lt;br /&gt;
&lt;br /&gt;
*On reçoit un tableau de caractère qui contient la consigne entre 0 et 1023 et un indice pour dire à quel joystick et quelle position la consigne correspond.&lt;br /&gt;
*On converti le tableau en entier et à l'aide de la fonction map on adapte la consigne pour qu'elle est une valeur entre 0 et 180.&lt;br /&gt;
*On transmet la consigne à l'ardupilot.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Idem semaine 9.&lt;br /&gt;
&lt;br /&gt;
===Semaine 11===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Débogage de la communication entre les modules XBee et l'ardupilot.&lt;br /&gt;
&lt;br /&gt;
En utilisant deux terminaux, la communication était réalisé entre les deux XBee  cependant une fois branché sur l'ardupilot nous avons eu des difficultés à traiter les trames, du au fait d'une transmission trop rapide.&lt;br /&gt;
&lt;br /&gt;
De plus nous avons passé un certains temps à vouloir utiliser une arduino micro mais avons finalement décidé de laisser tomber, puisque nous n'avons pas réussi à réceptionner les trames XBee.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Idem semaine 9.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Optimisation du format des trames et réglage de la vitesse de transmission.&lt;br /&gt;
&lt;br /&gt;
Passage d'une Arduino UNO à une Arduino Nano pour l'envoie des trames dans l'optique de réaliser un PCB pour la commande.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
A ce stade du projet nous ne pouvions qu'expérimenter les calibrations de la boussole et des accéléromètres de l'Ardupilot car la partie commande n'était pas terminée.&lt;br /&gt;
&lt;br /&gt;
La calibration de la boussole s'effectue en bougeant l'Ardupilot selon tous ces axes pendant une période de temps donnée jusqu'à ce que les informations nécessaires soient récoltées.&lt;br /&gt;
La calibration des accéléromètres s'effectue en positionnant l'Ardupilot dans des positions définies (sur le côté gauche, sur la face avant, etc.). (cliquer sur l'image ci-dessous pour lancer le GIF)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:compasscalib.gif|300px|center]][[Fichier:compasscalib.png|300px|center]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Réglage des trames pour la commande du prototype.&lt;br /&gt;
&lt;br /&gt;
Nous avons rencontré quelques problème de sensibilité au niveau des joysticks et du traitement du signal de commande transmis à l'ardupilot.&lt;br /&gt;
&lt;br /&gt;
En effet, ayant trouvé très peu de documentation sur l'ardupilot, nous avons eu du mal à générer les bons signaux de commande.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes ensuite consacrés à la partie alimentation de l'Ardupilot et du drone. En se documentant sur le site servant de manuel d'utilisation d'Ardupilot et des logiciels Mission Planner et APM Planner 2, nous avons trouvé que l'Ardupilot pouvait être alimenté via les ESC.&lt;br /&gt;
Une batterie LiPo alimente les ESC qui elles-mêmes alimentent l'Ardupilot via les broches Output. L'Ardupilot alimente ensuite l'Arduino qui réceptionne les trames reçues par le récepteur Xbee. Sur les sorties (Output) de l'Ardupilot sont aussi branchés les fils permettant la réception du signal envoyé aux moteurs.&lt;br /&gt;
Ainsi, tous les composants nécessaires au drone sont alimentés.&lt;br /&gt;
&lt;br /&gt;
===Semaine 14===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Conception du PCB pour la commande en essayant de limiter le plus possible les vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pcbdrone.png|400px|PCB]]&lt;br /&gt;
&lt;br /&gt;
Vérification de l'envoie des trames à l'aide de l'ordinateur et test de réception sur l'Ardupilot.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Branchements comme indiqués à la semaine précédente, alimentation et tests de bon fonctionnement des moteurs, Ardupilot et Arduino.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:branchementesc.jpg|300px]][[Fichier:branchementardu.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 15===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Fabrication de la manette&lt;br /&gt;
&lt;br /&gt;
[[Fichier:manettedrone.jpg|400px|PCB]]&lt;br /&gt;
&lt;br /&gt;
Modification de l'envoie des trames. Tests de transmission.&lt;br /&gt;
Implémentation du programme sur le prototype.&lt;br /&gt;
&lt;br /&gt;
Les deux équipes ont passé la semaine à réunir leur travail, nous avons ainsi tous pu réaliser de nombreux tests du prototype, avec réussite, hormis un léger accident qui à entraîné la destruction de deux hélices. &lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
A ce stade, la commande étant terminée et nous avons pu nous lier à l'équipe 1 pour mettre en relation la télécommande et l'Ardupilot. Après avoir utilisé Mission Planner pendant plusieurs semaines, un problème de mise-à-jour du software de l'Ardupilot nous empêchait toujours d'effectuer la calibration de la radiocommande. Nous sommes donc passés sur APM Planner 2 et la mise-à-jour n'était plus demandée, nous avons donc enfin pu terminer l'intégralité de la phase de calibration. Comme expliqué ci-dessus, nous avons effectué de nombreux tests pour atteindre notre objectif.&lt;br /&gt;
&lt;br /&gt;
===Documents Rendus===&lt;br /&gt;
&lt;br /&gt;
Rapport : [[fichier:rapport_groupe_4.pdf]]&lt;br /&gt;
&lt;br /&gt;
==Projet S7==&lt;br /&gt;
&lt;br /&gt;
===De nouveaux objectifs===&lt;br /&gt;
&lt;br /&gt;
Durant le semestre 6, nous avons réussi à concevoir un drone volant fonctionnel régulé à l'aide d'une carte de contrôle OpenSource '''Ardupilot 2.8'''. Concernant la commande, nous avions fait le choix d'utiliser une carte communication Xbee ainsi qu'une Arduino NANO et des joysticks.&lt;br /&gt;
&lt;br /&gt;
Cette année, nous avons décidé de développer plus amplement notre projet et de pratiquement repartir du point de départ. En effet, nos objectifs cette année sont :&lt;br /&gt;
*'''d'utiliser de nouveaux composants dont nous connaissons les propriétés (moteurs, ESCs, etc)'''&lt;br /&gt;
*'''d'utiliser une télécommande de modélisme ainsi qu'un récepteur adapté à des portées plus élevées que celles que permettait l'Xbee'''&lt;br /&gt;
*'''de concevoir notre propre contrôleur de vol'''&lt;br /&gt;
*'''Bonus''' : d'intégrer une régulation GPS et un mode automatique en cas de perte de signal&lt;br /&gt;
&lt;br /&gt;
===Reprise du cahier des charges===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 : Gestion de la commande et initialisation (Richard Simonin &amp;amp; Lukas Fauchois)'''&lt;br /&gt;
&lt;br /&gt;
L'objectif de la nouvelle gestion de la commande est d'utiliser une télécommande de modélisme capable de transmettre les différentes données nécessaires (Throttle, Yaw, Pitch) à un récepteur relié à une Arduino UNO, ce qui nous permettra d'être performant en terme de vitesse et de précision. De plus, cette partie de la conception consiste également à calibrer les quatre ESCs que nous utilisons. &lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 : Contrôleur de vol (Evan Gury &amp;amp; Maxime Claudel)&lt;br /&gt;
&lt;br /&gt;
L'objectif ici est d'implémenter notre propre contrôleur de vol (software et hardware) à l'aide de composants individuels, principalement d'une centrale inertielle 3 axes ainsi que d'un accéléromètre 3 axes.&lt;br /&gt;
&lt;br /&gt;
===Nouveaux choix techniques===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
Pour réaliser la commande du drone, nous avons décidé d'utiliser une télécommande [https://fr.banggood.com/Flysky-FS-i6X-2_4GHz-10CH-AFHDS-2A-RC-Transmitter-With-X6B-i-BUS-Receiver-p-1090406.html?rmmds=myorder&amp;amp;ID=42482530817&amp;amp;cur_warehouse=CN '''Flysky FS-I6X'''] accompagnée de son récepteur '''FS-X6B''' qui possède une portée assez élevée pour la réalisation de notre projet. Ce récepteur sera alors relié à une carte '''Arduino UNO''' (qui servira également au contrôleur de vol).&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
Concernant la réalisation du contrôleur de vol, nous choisissons d'utiliser une centrale inertielle [https://fr.banggood.com/3pcs-6DOF-MPU-6050-3-Axis-Gyro-With-Accelerometer-Sensor-Controller-Module-For-Arduino-p-1430733.html?rmmds=search&amp;amp;cur_warehouse=CN '''MPU6050'''] possédant un accéléromètre 3 axes ainsi qu'un gyroscope 3 axes, ce qui convient parfaitement à l'utilisation que l'on veut en faire. De plus, c'est une centrale qui est documentée et à coût raisonnable, elle dispose de son propre processeur, ce qui réduit considérablement la quantité de calculs à effectuer par notre micro-contrôleur. Nous relierons également cette centrale inertielle à la carte '''Arduino UNO'''.&lt;br /&gt;
&lt;br /&gt;
'''Conception générale du drone :'''&lt;br /&gt;
&lt;br /&gt;
Comme évoqué précédemment, pour le coeur d'une drone, nous utiliserons une carte '''Arduino UNO''' qui possède un nombre suffisant de ports d'interruptions, de ports PWM et d'une puissance de calcul suffisante pour traiter toutes les informations des différents capteurs.&lt;br /&gt;
&lt;br /&gt;
Nous avons également décidé de fabriquer notre propre chassis basé sur le design du précédent et d'utiliser de nouveaux ESCs dédiés spécialement au drone volant ([https://fr.banggood.com/EMAX-BLHeli-Series-6A-12A-20A-30A-ESC-p-963634.html?rmmds=search&amp;amp;ID=45170&amp;amp;cur_warehouse=CN '''EMAX BLHELI SERIES 20A''']). Nous avons également choisi de nouveaux moteurs brushless : les [https://fr.banggood.com/1000KV-Brushless-Motor-3_17mm-Shaft-Electric-Motor-p-1102054.html?rmmds=search&amp;amp;cur_warehouse=CN '''A2212/13T'''].&lt;br /&gt;
&lt;br /&gt;
'''Bilan'''&lt;br /&gt;
*'''Matériel'''&lt;br /&gt;
**Chassis&lt;br /&gt;
**4 ESCs EMAX BLHELI 20A&lt;br /&gt;
**4 moteurs A2212/13T&lt;br /&gt;
**Batterie LI-PO 11,1V - 2700mAh&lt;br /&gt;
**Arduino UNO&lt;br /&gt;
**Télécommande Flysky FS-I6X&lt;br /&gt;
**Récepteur FS-X6B&lt;br /&gt;
**Centrale inertielle MPU6050&lt;br /&gt;
*'''Logiciel'''&lt;br /&gt;
**Arduino&lt;br /&gt;
&lt;br /&gt;
'''Note''' : grâce au travail d'Evan Gury, nous avons pu acquérir tout ce matériel et il a pu concevoir le chassis avant même le commencement du semestre 7, ce qui nous a permis de nous avancer sur le travail à réaliser.&lt;br /&gt;
&lt;br /&gt;
===Liste des tâches à effectuer===&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser la nouvelle gestion de la commande et l'initialisation, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Découverte télécommande Flysky FS-I6X et son récepteur FS-X6B&lt;br /&gt;
* Configurer la télécommande&lt;br /&gt;
* Lecture des joysticks par Arduino&lt;br /&gt;
* Initialiser les extremums des joysticks&lt;br /&gt;
* Optimisation de la programmation&lt;br /&gt;
* Test de transmission sur les ESCs&lt;br /&gt;
* Mise en œuvre sur notre drone&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser le contrôleur de vol, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Découverte du MPU6050&lt;br /&gt;
* Configuration des registres du MPU6050&lt;br /&gt;
* Récupération des mesures angulaires en °/s&lt;br /&gt;
* Intégration des mesures pour récupérer les positions en degrés&lt;br /&gt;
* Calcul de la consigne&lt;br /&gt;
* Calcul de l'erreur&lt;br /&gt;
* Calcul du correcteur&lt;br /&gt;
* Application de la correction aux ESCs&lt;br /&gt;
&lt;br /&gt;
===Semaine 45===&lt;br /&gt;
&lt;br /&gt;
[[Fichier: flyskyFSI6X.jpg|200px|right|thumb|Flysky FS-I6X et FS-X6B]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Lors de la première semaine, nous avons fait le choix d'utiliser un mode de transmission existant et d'abandonner la télécommande conçue au semestre précédent. Nous avons alors choisi d'utiliser la télécommande de modélisme Flysky FS-I6X et son récepteur FS-X6B. &lt;br /&gt;
&lt;br /&gt;
*Nous avons dû dans un premier temps configurer la télécommande et comprendre comment transmettre les informations des deux joysticks.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Nous avons passé la première séance à nous documenter le plus possible sur le MPU6050 qui est le cœur de notre contrôleur de vol.&lt;br /&gt;
*Nous avons ainsi pu trouver de nombreux documents concernant la configuration des différents registre du MPU6050, de manière à avoir une utilisation correspondant au mieux à un drone volant.&lt;br /&gt;
&lt;br /&gt;
===Semaine 46===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Pour la réception des informations et le traitement des données, nous avons branché le récepteur sur une carte Arduino. Deux choix s'offraient à nous, utiliser des broches PWM ou une broche PPM. Le PPM a pour avantage d'utiliser un unique câble, tous les canaux sont transmis à la suite contrairement au PWM, un câble est nécessaire à chaque canal. L'Arduino UNO ne nous limitant pas pour l'utilisation de 1 broche ou 4 broches, nous avons décider d'utiliser le PWM.&lt;br /&gt;
&lt;br /&gt;
*Nous avons programmé notre Arduino UNO afin de récupérer les informations sur nos canaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Nous avons passé tout notre temps à tenter de récuperer les coordonnées YAW-PITCH-ROLL du mpu6050 et ce de la manière la plus rapide possible afin d'optimiser au mieux la régulation.&lt;br /&gt;
&lt;br /&gt;
===Semaine 47===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Nous avons finalisé la conception de notre drone, nous avons finalisé le câblage et ainsi pu faire des tests sur le prototype.&lt;br /&gt;
&lt;br /&gt;
*Pour commander les moteurs, les ESCs sont nécessaires. L'utilisation est plutôt simple car ils s'utilisent comme des servomoteurs, ainsi la bibliothèque ''servo.h'' d'Arduino nous a permis de les initialiser et donc de faire tourner les moteurs.&lt;br /&gt;
&lt;br /&gt;
*Le projet avance vite et nous avons beaucoup d'ambition et d'idées pour la suite.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Même si le MPU6050 est très bien documenté nous avons passé de nombreuses heures a tenter de récupérer les coordonnées YAW, PITCH et ROLL pour notre drone mais sans succès. Le principal problème était que deux des trois MPUs que nous avions commandés sur Banggood ne marchaient pas correctement.&lt;br /&gt;
*Au final nous arrivons désormais à récupérer ces informations suffisamment vite pour pouvoir espérer effectuer une correction correcte.&lt;br /&gt;
&lt;br /&gt;
===Semaine 48===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Correction du calibrage des ESCs à travers l'Arduino.&lt;br /&gt;
*Début de la commande des moteurs grâce à notre télécommande Flysky. Cependant, nous avons rencontré quelques soucis dans notre programme, il nous faut alors revoir ce code Arduino pour réussir cette étape.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Mise en commun de la partie programmation Arduino avec l'équipe 1. &lt;br /&gt;
*Première prise de renseignements sur les GPS dans l'optique d'en utiliser un pour commander le drone s'il nous reste du temps en fin de projet.&lt;br /&gt;
&lt;br /&gt;
===Documents Rendus===&lt;br /&gt;
&lt;br /&gt;
Soutenance : [[fichier:soutenance_S7_P4.pdf]]&lt;br /&gt;
&lt;br /&gt;
==Projet S8==&lt;br /&gt;
&lt;br /&gt;
[[Fichier: pcb_drone_p4.png|400px|right|thumb|PCB réalisé sur Altium]]&lt;br /&gt;
&lt;br /&gt;
===Liste des tâches à effectuer===&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Après analyse du travail réalisé au S7, nous devons désormais réaliser les tâches suivantes :&lt;br /&gt;
*Conception d'un PCB (pour l'ensemble du système)&lt;br /&gt;
*Optimiser la distribution de la puissance (esthétiquement)&lt;br /&gt;
*Finition de la partie communication envoie/reception de trame validé&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Après analyse du travail réalisé au S7, nous devons désormais réaliser les tâches suivantes :&lt;br /&gt;
*Mise en place et réglage de la régulation PID: &lt;br /&gt;
**Calcul de la consigne  &lt;br /&gt;
**Calcul des erreurs  &lt;br /&gt;
**Calcul des consignes à appliquer aux moteurs après correction&lt;br /&gt;
**Application des consignes&lt;br /&gt;
&lt;br /&gt;
*Implémenter un système de guidage GPS (à voir avec le temps dont on disposera)&lt;br /&gt;
&lt;br /&gt;
===Semaine 3===&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Réflexion et réalisation du PCB sur ''Altium Designer''&lt;br /&gt;
*Mise en relation des différentes variables de notre programme avec celui de l'équipe 2&lt;br /&gt;
*Choix et commande d'un distributeur de puissance (PDB) pour câbler plus proprement les ESCs&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Finalisation du programme, y compris la partie régulation PID&lt;br /&gt;
*Reste encore à régler les coefficients du PID&lt;br /&gt;
*Mise en relation du programme avec l'équipe 1&lt;br /&gt;
&lt;br /&gt;
===Semaine 4===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
* Finition du PCB sur altium et création du même PCB sur Fritzing.&lt;br /&gt;
* Reprise de l'ancienne maquette pour effectuer la régulation&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Réalisation d'un programme Arduino permettant de lire la valeur de 3 potentiomètres afin de pouvoir régler les coefficients du PID.&lt;br /&gt;
*Mise en place d'une maquette à base de potentiomètres et d'interrupteurs pour régler le PID.&lt;br /&gt;
*Possibilité de faire fonctionner le drone en mode normal ou en mode réglage PID par simple utilisation d'un interrupteur.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5===&lt;br /&gt;
&lt;br /&gt;
[[Fichier: testregubar.mp4|350px|right|thumb|Essai de calibration sur deux axes avec le premier dispositif (drone fixé par le haut et le bas grâce à des câbles)]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Impression du PCB et branchement sur la maquette (2)&lt;br /&gt;
*Début des tests de régulation en mode suspendu (sans grande réussite pour le moment)&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Tests de régulation en mode suspendu (avec l'équipe 1)&lt;br /&gt;
*Début de conception d'un PCB permettant de fixer l'ensemble des composants (les nombreux fils commencent à devenir trop gênants pour les tests)&lt;br /&gt;
&lt;br /&gt;
===Semaine 6===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Modification du programme afin de détecter l'arrêt du microcontrôleur Atemega 328P. &lt;br /&gt;
* Resolution de l'erreur lié à la carte et au programme, suspicion de l'ISR mais le problème était du à un câble défectueux (Problème de maquette avec le MPU 6050).  &lt;br /&gt;
&lt;br /&gt;
[[Fichier: calibration-un-axe.mp4|250px|right|thumb|Essai de calibration sur un axe avec le deuxième dispositif]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Mise en place de support en PVC (voir photo) afin de ne laisser au drone qu'un seul degrés de liberté et ainsi permettre de le réguler plus facilement, suite à l'échec de la régulation suspendue.&lt;br /&gt;
*Problème sur un moteur ou un ESC de notre nouveau drone, un des moteurs ne tourne pas lorsque nous montons l'hélice dessus.&lt;br /&gt;
*Problème sur un moteur du nouveau drone qui se coupe totalement à une consigne bien précise et redémarre ensuite.&lt;br /&gt;
&lt;br /&gt;
[[Fichier: testesc.jpg|400px|center|thumb|Test des valeurs de courant reçues par les ESC]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 : coupure pédagogique===&lt;br /&gt;
&lt;br /&gt;
===Semaine 8===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 &amp;amp; 2 :'''&lt;br /&gt;
&lt;br /&gt;
* Lors de cette semaine, nous nous sommes penchés sur les problèmes physiques rencontrés précédemment. &lt;br /&gt;
Pour cela nous avons utilisé un oscilloscope équipé d'une sonde afin de relever les valeurs clés de tension et de courant.&lt;br /&gt;
Nous utilisons un programme qui envoie la même consigne aux 4 moteurs afin de comparer les vitesses de rotation.&lt;br /&gt;
Nous nous sommes aperçu que sur la maquette n°1, les 4 moteurs fonctionnent correctement mais qu'un ESC (Contrôleur moteur) est défaillant.&lt;br /&gt;
Sur la maquette n°2, un moteur et un ESC sont obsolètes. &lt;br /&gt;
Nous avons essayé de mixer les deux maquettes pour faire fonctionner un drone.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 &amp;amp; 2 :'''&lt;br /&gt;
&lt;br /&gt;
* Commande et attente des ESC pour finaliser la régulation.&lt;br /&gt;
* Création d'un boitier PID pour simplifier la régulation. Ce boiter va nous permettre de modifier facilement les valeurs des coefficients de notre PID numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Le boitier comporte 3 potentiomètres, un pour chaque la valeur du I, la valeur du P et la valeur du D.&lt;br /&gt;
*Les valeurs du PID varient entre des plages bien précises: P: I: D:&lt;br /&gt;
&lt;br /&gt;
===Semaine 10===&lt;br /&gt;
&lt;br /&gt;
Re-structuration du projet suite aux événements du COVID-19:&lt;br /&gt;
&lt;br /&gt;
* Régulation sur deux ESCs : Lukas (dispose de tout le matériel)&lt;br /&gt;
* Création application mobile, communication entre téléphone et le drone. (Richard et Evan)&lt;br /&gt;
* Simuler le drone en C. (Maxime)&lt;br /&gt;
&lt;br /&gt;
===Semaine 11===&lt;br /&gt;
&lt;br /&gt;
'''Régulation avec 2 ESCs (Lukas) :'''&lt;br /&gt;
&lt;br /&gt;
* Test du boîtier permettant le contrôle des différents coefficients du PID. En effet, lors de sa conception, un faux contact avait été constaté : problème résolu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Pid_controller_P4.jpg|300px|center|thumb|Boîtier de contrôle du PID]]&lt;br /&gt;
&lt;br /&gt;
'''Application mobile :'''&lt;br /&gt;
&lt;br /&gt;
* Début de l'apprentissage de la création d'une application Android à l'aide de ANDROID STUDIO&lt;br /&gt;
&lt;br /&gt;
===Semaine 12===&lt;br /&gt;
&lt;br /&gt;
[[Fichier: regulation_4_esc.mp4|300px|left|thumb|Régulation presque adaptée sur 4 ESCs]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Application mobile :'''&lt;br /&gt;
*Réalisation d'une application Android, sous Android Studio, permettant de simuler une commande afin de piloter le drone.&lt;br /&gt;
*Les joysticks envoient une consigne variant de 1000 à 2000 pour le throttle et les axes Yaw, Pitch, Roll, valeurs attendues par le drone afin de générer les signaux PWM pour les ESCs.&lt;br /&gt;
*L'interface de l'application est terminée, il reste désormais à programmer la partie concernant l'ESP-32.&lt;br /&gt;
[[Fichier: applicationAndroid.mp4|520px|center|thumb|Présentation de l'application]]&lt;br /&gt;
&lt;br /&gt;
'''Régulation avec 2 ESCs'''&lt;br /&gt;
*Test de régulation sur le banc d'essai avec les valeurs du PID testée sur les derniers tests à 4 ESCs : vidéo ci-contre&lt;br /&gt;
*Test du programme utilisant le boitier PID permettant de modifier nos valeurs en direct&lt;br /&gt;
&lt;br /&gt;
===Semaine 13===&lt;br /&gt;
&lt;br /&gt;
* Reception d'un ESP32 et debut de la programmation. Création d'un Serveur WIFI, il reste à faire communiquer l'application et l'ESP32.&lt;br /&gt;
&lt;br /&gt;
* Modification du code pour réguler deux moteurs&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 et 15 : coupure pédagogique===&lt;br /&gt;
&lt;br /&gt;
* Communication telephone-ESP32  fonctionnelle à partir d'un serveur WEB. Communication de l'application vers ESP32 impossible. Nous n'avons pas réussi à nous connecter à la socket créé sur l'esp32.&lt;br /&gt;
&lt;br /&gt;
* La communication entre l'application mobile et l'ESP32 est fonctionnelle, nous envoyons ainsi un message formé des consignes sur la socket.&lt;br /&gt;
&lt;br /&gt;
'''Régulation avec deux moteurs'''&lt;br /&gt;
&lt;br /&gt;
Après avoir constaté que la fonction compensateBatteryDrop() était devenue obsolète en raison de l'ajout de notre PDB (Power Distributor Board), nous avons décidé de l'enlever de notre boucle (void loop()) améliorer les performances de notre programme. De plus, un pin était utilisé et faussait les calculs. Cette suppression nous a permis, effectivement, de constater une nette amélioration dans la gestion de la régulation.&lt;br /&gt;
&lt;br /&gt;
Lukas a alors pu réguler le drone avec deux moteurs sur un axe (Roll). Cette régulation a été menée à bien et le drone se stabilise sur un axe jusqu'à ce que nous soyons à court de batterie (nous nous rechargions à Robotech) avec les valeurs suivantes :&lt;br /&gt;
*kp Roll = 1.25  ki Roll = 0.05  kd Roll = 22.00&lt;br /&gt;
&lt;br /&gt;
L'objectif maintenant est, dès qu'on le pourra, après la fin du semestre de se réunir, d'installer les 4 nouveaux ESC et d'effectuer une régulation complète afin de finir complètement la conception de notre drone.&lt;br /&gt;
&lt;br /&gt;
===Documents Rendus===&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2018/2020_P4&amp;diff=84621</id>
		<title>IMA3/IMA4 2018/2020 P4</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2018/2020_P4&amp;diff=84621"/>
				<updated>2020-05-03T13:59:28Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Semaine 6 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;include nopre noesc src=&amp;quot;/home/pedago/pimasc/include/video-ConstructionDroneIMA32018-iframe.html&amp;quot; /&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre du projet IMA3/4, nous avons choisi le sujet P4 : '''Construction d'un drone volant'''. Notre groupe se compose de Maxime CLAUDEL, Lukas FAUCHOIS, Evan GURY et Richard Simonin.&lt;br /&gt;
Nous avions dans un premier temps décidé de réaliser notre projet autour d'un drone servant à la livraison de petit colis, cependant dans un souci concernant la matériel mis à notre disposition et de budget, nous avons finalement opté pour un drone &amp;quot;loisir&amp;quot;.&lt;br /&gt;
Ce dernier sera destiné à un public amateur, dans un but d'apprentissage et/ou d'amusement et sera ainsi plus en adéquation avec nos contraintes et compétences, de plus amples informations sont décrites ci-dessous dans la partie '''Objectifs''' de notre présentation.&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
A terme, l'objectif principal de ce projet est de concevoir et construire entièrement un drone &amp;quot;made in Polytech Lille&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nous allons alors répartir notre travail en deux sessions, une première réalisée en IMA (S6) et une seconde en IMA4.&lt;br /&gt;
&lt;br /&gt;
Pour la fin de cette première session de projet, nous avons pour objectif de faire voler notre drone. Pour ce faire, nous n'avons évidemment pas le temps de nous occuper de la partie concernant le vol nous-mêmes, c'est pour quoi nous avons opté pour l'utilisation d'un contrôleur de vol n'ayant qu'à être configuré.&lt;br /&gt;
&lt;br /&gt;
Parallèlement à cela, nous comptons réaliser nous-mêmes la commande permettant de communiquer avec ce dernier pendant qu'une autre partie des membres du projet s’attellera à la partie mécanique et électrique du drone.&lt;br /&gt;
&lt;br /&gt;
Ce faisant et si tout se passe bien, nous pourrons avoir pour débuter l'année prochaine une base solide pour concevoir nous-mêmes notre contrôleur de vol. Ce qui nous amène à notre second point, puisque nous comptons dans un second temps réaliser notre propre contrôleur de vol, une fois le premier objectif atteint.&lt;br /&gt;
&lt;br /&gt;
=Analyse du projet=&lt;br /&gt;
&lt;br /&gt;
==Positionnement par rapport à l'existant==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:parrot.jpg|right|thumb|PARROT AR.DRONE 2.0]]&lt;br /&gt;
[[Fichier:udi.jpg|right|thumb|UDI U818S]]&lt;br /&gt;
&lt;br /&gt;
===Analyse du premier concurrent : PARROT AR.DRONE 2.0===&lt;br /&gt;
&lt;br /&gt;
Le [https://www.parrot.com/fr/drones/parrot-ardrone-20-elite-edition PARROT AR.DRONE 2.0], tout comme le notre, est destiné à un usage ludique. En dehors de la camera que nous n'envisageons pas d'intégrer à notre drone pour le moment, il dispose de toutes les caractéristiques que nous souhaiterions obtenir. A savoir une portée d'environ 100m, une autonomie de plus de 10min et une vitesse moyenne d'environ 20 km/h pour un prix avoisinant les 100 euros.&lt;br /&gt;
&lt;br /&gt;
Notre avantage peut se jouer sur la camera, en effet, en enlevant cette dernière nous pouvons réaliser des économies. De plus, si une personne recherche un drone simplement pour prendre du plaisir à le faire voler, il ne souhaitera pas forcément gaspiller son argent dans une camera qu'il n'aurait surement de base pas voulu.&lt;br /&gt;
&lt;br /&gt;
===Analyse du second concurrent : UDI U818S===&lt;br /&gt;
&lt;br /&gt;
Fabriqué par la marque UDI, le [https://www.maisondudrone.com/prod/udi-u818s-avec-camera-hd-2-0mp-blanc-1400.html UDI U818S] est un drone au caractéristiques similaires au précédent, à l'exception de la camera.&lt;br /&gt;
En effet, cette fois nous sommes face à un concurrent qui tout comme nous, propose simplement la fonctionnalité de base d'un drone, à savoir voler et cela se fait ressentir sur le prix puisque nous passons sur un prix d'environ 50 euros.&lt;br /&gt;
Face à un concurrent proposant un produit similaire au notre et à un prix au plus bas pour ces caractéristiques, difficile de faire mieux sur le plan technique. Peut être serait il alors plus judicieux de proposer un produit plus haute gamme, plus chère, mais destiné à un public désireux de s'amuser avec un produit de qualité.&lt;br /&gt;
&lt;br /&gt;
==Scénario d'usage du produit ou du concept envisagé==&lt;br /&gt;
&lt;br /&gt;
'''A qui notre drone peut-il servir ?'''&lt;br /&gt;
&lt;br /&gt;
Le drone &amp;quot;made in Polytech Lille&amp;quot; s'adresse à tout public n'ayant que pour objectif l'amusement''&lt;br /&gt;
&lt;br /&gt;
Toute personne souhaitant débuter avec un drone de qualité, sans s'encombrer de fonctionnalité ne s'avérant pas utiles peut être amenées a utiliser notre drone.&lt;br /&gt;
&lt;br /&gt;
'''Pour quel type d'utilisation ?'''&lt;br /&gt;
&lt;br /&gt;
Nombre de notre génération ont déjà reçu comme cadeau une voiture RC. Cette dernière n'avait que pour objectif de rouler à toute vitesse pour nous satisfaire. Nul besoin d'embarquer des caméras, stabilisateurs et nombres d'autres gadgets inutile à la vocation initiale de notre voiture, rouler. &lt;br /&gt;
&lt;br /&gt;
Avec notre drone, nous voulons remettre cela en avant, le simple plaisir de piloter une voiture RC appliqué aux drones. Alors enfant, adultes et nostalgiques pourront par le biais de notre produit découvrir ou redécouvrir le plaisir de piloter un engin motorisé, qui plus est cette-ci fois dans les airs.&lt;br /&gt;
&lt;br /&gt;
==Réponse à la question difficile==&lt;br /&gt;
&lt;br /&gt;
'''Qu'en est-il du dimensionnement des composants pour permettre à votre drone de porter une telle charge ?'''&lt;br /&gt;
&lt;br /&gt;
Nos contraintes et objectif ayant totalement changé, la question ne se pose plus vraiment. En effet nous avons suites à notre présentation réalisé des calculs en terme de puissance et nous nous sommes très vite rendu compte de l'impossibilité à réaliser notre projet.&lt;br /&gt;
&lt;br /&gt;
En effet, au vu de notre budget, l'achat d'un seul des quatre moteurs nécessaire à l'atteinte des chiffres que nous avions avancés était déjà impossible. Nous avons donc totalement changé d'objectif et avons récupéré du matériel déjà présent à Polytech, à savoir quatre moteurs et leur ESC. Nous avons pris le problème à l'envers et avons réfléchi à ce que nous pouvions réaliser avec le budget et le matériel à disposition.&lt;br /&gt;
&lt;br /&gt;
C'est de cette manière que nous avons eu l'idée d'un drone &amp;quot;loisir&amp;quot;, effaçant ainsi la question de la charge.&lt;br /&gt;
&lt;br /&gt;
==Bibliographie et webographie==&lt;br /&gt;
&lt;br /&gt;
===Arducopter===&lt;br /&gt;
&lt;br /&gt;
 https://www.digi.com/resources/documentation/digidocs/PDFs/90000976.pdf&lt;br /&gt;
 http://jeromeabel.net/wiki/xbee/xbee-arduino.pdf&lt;br /&gt;
 https://www.digi.com/resources/documentation/digidocs/pdfs/90001942-13.pdf&lt;br /&gt;
 https://www.arduino.cc/en/Reference/Servo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Manuel d'utilisation&lt;br /&gt;
 http://ardupilot.org/copter/index.html&lt;br /&gt;
&lt;br /&gt;
* Tutoriels vidéos&lt;br /&gt;
 Première installation et setup : https://www.youtube.com/watch?v=30cCs4aHdB0&amp;amp;t=754s&lt;br /&gt;
 Alimentation de l'Ardupilot : https://www.youtube.com/watch?v=TS4OWAcfAQY&amp;amp;t=270s&lt;br /&gt;
 Calibration des ESC : https://youtu.be/gYoknRObfOg&lt;br /&gt;
&lt;br /&gt;
=Préparation du projet=&lt;br /&gt;
&lt;br /&gt;
==Cahier des charges du groupe==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Diagramme bête à cornes'''&lt;br /&gt;
&lt;br /&gt;
Le diagramme bête à cornes nous permet de faire une analyse fonctionnelle du besoin. Notre drone permet à utilisateur de découvrir l'aéronautique à travers une activité ludique à l'aide d'une télécommande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bete_a_cornes.png | center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Diagramme en pieuvre'''&lt;br /&gt;
&lt;br /&gt;
Le diagramme en pieuvre permet quant à lui de répertorier toutes les fonctions (principales et de service) et d'analyser l'importance des besoins de notre projet&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pieuvredrone.png | center]]&lt;br /&gt;
&lt;br /&gt;
'''Tableau de fonctions'''&lt;br /&gt;
&lt;br /&gt;
Le tableau ci-dessous liste les fonctions principales (FP) et les fonctions contraintes (FC), dans l'orde d'importance, les accompagnant d'une petite description.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tableau_fonctions.jpeg | 500px | center]]&lt;br /&gt;
&lt;br /&gt;
==Cahier des charges des équipes==&lt;br /&gt;
===Equipe 1 : Gestion de la commande (Evan Gury et Richard Simonin)===&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie, est de créer une télécommande ainsi que le récepteur. Nous devons lire les valeurs des potentiomètres, créer des trames, envoyer les trames et analyser les trames reçus. Notre système doit être performant en matière de vitesse ainsi qu'en précision.&lt;br /&gt;
&lt;br /&gt;
===Equipe 2 : Contrôleur de vol (Maxime Claudel et Lukas Fauchois)===&lt;br /&gt;
&lt;br /&gt;
L'objectif de l'équipe est d'utiliser une carte de contrôle pouvant être liée à un logiciel de contrôle de vol. Etant donné notre projet, la carte doit respecter certaines contraintes : être adaptée à un drone à quatre hélices (quadcopter), fonctionner sur batterie (car positionnée sur le chassis du drone), être déjà programmée et relativement simple d'utilisation. Le logiciel doit quant à lui nous permettre de gérer le vol du drone et de calibrer les commandes.&lt;br /&gt;
&lt;br /&gt;
==Choix techniques : matériel et logiciel==&lt;br /&gt;
===Equipe 1===&lt;br /&gt;
&lt;br /&gt;
'''Émetteur'''&lt;br /&gt;
&lt;br /&gt;
Pour la réalisation de l'émetteur, nous avons choisi de travailler avec une Arduino ainsi que '''deux joysticks''' et un '''émetteur Xbee'''. Nous voulons une télécommande petite c'est pourquoi nous avons pris avec une '''Arduino NANO'''. Le drone a besoin de deux joysticks pour être dirigé selon 3 axes.&lt;br /&gt;
&lt;br /&gt;
'''Récepteur'''&lt;br /&gt;
&lt;br /&gt;
Pour la réalisation du récepteur, qui sera situé sur le drone nous avons commencé par utiliser une '''Arduino UNO''' mais nous souhaitons changer pour une NANO afin d'optimiser le poids ainsi que l'espace. Nous avons aussi besoin d'un '''récepteur Xbee''' afin de recevoir les trames.&lt;br /&gt;
&lt;br /&gt;
===Equipe 2===&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi pour notre carte de contrôle un '''Ardupilot 2.8''', son prix est raisonnable (une trentaine d'euros) et nous trouvons beaucoup de tutoriels l'utilisant sur YouTube.&lt;br /&gt;
&lt;br /&gt;
Pour le logiciel, deux choix relativement similaires s'offraient à nous : Mission Planner ou APM Planner. Les deux logiciels ont à peu près la même interface et permettent tous les deux d'effectuer les mêmes étapes de calibrage de l'Ardupilot et des commandes avant le premier vol.&lt;br /&gt;
&lt;br /&gt;
Nous avons d'abord commencé sur Mission Planner mais des problèmes de mises à jour du firmware de l'Ardupilot nous ont empêché de calibrer les '''ESC du drone'''. Nous sommes donc ensuite passés sur '''APM Planner''' car il permet d'éviter ce problème de mises à jour.&lt;br /&gt;
&lt;br /&gt;
===Bilan===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:materieldrone.jpg|right|thumb|Matériel nécessaire à la conception]]&lt;br /&gt;
&lt;br /&gt;
* '''Matériel''' :&lt;br /&gt;
**2 joysticks&lt;br /&gt;
**Emetteur Xbee&lt;br /&gt;
**Récepteur Xbee&lt;br /&gt;
**Arduino NANO&lt;br /&gt;
**Arduino UNO&lt;br /&gt;
**Ardupilot 2.8&lt;br /&gt;
**Câblage&lt;br /&gt;
&lt;br /&gt;
* '''Logiciels''' :&lt;br /&gt;
**Arduino&lt;br /&gt;
**Mission Planner&lt;br /&gt;
**APM Planner 2.0&lt;br /&gt;
&lt;br /&gt;
==Liste des tâches à effectuer==&lt;br /&gt;
===Equipe 1===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser la partie gestion de la commande, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Analyse du projet&lt;br /&gt;
* Découverte Xbee&lt;br /&gt;
* Prise en main Xbee&lt;br /&gt;
* Envoi de trames&lt;br /&gt;
* Réception de trames&lt;br /&gt;
* Optimisation de la programmation&lt;br /&gt;
* Test sur maquette&lt;br /&gt;
* Réalisation du PCB&lt;br /&gt;
* Mise en œuvre sur notre drone&lt;br /&gt;
&lt;br /&gt;
===Equipe 2===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser la partie contrôleur de vol, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Analyse du projet&lt;br /&gt;
* Choix d'une carte de contrôle&lt;br /&gt;
* Documentation, recherche d'un software&lt;br /&gt;
* Calibration de la carte&lt;br /&gt;
* Réalisation des branchements&lt;br /&gt;
* Mise en application sur la maquette&lt;br /&gt;
* Mise en relation avec la partie commande&lt;br /&gt;
&lt;br /&gt;
==Calendrier prévisionnel==&lt;br /&gt;
Nous avons décidé de réaliser un diagramme de GANTT pour chacun des calendriers prévisionnels (un par équipe). Sur chaque tâche, nous avions prévu un temps de travail en bleu dans les diagrammes et le temps réel consacré en jaune.&lt;br /&gt;
===Equipe 1 : Calendrier prévisionnel pour la gestion de la commande===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:equipe1cal.jpg|500px|center|&amp;quot;Calendrier de l'Equipe 1&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Equipe 2 : Calendrier prévisionnel pour le contrôleur de vol===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:equipe2cal.jpg|500px|center|&amp;quot;Calendrier de l'Equipe 2&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet S6==&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 et 6===&lt;br /&gt;
&lt;br /&gt;
Avant de scinder le groupe en deux équipes, nous avons passés les deux premières séances à évaluer les besoins de conception de notre projet pour pouvoir ensuite réaliser un cahier des charges et établir un calendrier prévisionnel des tâches à effectuer.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:xbeedrone.jpg|200px|thumb|Xbee]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Etant donné que nous avons décidé d'utiliser des modules XBee, nous avons consacrés cette semaine à la documentation, afin de comprendre comment configurer et utiliser ces derniers.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ardupilot28.jpeg|300px|right|thumb|Ardupilot 2.8]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Sur le principe de la semaine 7, nous nous sommes documentés sur les XBee afin de comprendre comment les configurer et les utiliser.&lt;br /&gt;
&lt;br /&gt;
Pour la configuration, nous avons retenu le logiciel XCTU qui est celui recommandé pour configurer les XBee. Cependant, nous gardons quand même de côté Legacy XCTU qui est l'ancienne version XCTU mais qui reste tout de même viable.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Nous avons consacré cette séance de documentation à la recherche d'une carte de contrôle de vol satisfaisant nos exigences. Nous cherchions donc une carte facilement connectable avec un Arduino Uno/Micro. Nous avons opté pour l'Ardupilot 2.8. Il comprend tout le nécessaire pour diriger un drone quadcopter, centrale gyroscopique, accéléromètres, interface de radiocommande. &lt;br /&gt;
Nous avons donc commandé l'Ardupilot via le site Alibaba.com (30€) et nous l'avons reçu trois semaines plus tard.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Après avoir effectués diverses recherches sur les modules XBee et effectué de nombreux tests (XCTU, legacy XCTU), nous avons abandonné l'utilisation du logiciel XCTU, étant donné que nous n'utilisons que deux XBee, nous pouvons les initialiser directement dans le programme avec le programme suivant:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:inixbeedrone.png]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
En attendant la réception du colis de l'Ardupilot, nous nous sommes documentés sur les différents logiciels de contrôle de vol à notre disposition. L'objectif étant de trouver un logiciel compatible avec l'Ardupilot 2.8 et avec suffisamment de documentation et tutoriels d'utilisation. Les deux logiciels qui sont ressortis le plus dans nos recherches sont Mission Planner et APM Planner 2. Ces deux logiciels sont très similaires au niveau de l'interface et des options de calibration de la carte de vol à laquelle ils sont connectés.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:apm20.png|300px|center]][[Fichier:missionplanner.jpg|300px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En connectant l'Ardupilot via un câble USB, le logiciel le reconnait et une démarche de calibration peut être entamée : boussole, accéléromètres, radiocommande, ESC.&lt;br /&gt;
&lt;br /&gt;
===Semaine 10===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur la transmission, la réception et le traitement des trames.&lt;br /&gt;
&lt;br /&gt;
Pour la transmission, nous avons mis en place le système suivant:&lt;br /&gt;
&lt;br /&gt;
*On lit la valeur des potentiomètres&lt;br /&gt;
*On convertit la valeur en une chaîne de caractère et on lui attribue un indice qui est propre à chaque position des joysticks.&lt;br /&gt;
*On envoie la chaîne de caractère par liaison série.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la réception, nous avons mis en place le système suivant:&lt;br /&gt;
&lt;br /&gt;
*On reçoit un tableau de caractère qui contient la consigne entre 0 et 1023 et un indice pour dire à quel joystick et quelle position la consigne correspond.&lt;br /&gt;
*On converti le tableau en entier et à l'aide de la fonction map on adapte la consigne pour qu'elle est une valeur entre 0 et 180.&lt;br /&gt;
*On transmet la consigne à l'ardupilot.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Idem semaine 9.&lt;br /&gt;
&lt;br /&gt;
===Semaine 11===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Débogage de la communication entre les modules XBee et l'ardupilot.&lt;br /&gt;
&lt;br /&gt;
En utilisant deux terminaux, la communication était réalisé entre les deux XBee  cependant une fois branché sur l'ardupilot nous avons eu des difficultés à traiter les trames, du au fait d'une transmission trop rapide.&lt;br /&gt;
&lt;br /&gt;
De plus nous avons passé un certains temps à vouloir utiliser une arduino micro mais avons finalement décidé de laisser tomber, puisque nous n'avons pas réussi à réceptionner les trames XBee.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Idem semaine 9.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Optimisation du format des trames et réglage de la vitesse de transmission.&lt;br /&gt;
&lt;br /&gt;
Passage d'une Arduino UNO à une Arduino Nano pour l'envoie des trames dans l'optique de réaliser un PCB pour la commande.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
A ce stade du projet nous ne pouvions qu'expérimenter les calibrations de la boussole et des accéléromètres de l'Ardupilot car la partie commande n'était pas terminée.&lt;br /&gt;
&lt;br /&gt;
La calibration de la boussole s'effectue en bougeant l'Ardupilot selon tous ces axes pendant une période de temps donnée jusqu'à ce que les informations nécessaires soient récoltées.&lt;br /&gt;
La calibration des accéléromètres s'effectue en positionnant l'Ardupilot dans des positions définies (sur le côté gauche, sur la face avant, etc.). (cliquer sur l'image ci-dessous pour lancer le GIF)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:compasscalib.gif|300px|center]][[Fichier:compasscalib.png|300px|center]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Réglage des trames pour la commande du prototype.&lt;br /&gt;
&lt;br /&gt;
Nous avons rencontré quelques problème de sensibilité au niveau des joysticks et du traitement du signal de commande transmis à l'ardupilot.&lt;br /&gt;
&lt;br /&gt;
En effet, ayant trouvé très peu de documentation sur l'ardupilot, nous avons eu du mal à générer les bons signaux de commande.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes ensuite consacrés à la partie alimentation de l'Ardupilot et du drone. En se documentant sur le site servant de manuel d'utilisation d'Ardupilot et des logiciels Mission Planner et APM Planner 2, nous avons trouvé que l'Ardupilot pouvait être alimenté via les ESC.&lt;br /&gt;
Une batterie LiPo alimente les ESC qui elles-mêmes alimentent l'Ardupilot via les broches Output. L'Ardupilot alimente ensuite l'Arduino qui réceptionne les trames reçues par le récepteur Xbee. Sur les sorties (Output) de l'Ardupilot sont aussi branchés les fils permettant la réception du signal envoyé aux moteurs.&lt;br /&gt;
Ainsi, tous les composants nécessaires au drone sont alimentés.&lt;br /&gt;
&lt;br /&gt;
===Semaine 14===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Conception du PCB pour la commande en essayant de limiter le plus possible les vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pcbdrone.png|400px|PCB]]&lt;br /&gt;
&lt;br /&gt;
Vérification de l'envoie des trames à l'aide de l'ordinateur et test de réception sur l'Ardupilot.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Branchements comme indiqués à la semaine précédente, alimentation et tests de bon fonctionnement des moteurs, Ardupilot et Arduino.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:branchementesc.jpg|300px]][[Fichier:branchementardu.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 15===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Fabrication de la manette&lt;br /&gt;
&lt;br /&gt;
[[Fichier:manettedrone.jpg|400px|PCB]]&lt;br /&gt;
&lt;br /&gt;
Modification de l'envoie des trames. Tests de transmission.&lt;br /&gt;
Implémentation du programme sur le prototype.&lt;br /&gt;
&lt;br /&gt;
Les deux équipes ont passé la semaine à réunir leur travail, nous avons ainsi tous pu réaliser de nombreux tests du prototype, avec réussite, hormis un léger accident qui à entraîné la destruction de deux hélices. &lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
A ce stade, la commande étant terminée et nous avons pu nous lier à l'équipe 1 pour mettre en relation la télécommande et l'Ardupilot. Après avoir utilisé Mission Planner pendant plusieurs semaines, un problème de mise-à-jour du software de l'Ardupilot nous empêchait toujours d'effectuer la calibration de la radiocommande. Nous sommes donc passés sur APM Planner 2 et la mise-à-jour n'était plus demandée, nous avons donc enfin pu terminer l'intégralité de la phase de calibration. Comme expliqué ci-dessus, nous avons effectué de nombreux tests pour atteindre notre objectif.&lt;br /&gt;
&lt;br /&gt;
===Documents Rendus===&lt;br /&gt;
&lt;br /&gt;
Rapport : [[fichier:rapport_groupe_4.pdf]]&lt;br /&gt;
&lt;br /&gt;
==Projet S7==&lt;br /&gt;
&lt;br /&gt;
===De nouveaux objectifs===&lt;br /&gt;
&lt;br /&gt;
Durant le semestre 6, nous avons réussi à concevoir un drone volant fonctionnel régulé à l'aide d'une carte de contrôle OpenSource '''Ardupilot 2.8'''. Concernant la commande, nous avions fait le choix d'utiliser une carte communication Xbee ainsi qu'une Arduino NANO et des joysticks.&lt;br /&gt;
&lt;br /&gt;
Cette année, nous avons décidé de développer plus amplement notre projet et de pratiquement repartir du point de départ. En effet, nos objectifs cette année sont :&lt;br /&gt;
*'''d'utiliser de nouveaux composants dont nous connaissons les propriétés (moteurs, ESCs, etc)'''&lt;br /&gt;
*'''d'utiliser une télécommande de modélisme ainsi qu'un récepteur adapté à des portées plus élevées que celles que permettait l'Xbee'''&lt;br /&gt;
*'''de concevoir notre propre contrôleur de vol'''&lt;br /&gt;
*'''Bonus''' : d'intégrer une régulation GPS et un mode automatique en cas de perte de signal&lt;br /&gt;
&lt;br /&gt;
===Reprise du cahier des charges===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 : Gestion de la commande et initialisation (Richard Simonin &amp;amp; Lukas Fauchois)'''&lt;br /&gt;
&lt;br /&gt;
L'objectif de la nouvelle gestion de la commande est d'utiliser une télécommande de modélisme capable de transmettre les différentes données nécessaires (Throttle, Yaw, Pitch) à un récepteur relié à une Arduino UNO, ce qui nous permettra d'être performant en terme de vitesse et de précision. De plus, cette partie de la conception consiste également à calibrer les quatre ESCs que nous utilisons. &lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 : Contrôleur de vol (Evan Gury &amp;amp; Maxime Claudel)&lt;br /&gt;
&lt;br /&gt;
L'objectif ici est d'implémenter notre propre contrôleur de vol (software et hardware) à l'aide de composants individuels, principalement d'une centrale inertielle 3 axes ainsi que d'un accéléromètre 3 axes.&lt;br /&gt;
&lt;br /&gt;
===Nouveaux choix techniques===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
Pour réaliser la commande du drone, nous avons décidé d'utiliser une télécommande [https://fr.banggood.com/Flysky-FS-i6X-2_4GHz-10CH-AFHDS-2A-RC-Transmitter-With-X6B-i-BUS-Receiver-p-1090406.html?rmmds=myorder&amp;amp;ID=42482530817&amp;amp;cur_warehouse=CN '''Flysky FS-I6X'''] accompagnée de son récepteur '''FS-X6B''' qui possède une portée assez élevée pour la réalisation de notre projet. Ce récepteur sera alors relié à une carte '''Arduino UNO''' (qui servira également au contrôleur de vol).&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
Concernant la réalisation du contrôleur de vol, nous choisissons d'utiliser une centrale inertielle [https://fr.banggood.com/3pcs-6DOF-MPU-6050-3-Axis-Gyro-With-Accelerometer-Sensor-Controller-Module-For-Arduino-p-1430733.html?rmmds=search&amp;amp;cur_warehouse=CN '''MPU6050'''] possédant un accéléromètre 3 axes ainsi qu'un gyroscope 3 axes, ce qui convient parfaitement à l'utilisation que l'on veut en faire. De plus, c'est une centrale qui est documentée et à coût raisonnable, elle dispose de son propre processeur, ce qui réduit considérablement la quantité de calculs à effectuer par notre micro-contrôleur. Nous relierons également cette centrale inertielle à la carte '''Arduino UNO'''.&lt;br /&gt;
&lt;br /&gt;
'''Conception générale du drone :'''&lt;br /&gt;
&lt;br /&gt;
Comme évoqué précédemment, pour le coeur d'une drone, nous utiliserons une carte '''Arduino UNO''' qui possède un nombre suffisant de ports d'interruptions, de ports PWM et d'une puissance de calcul suffisante pour traiter toutes les informations des différents capteurs.&lt;br /&gt;
&lt;br /&gt;
Nous avons également décidé de fabriquer notre propre chassis basé sur le design du précédent et d'utiliser de nouveaux ESCs dédiés spécialement au drone volant ([https://fr.banggood.com/EMAX-BLHeli-Series-6A-12A-20A-30A-ESC-p-963634.html?rmmds=search&amp;amp;ID=45170&amp;amp;cur_warehouse=CN '''EMAX BLHELI SERIES 20A''']). Nous avons également choisi de nouveaux moteurs brushless : les [https://fr.banggood.com/1000KV-Brushless-Motor-3_17mm-Shaft-Electric-Motor-p-1102054.html?rmmds=search&amp;amp;cur_warehouse=CN '''A2212/13T'''].&lt;br /&gt;
&lt;br /&gt;
'''Bilan'''&lt;br /&gt;
*'''Matériel'''&lt;br /&gt;
**Chassis&lt;br /&gt;
**4 ESCs EMAX BLHELI 20A&lt;br /&gt;
**4 moteurs A2212/13T&lt;br /&gt;
**Batterie LI-PO 11,1V - 2700mAh&lt;br /&gt;
**Arduino UNO&lt;br /&gt;
**Télécommande Flysky FS-I6X&lt;br /&gt;
**Récepteur FS-X6B&lt;br /&gt;
**Centrale inertielle MPU6050&lt;br /&gt;
*'''Logiciel'''&lt;br /&gt;
**Arduino&lt;br /&gt;
&lt;br /&gt;
'''Note''' : grâce au travail d'Evan Gury, nous avons pu acquérir tout ce matériel et il a pu concevoir le chassis avant même le commencement du semestre 7, ce qui nous a permis de nous avancer sur le travail à réaliser.&lt;br /&gt;
&lt;br /&gt;
===Liste des tâches à effectuer===&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser la nouvelle gestion de la commande et l'initialisation, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Découverte télécommande Flysky FS-I6X et son récepteur FS-X6B&lt;br /&gt;
* Configurer la télécommande&lt;br /&gt;
* Lecture des joysticks par Arduino&lt;br /&gt;
* Initialiser les extremums des joysticks&lt;br /&gt;
* Optimisation de la programmation&lt;br /&gt;
* Test de transmission sur les ESCs&lt;br /&gt;
* Mise en œuvre sur notre drone&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser le contrôleur de vol, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Découverte du MPU6050&lt;br /&gt;
* Configuration des registres du MPU6050&lt;br /&gt;
* Récupération des mesures angulaires en °/s&lt;br /&gt;
* Intégration des mesures pour récupérer les positions en degrés&lt;br /&gt;
* Calcul de la consigne&lt;br /&gt;
* Calcul de l'erreur&lt;br /&gt;
* Calcul du correcteur&lt;br /&gt;
* Application de la correction aux ESCs&lt;br /&gt;
&lt;br /&gt;
===Semaine 45===&lt;br /&gt;
&lt;br /&gt;
[[Fichier: flyskyFSI6X.jpg|200px|right|thumb|Flysky FS-I6X et FS-X6B]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Lors de la première semaine, nous avons fait le choix d'utiliser un mode de transmission existant et d'abandonner la télécommande conçue au semestre précédent. Nous avons alors choisi d'utiliser la télécommande de modélisme Flysky FS-I6X et son récepteur FS-X6B. &lt;br /&gt;
&lt;br /&gt;
*Nous avons dû dans un premier temps configurer la télécommande et comprendre comment transmettre les informations des deux joysticks.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Nous avons passé la première séance à nous documenter le plus possible sur le MPU6050 qui est le cœur de notre contrôleur de vol.&lt;br /&gt;
*Nous avons ainsi pu trouver de nombreux documents concernant la configuration des différents registre du MPU6050, de manière à avoir une utilisation correspondant au mieux à un drone volant.&lt;br /&gt;
&lt;br /&gt;
===Semaine 46===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Pour la réception des informations et le traitement des données, nous avons branché le récepteur sur une carte Arduino. Deux choix s'offraient à nous, utiliser des broches PWM ou une broche PPM. Le PPM a pour avantage d'utiliser un unique câble, tous les canaux sont transmis à la suite contrairement au PWM, un câble est nécessaire à chaque canal. L'Arduino UNO ne nous limitant pas pour l'utilisation de 1 broche ou 4 broches, nous avons décider d'utiliser le PWM.&lt;br /&gt;
&lt;br /&gt;
*Nous avons programmé notre Arduino UNO afin de récupérer les informations sur nos canaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Nous avons passé tout notre temps à tenter de récuperer les coordonnées YAW-PITCH-ROLL du mpu6050 et ce de la manière la plus rapide possible afin d'optimiser au mieux la régulation.&lt;br /&gt;
&lt;br /&gt;
===Semaine 47===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Nous avons finalisé la conception de notre drone, nous avons finalisé le câblage et ainsi pu faire des tests sur le prototype.&lt;br /&gt;
&lt;br /&gt;
*Pour commander les moteurs, les ESCs sont nécessaires. L'utilisation est plutôt simple car ils s'utilisent comme des servomoteurs, ainsi la bibliothèque ''servo.h'' d'Arduino nous a permis de les initialiser et donc de faire tourner les moteurs.&lt;br /&gt;
&lt;br /&gt;
*Le projet avance vite et nous avons beaucoup d'ambition et d'idées pour la suite.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Même si le MPU6050 est très bien documenté nous avons passé de nombreuses heures a tenter de récupérer les coordonnées YAW, PITCH et ROLL pour notre drone mais sans succès. Le principal problème était que deux des trois MPUs que nous avions commandés sur Banggood ne marchaient pas correctement.&lt;br /&gt;
*Au final nous arrivons désormais à récupérer ces informations suffisamment vite pour pouvoir espérer effectuer une correction correcte.&lt;br /&gt;
&lt;br /&gt;
===Semaine 48===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Correction du calibrage des ESCs à travers l'Arduino.&lt;br /&gt;
*Début de la commande des moteurs grâce à notre télécommande Flysky. Cependant, nous avons rencontré quelques soucis dans notre programme, il nous faut alors revoir ce code Arduino pour réussir cette étape.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Mise en commun de la partie programmation Arduino avec l'équipe 1. &lt;br /&gt;
*Première prise de renseignements sur les GPS dans l'optique d'en utiliser un pour commander le drone s'il nous reste du temps en fin de projet.&lt;br /&gt;
&lt;br /&gt;
===Documents Rendus===&lt;br /&gt;
&lt;br /&gt;
Soutenance : [[fichier:soutenance_S7_P4.pdf]]&lt;br /&gt;
&lt;br /&gt;
==Projet S8==&lt;br /&gt;
&lt;br /&gt;
[[Fichier: pcb_drone_p4.png|400px|right|thumb|PCB réalisé sur Altium]]&lt;br /&gt;
&lt;br /&gt;
===Liste des tâches à effectuer===&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Après analyse du travail réalisé au S7, nous devons désormais réaliser les tâches suivantes :&lt;br /&gt;
*Conception d'un PCB (pour l'ensemble du système)&lt;br /&gt;
*Optimiser la distribution de la puissance (esthétiquement)&lt;br /&gt;
*Finition de la partie communication envoie/reception de trame validé&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Après analyse du travail réalisé au S7, nous devons désormais réaliser les tâches suivantes :&lt;br /&gt;
*Mise en place et réglage de la régulation PID: &lt;br /&gt;
**Calcul de la consigne  &lt;br /&gt;
**Calcul des erreurs  &lt;br /&gt;
**Calcul des consignes à appliquer aux moteurs après correction&lt;br /&gt;
**Application des consignes&lt;br /&gt;
&lt;br /&gt;
*Implémenter un système de guidage GPS (à voir avec le temps dont on disposera)&lt;br /&gt;
&lt;br /&gt;
===Semaine 3===&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Réflexion et réalisation du PCB sur ''Altium Designer''&lt;br /&gt;
*Mise en relation des différentes variables de notre programme avec celui de l'équipe 2&lt;br /&gt;
*Choix et commande d'un distributeur de puissance (PDB) pour câbler plus proprement les ESCs&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Finalisation du programme, y compris la partie régulation PID&lt;br /&gt;
*Reste encore à régler les coefficients du PID&lt;br /&gt;
*Mise en relation du programme avec l'équipe 1&lt;br /&gt;
&lt;br /&gt;
===Semaine 4===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
* Finition du PCB sur altium et création du même PCB sur Fritzing.&lt;br /&gt;
* Reprise de l'ancienne maquette pour effectuer la régulation&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Réalisation d'un programme Arduino permettant de lire la valeur de 3 potentiomètres afin de pouvoir régler les coefficients du PID.&lt;br /&gt;
*Mise en place d'une maquette à base de potentiomètres et d'interrupteurs pour régler le PID.&lt;br /&gt;
*Possibilité de faire fonctionner le drone en mode normal ou en mode réglage PID par simple utilisation d'un interrupteur.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5===&lt;br /&gt;
&lt;br /&gt;
[[Fichier: testregubar.mp4|350px|right|thumb|Essai de calibration sur deux axes avec le premier dispositif (drone fixé par le haut et le bas grâce à des câbles)]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Impression du PCB et branchement sur la maquette (2)&lt;br /&gt;
*Début des tests de régulation en mode suspendu (sans grande réussite pour le moment)&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Tests de régulation en mode suspendu (avec l'équipe 1)&lt;br /&gt;
*Début de conception d'un PCB permettant de fixer l'ensemble des composants (les nombreux fils commencent à devenir trop gênants pour les tests)&lt;br /&gt;
&lt;br /&gt;
===Semaine 6===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Modification du programme afin de détecter l'arrêt du microcontrôleur Atemega 328P. &lt;br /&gt;
* Resolution de l'erreur lié à la carte et au programme, suspicion de l'ISR mais le problème était du à un câble défectueux (Problème de maquette avec le MPU 6050).  &lt;br /&gt;
&lt;br /&gt;
[[Fichier: calibration-un-axe.mp4|250px|right|thumb|Essai de calibration sur un axe avec le deuxième dispositif]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Mise en place de support en PVC (voir photo) afin de ne laisser au drone qu'un seul degrés de liberté et ainsi permettre de le réguler plus facilement, suite à l'échec de la régulation suspendue.&lt;br /&gt;
*Problème sur un moteur ou un ESC de notre nouveau drone, un des moteurs ne tourne pas lorsque nous montons l'hélice dessus.&lt;br /&gt;
*Problème sur un moteur du nouveau drone qui se coupe totalement à une consigne bien précise et redémarre ensuite.&lt;br /&gt;
&lt;br /&gt;
[[Fichier: testesc.jpg|400px|center|thumb|Test des valeurs de courant reçues par les ESC]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 : coupure pédagogique===&lt;br /&gt;
&lt;br /&gt;
===Semaine 8===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 &amp;amp; 2 :'''&lt;br /&gt;
&lt;br /&gt;
* Lors de cette semaine, nous nous sommes penchés sur les problèmes physiques rencontrés précédemment. &lt;br /&gt;
Pour cela nous avons utilisé un oscilloscope équipé d'une sonde afin de relever les valeurs clés de tension et de courant.&lt;br /&gt;
Nous utilisons un programme qui envoie la même consigne aux 4 moteurs afin de comparer les vitesses de rotation.&lt;br /&gt;
Nous nous sommes aperçu que sur la maquette n°1, les 4 moteurs fonctionnent correctement mais qu'un ESC (Contrôleur moteur) est défaillant.&lt;br /&gt;
Sur la maquette n°2, un moteur et un ESC sont obsolètes. &lt;br /&gt;
Nous avons essayé de mixer les deux maquettes pour faire fonctionner un drone.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 &amp;amp; 2 :'''&lt;br /&gt;
&lt;br /&gt;
* Commande et attente des ESC pour finaliser la régulation.&lt;br /&gt;
* Création d'un boitier PID pour simplifier la régulation. Ce boiter va nous permettre de modifier facilement les valeurs des coefficients de notre PID numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Nous avons créé un programme, permettant de prendre en entrée le boitier PID, et de lire la valeur des potentiomètres pour modifier en instantané les valeurs du PID numérique.&lt;br /&gt;
*Le boitier comporte 3 potentiomètres, un pour chaque la valeur du I, la valeur du P et la valeur du D.&lt;br /&gt;
*Les valeurs du PID varient entre des plages bien précises: P: I: D:&lt;br /&gt;
&lt;br /&gt;
===Semaine 10===&lt;br /&gt;
&lt;br /&gt;
Re-structuration du projet suite aux événements du COVID-19:&lt;br /&gt;
&lt;br /&gt;
* Régulation sur deux ESCs : Lukas (dispose de tout le matériel)&lt;br /&gt;
* Création application mobile, communication entre téléphone et le drone. (Richard et Evan)&lt;br /&gt;
* Simuler le drone en C. (Maxime)&lt;br /&gt;
&lt;br /&gt;
===Semaine 11===&lt;br /&gt;
&lt;br /&gt;
'''Régulation avec 2 ESCs (Lukas) :'''&lt;br /&gt;
&lt;br /&gt;
* Test du boîtier permettant le contrôle des différents coefficients du PID. En effet, lors de sa conception, un faux contact avait été constaté : problème résolu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Pid_controller_P4.jpg|300px|center|thumb|Boîtier de contrôle du PID]]&lt;br /&gt;
&lt;br /&gt;
'''Application mobile :'''&lt;br /&gt;
&lt;br /&gt;
* Début de l'apprentissage de la création d'une application Android à l'aide de ANDROID STUDIO&lt;br /&gt;
&lt;br /&gt;
===Semaine 12===&lt;br /&gt;
&lt;br /&gt;
[[Fichier: regulation_4_esc.mp4|300px|left|thumb|Régulation presque adaptée sur 4 ESCs]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Application mobile :'''&lt;br /&gt;
*Réalisation d'une application Android, sous Android Studio, permettant de simuler une commande afin de piloter le drone.&lt;br /&gt;
*Les joysticks envoient une consigne variant de 1000 à 2000 pour le throttle et les axes Yaw, Pitch, Roll, valeurs attendues par le drone afin de générer les signaux PWM pour les ESCs.&lt;br /&gt;
*L'interface de l'application est terminée, il reste désormais à programmer la partie concernant l'ESP-32.&lt;br /&gt;
[[Fichier: applicationAndroid.mp4|520px|center|thumb|Présentation de l'application]]&lt;br /&gt;
&lt;br /&gt;
'''Régulation avec 2 ESCs'''&lt;br /&gt;
*Test de régulation sur le banc d'essai avec les valeurs du PID testée sur les derniers tests à 4 ESCs : vidéo ci-contre&lt;br /&gt;
*Test du programme utilisant le boitier PID permettant de modifier nos valeurs en direct&lt;br /&gt;
&lt;br /&gt;
===Semaine 13===&lt;br /&gt;
&lt;br /&gt;
* Reception d'un ESP32 et debut de la programmation. Création d'un Serveur WIFI, il reste à faire communiquer l'application et l'ESP32.&lt;br /&gt;
&lt;br /&gt;
* Modification du code pour réguler deux moteurs&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 et 15 : coupure pédagogique===&lt;br /&gt;
&lt;br /&gt;
* Communication telephone-ESP32  fonctionnelle à partir d'un serveur WEB. Communication de l'application vers ESP32 impossible. Nous n'avons pas réussi à nous connecter à la socket créé sur l'esp32.&lt;br /&gt;
&lt;br /&gt;
* La communication entre l'application mobile et l'ESP32 est fonctionnelle, nous envoyons ainsi un message formé des consignes sur la socket.&lt;br /&gt;
&lt;br /&gt;
'''Régulation avec deux moteurs'''&lt;br /&gt;
&lt;br /&gt;
Après avoir constaté que la fonction compensateBatteryDrop() était devenue obsolète en raison de l'ajout de notre PDB (Power Distributor Board), nous avons décidé de l'enlever de notre boucle (void loop()) améliorer les performances de notre programme. De plus, un pin était utilisé et faussait les calculs. Cette suppression nous a permis, effectivement, de constater une nette amélioration dans la gestion de la régulation.&lt;br /&gt;
&lt;br /&gt;
Lukas a alors pu réguler le drone avec deux moteurs sur un axe (Roll). Cette régulation a été menée à bien et le drone se stabilise sur un axe jusqu'à ce que nous soyons à court de batterie (nous nous rechargions à Robotech) avec les valeurs suivantes :&lt;br /&gt;
*kp Roll = 1.25  ki Roll = 0.05  kd Roll = 22.00&lt;br /&gt;
&lt;br /&gt;
L'objectif maintenant est, dès qu'on le pourra, après la fin du semestre de se réunir, d'installer les 4 nouveaux ESC et d'effectuer une régulation complète afin de finir complètement la conception de notre drone.&lt;br /&gt;
&lt;br /&gt;
===Documents Rendus===&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2018/2020_P4&amp;diff=84610</id>
		<title>IMA3/IMA4 2018/2020 P4</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2018/2020_P4&amp;diff=84610"/>
				<updated>2020-05-03T12:22:48Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Semaine 4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;include nopre noesc src=&amp;quot;/home/pedago/pimasc/include/video-ConstructionDroneIMA32018-iframe.html&amp;quot; /&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre du projet IMA3/4, nous avons choisi le sujet P4 : '''Construction d'un drone volant'''. Notre groupe se compose de Maxime CLAUDEL, Lukas FAUCHOIS, Evan GURY et Richard Simonin.&lt;br /&gt;
Nous avions dans un premier temps décidé de réaliser notre projet autour d'un drone servant à la livraison de petit colis, cependant dans un souci concernant la matériel mis à notre disposition et de budget, nous avons finalement opté pour un drone &amp;quot;loisir&amp;quot;.&lt;br /&gt;
Ce dernier sera destiné à un public amateur, dans un but d'apprentissage et/ou d'amusement et sera ainsi plus en adéquation avec nos contraintes et compétences, de plus amples informations sont décrites ci-dessous dans la partie '''Objectifs''' de notre présentation.&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
A terme, l'objectif principal de ce projet est de concevoir et construire entièrement un drone &amp;quot;made in Polytech Lille&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nous allons alors répartir notre travail en deux sessions, une première réalisée en IMA (S6) et une seconde en IMA4.&lt;br /&gt;
&lt;br /&gt;
Pour la fin de cette première session de projet, nous avons pour objectif de faire voler notre drone. Pour ce faire, nous n'avons évidemment pas le temps de nous occuper de la partie concernant le vol nous-mêmes, c'est pour quoi nous avons opté pour l'utilisation d'un contrôleur de vol n'ayant qu'à être configuré.&lt;br /&gt;
&lt;br /&gt;
Parallèlement à cela, nous comptons réaliser nous-mêmes la commande permettant de communiquer avec ce dernier pendant qu'une autre partie des membres du projet s’attellera à la partie mécanique et électrique du drone.&lt;br /&gt;
&lt;br /&gt;
Ce faisant et si tout se passe bien, nous pourrons avoir pour débuter l'année prochaine une base solide pour concevoir nous-mêmes notre contrôleur de vol. Ce qui nous amène à notre second point, puisque nous comptons dans un second temps réaliser notre propre contrôleur de vol, une fois le premier objectif atteint.&lt;br /&gt;
&lt;br /&gt;
=Analyse du projet=&lt;br /&gt;
&lt;br /&gt;
==Positionnement par rapport à l'existant==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:parrot.jpg|right|thumb|PARROT AR.DRONE 2.0]]&lt;br /&gt;
[[Fichier:udi.jpg|right|thumb|UDI U818S]]&lt;br /&gt;
&lt;br /&gt;
===Analyse du premier concurrent : PARROT AR.DRONE 2.0===&lt;br /&gt;
&lt;br /&gt;
Le [https://www.parrot.com/fr/drones/parrot-ardrone-20-elite-edition PARROT AR.DRONE 2.0], tout comme le notre, est destiné à un usage ludique. En dehors de la camera que nous n'envisageons pas d'intégrer à notre drone pour le moment, il dispose de toutes les caractéristiques que nous souhaiterions obtenir. A savoir une portée d'environ 100m, une autonomie de plus de 10min et une vitesse moyenne d'environ 20 km/h pour un prix avoisinant les 100 euros.&lt;br /&gt;
&lt;br /&gt;
Notre avantage peut se jouer sur la camera, en effet, en enlevant cette dernière nous pouvons réaliser des économies. De plus, si une personne recherche un drone simplement pour prendre du plaisir à le faire voler, il ne souhaitera pas forcément gaspiller son argent dans une camera qu'il n'aurait surement de base pas voulu.&lt;br /&gt;
&lt;br /&gt;
===Analyse du second concurrent : UDI U818S===&lt;br /&gt;
&lt;br /&gt;
Fabriqué par la marque UDI, le [https://www.maisondudrone.com/prod/udi-u818s-avec-camera-hd-2-0mp-blanc-1400.html UDI U818S] est un drone au caractéristiques similaires au précédent, à l'exception de la camera.&lt;br /&gt;
En effet, cette fois nous sommes face à un concurrent qui tout comme nous, propose simplement la fonctionnalité de base d'un drone, à savoir voler et cela se fait ressentir sur le prix puisque nous passons sur un prix d'environ 50 euros.&lt;br /&gt;
Face à un concurrent proposant un produit similaire au notre et à un prix au plus bas pour ces caractéristiques, difficile de faire mieux sur le plan technique. Peut être serait il alors plus judicieux de proposer un produit plus haute gamme, plus chère, mais destiné à un public désireux de s'amuser avec un produit de qualité.&lt;br /&gt;
&lt;br /&gt;
==Scénario d'usage du produit ou du concept envisagé==&lt;br /&gt;
&lt;br /&gt;
'''A qui notre drone peut-il servir ?'''&lt;br /&gt;
&lt;br /&gt;
Le drone &amp;quot;made in Polytech Lille&amp;quot; s'adresse à tout public n'ayant que pour objectif l'amusement''&lt;br /&gt;
&lt;br /&gt;
Toute personne souhaitant débuter avec un drone de qualité, sans s'encombrer de fonctionnalité ne s'avérant pas utiles peut être amenées a utiliser notre drone.&lt;br /&gt;
&lt;br /&gt;
'''Pour quel type d'utilisation ?'''&lt;br /&gt;
&lt;br /&gt;
Nombre de notre génération ont déjà reçu comme cadeau une voiture RC. Cette dernière n'avait que pour objectif de rouler à toute vitesse pour nous satisfaire. Nul besoin d'embarquer des caméras, stabilisateurs et nombres d'autres gadgets inutile à la vocation initiale de notre voiture, rouler. &lt;br /&gt;
&lt;br /&gt;
Avec notre drone, nous voulons remettre cela en avant, le simple plaisir de piloter une voiture RC appliqué aux drones. Alors enfant, adultes et nostalgiques pourront par le biais de notre produit découvrir ou redécouvrir le plaisir de piloter un engin motorisé, qui plus est cette-ci fois dans les airs.&lt;br /&gt;
&lt;br /&gt;
==Réponse à la question difficile==&lt;br /&gt;
&lt;br /&gt;
'''Qu'en est-il du dimensionnement des composants pour permettre à votre drone de porter une telle charge ?'''&lt;br /&gt;
&lt;br /&gt;
Nos contraintes et objectif ayant totalement changé, la question ne se pose plus vraiment. En effet nous avons suites à notre présentation réalisé des calculs en terme de puissance et nous nous sommes très vite rendu compte de l'impossibilité à réaliser notre projet.&lt;br /&gt;
&lt;br /&gt;
En effet, au vu de notre budget, l'achat d'un seul des quatre moteurs nécessaire à l'atteinte des chiffres que nous avions avancés était déjà impossible. Nous avons donc totalement changé d'objectif et avons récupéré du matériel déjà présent à Polytech, à savoir quatre moteurs et leur ESC. Nous avons pris le problème à l'envers et avons réfléchi à ce que nous pouvions réaliser avec le budget et le matériel à disposition.&lt;br /&gt;
&lt;br /&gt;
C'est de cette manière que nous avons eu l'idée d'un drone &amp;quot;loisir&amp;quot;, effaçant ainsi la question de la charge.&lt;br /&gt;
&lt;br /&gt;
==Bibliographie et webographie==&lt;br /&gt;
&lt;br /&gt;
===Arducopter===&lt;br /&gt;
&lt;br /&gt;
 https://www.digi.com/resources/documentation/digidocs/PDFs/90000976.pdf&lt;br /&gt;
 http://jeromeabel.net/wiki/xbee/xbee-arduino.pdf&lt;br /&gt;
 https://www.digi.com/resources/documentation/digidocs/pdfs/90001942-13.pdf&lt;br /&gt;
 https://www.arduino.cc/en/Reference/Servo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Manuel d'utilisation&lt;br /&gt;
 http://ardupilot.org/copter/index.html&lt;br /&gt;
&lt;br /&gt;
* Tutoriels vidéos&lt;br /&gt;
 Première installation et setup : https://www.youtube.com/watch?v=30cCs4aHdB0&amp;amp;t=754s&lt;br /&gt;
 Alimentation de l'Ardupilot : https://www.youtube.com/watch?v=TS4OWAcfAQY&amp;amp;t=270s&lt;br /&gt;
 Calibration des ESC : https://youtu.be/gYoknRObfOg&lt;br /&gt;
&lt;br /&gt;
=Préparation du projet=&lt;br /&gt;
&lt;br /&gt;
==Cahier des charges du groupe==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Diagramme bête à cornes'''&lt;br /&gt;
&lt;br /&gt;
Le diagramme bête à cornes nous permet de faire une analyse fonctionnelle du besoin. Notre drone permet à utilisateur de découvrir l'aéronautique à travers une activité ludique à l'aide d'une télécommande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bete_a_cornes.png | center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Diagramme en pieuvre'''&lt;br /&gt;
&lt;br /&gt;
Le diagramme en pieuvre permet quant à lui de répertorier toutes les fonctions (principales et de service) et d'analyser l'importance des besoins de notre projet&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pieuvredrone.png | center]]&lt;br /&gt;
&lt;br /&gt;
'''Tableau de fonctions'''&lt;br /&gt;
&lt;br /&gt;
Le tableau ci-dessous liste les fonctions principales (FP) et les fonctions contraintes (FC), dans l'orde d'importance, les accompagnant d'une petite description.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tableau_fonctions.jpeg | 500px | center]]&lt;br /&gt;
&lt;br /&gt;
==Cahier des charges des équipes==&lt;br /&gt;
===Equipe 1 : Gestion de la commande (Evan Gury et Richard Simonin)===&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie, est de créer une télécommande ainsi que le récepteur. Nous devons lire les valeurs des potentiomètres, créer des trames, envoyer les trames et analyser les trames reçus. Notre système doit être performant en matière de vitesse ainsi qu'en précision.&lt;br /&gt;
&lt;br /&gt;
===Equipe 2 : Contrôleur de vol (Maxime Claudel et Lukas Fauchois)===&lt;br /&gt;
&lt;br /&gt;
L'objectif de l'équipe est d'utiliser une carte de contrôle pouvant être liée à un logiciel de contrôle de vol. Etant donné notre projet, la carte doit respecter certaines contraintes : être adaptée à un drone à quatre hélices (quadcopter), fonctionner sur batterie (car positionnée sur le chassis du drone), être déjà programmée et relativement simple d'utilisation. Le logiciel doit quant à lui nous permettre de gérer le vol du drone et de calibrer les commandes.&lt;br /&gt;
&lt;br /&gt;
==Choix techniques : matériel et logiciel==&lt;br /&gt;
===Equipe 1===&lt;br /&gt;
&lt;br /&gt;
'''Émetteur'''&lt;br /&gt;
&lt;br /&gt;
Pour la réalisation de l'émetteur, nous avons choisi de travailler avec une Arduino ainsi que '''deux joysticks''' et un '''émetteur Xbee'''. Nous voulons une télécommande petite c'est pourquoi nous avons pris avec une '''Arduino NANO'''. Le drone a besoin de deux joysticks pour être dirigé selon 3 axes.&lt;br /&gt;
&lt;br /&gt;
'''Récepteur'''&lt;br /&gt;
&lt;br /&gt;
Pour la réalisation du récepteur, qui sera situé sur le drone nous avons commencé par utiliser une '''Arduino UNO''' mais nous souhaitons changer pour une NANO afin d'optimiser le poids ainsi que l'espace. Nous avons aussi besoin d'un '''récepteur Xbee''' afin de recevoir les trames.&lt;br /&gt;
&lt;br /&gt;
===Equipe 2===&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi pour notre carte de contrôle un '''Ardupilot 2.8''', son prix est raisonnable (une trentaine d'euros) et nous trouvons beaucoup de tutoriels l'utilisant sur YouTube.&lt;br /&gt;
&lt;br /&gt;
Pour le logiciel, deux choix relativement similaires s'offraient à nous : Mission Planner ou APM Planner. Les deux logiciels ont à peu près la même interface et permettent tous les deux d'effectuer les mêmes étapes de calibrage de l'Ardupilot et des commandes avant le premier vol.&lt;br /&gt;
&lt;br /&gt;
Nous avons d'abord commencé sur Mission Planner mais des problèmes de mises à jour du firmware de l'Ardupilot nous ont empêché de calibrer les '''ESC du drone'''. Nous sommes donc ensuite passés sur '''APM Planner''' car il permet d'éviter ce problème de mises à jour.&lt;br /&gt;
&lt;br /&gt;
===Bilan===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:materieldrone.jpg|right|thumb|Matériel nécessaire à la conception]]&lt;br /&gt;
&lt;br /&gt;
* '''Matériel''' :&lt;br /&gt;
**2 joysticks&lt;br /&gt;
**Emetteur Xbee&lt;br /&gt;
**Récepteur Xbee&lt;br /&gt;
**Arduino NANO&lt;br /&gt;
**Arduino UNO&lt;br /&gt;
**Ardupilot 2.8&lt;br /&gt;
**Câblage&lt;br /&gt;
&lt;br /&gt;
* '''Logiciels''' :&lt;br /&gt;
**Arduino&lt;br /&gt;
**Mission Planner&lt;br /&gt;
**APM Planner 2.0&lt;br /&gt;
&lt;br /&gt;
==Liste des tâches à effectuer==&lt;br /&gt;
===Equipe 1===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser la partie gestion de la commande, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Analyse du projet&lt;br /&gt;
* Découverte Xbee&lt;br /&gt;
* Prise en main Xbee&lt;br /&gt;
* Envoi de trames&lt;br /&gt;
* Réception de trames&lt;br /&gt;
* Optimisation de la programmation&lt;br /&gt;
* Test sur maquette&lt;br /&gt;
* Réalisation du PCB&lt;br /&gt;
* Mise en œuvre sur notre drone&lt;br /&gt;
&lt;br /&gt;
===Equipe 2===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser la partie contrôleur de vol, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Analyse du projet&lt;br /&gt;
* Choix d'une carte de contrôle&lt;br /&gt;
* Documentation, recherche d'un software&lt;br /&gt;
* Calibration de la carte&lt;br /&gt;
* Réalisation des branchements&lt;br /&gt;
* Mise en application sur la maquette&lt;br /&gt;
* Mise en relation avec la partie commande&lt;br /&gt;
&lt;br /&gt;
==Calendrier prévisionnel==&lt;br /&gt;
Nous avons décidé de réaliser un diagramme de GANTT pour chacun des calendriers prévisionnels (un par équipe). Sur chaque tâche, nous avions prévu un temps de travail en bleu dans les diagrammes et le temps réel consacré en jaune.&lt;br /&gt;
===Equipe 1 : Calendrier prévisionnel pour la gestion de la commande===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:equipe1cal.jpg|500px|center|&amp;quot;Calendrier de l'Equipe 1&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Equipe 2 : Calendrier prévisionnel pour le contrôleur de vol===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:equipe2cal.jpg|500px|center|&amp;quot;Calendrier de l'Equipe 2&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet S6==&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 et 6===&lt;br /&gt;
&lt;br /&gt;
Avant de scinder le groupe en deux équipes, nous avons passés les deux premières séances à évaluer les besoins de conception de notre projet pour pouvoir ensuite réaliser un cahier des charges et établir un calendrier prévisionnel des tâches à effectuer.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:xbeedrone.jpg|200px|thumb|Xbee]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Etant donné que nous avons décidé d'utiliser des modules XBee, nous avons consacrés cette semaine à la documentation, afin de comprendre comment configurer et utiliser ces derniers.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ardupilot28.jpeg|300px|right|thumb|Ardupilot 2.8]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Sur le principe de la semaine 7, nous nous sommes documentés sur les XBee afin de comprendre comment les configurer et les utiliser.&lt;br /&gt;
&lt;br /&gt;
Pour la configuration, nous avons retenu le logiciel XCTU qui est celui recommandé pour configurer les XBee. Cependant, nous gardons quand même de côté Legacy XCTU qui est l'ancienne version XCTU mais qui reste tout de même viable.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Nous avons consacré cette séance de documentation à la recherche d'une carte de contrôle de vol satisfaisant nos exigences. Nous cherchions donc une carte facilement connectable avec un Arduino Uno/Micro. Nous avons opté pour l'Ardupilot 2.8. Il comprend tout le nécessaire pour diriger un drone quadcopter, centrale gyroscopique, accéléromètres, interface de radiocommande. &lt;br /&gt;
Nous avons donc commandé l'Ardupilot via le site Alibaba.com (30€) et nous l'avons reçu trois semaines plus tard.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Après avoir effectués diverses recherches sur les modules XBee et effectué de nombreux tests (XCTU, legacy XCTU), nous avons abandonné l'utilisation du logiciel XCTU, étant donné que nous n'utilisons que deux XBee, nous pouvons les initialiser directement dans le programme avec le programme suivant:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:inixbeedrone.png]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
En attendant la réception du colis de l'Ardupilot, nous nous sommes documentés sur les différents logiciels de contrôle de vol à notre disposition. L'objectif étant de trouver un logiciel compatible avec l'Ardupilot 2.8 et avec suffisamment de documentation et tutoriels d'utilisation. Les deux logiciels qui sont ressortis le plus dans nos recherches sont Mission Planner et APM Planner 2. Ces deux logiciels sont très similaires au niveau de l'interface et des options de calibration de la carte de vol à laquelle ils sont connectés.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:apm20.png|300px|center]][[Fichier:missionplanner.jpg|300px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En connectant l'Ardupilot via un câble USB, le logiciel le reconnait et une démarche de calibration peut être entamée : boussole, accéléromètres, radiocommande, ESC.&lt;br /&gt;
&lt;br /&gt;
===Semaine 10===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur la transmission, la réception et le traitement des trames.&lt;br /&gt;
&lt;br /&gt;
Pour la transmission, nous avons mis en place le système suivant:&lt;br /&gt;
&lt;br /&gt;
*On lit la valeur des potentiomètres&lt;br /&gt;
*On convertit la valeur en une chaîne de caractère et on lui attribue un indice qui est propre à chaque position des joysticks.&lt;br /&gt;
*On envoie la chaîne de caractère par liaison série.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la réception, nous avons mis en place le système suivant:&lt;br /&gt;
&lt;br /&gt;
*On reçoit un tableau de caractère qui contient la consigne entre 0 et 1023 et un indice pour dire à quel joystick et quelle position la consigne correspond.&lt;br /&gt;
*On converti le tableau en entier et à l'aide de la fonction map on adapte la consigne pour qu'elle est une valeur entre 0 et 180.&lt;br /&gt;
*On transmet la consigne à l'ardupilot.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Idem semaine 9.&lt;br /&gt;
&lt;br /&gt;
===Semaine 11===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Débogage de la communication entre les modules XBee et l'ardupilot.&lt;br /&gt;
&lt;br /&gt;
En utilisant deux terminaux, la communication était réalisé entre les deux XBee  cependant une fois branché sur l'ardupilot nous avons eu des difficultés à traiter les trames, du au fait d'une transmission trop rapide.&lt;br /&gt;
&lt;br /&gt;
De plus nous avons passé un certains temps à vouloir utiliser une arduino micro mais avons finalement décidé de laisser tomber, puisque nous n'avons pas réussi à réceptionner les trames XBee.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Idem semaine 9.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Optimisation du format des trames et réglage de la vitesse de transmission.&lt;br /&gt;
&lt;br /&gt;
Passage d'une Arduino UNO à une Arduino Nano pour l'envoie des trames dans l'optique de réaliser un PCB pour la commande.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
A ce stade du projet nous ne pouvions qu'expérimenter les calibrations de la boussole et des accéléromètres de l'Ardupilot car la partie commande n'était pas terminée.&lt;br /&gt;
&lt;br /&gt;
La calibration de la boussole s'effectue en bougeant l'Ardupilot selon tous ces axes pendant une période de temps donnée jusqu'à ce que les informations nécessaires soient récoltées.&lt;br /&gt;
La calibration des accéléromètres s'effectue en positionnant l'Ardupilot dans des positions définies (sur le côté gauche, sur la face avant, etc.). (cliquer sur l'image ci-dessous pour lancer le GIF)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:compasscalib.gif|300px|center]][[Fichier:compasscalib.png|300px|center]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Réglage des trames pour la commande du prototype.&lt;br /&gt;
&lt;br /&gt;
Nous avons rencontré quelques problème de sensibilité au niveau des joysticks et du traitement du signal de commande transmis à l'ardupilot.&lt;br /&gt;
&lt;br /&gt;
En effet, ayant trouvé très peu de documentation sur l'ardupilot, nous avons eu du mal à générer les bons signaux de commande.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes ensuite consacrés à la partie alimentation de l'Ardupilot et du drone. En se documentant sur le site servant de manuel d'utilisation d'Ardupilot et des logiciels Mission Planner et APM Planner 2, nous avons trouvé que l'Ardupilot pouvait être alimenté via les ESC.&lt;br /&gt;
Une batterie LiPo alimente les ESC qui elles-mêmes alimentent l'Ardupilot via les broches Output. L'Ardupilot alimente ensuite l'Arduino qui réceptionne les trames reçues par le récepteur Xbee. Sur les sorties (Output) de l'Ardupilot sont aussi branchés les fils permettant la réception du signal envoyé aux moteurs.&lt;br /&gt;
Ainsi, tous les composants nécessaires au drone sont alimentés.&lt;br /&gt;
&lt;br /&gt;
===Semaine 14===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Conception du PCB pour la commande en essayant de limiter le plus possible les vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pcbdrone.png|400px|PCB]]&lt;br /&gt;
&lt;br /&gt;
Vérification de l'envoie des trames à l'aide de l'ordinateur et test de réception sur l'Ardupilot.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Branchements comme indiqués à la semaine précédente, alimentation et tests de bon fonctionnement des moteurs, Ardupilot et Arduino.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:branchementesc.jpg|300px]][[Fichier:branchementardu.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 15===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Fabrication de la manette&lt;br /&gt;
&lt;br /&gt;
[[Fichier:manettedrone.jpg|400px|PCB]]&lt;br /&gt;
&lt;br /&gt;
Modification de l'envoie des trames. Tests de transmission.&lt;br /&gt;
Implémentation du programme sur le prototype.&lt;br /&gt;
&lt;br /&gt;
Les deux équipes ont passé la semaine à réunir leur travail, nous avons ainsi tous pu réaliser de nombreux tests du prototype, avec réussite, hormis un léger accident qui à entraîné la destruction de deux hélices. &lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
A ce stade, la commande étant terminée et nous avons pu nous lier à l'équipe 1 pour mettre en relation la télécommande et l'Ardupilot. Après avoir utilisé Mission Planner pendant plusieurs semaines, un problème de mise-à-jour du software de l'Ardupilot nous empêchait toujours d'effectuer la calibration de la radiocommande. Nous sommes donc passés sur APM Planner 2 et la mise-à-jour n'était plus demandée, nous avons donc enfin pu terminer l'intégralité de la phase de calibration. Comme expliqué ci-dessus, nous avons effectué de nombreux tests pour atteindre notre objectif.&lt;br /&gt;
&lt;br /&gt;
===Documents Rendus===&lt;br /&gt;
&lt;br /&gt;
Rapport : [[fichier:rapport_groupe_4.pdf]]&lt;br /&gt;
&lt;br /&gt;
==Projet S7==&lt;br /&gt;
&lt;br /&gt;
===De nouveaux objectifs===&lt;br /&gt;
&lt;br /&gt;
Durant le semestre 6, nous avons réussi à concevoir un drone volant fonctionnel régulé à l'aide d'une carte de contrôle OpenSource '''Ardupilot 2.8'''. Concernant la commande, nous avions fait le choix d'utiliser une carte communication Xbee ainsi qu'une Arduino NANO et des joysticks.&lt;br /&gt;
&lt;br /&gt;
Cette année, nous avons décidé de développer plus amplement notre projet et de pratiquement repartir du point de départ. En effet, nos objectifs cette année sont :&lt;br /&gt;
*'''d'utiliser de nouveaux composants dont nous connaissons les propriétés (moteurs, ESCs, etc)'''&lt;br /&gt;
*'''d'utiliser une télécommande de modélisme ainsi qu'un récepteur adapté à des portées plus élevées que celles que permettait l'Xbee'''&lt;br /&gt;
*'''de concevoir notre propre contrôleur de vol'''&lt;br /&gt;
*'''Bonus''' : d'intégrer une régulation GPS et un mode automatique en cas de perte de signal&lt;br /&gt;
&lt;br /&gt;
===Reprise du cahier des charges===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 : Gestion de la commande et initialisation (Richard Simonin &amp;amp; Lukas Fauchois)'''&lt;br /&gt;
&lt;br /&gt;
L'objectif de la nouvelle gestion de la commande est d'utiliser une télécommande de modélisme capable de transmettre les différentes données nécessaires (Throttle, Yaw, Pitch) à un récepteur relié à une Arduino UNO, ce qui nous permettra d'être performant en terme de vitesse et de précision. De plus, cette partie de la conception consiste également à calibrer les quatre ESCs que nous utilisons. &lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 : Contrôleur de vol (Evan Gury &amp;amp; Maxime Claudel)&lt;br /&gt;
&lt;br /&gt;
L'objectif ici est d'implémenter notre propre contrôleur de vol (software et hardware) à l'aide de composants individuels, principalement d'une centrale inertielle 3 axes ainsi que d'un accéléromètre 3 axes.&lt;br /&gt;
&lt;br /&gt;
===Nouveaux choix techniques===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
Pour réaliser la commande du drone, nous avons décidé d'utiliser une télécommande [https://fr.banggood.com/Flysky-FS-i6X-2_4GHz-10CH-AFHDS-2A-RC-Transmitter-With-X6B-i-BUS-Receiver-p-1090406.html?rmmds=myorder&amp;amp;ID=42482530817&amp;amp;cur_warehouse=CN '''Flysky FS-I6X'''] accompagnée de son récepteur '''FS-X6B''' qui possède une portée assez élevée pour la réalisation de notre projet. Ce récepteur sera alors relié à une carte '''Arduino UNO''' (qui servira également au contrôleur de vol).&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
Concernant la réalisation du contrôleur de vol, nous choisissons d'utiliser une centrale inertielle [https://fr.banggood.com/3pcs-6DOF-MPU-6050-3-Axis-Gyro-With-Accelerometer-Sensor-Controller-Module-For-Arduino-p-1430733.html?rmmds=search&amp;amp;cur_warehouse=CN '''MPU6050'''] possédant un accéléromètre 3 axes ainsi qu'un gyroscope 3 axes, ce qui convient parfaitement à l'utilisation que l'on veut en faire. De plus, c'est une centrale qui est documentée et à coût raisonnable, elle dispose de son propre processeur, ce qui réduit considérablement la quantité de calculs à effectuer par notre micro-contrôleur. Nous relierons également cette centrale inertielle à la carte '''Arduino UNO'''.&lt;br /&gt;
&lt;br /&gt;
'''Conception générale du drone :'''&lt;br /&gt;
&lt;br /&gt;
Comme évoqué précédemment, pour le coeur d'une drone, nous utiliserons une carte '''Arduino UNO''' qui possède un nombre suffisant de ports d'interruptions, de ports PWM et d'une puissance de calcul suffisante pour traiter toutes les informations des différents capteurs.&lt;br /&gt;
&lt;br /&gt;
Nous avons également décidé de fabriquer notre propre chassis basé sur le design du précédent et d'utiliser de nouveaux ESCs dédiés spécialement au drone volant ([https://fr.banggood.com/EMAX-BLHeli-Series-6A-12A-20A-30A-ESC-p-963634.html?rmmds=search&amp;amp;ID=45170&amp;amp;cur_warehouse=CN '''EMAX BLHELI SERIES 20A''']). Nous avons également choisi de nouveaux moteurs brushless : les [https://fr.banggood.com/1000KV-Brushless-Motor-3_17mm-Shaft-Electric-Motor-p-1102054.html?rmmds=search&amp;amp;cur_warehouse=CN '''A2212/13T'''].&lt;br /&gt;
&lt;br /&gt;
'''Bilan'''&lt;br /&gt;
*'''Matériel'''&lt;br /&gt;
**Chassis&lt;br /&gt;
**4 ESCs EMAX BLHELI 20A&lt;br /&gt;
**4 moteurs A2212/13T&lt;br /&gt;
**Batterie LI-PO 11,1V - 2700mAh&lt;br /&gt;
**Arduino UNO&lt;br /&gt;
**Télécommande Flysky FS-I6X&lt;br /&gt;
**Récepteur FS-X6B&lt;br /&gt;
**Centrale inertielle MPU6050&lt;br /&gt;
*'''Logiciel'''&lt;br /&gt;
**Arduino&lt;br /&gt;
&lt;br /&gt;
'''Note''' : grâce au travail d'Evan Gury, nous avons pu acquérir tout ce matériel et il a pu concevoir le chassis avant même le commencement du semestre 7, ce qui nous a permis de nous avancer sur le travail à réaliser.&lt;br /&gt;
&lt;br /&gt;
===Liste des tâches à effectuer===&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser la nouvelle gestion de la commande et l'initialisation, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Découverte télécommande Flysky FS-I6X et son récepteur FS-X6B&lt;br /&gt;
* Configurer la télécommande&lt;br /&gt;
* Lecture des joysticks par Arduino&lt;br /&gt;
* Initialiser les extremums des joysticks&lt;br /&gt;
* Optimisation de la programmation&lt;br /&gt;
* Test de transmission sur les ESCs&lt;br /&gt;
* Mise en œuvre sur notre drone&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser le contrôleur de vol, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Découverte du MPU6050&lt;br /&gt;
* Configuration des registres du MPU6050&lt;br /&gt;
* Récupération des mesures angulaires en °/s&lt;br /&gt;
* Intégration des mesures pour récupérer les positions en degrés&lt;br /&gt;
* Calcul de la consigne&lt;br /&gt;
* Calcul de l'erreur&lt;br /&gt;
* Calcul du correcteur&lt;br /&gt;
* Application de la correction aux ESCs&lt;br /&gt;
&lt;br /&gt;
===Semaine 45===&lt;br /&gt;
&lt;br /&gt;
[[Fichier: flyskyFSI6X.jpg|200px|right|thumb|Flysky FS-I6X et FS-X6B]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Lors de la première semaine, nous avons fait le choix d'utiliser un mode de transmission existant et d'abandonner la télécommande conçue au semestre précédent. Nous avons alors choisi d'utiliser la télécommande de modélisme Flysky FS-I6X et son récepteur FS-X6B. &lt;br /&gt;
&lt;br /&gt;
*Nous avons dû dans un premier temps configurer la télécommande et comprendre comment transmettre les informations des deux joysticks.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Nous avons passé la première séance à nous documenter le plus possible sur le MPU6050 qui est le cœur de notre contrôleur de vol.&lt;br /&gt;
*Nous avons ainsi pu trouver de nombreux documents concernant la configuration des différents registre du MPU6050, de manière à avoir une utilisation correspondant au mieux à un drone volant.&lt;br /&gt;
&lt;br /&gt;
===Semaine 46===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Pour la réception des informations et le traitement des données, nous avons branché le récepteur sur une carte Arduino. Deux choix s'offraient à nous, utiliser des broches PWM ou une broche PPM. Le PPM a pour avantage d'utiliser un unique câble, tous les canaux sont transmis à la suite contrairement au PWM, un câble est nécessaire à chaque canal. L'Arduino UNO ne nous limitant pas pour l'utilisation de 1 broche ou 4 broches, nous avons décider d'utiliser le PWM.&lt;br /&gt;
&lt;br /&gt;
*Nous avons programmé notre Arduino UNO afin de récupérer les informations sur nos canaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Nous avons passé tout notre temps à tenter de récuperer les coordonnées YAW-PITCH-ROLL du mpu6050 et ce de la manière la plus rapide possible afin d'optimiser au mieux la régulation.&lt;br /&gt;
&lt;br /&gt;
===Semaine 47===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Nous avons finalisé la conception de notre drone, nous avons finalisé le câblage et ainsi pu faire des tests sur le prototype.&lt;br /&gt;
&lt;br /&gt;
*Pour commander les moteurs, les ESCs sont nécessaires. L'utilisation est plutôt simple car ils s'utilisent comme des servomoteurs, ainsi la bibliothèque ''servo.h'' d'Arduino nous a permis de les initialiser et donc de faire tourner les moteurs.&lt;br /&gt;
&lt;br /&gt;
*Le projet avance vite et nous avons beaucoup d'ambition et d'idées pour la suite.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Même si le MPU6050 est très bien documenté nous avons passé de nombreuses heures a tenter de récupérer les coordonnées YAW, PITCH et ROLL pour notre drone mais sans succès. Le principal problème était que deux des trois MPUs que nous avions commandés sur Banggood ne marchaient pas correctement.&lt;br /&gt;
*Au final nous arrivons désormais à récupérer ces informations suffisamment vite pour pouvoir espérer effectuer une correction correcte.&lt;br /&gt;
&lt;br /&gt;
===Semaine 48===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Correction du calibrage des ESCs à travers l'Arduino.&lt;br /&gt;
*Début de la commande des moteurs grâce à notre télécommande Flysky. Cependant, nous avons rencontré quelques soucis dans notre programme, il nous faut alors revoir ce code Arduino pour réussir cette étape.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Mise en commun de la partie programmation Arduino avec l'équipe 1. &lt;br /&gt;
*Première prise de renseignements sur les GPS dans l'optique d'en utiliser un pour commander le drone s'il nous reste du temps en fin de projet.&lt;br /&gt;
&lt;br /&gt;
===Documents Rendus===&lt;br /&gt;
&lt;br /&gt;
Soutenance : [[fichier:soutenance_S7_P4.pdf]]&lt;br /&gt;
&lt;br /&gt;
==Projet S8==&lt;br /&gt;
&lt;br /&gt;
[[Fichier: pcb_drone_p4.png|400px|right|thumb|PCB réalisé sur Altium]]&lt;br /&gt;
&lt;br /&gt;
===Liste des tâches à effectuer===&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Après analyse du travail réalisé au S7, nous devons désormais réaliser les tâches suivantes :&lt;br /&gt;
*Conception d'un PCB (pour l'ensemble du système)&lt;br /&gt;
*Optimiser la distribution de la puissance (esthétiquement)&lt;br /&gt;
*Finition de la partie communication envoie/reception de trame validé&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Après analyse du travail réalisé au S7, nous devons désormais réaliser les tâches suivantes :&lt;br /&gt;
*Mise en place et réglage de la régulation PID: &lt;br /&gt;
**Calcul de la consigne  &lt;br /&gt;
**Calcul des erreurs  &lt;br /&gt;
**Calcul des consignes à appliquer aux moteurs après correction&lt;br /&gt;
**Application des consignes&lt;br /&gt;
&lt;br /&gt;
*Implémenter un système de guidage GPS (à voir avec le temps dont on disposera)&lt;br /&gt;
&lt;br /&gt;
===Semaine 3===&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Réflexion et réalisation du PCB sur ''Altium Designer''&lt;br /&gt;
*Mise en relation des différentes variables de notre programme avec celui de l'équipe 2&lt;br /&gt;
*Choix et commande d'un distributeur de puissance (PDB) pour câbler plus proprement les ESCs&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Finalisation du programme, y compris la partie régulation PID&lt;br /&gt;
*Reste encore à régler les coefficients du PID&lt;br /&gt;
*Mise en relation du programme avec l'équipe 1&lt;br /&gt;
&lt;br /&gt;
===Semaine 4===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
* Finition du PCB sur altium et création du même PCB sur Fritzing.&lt;br /&gt;
* Reprise de l'ancienne maquette pour effectuer la régulation&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Réalisation d'un programme Arduino permettant de lire la valeur de 3 potentiomètres afin de pouvoir régler les coefficients du PID.&lt;br /&gt;
*Mise en place d'une maquette à base de potentiomètres et d'interrupteurs pour régler le PID.&lt;br /&gt;
*Possibilité de faire fonctionner le drone en mode normal ou en mode réglage PID par simple utilisation d'un interrupteur.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5===&lt;br /&gt;
&lt;br /&gt;
[[Fichier: testregubar.mp4|350px|right|thumb|Essai de calibration sur deux axes avec le premier dispositif (drone fixé par le haut et le bas grâce à des câbles)]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Impression du PCB et branchement sur la maquette (2)&lt;br /&gt;
*Début des tests de régulation en mode suspendu (sans grande réussite pour le moment)&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Tests de régulation en mode suspendu (avec l'équipe 1)&lt;br /&gt;
*Début de conception d'un PCB permettant de fixer l'ensemble des composants (les nombreux fils commencent à devenir trop gênants pour les tests)&lt;br /&gt;
&lt;br /&gt;
===Semaine 6===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Modification du programme afin de détecter l'arrêt du microcontrôleur Atemega 328P. &lt;br /&gt;
* Resolution de l'erreur lié à la carte et au programme, suspicion de l'ISR mais le problème était du à une division par 0 (Probleme de maquette avec le MPU 6050).  &lt;br /&gt;
&lt;br /&gt;
[[Fichier: calibration-un-axe.mp4|250px|right|thumb|Essai de calibration sur un axe avec le deuxième dispositif]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Mise en place de support en PVC (voir photo) afin de ne laisser au drone qu'un seul degrés de liberté et ainsi permettre de le réguler plus facilement, suite à l'échec de la régulation suspendue.&lt;br /&gt;
*Problème sur un moteur ou un ESC de notre nouveau drone, un des moteurs ne tourne pas lorsque nous montons l'hélice dessus.&lt;br /&gt;
*Problème sur un moteur du nouveau drone qui se coupe totalement à une consigne bien précise et redémarre ensuite.&lt;br /&gt;
&lt;br /&gt;
[[Fichier: testesc.jpg|400px|center|thumb|Test des valeurs de courant reçues par les ESC]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 : coupure pédagogique===&lt;br /&gt;
&lt;br /&gt;
===Semaine 8===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 &amp;amp; 2 :'''&lt;br /&gt;
&lt;br /&gt;
* Lors de cette semaine, nous nous sommes penchés sur les problèmes physiques rencontrés précédemment. &lt;br /&gt;
Pour cela nous avons utilisé un oscilloscope équipé d'une sonde afin de relever les valeurs clés de tension et de courant.&lt;br /&gt;
Nous utilisons un programme qui envoie la même consigne aux 4 moteurs afin de comparer les vitesses de rotation.&lt;br /&gt;
Nous nous sommes aperçu que sur la maquette n°1, les 4 moteurs fonctionnent correctement mais qu'un ESC (Contrôleur moteur) est défaillant.&lt;br /&gt;
Sur la maquette n°2, un moteur et un ESC sont obsolètes. &lt;br /&gt;
Nous avons essayé de mixer les deux maquettes pour faire fonctionner un drone.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 &amp;amp; 2 :'''&lt;br /&gt;
&lt;br /&gt;
* Commande et attente des ESC pour finaliser la régulation.&lt;br /&gt;
* Création d'un boitier PID pour simplifier la régulation. Ce boiter va nous permettre de modifier facilement les valeurs des coefficients de notre PID numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Nous avons créé un programme, permettant de prendre en entrée le boitier PID, et de lire la valeur des potentiomètres pour modifier en instantané les valeurs du PID numérique.&lt;br /&gt;
*Le boitier comporte 3 potentiomètres, un pour chaque la valeur du I, la valeur du P et la valeur du D.&lt;br /&gt;
*Les valeurs du PID varient entre des plages bien précises: P: I: D:&lt;br /&gt;
&lt;br /&gt;
===Semaine 10===&lt;br /&gt;
&lt;br /&gt;
Re-structuration du projet suite aux événements du COVID-19:&lt;br /&gt;
&lt;br /&gt;
* Régulation sur deux ESCs : Lukas (dispose de tout le matériel)&lt;br /&gt;
* Création application mobile, communication entre téléphone et le drone. (Richard et Evan)&lt;br /&gt;
* Simuler le drone en C. (Maxime)&lt;br /&gt;
&lt;br /&gt;
===Semaine 11===&lt;br /&gt;
&lt;br /&gt;
'''Régulation avec 2 ESCs (Lukas) :'''&lt;br /&gt;
&lt;br /&gt;
* Test du boîtier permettant le contrôle des différents coefficients du PID. En effet, lors de sa conception, un faux contact avait été constaté : problème résolu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Pid_controller_P4.jpg|300px|center|thumb|Boîtier de contrôle du PID]]&lt;br /&gt;
&lt;br /&gt;
'''Application mobile :'''&lt;br /&gt;
&lt;br /&gt;
* Début de l'apprentissage de la création d'une application Android à l'aide de ANDROID STUDIO&lt;br /&gt;
&lt;br /&gt;
===Semaine 12===&lt;br /&gt;
&lt;br /&gt;
[[Fichier: regulation_4_esc.mp4|300px|left|thumb|Régulation presque adaptée sur 4 ESCs]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Application mobile :'''&lt;br /&gt;
*Réalisation d'une application Android, sous Android Studio, permettant de simuler une commande afin de piloter le drone.&lt;br /&gt;
*Les joysticks envoient une consigne variant de 1000 à 2000 pour le throttle et les axes Yaw, Pitch, Roll, valeurs attendues par le drone afin de générer les signaux PWM pour les ESCs.&lt;br /&gt;
*L'interface de l'application est terminée, il reste désormais à programmer la partie concernant l'ESP-32.&lt;br /&gt;
[[Fichier: applicationAndroid.mp4|520px|center|thumb|Présentation de l'application]]&lt;br /&gt;
&lt;br /&gt;
'''Régulation avec 2 ESCs'''&lt;br /&gt;
*Test de régulation sur le banc d'essai avec les valeurs du PID testée sur les derniers tests à 4 ESCs : vidéo ci-contre&lt;br /&gt;
*Test du programme utilisant le boitier PID permettant de modifier nos valeurs en direct&lt;br /&gt;
&lt;br /&gt;
===Semaine 13===&lt;br /&gt;
&lt;br /&gt;
* Reception d'un ESP32 et debut de la programmation. Création d'un Serveur WIFI, il reste à faire communiquer l'application et l'ESP32.&lt;br /&gt;
&lt;br /&gt;
* Modification du code pour réguler deux moteurs&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 et 15 : coupure pédagogique===&lt;br /&gt;
&lt;br /&gt;
* Communication telephone-ESP32  fonctionnelle à partir d'un serveur WEB. Communication de l'application vers ESP32 impossible. Nous n'avons pas réussi à nous connecter à la socket créé sur l'esp32.&lt;br /&gt;
&lt;br /&gt;
* La communication entre l'application mobile et l'ESP32 est fonctionnelle, nous envoyons ainsi un message formé des consignes sur la socket.&lt;br /&gt;
&lt;br /&gt;
'''Régulation avec deux moteurs'''&lt;br /&gt;
&lt;br /&gt;
Après avoir constaté que la fonction compensateBatteryDrop() était devenue obsolète en raison de l'ajout de notre PDB (Power Distributor Board), nous avons décidé de l'enlever de notre boucle (void loop()) améliorer les performances de notre programme. De plus, un pin était utilisé et faussait les calculs. Cette suppression nous a permis, effectivement, de constater une nette amélioration dans la gestion de la régulation.&lt;br /&gt;
&lt;br /&gt;
Lukas a alors pu réguler le drone avec deux moteurs sur un axe (Roll). Cette régulation a été menée à bien et le drone se stabilise sur un axe jusqu'à ce que nous soyons à court de batterie (nous nous rechargions à Robotech) avec les valeurs suivantes :&lt;br /&gt;
*kp Roll = 1.25  ki Roll = 0.05  kd Roll = 22.00&lt;br /&gt;
&lt;br /&gt;
L'objectif maintenant est, dès qu'on le pourra, après la fin du semestre de se réunir, d'installer les 4 nouveaux ESC et d'effectuer une régulation complète afin de finir complètement la conception de notre drone.&lt;br /&gt;
&lt;br /&gt;
===Documents Rendus===&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2018/2020_P4&amp;diff=84609</id>
		<title>IMA3/IMA4 2018/2020 P4</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2018/2020_P4&amp;diff=84609"/>
				<updated>2020-05-03T12:21:36Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Semaine 4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;include nopre noesc src=&amp;quot;/home/pedago/pimasc/include/video-ConstructionDroneIMA32018-iframe.html&amp;quot; /&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre du projet IMA3/4, nous avons choisi le sujet P4 : '''Construction d'un drone volant'''. Notre groupe se compose de Maxime CLAUDEL, Lukas FAUCHOIS, Evan GURY et Richard Simonin.&lt;br /&gt;
Nous avions dans un premier temps décidé de réaliser notre projet autour d'un drone servant à la livraison de petit colis, cependant dans un souci concernant la matériel mis à notre disposition et de budget, nous avons finalement opté pour un drone &amp;quot;loisir&amp;quot;.&lt;br /&gt;
Ce dernier sera destiné à un public amateur, dans un but d'apprentissage et/ou d'amusement et sera ainsi plus en adéquation avec nos contraintes et compétences, de plus amples informations sont décrites ci-dessous dans la partie '''Objectifs''' de notre présentation.&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
A terme, l'objectif principal de ce projet est de concevoir et construire entièrement un drone &amp;quot;made in Polytech Lille&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nous allons alors répartir notre travail en deux sessions, une première réalisée en IMA (S6) et une seconde en IMA4.&lt;br /&gt;
&lt;br /&gt;
Pour la fin de cette première session de projet, nous avons pour objectif de faire voler notre drone. Pour ce faire, nous n'avons évidemment pas le temps de nous occuper de la partie concernant le vol nous-mêmes, c'est pour quoi nous avons opté pour l'utilisation d'un contrôleur de vol n'ayant qu'à être configuré.&lt;br /&gt;
&lt;br /&gt;
Parallèlement à cela, nous comptons réaliser nous-mêmes la commande permettant de communiquer avec ce dernier pendant qu'une autre partie des membres du projet s’attellera à la partie mécanique et électrique du drone.&lt;br /&gt;
&lt;br /&gt;
Ce faisant et si tout se passe bien, nous pourrons avoir pour débuter l'année prochaine une base solide pour concevoir nous-mêmes notre contrôleur de vol. Ce qui nous amène à notre second point, puisque nous comptons dans un second temps réaliser notre propre contrôleur de vol, une fois le premier objectif atteint.&lt;br /&gt;
&lt;br /&gt;
=Analyse du projet=&lt;br /&gt;
&lt;br /&gt;
==Positionnement par rapport à l'existant==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:parrot.jpg|right|thumb|PARROT AR.DRONE 2.0]]&lt;br /&gt;
[[Fichier:udi.jpg|right|thumb|UDI U818S]]&lt;br /&gt;
&lt;br /&gt;
===Analyse du premier concurrent : PARROT AR.DRONE 2.0===&lt;br /&gt;
&lt;br /&gt;
Le [https://www.parrot.com/fr/drones/parrot-ardrone-20-elite-edition PARROT AR.DRONE 2.0], tout comme le notre, est destiné à un usage ludique. En dehors de la camera que nous n'envisageons pas d'intégrer à notre drone pour le moment, il dispose de toutes les caractéristiques que nous souhaiterions obtenir. A savoir une portée d'environ 100m, une autonomie de plus de 10min et une vitesse moyenne d'environ 20 km/h pour un prix avoisinant les 100 euros.&lt;br /&gt;
&lt;br /&gt;
Notre avantage peut se jouer sur la camera, en effet, en enlevant cette dernière nous pouvons réaliser des économies. De plus, si une personne recherche un drone simplement pour prendre du plaisir à le faire voler, il ne souhaitera pas forcément gaspiller son argent dans une camera qu'il n'aurait surement de base pas voulu.&lt;br /&gt;
&lt;br /&gt;
===Analyse du second concurrent : UDI U818S===&lt;br /&gt;
&lt;br /&gt;
Fabriqué par la marque UDI, le [https://www.maisondudrone.com/prod/udi-u818s-avec-camera-hd-2-0mp-blanc-1400.html UDI U818S] est un drone au caractéristiques similaires au précédent, à l'exception de la camera.&lt;br /&gt;
En effet, cette fois nous sommes face à un concurrent qui tout comme nous, propose simplement la fonctionnalité de base d'un drone, à savoir voler et cela se fait ressentir sur le prix puisque nous passons sur un prix d'environ 50 euros.&lt;br /&gt;
Face à un concurrent proposant un produit similaire au notre et à un prix au plus bas pour ces caractéristiques, difficile de faire mieux sur le plan technique. Peut être serait il alors plus judicieux de proposer un produit plus haute gamme, plus chère, mais destiné à un public désireux de s'amuser avec un produit de qualité.&lt;br /&gt;
&lt;br /&gt;
==Scénario d'usage du produit ou du concept envisagé==&lt;br /&gt;
&lt;br /&gt;
'''A qui notre drone peut-il servir ?'''&lt;br /&gt;
&lt;br /&gt;
Le drone &amp;quot;made in Polytech Lille&amp;quot; s'adresse à tout public n'ayant que pour objectif l'amusement''&lt;br /&gt;
&lt;br /&gt;
Toute personne souhaitant débuter avec un drone de qualité, sans s'encombrer de fonctionnalité ne s'avérant pas utiles peut être amenées a utiliser notre drone.&lt;br /&gt;
&lt;br /&gt;
'''Pour quel type d'utilisation ?'''&lt;br /&gt;
&lt;br /&gt;
Nombre de notre génération ont déjà reçu comme cadeau une voiture RC. Cette dernière n'avait que pour objectif de rouler à toute vitesse pour nous satisfaire. Nul besoin d'embarquer des caméras, stabilisateurs et nombres d'autres gadgets inutile à la vocation initiale de notre voiture, rouler. &lt;br /&gt;
&lt;br /&gt;
Avec notre drone, nous voulons remettre cela en avant, le simple plaisir de piloter une voiture RC appliqué aux drones. Alors enfant, adultes et nostalgiques pourront par le biais de notre produit découvrir ou redécouvrir le plaisir de piloter un engin motorisé, qui plus est cette-ci fois dans les airs.&lt;br /&gt;
&lt;br /&gt;
==Réponse à la question difficile==&lt;br /&gt;
&lt;br /&gt;
'''Qu'en est-il du dimensionnement des composants pour permettre à votre drone de porter une telle charge ?'''&lt;br /&gt;
&lt;br /&gt;
Nos contraintes et objectif ayant totalement changé, la question ne se pose plus vraiment. En effet nous avons suites à notre présentation réalisé des calculs en terme de puissance et nous nous sommes très vite rendu compte de l'impossibilité à réaliser notre projet.&lt;br /&gt;
&lt;br /&gt;
En effet, au vu de notre budget, l'achat d'un seul des quatre moteurs nécessaire à l'atteinte des chiffres que nous avions avancés était déjà impossible. Nous avons donc totalement changé d'objectif et avons récupéré du matériel déjà présent à Polytech, à savoir quatre moteurs et leur ESC. Nous avons pris le problème à l'envers et avons réfléchi à ce que nous pouvions réaliser avec le budget et le matériel à disposition.&lt;br /&gt;
&lt;br /&gt;
C'est de cette manière que nous avons eu l'idée d'un drone &amp;quot;loisir&amp;quot;, effaçant ainsi la question de la charge.&lt;br /&gt;
&lt;br /&gt;
==Bibliographie et webographie==&lt;br /&gt;
&lt;br /&gt;
===Arducopter===&lt;br /&gt;
&lt;br /&gt;
 https://www.digi.com/resources/documentation/digidocs/PDFs/90000976.pdf&lt;br /&gt;
 http://jeromeabel.net/wiki/xbee/xbee-arduino.pdf&lt;br /&gt;
 https://www.digi.com/resources/documentation/digidocs/pdfs/90001942-13.pdf&lt;br /&gt;
 https://www.arduino.cc/en/Reference/Servo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Manuel d'utilisation&lt;br /&gt;
 http://ardupilot.org/copter/index.html&lt;br /&gt;
&lt;br /&gt;
* Tutoriels vidéos&lt;br /&gt;
 Première installation et setup : https://www.youtube.com/watch?v=30cCs4aHdB0&amp;amp;t=754s&lt;br /&gt;
 Alimentation de l'Ardupilot : https://www.youtube.com/watch?v=TS4OWAcfAQY&amp;amp;t=270s&lt;br /&gt;
 Calibration des ESC : https://youtu.be/gYoknRObfOg&lt;br /&gt;
&lt;br /&gt;
=Préparation du projet=&lt;br /&gt;
&lt;br /&gt;
==Cahier des charges du groupe==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Diagramme bête à cornes'''&lt;br /&gt;
&lt;br /&gt;
Le diagramme bête à cornes nous permet de faire une analyse fonctionnelle du besoin. Notre drone permet à utilisateur de découvrir l'aéronautique à travers une activité ludique à l'aide d'une télécommande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bete_a_cornes.png | center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Diagramme en pieuvre'''&lt;br /&gt;
&lt;br /&gt;
Le diagramme en pieuvre permet quant à lui de répertorier toutes les fonctions (principales et de service) et d'analyser l'importance des besoins de notre projet&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pieuvredrone.png | center]]&lt;br /&gt;
&lt;br /&gt;
'''Tableau de fonctions'''&lt;br /&gt;
&lt;br /&gt;
Le tableau ci-dessous liste les fonctions principales (FP) et les fonctions contraintes (FC), dans l'orde d'importance, les accompagnant d'une petite description.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tableau_fonctions.jpeg | 500px | center]]&lt;br /&gt;
&lt;br /&gt;
==Cahier des charges des équipes==&lt;br /&gt;
===Equipe 1 : Gestion de la commande (Evan Gury et Richard Simonin)===&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie, est de créer une télécommande ainsi que le récepteur. Nous devons lire les valeurs des potentiomètres, créer des trames, envoyer les trames et analyser les trames reçus. Notre système doit être performant en matière de vitesse ainsi qu'en précision.&lt;br /&gt;
&lt;br /&gt;
===Equipe 2 : Contrôleur de vol (Maxime Claudel et Lukas Fauchois)===&lt;br /&gt;
&lt;br /&gt;
L'objectif de l'équipe est d'utiliser une carte de contrôle pouvant être liée à un logiciel de contrôle de vol. Etant donné notre projet, la carte doit respecter certaines contraintes : être adaptée à un drone à quatre hélices (quadcopter), fonctionner sur batterie (car positionnée sur le chassis du drone), être déjà programmée et relativement simple d'utilisation. Le logiciel doit quant à lui nous permettre de gérer le vol du drone et de calibrer les commandes.&lt;br /&gt;
&lt;br /&gt;
==Choix techniques : matériel et logiciel==&lt;br /&gt;
===Equipe 1===&lt;br /&gt;
&lt;br /&gt;
'''Émetteur'''&lt;br /&gt;
&lt;br /&gt;
Pour la réalisation de l'émetteur, nous avons choisi de travailler avec une Arduino ainsi que '''deux joysticks''' et un '''émetteur Xbee'''. Nous voulons une télécommande petite c'est pourquoi nous avons pris avec une '''Arduino NANO'''. Le drone a besoin de deux joysticks pour être dirigé selon 3 axes.&lt;br /&gt;
&lt;br /&gt;
'''Récepteur'''&lt;br /&gt;
&lt;br /&gt;
Pour la réalisation du récepteur, qui sera situé sur le drone nous avons commencé par utiliser une '''Arduino UNO''' mais nous souhaitons changer pour une NANO afin d'optimiser le poids ainsi que l'espace. Nous avons aussi besoin d'un '''récepteur Xbee''' afin de recevoir les trames.&lt;br /&gt;
&lt;br /&gt;
===Equipe 2===&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi pour notre carte de contrôle un '''Ardupilot 2.8''', son prix est raisonnable (une trentaine d'euros) et nous trouvons beaucoup de tutoriels l'utilisant sur YouTube.&lt;br /&gt;
&lt;br /&gt;
Pour le logiciel, deux choix relativement similaires s'offraient à nous : Mission Planner ou APM Planner. Les deux logiciels ont à peu près la même interface et permettent tous les deux d'effectuer les mêmes étapes de calibrage de l'Ardupilot et des commandes avant le premier vol.&lt;br /&gt;
&lt;br /&gt;
Nous avons d'abord commencé sur Mission Planner mais des problèmes de mises à jour du firmware de l'Ardupilot nous ont empêché de calibrer les '''ESC du drone'''. Nous sommes donc ensuite passés sur '''APM Planner''' car il permet d'éviter ce problème de mises à jour.&lt;br /&gt;
&lt;br /&gt;
===Bilan===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:materieldrone.jpg|right|thumb|Matériel nécessaire à la conception]]&lt;br /&gt;
&lt;br /&gt;
* '''Matériel''' :&lt;br /&gt;
**2 joysticks&lt;br /&gt;
**Emetteur Xbee&lt;br /&gt;
**Récepteur Xbee&lt;br /&gt;
**Arduino NANO&lt;br /&gt;
**Arduino UNO&lt;br /&gt;
**Ardupilot 2.8&lt;br /&gt;
**Câblage&lt;br /&gt;
&lt;br /&gt;
* '''Logiciels''' :&lt;br /&gt;
**Arduino&lt;br /&gt;
**Mission Planner&lt;br /&gt;
**APM Planner 2.0&lt;br /&gt;
&lt;br /&gt;
==Liste des tâches à effectuer==&lt;br /&gt;
===Equipe 1===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser la partie gestion de la commande, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Analyse du projet&lt;br /&gt;
* Découverte Xbee&lt;br /&gt;
* Prise en main Xbee&lt;br /&gt;
* Envoi de trames&lt;br /&gt;
* Réception de trames&lt;br /&gt;
* Optimisation de la programmation&lt;br /&gt;
* Test sur maquette&lt;br /&gt;
* Réalisation du PCB&lt;br /&gt;
* Mise en œuvre sur notre drone&lt;br /&gt;
&lt;br /&gt;
===Equipe 2===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser la partie contrôleur de vol, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Analyse du projet&lt;br /&gt;
* Choix d'une carte de contrôle&lt;br /&gt;
* Documentation, recherche d'un software&lt;br /&gt;
* Calibration de la carte&lt;br /&gt;
* Réalisation des branchements&lt;br /&gt;
* Mise en application sur la maquette&lt;br /&gt;
* Mise en relation avec la partie commande&lt;br /&gt;
&lt;br /&gt;
==Calendrier prévisionnel==&lt;br /&gt;
Nous avons décidé de réaliser un diagramme de GANTT pour chacun des calendriers prévisionnels (un par équipe). Sur chaque tâche, nous avions prévu un temps de travail en bleu dans les diagrammes et le temps réel consacré en jaune.&lt;br /&gt;
===Equipe 1 : Calendrier prévisionnel pour la gestion de la commande===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:equipe1cal.jpg|500px|center|&amp;quot;Calendrier de l'Equipe 1&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Equipe 2 : Calendrier prévisionnel pour le contrôleur de vol===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:equipe2cal.jpg|500px|center|&amp;quot;Calendrier de l'Equipe 2&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet S6==&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 et 6===&lt;br /&gt;
&lt;br /&gt;
Avant de scinder le groupe en deux équipes, nous avons passés les deux premières séances à évaluer les besoins de conception de notre projet pour pouvoir ensuite réaliser un cahier des charges et établir un calendrier prévisionnel des tâches à effectuer.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:xbeedrone.jpg|200px|thumb|Xbee]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Etant donné que nous avons décidé d'utiliser des modules XBee, nous avons consacrés cette semaine à la documentation, afin de comprendre comment configurer et utiliser ces derniers.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ardupilot28.jpeg|300px|right|thumb|Ardupilot 2.8]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Sur le principe de la semaine 7, nous nous sommes documentés sur les XBee afin de comprendre comment les configurer et les utiliser.&lt;br /&gt;
&lt;br /&gt;
Pour la configuration, nous avons retenu le logiciel XCTU qui est celui recommandé pour configurer les XBee. Cependant, nous gardons quand même de côté Legacy XCTU qui est l'ancienne version XCTU mais qui reste tout de même viable.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Nous avons consacré cette séance de documentation à la recherche d'une carte de contrôle de vol satisfaisant nos exigences. Nous cherchions donc une carte facilement connectable avec un Arduino Uno/Micro. Nous avons opté pour l'Ardupilot 2.8. Il comprend tout le nécessaire pour diriger un drone quadcopter, centrale gyroscopique, accéléromètres, interface de radiocommande. &lt;br /&gt;
Nous avons donc commandé l'Ardupilot via le site Alibaba.com (30€) et nous l'avons reçu trois semaines plus tard.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Après avoir effectués diverses recherches sur les modules XBee et effectué de nombreux tests (XCTU, legacy XCTU), nous avons abandonné l'utilisation du logiciel XCTU, étant donné que nous n'utilisons que deux XBee, nous pouvons les initialiser directement dans le programme avec le programme suivant:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:inixbeedrone.png]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
En attendant la réception du colis de l'Ardupilot, nous nous sommes documentés sur les différents logiciels de contrôle de vol à notre disposition. L'objectif étant de trouver un logiciel compatible avec l'Ardupilot 2.8 et avec suffisamment de documentation et tutoriels d'utilisation. Les deux logiciels qui sont ressortis le plus dans nos recherches sont Mission Planner et APM Planner 2. Ces deux logiciels sont très similaires au niveau de l'interface et des options de calibration de la carte de vol à laquelle ils sont connectés.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:apm20.png|300px|center]][[Fichier:missionplanner.jpg|300px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En connectant l'Ardupilot via un câble USB, le logiciel le reconnait et une démarche de calibration peut être entamée : boussole, accéléromètres, radiocommande, ESC.&lt;br /&gt;
&lt;br /&gt;
===Semaine 10===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur la transmission, la réception et le traitement des trames.&lt;br /&gt;
&lt;br /&gt;
Pour la transmission, nous avons mis en place le système suivant:&lt;br /&gt;
&lt;br /&gt;
*On lit la valeur des potentiomètres&lt;br /&gt;
*On convertit la valeur en une chaîne de caractère et on lui attribue un indice qui est propre à chaque position des joysticks.&lt;br /&gt;
*On envoie la chaîne de caractère par liaison série.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la réception, nous avons mis en place le système suivant:&lt;br /&gt;
&lt;br /&gt;
*On reçoit un tableau de caractère qui contient la consigne entre 0 et 1023 et un indice pour dire à quel joystick et quelle position la consigne correspond.&lt;br /&gt;
*On converti le tableau en entier et à l'aide de la fonction map on adapte la consigne pour qu'elle est une valeur entre 0 et 180.&lt;br /&gt;
*On transmet la consigne à l'ardupilot.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Idem semaine 9.&lt;br /&gt;
&lt;br /&gt;
===Semaine 11===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Débogage de la communication entre les modules XBee et l'ardupilot.&lt;br /&gt;
&lt;br /&gt;
En utilisant deux terminaux, la communication était réalisé entre les deux XBee  cependant une fois branché sur l'ardupilot nous avons eu des difficultés à traiter les trames, du au fait d'une transmission trop rapide.&lt;br /&gt;
&lt;br /&gt;
De plus nous avons passé un certains temps à vouloir utiliser une arduino micro mais avons finalement décidé de laisser tomber, puisque nous n'avons pas réussi à réceptionner les trames XBee.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Idem semaine 9.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Optimisation du format des trames et réglage de la vitesse de transmission.&lt;br /&gt;
&lt;br /&gt;
Passage d'une Arduino UNO à une Arduino Nano pour l'envoie des trames dans l'optique de réaliser un PCB pour la commande.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
A ce stade du projet nous ne pouvions qu'expérimenter les calibrations de la boussole et des accéléromètres de l'Ardupilot car la partie commande n'était pas terminée.&lt;br /&gt;
&lt;br /&gt;
La calibration de la boussole s'effectue en bougeant l'Ardupilot selon tous ces axes pendant une période de temps donnée jusqu'à ce que les informations nécessaires soient récoltées.&lt;br /&gt;
La calibration des accéléromètres s'effectue en positionnant l'Ardupilot dans des positions définies (sur le côté gauche, sur la face avant, etc.). (cliquer sur l'image ci-dessous pour lancer le GIF)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:compasscalib.gif|300px|center]][[Fichier:compasscalib.png|300px|center]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Réglage des trames pour la commande du prototype.&lt;br /&gt;
&lt;br /&gt;
Nous avons rencontré quelques problème de sensibilité au niveau des joysticks et du traitement du signal de commande transmis à l'ardupilot.&lt;br /&gt;
&lt;br /&gt;
En effet, ayant trouvé très peu de documentation sur l'ardupilot, nous avons eu du mal à générer les bons signaux de commande.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes ensuite consacrés à la partie alimentation de l'Ardupilot et du drone. En se documentant sur le site servant de manuel d'utilisation d'Ardupilot et des logiciels Mission Planner et APM Planner 2, nous avons trouvé que l'Ardupilot pouvait être alimenté via les ESC.&lt;br /&gt;
Une batterie LiPo alimente les ESC qui elles-mêmes alimentent l'Ardupilot via les broches Output. L'Ardupilot alimente ensuite l'Arduino qui réceptionne les trames reçues par le récepteur Xbee. Sur les sorties (Output) de l'Ardupilot sont aussi branchés les fils permettant la réception du signal envoyé aux moteurs.&lt;br /&gt;
Ainsi, tous les composants nécessaires au drone sont alimentés.&lt;br /&gt;
&lt;br /&gt;
===Semaine 14===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Conception du PCB pour la commande en essayant de limiter le plus possible les vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pcbdrone.png|400px|PCB]]&lt;br /&gt;
&lt;br /&gt;
Vérification de l'envoie des trames à l'aide de l'ordinateur et test de réception sur l'Ardupilot.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Branchements comme indiqués à la semaine précédente, alimentation et tests de bon fonctionnement des moteurs, Ardupilot et Arduino.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:branchementesc.jpg|300px]][[Fichier:branchementardu.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 15===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Fabrication de la manette&lt;br /&gt;
&lt;br /&gt;
[[Fichier:manettedrone.jpg|400px|PCB]]&lt;br /&gt;
&lt;br /&gt;
Modification de l'envoie des trames. Tests de transmission.&lt;br /&gt;
Implémentation du programme sur le prototype.&lt;br /&gt;
&lt;br /&gt;
Les deux équipes ont passé la semaine à réunir leur travail, nous avons ainsi tous pu réaliser de nombreux tests du prototype, avec réussite, hormis un léger accident qui à entraîné la destruction de deux hélices. &lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
A ce stade, la commande étant terminée et nous avons pu nous lier à l'équipe 1 pour mettre en relation la télécommande et l'Ardupilot. Après avoir utilisé Mission Planner pendant plusieurs semaines, un problème de mise-à-jour du software de l'Ardupilot nous empêchait toujours d'effectuer la calibration de la radiocommande. Nous sommes donc passés sur APM Planner 2 et la mise-à-jour n'était plus demandée, nous avons donc enfin pu terminer l'intégralité de la phase de calibration. Comme expliqué ci-dessus, nous avons effectué de nombreux tests pour atteindre notre objectif.&lt;br /&gt;
&lt;br /&gt;
===Documents Rendus===&lt;br /&gt;
&lt;br /&gt;
Rapport : [[fichier:rapport_groupe_4.pdf]]&lt;br /&gt;
&lt;br /&gt;
==Projet S7==&lt;br /&gt;
&lt;br /&gt;
===De nouveaux objectifs===&lt;br /&gt;
&lt;br /&gt;
Durant le semestre 6, nous avons réussi à concevoir un drone volant fonctionnel régulé à l'aide d'une carte de contrôle OpenSource '''Ardupilot 2.8'''. Concernant la commande, nous avions fait le choix d'utiliser une carte communication Xbee ainsi qu'une Arduino NANO et des joysticks.&lt;br /&gt;
&lt;br /&gt;
Cette année, nous avons décidé de développer plus amplement notre projet et de pratiquement repartir du point de départ. En effet, nos objectifs cette année sont :&lt;br /&gt;
*'''d'utiliser de nouveaux composants dont nous connaissons les propriétés (moteurs, ESCs, etc)'''&lt;br /&gt;
*'''d'utiliser une télécommande de modélisme ainsi qu'un récepteur adapté à des portées plus élevées que celles que permettait l'Xbee'''&lt;br /&gt;
*'''de concevoir notre propre contrôleur de vol'''&lt;br /&gt;
*'''Bonus''' : d'intégrer une régulation GPS et un mode automatique en cas de perte de signal&lt;br /&gt;
&lt;br /&gt;
===Reprise du cahier des charges===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 : Gestion de la commande et initialisation (Richard Simonin &amp;amp; Lukas Fauchois)'''&lt;br /&gt;
&lt;br /&gt;
L'objectif de la nouvelle gestion de la commande est d'utiliser une télécommande de modélisme capable de transmettre les différentes données nécessaires (Throttle, Yaw, Pitch) à un récepteur relié à une Arduino UNO, ce qui nous permettra d'être performant en terme de vitesse et de précision. De plus, cette partie de la conception consiste également à calibrer les quatre ESCs que nous utilisons. &lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 : Contrôleur de vol (Evan Gury &amp;amp; Maxime Claudel)&lt;br /&gt;
&lt;br /&gt;
L'objectif ici est d'implémenter notre propre contrôleur de vol (software et hardware) à l'aide de composants individuels, principalement d'une centrale inertielle 3 axes ainsi que d'un accéléromètre 3 axes.&lt;br /&gt;
&lt;br /&gt;
===Nouveaux choix techniques===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
Pour réaliser la commande du drone, nous avons décidé d'utiliser une télécommande [https://fr.banggood.com/Flysky-FS-i6X-2_4GHz-10CH-AFHDS-2A-RC-Transmitter-With-X6B-i-BUS-Receiver-p-1090406.html?rmmds=myorder&amp;amp;ID=42482530817&amp;amp;cur_warehouse=CN '''Flysky FS-I6X'''] accompagnée de son récepteur '''FS-X6B''' qui possède une portée assez élevée pour la réalisation de notre projet. Ce récepteur sera alors relié à une carte '''Arduino UNO''' (qui servira également au contrôleur de vol).&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
Concernant la réalisation du contrôleur de vol, nous choisissons d'utiliser une centrale inertielle [https://fr.banggood.com/3pcs-6DOF-MPU-6050-3-Axis-Gyro-With-Accelerometer-Sensor-Controller-Module-For-Arduino-p-1430733.html?rmmds=search&amp;amp;cur_warehouse=CN '''MPU6050'''] possédant un accéléromètre 3 axes ainsi qu'un gyroscope 3 axes, ce qui convient parfaitement à l'utilisation que l'on veut en faire. De plus, c'est une centrale qui est documentée et à coût raisonnable, elle dispose de son propre processeur, ce qui réduit considérablement la quantité de calculs à effectuer par notre micro-contrôleur. Nous relierons également cette centrale inertielle à la carte '''Arduino UNO'''.&lt;br /&gt;
&lt;br /&gt;
'''Conception générale du drone :'''&lt;br /&gt;
&lt;br /&gt;
Comme évoqué précédemment, pour le coeur d'une drone, nous utiliserons une carte '''Arduino UNO''' qui possède un nombre suffisant de ports d'interruptions, de ports PWM et d'une puissance de calcul suffisante pour traiter toutes les informations des différents capteurs.&lt;br /&gt;
&lt;br /&gt;
Nous avons également décidé de fabriquer notre propre chassis basé sur le design du précédent et d'utiliser de nouveaux ESCs dédiés spécialement au drone volant ([https://fr.banggood.com/EMAX-BLHeli-Series-6A-12A-20A-30A-ESC-p-963634.html?rmmds=search&amp;amp;ID=45170&amp;amp;cur_warehouse=CN '''EMAX BLHELI SERIES 20A''']). Nous avons également choisi de nouveaux moteurs brushless : les [https://fr.banggood.com/1000KV-Brushless-Motor-3_17mm-Shaft-Electric-Motor-p-1102054.html?rmmds=search&amp;amp;cur_warehouse=CN '''A2212/13T'''].&lt;br /&gt;
&lt;br /&gt;
'''Bilan'''&lt;br /&gt;
*'''Matériel'''&lt;br /&gt;
**Chassis&lt;br /&gt;
**4 ESCs EMAX BLHELI 20A&lt;br /&gt;
**4 moteurs A2212/13T&lt;br /&gt;
**Batterie LI-PO 11,1V - 2700mAh&lt;br /&gt;
**Arduino UNO&lt;br /&gt;
**Télécommande Flysky FS-I6X&lt;br /&gt;
**Récepteur FS-X6B&lt;br /&gt;
**Centrale inertielle MPU6050&lt;br /&gt;
*'''Logiciel'''&lt;br /&gt;
**Arduino&lt;br /&gt;
&lt;br /&gt;
'''Note''' : grâce au travail d'Evan Gury, nous avons pu acquérir tout ce matériel et il a pu concevoir le chassis avant même le commencement du semestre 7, ce qui nous a permis de nous avancer sur le travail à réaliser.&lt;br /&gt;
&lt;br /&gt;
===Liste des tâches à effectuer===&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser la nouvelle gestion de la commande et l'initialisation, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Découverte télécommande Flysky FS-I6X et son récepteur FS-X6B&lt;br /&gt;
* Configurer la télécommande&lt;br /&gt;
* Lecture des joysticks par Arduino&lt;br /&gt;
* Initialiser les extremums des joysticks&lt;br /&gt;
* Optimisation de la programmation&lt;br /&gt;
* Test de transmission sur les ESCs&lt;br /&gt;
* Mise en œuvre sur notre drone&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser le contrôleur de vol, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Découverte du MPU6050&lt;br /&gt;
* Configuration des registres du MPU6050&lt;br /&gt;
* Récupération des mesures angulaires en °/s&lt;br /&gt;
* Intégration des mesures pour récupérer les positions en degrés&lt;br /&gt;
* Calcul de la consigne&lt;br /&gt;
* Calcul de l'erreur&lt;br /&gt;
* Calcul du correcteur&lt;br /&gt;
* Application de la correction aux ESCs&lt;br /&gt;
&lt;br /&gt;
===Semaine 45===&lt;br /&gt;
&lt;br /&gt;
[[Fichier: flyskyFSI6X.jpg|200px|right|thumb|Flysky FS-I6X et FS-X6B]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Lors de la première semaine, nous avons fait le choix d'utiliser un mode de transmission existant et d'abandonner la télécommande conçue au semestre précédent. Nous avons alors choisi d'utiliser la télécommande de modélisme Flysky FS-I6X et son récepteur FS-X6B. &lt;br /&gt;
&lt;br /&gt;
*Nous avons dû dans un premier temps configurer la télécommande et comprendre comment transmettre les informations des deux joysticks.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Nous avons passé la première séance à nous documenter le plus possible sur le MPU6050 qui est le cœur de notre contrôleur de vol.&lt;br /&gt;
*Nous avons ainsi pu trouver de nombreux documents concernant la configuration des différents registre du MPU6050, de manière à avoir une utilisation correspondant au mieux à un drone volant.&lt;br /&gt;
&lt;br /&gt;
===Semaine 46===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Pour la réception des informations et le traitement des données, nous avons branché le récepteur sur une carte Arduino. Deux choix s'offraient à nous, utiliser des broches PWM ou une broche PPM. Le PPM a pour avantage d'utiliser un unique câble, tous les canaux sont transmis à la suite contrairement au PWM, un câble est nécessaire à chaque canal. L'Arduino UNO ne nous limitant pas pour l'utilisation de 1 broche ou 4 broches, nous avons décider d'utiliser le PWM.&lt;br /&gt;
&lt;br /&gt;
*Nous avons programmé notre Arduino UNO afin de récupérer les informations sur nos canaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Nous avons passé tout notre temps à tenter de récuperer les coordonnées YAW-PITCH-ROLL du mpu6050 et ce de la manière la plus rapide possible afin d'optimiser au mieux la régulation.&lt;br /&gt;
&lt;br /&gt;
===Semaine 47===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Nous avons finalisé la conception de notre drone, nous avons finalisé le câblage et ainsi pu faire des tests sur le prototype.&lt;br /&gt;
&lt;br /&gt;
*Pour commander les moteurs, les ESCs sont nécessaires. L'utilisation est plutôt simple car ils s'utilisent comme des servomoteurs, ainsi la bibliothèque ''servo.h'' d'Arduino nous a permis de les initialiser et donc de faire tourner les moteurs.&lt;br /&gt;
&lt;br /&gt;
*Le projet avance vite et nous avons beaucoup d'ambition et d'idées pour la suite.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Même si le MPU6050 est très bien documenté nous avons passé de nombreuses heures a tenter de récupérer les coordonnées YAW, PITCH et ROLL pour notre drone mais sans succès. Le principal problème était que deux des trois MPUs que nous avions commandés sur Banggood ne marchaient pas correctement.&lt;br /&gt;
*Au final nous arrivons désormais à récupérer ces informations suffisamment vite pour pouvoir espérer effectuer une correction correcte.&lt;br /&gt;
&lt;br /&gt;
===Semaine 48===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Correction du calibrage des ESCs à travers l'Arduino.&lt;br /&gt;
*Début de la commande des moteurs grâce à notre télécommande Flysky. Cependant, nous avons rencontré quelques soucis dans notre programme, il nous faut alors revoir ce code Arduino pour réussir cette étape.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Mise en commun de la partie programmation Arduino avec l'équipe 1. &lt;br /&gt;
*Première prise de renseignements sur les GPS dans l'optique d'en utiliser un pour commander le drone s'il nous reste du temps en fin de projet.&lt;br /&gt;
&lt;br /&gt;
===Documents Rendus===&lt;br /&gt;
&lt;br /&gt;
Soutenance : [[fichier:soutenance_S7_P4.pdf]]&lt;br /&gt;
&lt;br /&gt;
==Projet S8==&lt;br /&gt;
&lt;br /&gt;
[[Fichier: pcb_drone_p4.png|400px|right|thumb|PCB réalisé sur Altium]]&lt;br /&gt;
&lt;br /&gt;
===Liste des tâches à effectuer===&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Après analyse du travail réalisé au S7, nous devons désormais réaliser les tâches suivantes :&lt;br /&gt;
*Conception d'un PCB (pour l'ensemble du système)&lt;br /&gt;
*Optimiser la distribution de la puissance (esthétiquement)&lt;br /&gt;
*Finition de la partie communication envoie/reception de trame validé&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Après analyse du travail réalisé au S7, nous devons désormais réaliser les tâches suivantes :&lt;br /&gt;
*Mise en place et réglage de la régulation PID: &lt;br /&gt;
**Calcul de la consigne  &lt;br /&gt;
**Calcul des erreurs  &lt;br /&gt;
**Calcul des consignes à appliquer aux moteurs après correction&lt;br /&gt;
**Application des consignes&lt;br /&gt;
&lt;br /&gt;
*Implémenter un système de guidage GPS (à voir avec le temps dont on disposera)&lt;br /&gt;
&lt;br /&gt;
===Semaine 3===&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Réflexion et réalisation du PCB sur ''Altium Designer''&lt;br /&gt;
*Mise en relation des différentes variables de notre programme avec celui de l'équipe 2&lt;br /&gt;
*Choix et commande d'un distributeur de puissance (PDB) pour câbler plus proprement les ESCs&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Finalisation du programme, y compris la partie régulation PID&lt;br /&gt;
*Reste encore à régler les coefficients du PID&lt;br /&gt;
*Mise en relation du programme avec l'équipe 1&lt;br /&gt;
&lt;br /&gt;
===Semaine 4===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
* Finition du PCB sur altium et création du même PCB sur Fritzing.&lt;br /&gt;
* Reprise de l'ancienne maquette pour effectuer la régulation&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Réalisation d'un programme Arduino permettant de lire la valeur de 3 potentiomètres afin de pouvoir régler les coefficients du PID.&lt;br /&gt;
*Possibilité de faire fonctionner le drone en mode normal ou en mode réglage PID par simple utilisation d'un interrupteur.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5===&lt;br /&gt;
&lt;br /&gt;
[[Fichier: testregubar.mp4|350px|right|thumb|Essai de calibration sur deux axes avec le premier dispositif (drone fixé par le haut et le bas grâce à des câbles)]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Impression du PCB et branchement sur la maquette (2)&lt;br /&gt;
*Début des tests de régulation en mode suspendu (sans grande réussite pour le moment)&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Tests de régulation en mode suspendu (avec l'équipe 1)&lt;br /&gt;
*Début de conception d'un PCB permettant de fixer l'ensemble des composants (les nombreux fils commencent à devenir trop gênants pour les tests)&lt;br /&gt;
&lt;br /&gt;
===Semaine 6===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Modification du programme afin de détecter l'arrêt du microcontrôleur Atemega 328P. &lt;br /&gt;
* Resolution de l'erreur lié à la carte et au programme, suspicion de l'ISR mais le problème était du à une division par 0 (Probleme de maquette avec le MPU 6050).  &lt;br /&gt;
&lt;br /&gt;
[[Fichier: calibration-un-axe.mp4|250px|right|thumb|Essai de calibration sur un axe avec le deuxième dispositif]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Mise en place de support en PVC (voir photo) afin de ne laisser au drone qu'un seul degrés de liberté et ainsi permettre de le réguler plus facilement, suite à l'échec de la régulation suspendue.&lt;br /&gt;
*Problème sur un moteur ou un ESC de notre nouveau drone, un des moteurs ne tourne pas lorsque nous montons l'hélice dessus.&lt;br /&gt;
*Problème sur un moteur du nouveau drone qui se coupe totalement à une consigne bien précise et redémarre ensuite.&lt;br /&gt;
&lt;br /&gt;
[[Fichier: testesc.jpg|400px|center|thumb|Test des valeurs de courant reçues par les ESC]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 : coupure pédagogique===&lt;br /&gt;
&lt;br /&gt;
===Semaine 8===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 &amp;amp; 2 :'''&lt;br /&gt;
&lt;br /&gt;
* Lors de cette semaine, nous nous sommes penchés sur les problèmes physiques rencontrés précédemment. &lt;br /&gt;
Pour cela nous avons utilisé un oscilloscope équipé d'une sonde afin de relever les valeurs clés de tension et de courant.&lt;br /&gt;
Nous utilisons un programme qui envoie la même consigne aux 4 moteurs afin de comparer les vitesses de rotation.&lt;br /&gt;
Nous nous sommes aperçu que sur la maquette n°1, les 4 moteurs fonctionnent correctement mais qu'un ESC (Contrôleur moteur) est défaillant.&lt;br /&gt;
Sur la maquette n°2, un moteur et un ESC sont obsolètes. &lt;br /&gt;
Nous avons essayé de mixer les deux maquettes pour faire fonctionner un drone.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 &amp;amp; 2 :'''&lt;br /&gt;
&lt;br /&gt;
* Commande et attente des ESC pour finaliser la régulation.&lt;br /&gt;
* Création d'un boitier PID pour simplifier la régulation. Ce boiter va nous permettre de modifier facilement les valeurs des coefficients de notre PID numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Nous avons créé un programme, permettant de prendre en entrée le boitier PID, et de lire la valeur des potentiomètres pour modifier en instantané les valeurs du PID numérique.&lt;br /&gt;
*Le boitier comporte 3 potentiomètres, un pour chaque la valeur du I, la valeur du P et la valeur du D.&lt;br /&gt;
*Les valeurs du PID varient entre des plages bien précises: P: I: D:&lt;br /&gt;
&lt;br /&gt;
===Semaine 10===&lt;br /&gt;
&lt;br /&gt;
Re-structuration du projet suite aux événements du COVID-19:&lt;br /&gt;
&lt;br /&gt;
* Régulation sur deux ESCs : Lukas (dispose de tout le matériel)&lt;br /&gt;
* Création application mobile, communication entre téléphone et le drone. (Richard et Evan)&lt;br /&gt;
* Simuler le drone en C. (Maxime)&lt;br /&gt;
&lt;br /&gt;
===Semaine 11===&lt;br /&gt;
&lt;br /&gt;
'''Régulation avec 2 ESCs (Lukas) :'''&lt;br /&gt;
&lt;br /&gt;
* Test du boîtier permettant le contrôle des différents coefficients du PID. En effet, lors de sa conception, un faux contact avait été constaté : problème résolu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Pid_controller_P4.jpg|300px|center|thumb|Boîtier de contrôle du PID]]&lt;br /&gt;
&lt;br /&gt;
'''Application mobile :'''&lt;br /&gt;
&lt;br /&gt;
* Début de l'apprentissage de la création d'une application Android à l'aide de ANDROID STUDIO&lt;br /&gt;
&lt;br /&gt;
===Semaine 12===&lt;br /&gt;
&lt;br /&gt;
[[Fichier: regulation_4_esc.mp4|300px|left|thumb|Régulation presque adaptée sur 4 ESCs]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Application mobile :'''&lt;br /&gt;
*Réalisation d'une application Android, sous Android Studio, permettant de simuler une commande afin de piloter le drone.&lt;br /&gt;
*Les joysticks envoient une consigne variant de 1000 à 2000 pour le throttle et les axes Yaw, Pitch, Roll, valeurs attendues par le drone afin de générer les signaux PWM pour les ESCs.&lt;br /&gt;
*L'interface de l'application est terminée, il reste désormais à programmer la partie concernant l'ESP-32.&lt;br /&gt;
[[Fichier: applicationAndroid.mp4|520px|center|thumb|Présentation de l'application]]&lt;br /&gt;
&lt;br /&gt;
'''Régulation avec 2 ESCs'''&lt;br /&gt;
*Test de régulation sur le banc d'essai avec les valeurs du PID testée sur les derniers tests à 4 ESCs : vidéo ci-contre&lt;br /&gt;
*Test du programme utilisant le boitier PID permettant de modifier nos valeurs en direct&lt;br /&gt;
&lt;br /&gt;
===Semaine 13===&lt;br /&gt;
&lt;br /&gt;
* Reception d'un ESP32 et debut de la programmation. Création d'un Serveur WIFI, il reste à faire communiquer l'application et l'ESP32.&lt;br /&gt;
&lt;br /&gt;
* Modification du code pour réguler deux moteurs&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 et 15 : coupure pédagogique===&lt;br /&gt;
&lt;br /&gt;
* Communication telephone-ESP32  fonctionnelle à partir d'un serveur WEB. Communication de l'application vers ESP32 impossible. Nous n'avons pas réussi à nous connecter à la socket créé sur l'esp32.&lt;br /&gt;
&lt;br /&gt;
* La communication entre l'application mobile et l'ESP32 est fonctionnelle, nous envoyons ainsi un message formé des consignes sur la socket.&lt;br /&gt;
&lt;br /&gt;
'''Régulation avec deux moteurs'''&lt;br /&gt;
&lt;br /&gt;
Après avoir constaté que la fonction compensateBatteryDrop() était devenue obsolète en raison de l'ajout de notre PDB (Power Distributor Board), nous avons décidé de l'enlever de notre boucle (void loop()) améliorer les performances de notre programme. De plus, un pin était utilisé et faussait les calculs. Cette suppression nous a permis, effectivement, de constater une nette amélioration dans la gestion de la régulation.&lt;br /&gt;
&lt;br /&gt;
Lukas a alors pu réguler le drone avec deux moteurs sur un axe (Roll). Cette régulation a été menée à bien et le drone se stabilise sur un axe jusqu'à ce que nous soyons à court de batterie (nous nous rechargions à Robotech) avec les valeurs suivantes :&lt;br /&gt;
*kp Roll = 1.25  ki Roll = 0.05  kd Roll = 22.00&lt;br /&gt;
&lt;br /&gt;
L'objectif maintenant est, dès qu'on le pourra, après la fin du semestre de se réunir, d'installer les 4 nouveaux ESC et d'effectuer une régulation complète afin de finir complètement la conception de notre drone.&lt;br /&gt;
&lt;br /&gt;
===Documents Rendus===&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2018/2020_P4&amp;diff=84608</id>
		<title>IMA3/IMA4 2018/2020 P4</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2018/2020_P4&amp;diff=84608"/>
				<updated>2020-05-03T12:18:49Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Semaine 3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;include nopre noesc src=&amp;quot;/home/pedago/pimasc/include/video-ConstructionDroneIMA32018-iframe.html&amp;quot; /&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre du projet IMA3/4, nous avons choisi le sujet P4 : '''Construction d'un drone volant'''. Notre groupe se compose de Maxime CLAUDEL, Lukas FAUCHOIS, Evan GURY et Richard Simonin.&lt;br /&gt;
Nous avions dans un premier temps décidé de réaliser notre projet autour d'un drone servant à la livraison de petit colis, cependant dans un souci concernant la matériel mis à notre disposition et de budget, nous avons finalement opté pour un drone &amp;quot;loisir&amp;quot;.&lt;br /&gt;
Ce dernier sera destiné à un public amateur, dans un but d'apprentissage et/ou d'amusement et sera ainsi plus en adéquation avec nos contraintes et compétences, de plus amples informations sont décrites ci-dessous dans la partie '''Objectifs''' de notre présentation.&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
A terme, l'objectif principal de ce projet est de concevoir et construire entièrement un drone &amp;quot;made in Polytech Lille&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nous allons alors répartir notre travail en deux sessions, une première réalisée en IMA (S6) et une seconde en IMA4.&lt;br /&gt;
&lt;br /&gt;
Pour la fin de cette première session de projet, nous avons pour objectif de faire voler notre drone. Pour ce faire, nous n'avons évidemment pas le temps de nous occuper de la partie concernant le vol nous-mêmes, c'est pour quoi nous avons opté pour l'utilisation d'un contrôleur de vol n'ayant qu'à être configuré.&lt;br /&gt;
&lt;br /&gt;
Parallèlement à cela, nous comptons réaliser nous-mêmes la commande permettant de communiquer avec ce dernier pendant qu'une autre partie des membres du projet s’attellera à la partie mécanique et électrique du drone.&lt;br /&gt;
&lt;br /&gt;
Ce faisant et si tout se passe bien, nous pourrons avoir pour débuter l'année prochaine une base solide pour concevoir nous-mêmes notre contrôleur de vol. Ce qui nous amène à notre second point, puisque nous comptons dans un second temps réaliser notre propre contrôleur de vol, une fois le premier objectif atteint.&lt;br /&gt;
&lt;br /&gt;
=Analyse du projet=&lt;br /&gt;
&lt;br /&gt;
==Positionnement par rapport à l'existant==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:parrot.jpg|right|thumb|PARROT AR.DRONE 2.0]]&lt;br /&gt;
[[Fichier:udi.jpg|right|thumb|UDI U818S]]&lt;br /&gt;
&lt;br /&gt;
===Analyse du premier concurrent : PARROT AR.DRONE 2.0===&lt;br /&gt;
&lt;br /&gt;
Le [https://www.parrot.com/fr/drones/parrot-ardrone-20-elite-edition PARROT AR.DRONE 2.0], tout comme le notre, est destiné à un usage ludique. En dehors de la camera que nous n'envisageons pas d'intégrer à notre drone pour le moment, il dispose de toutes les caractéristiques que nous souhaiterions obtenir. A savoir une portée d'environ 100m, une autonomie de plus de 10min et une vitesse moyenne d'environ 20 km/h pour un prix avoisinant les 100 euros.&lt;br /&gt;
&lt;br /&gt;
Notre avantage peut se jouer sur la camera, en effet, en enlevant cette dernière nous pouvons réaliser des économies. De plus, si une personne recherche un drone simplement pour prendre du plaisir à le faire voler, il ne souhaitera pas forcément gaspiller son argent dans une camera qu'il n'aurait surement de base pas voulu.&lt;br /&gt;
&lt;br /&gt;
===Analyse du second concurrent : UDI U818S===&lt;br /&gt;
&lt;br /&gt;
Fabriqué par la marque UDI, le [https://www.maisondudrone.com/prod/udi-u818s-avec-camera-hd-2-0mp-blanc-1400.html UDI U818S] est un drone au caractéristiques similaires au précédent, à l'exception de la camera.&lt;br /&gt;
En effet, cette fois nous sommes face à un concurrent qui tout comme nous, propose simplement la fonctionnalité de base d'un drone, à savoir voler et cela se fait ressentir sur le prix puisque nous passons sur un prix d'environ 50 euros.&lt;br /&gt;
Face à un concurrent proposant un produit similaire au notre et à un prix au plus bas pour ces caractéristiques, difficile de faire mieux sur le plan technique. Peut être serait il alors plus judicieux de proposer un produit plus haute gamme, plus chère, mais destiné à un public désireux de s'amuser avec un produit de qualité.&lt;br /&gt;
&lt;br /&gt;
==Scénario d'usage du produit ou du concept envisagé==&lt;br /&gt;
&lt;br /&gt;
'''A qui notre drone peut-il servir ?'''&lt;br /&gt;
&lt;br /&gt;
Le drone &amp;quot;made in Polytech Lille&amp;quot; s'adresse à tout public n'ayant que pour objectif l'amusement''&lt;br /&gt;
&lt;br /&gt;
Toute personne souhaitant débuter avec un drone de qualité, sans s'encombrer de fonctionnalité ne s'avérant pas utiles peut être amenées a utiliser notre drone.&lt;br /&gt;
&lt;br /&gt;
'''Pour quel type d'utilisation ?'''&lt;br /&gt;
&lt;br /&gt;
Nombre de notre génération ont déjà reçu comme cadeau une voiture RC. Cette dernière n'avait que pour objectif de rouler à toute vitesse pour nous satisfaire. Nul besoin d'embarquer des caméras, stabilisateurs et nombres d'autres gadgets inutile à la vocation initiale de notre voiture, rouler. &lt;br /&gt;
&lt;br /&gt;
Avec notre drone, nous voulons remettre cela en avant, le simple plaisir de piloter une voiture RC appliqué aux drones. Alors enfant, adultes et nostalgiques pourront par le biais de notre produit découvrir ou redécouvrir le plaisir de piloter un engin motorisé, qui plus est cette-ci fois dans les airs.&lt;br /&gt;
&lt;br /&gt;
==Réponse à la question difficile==&lt;br /&gt;
&lt;br /&gt;
'''Qu'en est-il du dimensionnement des composants pour permettre à votre drone de porter une telle charge ?'''&lt;br /&gt;
&lt;br /&gt;
Nos contraintes et objectif ayant totalement changé, la question ne se pose plus vraiment. En effet nous avons suites à notre présentation réalisé des calculs en terme de puissance et nous nous sommes très vite rendu compte de l'impossibilité à réaliser notre projet.&lt;br /&gt;
&lt;br /&gt;
En effet, au vu de notre budget, l'achat d'un seul des quatre moteurs nécessaire à l'atteinte des chiffres que nous avions avancés était déjà impossible. Nous avons donc totalement changé d'objectif et avons récupéré du matériel déjà présent à Polytech, à savoir quatre moteurs et leur ESC. Nous avons pris le problème à l'envers et avons réfléchi à ce que nous pouvions réaliser avec le budget et le matériel à disposition.&lt;br /&gt;
&lt;br /&gt;
C'est de cette manière que nous avons eu l'idée d'un drone &amp;quot;loisir&amp;quot;, effaçant ainsi la question de la charge.&lt;br /&gt;
&lt;br /&gt;
==Bibliographie et webographie==&lt;br /&gt;
&lt;br /&gt;
===Arducopter===&lt;br /&gt;
&lt;br /&gt;
 https://www.digi.com/resources/documentation/digidocs/PDFs/90000976.pdf&lt;br /&gt;
 http://jeromeabel.net/wiki/xbee/xbee-arduino.pdf&lt;br /&gt;
 https://www.digi.com/resources/documentation/digidocs/pdfs/90001942-13.pdf&lt;br /&gt;
 https://www.arduino.cc/en/Reference/Servo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Manuel d'utilisation&lt;br /&gt;
 http://ardupilot.org/copter/index.html&lt;br /&gt;
&lt;br /&gt;
* Tutoriels vidéos&lt;br /&gt;
 Première installation et setup : https://www.youtube.com/watch?v=30cCs4aHdB0&amp;amp;t=754s&lt;br /&gt;
 Alimentation de l'Ardupilot : https://www.youtube.com/watch?v=TS4OWAcfAQY&amp;amp;t=270s&lt;br /&gt;
 Calibration des ESC : https://youtu.be/gYoknRObfOg&lt;br /&gt;
&lt;br /&gt;
=Préparation du projet=&lt;br /&gt;
&lt;br /&gt;
==Cahier des charges du groupe==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Diagramme bête à cornes'''&lt;br /&gt;
&lt;br /&gt;
Le diagramme bête à cornes nous permet de faire une analyse fonctionnelle du besoin. Notre drone permet à utilisateur de découvrir l'aéronautique à travers une activité ludique à l'aide d'une télécommande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bete_a_cornes.png | center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Diagramme en pieuvre'''&lt;br /&gt;
&lt;br /&gt;
Le diagramme en pieuvre permet quant à lui de répertorier toutes les fonctions (principales et de service) et d'analyser l'importance des besoins de notre projet&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pieuvredrone.png | center]]&lt;br /&gt;
&lt;br /&gt;
'''Tableau de fonctions'''&lt;br /&gt;
&lt;br /&gt;
Le tableau ci-dessous liste les fonctions principales (FP) et les fonctions contraintes (FC), dans l'orde d'importance, les accompagnant d'une petite description.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tableau_fonctions.jpeg | 500px | center]]&lt;br /&gt;
&lt;br /&gt;
==Cahier des charges des équipes==&lt;br /&gt;
===Equipe 1 : Gestion de la commande (Evan Gury et Richard Simonin)===&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie, est de créer une télécommande ainsi que le récepteur. Nous devons lire les valeurs des potentiomètres, créer des trames, envoyer les trames et analyser les trames reçus. Notre système doit être performant en matière de vitesse ainsi qu'en précision.&lt;br /&gt;
&lt;br /&gt;
===Equipe 2 : Contrôleur de vol (Maxime Claudel et Lukas Fauchois)===&lt;br /&gt;
&lt;br /&gt;
L'objectif de l'équipe est d'utiliser une carte de contrôle pouvant être liée à un logiciel de contrôle de vol. Etant donné notre projet, la carte doit respecter certaines contraintes : être adaptée à un drone à quatre hélices (quadcopter), fonctionner sur batterie (car positionnée sur le chassis du drone), être déjà programmée et relativement simple d'utilisation. Le logiciel doit quant à lui nous permettre de gérer le vol du drone et de calibrer les commandes.&lt;br /&gt;
&lt;br /&gt;
==Choix techniques : matériel et logiciel==&lt;br /&gt;
===Equipe 1===&lt;br /&gt;
&lt;br /&gt;
'''Émetteur'''&lt;br /&gt;
&lt;br /&gt;
Pour la réalisation de l'émetteur, nous avons choisi de travailler avec une Arduino ainsi que '''deux joysticks''' et un '''émetteur Xbee'''. Nous voulons une télécommande petite c'est pourquoi nous avons pris avec une '''Arduino NANO'''. Le drone a besoin de deux joysticks pour être dirigé selon 3 axes.&lt;br /&gt;
&lt;br /&gt;
'''Récepteur'''&lt;br /&gt;
&lt;br /&gt;
Pour la réalisation du récepteur, qui sera situé sur le drone nous avons commencé par utiliser une '''Arduino UNO''' mais nous souhaitons changer pour une NANO afin d'optimiser le poids ainsi que l'espace. Nous avons aussi besoin d'un '''récepteur Xbee''' afin de recevoir les trames.&lt;br /&gt;
&lt;br /&gt;
===Equipe 2===&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi pour notre carte de contrôle un '''Ardupilot 2.8''', son prix est raisonnable (une trentaine d'euros) et nous trouvons beaucoup de tutoriels l'utilisant sur YouTube.&lt;br /&gt;
&lt;br /&gt;
Pour le logiciel, deux choix relativement similaires s'offraient à nous : Mission Planner ou APM Planner. Les deux logiciels ont à peu près la même interface et permettent tous les deux d'effectuer les mêmes étapes de calibrage de l'Ardupilot et des commandes avant le premier vol.&lt;br /&gt;
&lt;br /&gt;
Nous avons d'abord commencé sur Mission Planner mais des problèmes de mises à jour du firmware de l'Ardupilot nous ont empêché de calibrer les '''ESC du drone'''. Nous sommes donc ensuite passés sur '''APM Planner''' car il permet d'éviter ce problème de mises à jour.&lt;br /&gt;
&lt;br /&gt;
===Bilan===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:materieldrone.jpg|right|thumb|Matériel nécessaire à la conception]]&lt;br /&gt;
&lt;br /&gt;
* '''Matériel''' :&lt;br /&gt;
**2 joysticks&lt;br /&gt;
**Emetteur Xbee&lt;br /&gt;
**Récepteur Xbee&lt;br /&gt;
**Arduino NANO&lt;br /&gt;
**Arduino UNO&lt;br /&gt;
**Ardupilot 2.8&lt;br /&gt;
**Câblage&lt;br /&gt;
&lt;br /&gt;
* '''Logiciels''' :&lt;br /&gt;
**Arduino&lt;br /&gt;
**Mission Planner&lt;br /&gt;
**APM Planner 2.0&lt;br /&gt;
&lt;br /&gt;
==Liste des tâches à effectuer==&lt;br /&gt;
===Equipe 1===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser la partie gestion de la commande, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Analyse du projet&lt;br /&gt;
* Découverte Xbee&lt;br /&gt;
* Prise en main Xbee&lt;br /&gt;
* Envoi de trames&lt;br /&gt;
* Réception de trames&lt;br /&gt;
* Optimisation de la programmation&lt;br /&gt;
* Test sur maquette&lt;br /&gt;
* Réalisation du PCB&lt;br /&gt;
* Mise en œuvre sur notre drone&lt;br /&gt;
&lt;br /&gt;
===Equipe 2===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser la partie contrôleur de vol, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Analyse du projet&lt;br /&gt;
* Choix d'une carte de contrôle&lt;br /&gt;
* Documentation, recherche d'un software&lt;br /&gt;
* Calibration de la carte&lt;br /&gt;
* Réalisation des branchements&lt;br /&gt;
* Mise en application sur la maquette&lt;br /&gt;
* Mise en relation avec la partie commande&lt;br /&gt;
&lt;br /&gt;
==Calendrier prévisionnel==&lt;br /&gt;
Nous avons décidé de réaliser un diagramme de GANTT pour chacun des calendriers prévisionnels (un par équipe). Sur chaque tâche, nous avions prévu un temps de travail en bleu dans les diagrammes et le temps réel consacré en jaune.&lt;br /&gt;
===Equipe 1 : Calendrier prévisionnel pour la gestion de la commande===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:equipe1cal.jpg|500px|center|&amp;quot;Calendrier de l'Equipe 1&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Equipe 2 : Calendrier prévisionnel pour le contrôleur de vol===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:equipe2cal.jpg|500px|center|&amp;quot;Calendrier de l'Equipe 2&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet S6==&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 et 6===&lt;br /&gt;
&lt;br /&gt;
Avant de scinder le groupe en deux équipes, nous avons passés les deux premières séances à évaluer les besoins de conception de notre projet pour pouvoir ensuite réaliser un cahier des charges et établir un calendrier prévisionnel des tâches à effectuer.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:xbeedrone.jpg|200px|thumb|Xbee]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Etant donné que nous avons décidé d'utiliser des modules XBee, nous avons consacrés cette semaine à la documentation, afin de comprendre comment configurer et utiliser ces derniers.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ardupilot28.jpeg|300px|right|thumb|Ardupilot 2.8]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Sur le principe de la semaine 7, nous nous sommes documentés sur les XBee afin de comprendre comment les configurer et les utiliser.&lt;br /&gt;
&lt;br /&gt;
Pour la configuration, nous avons retenu le logiciel XCTU qui est celui recommandé pour configurer les XBee. Cependant, nous gardons quand même de côté Legacy XCTU qui est l'ancienne version XCTU mais qui reste tout de même viable.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Nous avons consacré cette séance de documentation à la recherche d'une carte de contrôle de vol satisfaisant nos exigences. Nous cherchions donc une carte facilement connectable avec un Arduino Uno/Micro. Nous avons opté pour l'Ardupilot 2.8. Il comprend tout le nécessaire pour diriger un drone quadcopter, centrale gyroscopique, accéléromètres, interface de radiocommande. &lt;br /&gt;
Nous avons donc commandé l'Ardupilot via le site Alibaba.com (30€) et nous l'avons reçu trois semaines plus tard.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Après avoir effectués diverses recherches sur les modules XBee et effectué de nombreux tests (XCTU, legacy XCTU), nous avons abandonné l'utilisation du logiciel XCTU, étant donné que nous n'utilisons que deux XBee, nous pouvons les initialiser directement dans le programme avec le programme suivant:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:inixbeedrone.png]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
En attendant la réception du colis de l'Ardupilot, nous nous sommes documentés sur les différents logiciels de contrôle de vol à notre disposition. L'objectif étant de trouver un logiciel compatible avec l'Ardupilot 2.8 et avec suffisamment de documentation et tutoriels d'utilisation. Les deux logiciels qui sont ressortis le plus dans nos recherches sont Mission Planner et APM Planner 2. Ces deux logiciels sont très similaires au niveau de l'interface et des options de calibration de la carte de vol à laquelle ils sont connectés.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:apm20.png|300px|center]][[Fichier:missionplanner.jpg|300px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En connectant l'Ardupilot via un câble USB, le logiciel le reconnait et une démarche de calibration peut être entamée : boussole, accéléromètres, radiocommande, ESC.&lt;br /&gt;
&lt;br /&gt;
===Semaine 10===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur la transmission, la réception et le traitement des trames.&lt;br /&gt;
&lt;br /&gt;
Pour la transmission, nous avons mis en place le système suivant:&lt;br /&gt;
&lt;br /&gt;
*On lit la valeur des potentiomètres&lt;br /&gt;
*On convertit la valeur en une chaîne de caractère et on lui attribue un indice qui est propre à chaque position des joysticks.&lt;br /&gt;
*On envoie la chaîne de caractère par liaison série.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la réception, nous avons mis en place le système suivant:&lt;br /&gt;
&lt;br /&gt;
*On reçoit un tableau de caractère qui contient la consigne entre 0 et 1023 et un indice pour dire à quel joystick et quelle position la consigne correspond.&lt;br /&gt;
*On converti le tableau en entier et à l'aide de la fonction map on adapte la consigne pour qu'elle est une valeur entre 0 et 180.&lt;br /&gt;
*On transmet la consigne à l'ardupilot.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Idem semaine 9.&lt;br /&gt;
&lt;br /&gt;
===Semaine 11===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Débogage de la communication entre les modules XBee et l'ardupilot.&lt;br /&gt;
&lt;br /&gt;
En utilisant deux terminaux, la communication était réalisé entre les deux XBee  cependant une fois branché sur l'ardupilot nous avons eu des difficultés à traiter les trames, du au fait d'une transmission trop rapide.&lt;br /&gt;
&lt;br /&gt;
De plus nous avons passé un certains temps à vouloir utiliser une arduino micro mais avons finalement décidé de laisser tomber, puisque nous n'avons pas réussi à réceptionner les trames XBee.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Idem semaine 9.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Optimisation du format des trames et réglage de la vitesse de transmission.&lt;br /&gt;
&lt;br /&gt;
Passage d'une Arduino UNO à une Arduino Nano pour l'envoie des trames dans l'optique de réaliser un PCB pour la commande.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
A ce stade du projet nous ne pouvions qu'expérimenter les calibrations de la boussole et des accéléromètres de l'Ardupilot car la partie commande n'était pas terminée.&lt;br /&gt;
&lt;br /&gt;
La calibration de la boussole s'effectue en bougeant l'Ardupilot selon tous ces axes pendant une période de temps donnée jusqu'à ce que les informations nécessaires soient récoltées.&lt;br /&gt;
La calibration des accéléromètres s'effectue en positionnant l'Ardupilot dans des positions définies (sur le côté gauche, sur la face avant, etc.). (cliquer sur l'image ci-dessous pour lancer le GIF)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:compasscalib.gif|300px|center]][[Fichier:compasscalib.png|300px|center]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Réglage des trames pour la commande du prototype.&lt;br /&gt;
&lt;br /&gt;
Nous avons rencontré quelques problème de sensibilité au niveau des joysticks et du traitement du signal de commande transmis à l'ardupilot.&lt;br /&gt;
&lt;br /&gt;
En effet, ayant trouvé très peu de documentation sur l'ardupilot, nous avons eu du mal à générer les bons signaux de commande.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes ensuite consacrés à la partie alimentation de l'Ardupilot et du drone. En se documentant sur le site servant de manuel d'utilisation d'Ardupilot et des logiciels Mission Planner et APM Planner 2, nous avons trouvé que l'Ardupilot pouvait être alimenté via les ESC.&lt;br /&gt;
Une batterie LiPo alimente les ESC qui elles-mêmes alimentent l'Ardupilot via les broches Output. L'Ardupilot alimente ensuite l'Arduino qui réceptionne les trames reçues par le récepteur Xbee. Sur les sorties (Output) de l'Ardupilot sont aussi branchés les fils permettant la réception du signal envoyé aux moteurs.&lt;br /&gt;
Ainsi, tous les composants nécessaires au drone sont alimentés.&lt;br /&gt;
&lt;br /&gt;
===Semaine 14===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Conception du PCB pour la commande en essayant de limiter le plus possible les vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pcbdrone.png|400px|PCB]]&lt;br /&gt;
&lt;br /&gt;
Vérification de l'envoie des trames à l'aide de l'ordinateur et test de réception sur l'Ardupilot.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Branchements comme indiqués à la semaine précédente, alimentation et tests de bon fonctionnement des moteurs, Ardupilot et Arduino.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:branchementesc.jpg|300px]][[Fichier:branchementardu.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 15===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Fabrication de la manette&lt;br /&gt;
&lt;br /&gt;
[[Fichier:manettedrone.jpg|400px|PCB]]&lt;br /&gt;
&lt;br /&gt;
Modification de l'envoie des trames. Tests de transmission.&lt;br /&gt;
Implémentation du programme sur le prototype.&lt;br /&gt;
&lt;br /&gt;
Les deux équipes ont passé la semaine à réunir leur travail, nous avons ainsi tous pu réaliser de nombreux tests du prototype, avec réussite, hormis un léger accident qui à entraîné la destruction de deux hélices. &lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
A ce stade, la commande étant terminée et nous avons pu nous lier à l'équipe 1 pour mettre en relation la télécommande et l'Ardupilot. Après avoir utilisé Mission Planner pendant plusieurs semaines, un problème de mise-à-jour du software de l'Ardupilot nous empêchait toujours d'effectuer la calibration de la radiocommande. Nous sommes donc passés sur APM Planner 2 et la mise-à-jour n'était plus demandée, nous avons donc enfin pu terminer l'intégralité de la phase de calibration. Comme expliqué ci-dessus, nous avons effectué de nombreux tests pour atteindre notre objectif.&lt;br /&gt;
&lt;br /&gt;
===Documents Rendus===&lt;br /&gt;
&lt;br /&gt;
Rapport : [[fichier:rapport_groupe_4.pdf]]&lt;br /&gt;
&lt;br /&gt;
==Projet S7==&lt;br /&gt;
&lt;br /&gt;
===De nouveaux objectifs===&lt;br /&gt;
&lt;br /&gt;
Durant le semestre 6, nous avons réussi à concevoir un drone volant fonctionnel régulé à l'aide d'une carte de contrôle OpenSource '''Ardupilot 2.8'''. Concernant la commande, nous avions fait le choix d'utiliser une carte communication Xbee ainsi qu'une Arduino NANO et des joysticks.&lt;br /&gt;
&lt;br /&gt;
Cette année, nous avons décidé de développer plus amplement notre projet et de pratiquement repartir du point de départ. En effet, nos objectifs cette année sont :&lt;br /&gt;
*'''d'utiliser de nouveaux composants dont nous connaissons les propriétés (moteurs, ESCs, etc)'''&lt;br /&gt;
*'''d'utiliser une télécommande de modélisme ainsi qu'un récepteur adapté à des portées plus élevées que celles que permettait l'Xbee'''&lt;br /&gt;
*'''de concevoir notre propre contrôleur de vol'''&lt;br /&gt;
*'''Bonus''' : d'intégrer une régulation GPS et un mode automatique en cas de perte de signal&lt;br /&gt;
&lt;br /&gt;
===Reprise du cahier des charges===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 : Gestion de la commande et initialisation (Richard Simonin &amp;amp; Lukas Fauchois)'''&lt;br /&gt;
&lt;br /&gt;
L'objectif de la nouvelle gestion de la commande est d'utiliser une télécommande de modélisme capable de transmettre les différentes données nécessaires (Throttle, Yaw, Pitch) à un récepteur relié à une Arduino UNO, ce qui nous permettra d'être performant en terme de vitesse et de précision. De plus, cette partie de la conception consiste également à calibrer les quatre ESCs que nous utilisons. &lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 : Contrôleur de vol (Evan Gury &amp;amp; Maxime Claudel)&lt;br /&gt;
&lt;br /&gt;
L'objectif ici est d'implémenter notre propre contrôleur de vol (software et hardware) à l'aide de composants individuels, principalement d'une centrale inertielle 3 axes ainsi que d'un accéléromètre 3 axes.&lt;br /&gt;
&lt;br /&gt;
===Nouveaux choix techniques===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
Pour réaliser la commande du drone, nous avons décidé d'utiliser une télécommande [https://fr.banggood.com/Flysky-FS-i6X-2_4GHz-10CH-AFHDS-2A-RC-Transmitter-With-X6B-i-BUS-Receiver-p-1090406.html?rmmds=myorder&amp;amp;ID=42482530817&amp;amp;cur_warehouse=CN '''Flysky FS-I6X'''] accompagnée de son récepteur '''FS-X6B''' qui possède une portée assez élevée pour la réalisation de notre projet. Ce récepteur sera alors relié à une carte '''Arduino UNO''' (qui servira également au contrôleur de vol).&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
Concernant la réalisation du contrôleur de vol, nous choisissons d'utiliser une centrale inertielle [https://fr.banggood.com/3pcs-6DOF-MPU-6050-3-Axis-Gyro-With-Accelerometer-Sensor-Controller-Module-For-Arduino-p-1430733.html?rmmds=search&amp;amp;cur_warehouse=CN '''MPU6050'''] possédant un accéléromètre 3 axes ainsi qu'un gyroscope 3 axes, ce qui convient parfaitement à l'utilisation que l'on veut en faire. De plus, c'est une centrale qui est documentée et à coût raisonnable, elle dispose de son propre processeur, ce qui réduit considérablement la quantité de calculs à effectuer par notre micro-contrôleur. Nous relierons également cette centrale inertielle à la carte '''Arduino UNO'''.&lt;br /&gt;
&lt;br /&gt;
'''Conception générale du drone :'''&lt;br /&gt;
&lt;br /&gt;
Comme évoqué précédemment, pour le coeur d'une drone, nous utiliserons une carte '''Arduino UNO''' qui possède un nombre suffisant de ports d'interruptions, de ports PWM et d'une puissance de calcul suffisante pour traiter toutes les informations des différents capteurs.&lt;br /&gt;
&lt;br /&gt;
Nous avons également décidé de fabriquer notre propre chassis basé sur le design du précédent et d'utiliser de nouveaux ESCs dédiés spécialement au drone volant ([https://fr.banggood.com/EMAX-BLHeli-Series-6A-12A-20A-30A-ESC-p-963634.html?rmmds=search&amp;amp;ID=45170&amp;amp;cur_warehouse=CN '''EMAX BLHELI SERIES 20A''']). Nous avons également choisi de nouveaux moteurs brushless : les [https://fr.banggood.com/1000KV-Brushless-Motor-3_17mm-Shaft-Electric-Motor-p-1102054.html?rmmds=search&amp;amp;cur_warehouse=CN '''A2212/13T'''].&lt;br /&gt;
&lt;br /&gt;
'''Bilan'''&lt;br /&gt;
*'''Matériel'''&lt;br /&gt;
**Chassis&lt;br /&gt;
**4 ESCs EMAX BLHELI 20A&lt;br /&gt;
**4 moteurs A2212/13T&lt;br /&gt;
**Batterie LI-PO 11,1V - 2700mAh&lt;br /&gt;
**Arduino UNO&lt;br /&gt;
**Télécommande Flysky FS-I6X&lt;br /&gt;
**Récepteur FS-X6B&lt;br /&gt;
**Centrale inertielle MPU6050&lt;br /&gt;
*'''Logiciel'''&lt;br /&gt;
**Arduino&lt;br /&gt;
&lt;br /&gt;
'''Note''' : grâce au travail d'Evan Gury, nous avons pu acquérir tout ce matériel et il a pu concevoir le chassis avant même le commencement du semestre 7, ce qui nous a permis de nous avancer sur le travail à réaliser.&lt;br /&gt;
&lt;br /&gt;
===Liste des tâches à effectuer===&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser la nouvelle gestion de la commande et l'initialisation, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Découverte télécommande Flysky FS-I6X et son récepteur FS-X6B&lt;br /&gt;
* Configurer la télécommande&lt;br /&gt;
* Lecture des joysticks par Arduino&lt;br /&gt;
* Initialiser les extremums des joysticks&lt;br /&gt;
* Optimisation de la programmation&lt;br /&gt;
* Test de transmission sur les ESCs&lt;br /&gt;
* Mise en œuvre sur notre drone&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser le contrôleur de vol, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Découverte du MPU6050&lt;br /&gt;
* Configuration des registres du MPU6050&lt;br /&gt;
* Récupération des mesures angulaires en °/s&lt;br /&gt;
* Intégration des mesures pour récupérer les positions en degrés&lt;br /&gt;
* Calcul de la consigne&lt;br /&gt;
* Calcul de l'erreur&lt;br /&gt;
* Calcul du correcteur&lt;br /&gt;
* Application de la correction aux ESCs&lt;br /&gt;
&lt;br /&gt;
===Semaine 45===&lt;br /&gt;
&lt;br /&gt;
[[Fichier: flyskyFSI6X.jpg|200px|right|thumb|Flysky FS-I6X et FS-X6B]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Lors de la première semaine, nous avons fait le choix d'utiliser un mode de transmission existant et d'abandonner la télécommande conçue au semestre précédent. Nous avons alors choisi d'utiliser la télécommande de modélisme Flysky FS-I6X et son récepteur FS-X6B. &lt;br /&gt;
&lt;br /&gt;
*Nous avons dû dans un premier temps configurer la télécommande et comprendre comment transmettre les informations des deux joysticks.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Nous avons passé la première séance à nous documenter le plus possible sur le MPU6050 qui est le cœur de notre contrôleur de vol.&lt;br /&gt;
*Nous avons ainsi pu trouver de nombreux documents concernant la configuration des différents registre du MPU6050, de manière à avoir une utilisation correspondant au mieux à un drone volant.&lt;br /&gt;
&lt;br /&gt;
===Semaine 46===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Pour la réception des informations et le traitement des données, nous avons branché le récepteur sur une carte Arduino. Deux choix s'offraient à nous, utiliser des broches PWM ou une broche PPM. Le PPM a pour avantage d'utiliser un unique câble, tous les canaux sont transmis à la suite contrairement au PWM, un câble est nécessaire à chaque canal. L'Arduino UNO ne nous limitant pas pour l'utilisation de 1 broche ou 4 broches, nous avons décider d'utiliser le PWM.&lt;br /&gt;
&lt;br /&gt;
*Nous avons programmé notre Arduino UNO afin de récupérer les informations sur nos canaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Nous avons passé tout notre temps à tenter de récuperer les coordonnées YAW-PITCH-ROLL du mpu6050 et ce de la manière la plus rapide possible afin d'optimiser au mieux la régulation.&lt;br /&gt;
&lt;br /&gt;
===Semaine 47===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Nous avons finalisé la conception de notre drone, nous avons finalisé le câblage et ainsi pu faire des tests sur le prototype.&lt;br /&gt;
&lt;br /&gt;
*Pour commander les moteurs, les ESCs sont nécessaires. L'utilisation est plutôt simple car ils s'utilisent comme des servomoteurs, ainsi la bibliothèque ''servo.h'' d'Arduino nous a permis de les initialiser et donc de faire tourner les moteurs.&lt;br /&gt;
&lt;br /&gt;
*Le projet avance vite et nous avons beaucoup d'ambition et d'idées pour la suite.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Même si le MPU6050 est très bien documenté nous avons passé de nombreuses heures a tenter de récupérer les coordonnées YAW, PITCH et ROLL pour notre drone mais sans succès. Le principal problème était que deux des trois MPUs que nous avions commandés sur Banggood ne marchaient pas correctement.&lt;br /&gt;
*Au final nous arrivons désormais à récupérer ces informations suffisamment vite pour pouvoir espérer effectuer une correction correcte.&lt;br /&gt;
&lt;br /&gt;
===Semaine 48===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Correction du calibrage des ESCs à travers l'Arduino.&lt;br /&gt;
*Début de la commande des moteurs grâce à notre télécommande Flysky. Cependant, nous avons rencontré quelques soucis dans notre programme, il nous faut alors revoir ce code Arduino pour réussir cette étape.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Mise en commun de la partie programmation Arduino avec l'équipe 1. &lt;br /&gt;
*Première prise de renseignements sur les GPS dans l'optique d'en utiliser un pour commander le drone s'il nous reste du temps en fin de projet.&lt;br /&gt;
&lt;br /&gt;
===Documents Rendus===&lt;br /&gt;
&lt;br /&gt;
Soutenance : [[fichier:soutenance_S7_P4.pdf]]&lt;br /&gt;
&lt;br /&gt;
==Projet S8==&lt;br /&gt;
&lt;br /&gt;
[[Fichier: pcb_drone_p4.png|400px|right|thumb|PCB réalisé sur Altium]]&lt;br /&gt;
&lt;br /&gt;
===Liste des tâches à effectuer===&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Après analyse du travail réalisé au S7, nous devons désormais réaliser les tâches suivantes :&lt;br /&gt;
*Conception d'un PCB (pour l'ensemble du système)&lt;br /&gt;
*Optimiser la distribution de la puissance (esthétiquement)&lt;br /&gt;
*Finition de la partie communication envoie/reception de trame validé&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Après analyse du travail réalisé au S7, nous devons désormais réaliser les tâches suivantes :&lt;br /&gt;
*Mise en place et réglage de la régulation PID: &lt;br /&gt;
**Calcul de la consigne  &lt;br /&gt;
**Calcul des erreurs  &lt;br /&gt;
**Calcul des consignes à appliquer aux moteurs après correction&lt;br /&gt;
**Application des consignes&lt;br /&gt;
&lt;br /&gt;
*Implémenter un système de guidage GPS (à voir avec le temps dont on disposera)&lt;br /&gt;
&lt;br /&gt;
===Semaine 3===&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Réflexion et réalisation du PCB sur ''Altium Designer''&lt;br /&gt;
*Mise en relation des différentes variables de notre programme avec celui de l'équipe 2&lt;br /&gt;
*Choix et commande d'un distributeur de puissance (PDB) pour câbler plus proprement les ESCs&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Finalisation du programme, y compris la partie régulation PID&lt;br /&gt;
*Reste encore à régler les coefficients du PID&lt;br /&gt;
*Mise en relation du programme avec l'équipe 1&lt;br /&gt;
&lt;br /&gt;
===Semaine 4===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
* Finition du PCB sur altium et création du même PCB sur Fritzing.&lt;br /&gt;
* Reprise de l'ancienne maquette pour effectuer la régulation&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Réalisation d'un programme Arduino permettant de lire la valeur de 3 potentiomètres afin de pouvoir régler les coefficients du PID.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5===&lt;br /&gt;
&lt;br /&gt;
[[Fichier: testregubar.mp4|350px|right|thumb|Essai de calibration sur deux axes avec le premier dispositif (drone fixé par le haut et le bas grâce à des câbles)]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Impression du PCB et branchement sur la maquette (2)&lt;br /&gt;
*Début des tests de régulation en mode suspendu (sans grande réussite pour le moment)&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Tests de régulation en mode suspendu (avec l'équipe 1)&lt;br /&gt;
*Début de conception d'un PCB permettant de fixer l'ensemble des composants (les nombreux fils commencent à devenir trop gênants pour les tests)&lt;br /&gt;
&lt;br /&gt;
===Semaine 6===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Modification du programme afin de détecter l'arrêt du microcontrôleur Atemega 328P. &lt;br /&gt;
* Resolution de l'erreur lié à la carte et au programme, suspicion de l'ISR mais le problème était du à une division par 0 (Probleme de maquette avec le MPU 6050).  &lt;br /&gt;
&lt;br /&gt;
[[Fichier: calibration-un-axe.mp4|250px|right|thumb|Essai de calibration sur un axe avec le deuxième dispositif]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Mise en place de support en PVC (voir photo) afin de ne laisser au drone qu'un seul degrés de liberté et ainsi permettre de le réguler plus facilement, suite à l'échec de la régulation suspendue.&lt;br /&gt;
*Problème sur un moteur ou un ESC de notre nouveau drone, un des moteurs ne tourne pas lorsque nous montons l'hélice dessus.&lt;br /&gt;
*Problème sur un moteur du nouveau drone qui se coupe totalement à une consigne bien précise et redémarre ensuite.&lt;br /&gt;
&lt;br /&gt;
[[Fichier: testesc.jpg|400px|center|thumb|Test des valeurs de courant reçues par les ESC]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 : coupure pédagogique===&lt;br /&gt;
&lt;br /&gt;
===Semaine 8===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 &amp;amp; 2 :'''&lt;br /&gt;
&lt;br /&gt;
* Lors de cette semaine, nous nous sommes penchés sur les problèmes physiques rencontrés précédemment. &lt;br /&gt;
Pour cela nous avons utilisé un oscilloscope équipé d'une sonde afin de relever les valeurs clés de tension et de courant.&lt;br /&gt;
Nous utilisons un programme qui envoie la même consigne aux 4 moteurs afin de comparer les vitesses de rotation.&lt;br /&gt;
Nous nous sommes aperçu que sur la maquette n°1, les 4 moteurs fonctionnent correctement mais qu'un ESC (Contrôleur moteur) est défaillant.&lt;br /&gt;
Sur la maquette n°2, un moteur et un ESC sont obsolètes. &lt;br /&gt;
Nous avons essayé de mixer les deux maquettes pour faire fonctionner un drone.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 &amp;amp; 2 :'''&lt;br /&gt;
&lt;br /&gt;
* Commande et attente des ESC pour finaliser la régulation.&lt;br /&gt;
* Création d'un boitier PID pour simplifier la régulation. Ce boiter va nous permettre de modifier facilement les valeurs des coefficients de notre PID numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Nous avons créé un programme, permettant de prendre en entrée le boitier PID, et de lire la valeur des potentiomètres pour modifier en instantané les valeurs du PID numérique.&lt;br /&gt;
*Le boitier comporte 3 potentiomètres, un pour chaque la valeur du I, la valeur du P et la valeur du D.&lt;br /&gt;
*Les valeurs du PID varient entre des plages bien précises: P: I: D:&lt;br /&gt;
&lt;br /&gt;
===Semaine 10===&lt;br /&gt;
&lt;br /&gt;
Re-structuration du projet suite aux événements du COVID-19:&lt;br /&gt;
&lt;br /&gt;
* Régulation sur deux ESCs : Lukas (dispose de tout le matériel)&lt;br /&gt;
* Création application mobile, communication entre téléphone et le drone. (Richard et Evan)&lt;br /&gt;
* Simuler le drone en C. (Maxime)&lt;br /&gt;
&lt;br /&gt;
===Semaine 11===&lt;br /&gt;
&lt;br /&gt;
'''Régulation avec 2 ESCs (Lukas) :'''&lt;br /&gt;
&lt;br /&gt;
* Test du boîtier permettant le contrôle des différents coefficients du PID. En effet, lors de sa conception, un faux contact avait été constaté : problème résolu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Pid_controller_P4.jpg|300px|center|thumb|Boîtier de contrôle du PID]]&lt;br /&gt;
&lt;br /&gt;
'''Application mobile :'''&lt;br /&gt;
&lt;br /&gt;
* Début de l'apprentissage de la création d'une application Android à l'aide de ANDROID STUDIO&lt;br /&gt;
&lt;br /&gt;
===Semaine 12===&lt;br /&gt;
&lt;br /&gt;
[[Fichier: regulation_4_esc.mp4|300px|left|thumb|Régulation presque adaptée sur 4 ESCs]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Application mobile :'''&lt;br /&gt;
*Réalisation d'une application Android, sous Android Studio, permettant de simuler une commande afin de piloter le drone.&lt;br /&gt;
*Les joysticks envoient une consigne variant de 1000 à 2000 pour le throttle et les axes Yaw, Pitch, Roll, valeurs attendues par le drone afin de générer les signaux PWM pour les ESCs.&lt;br /&gt;
*L'interface de l'application est terminée, il reste désormais à programmer la partie concernant l'ESP-32.&lt;br /&gt;
[[Fichier: applicationAndroid.mp4|520px|center|thumb|Présentation de l'application]]&lt;br /&gt;
&lt;br /&gt;
'''Régulation avec 2 ESCs'''&lt;br /&gt;
*Test de régulation sur le banc d'essai avec les valeurs du PID testée sur les derniers tests à 4 ESCs : vidéo ci-contre&lt;br /&gt;
*Test du programme utilisant le boitier PID permettant de modifier nos valeurs en direct&lt;br /&gt;
&lt;br /&gt;
===Semaine 13===&lt;br /&gt;
&lt;br /&gt;
* Reception d'un ESP32 et debut de la programmation. Création d'un Serveur WIFI, il reste à faire communiquer l'application et l'ESP32.&lt;br /&gt;
&lt;br /&gt;
* Modification du code pour réguler deux moteurs&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 et 15 : coupure pédagogique===&lt;br /&gt;
&lt;br /&gt;
* Communication telephone-ESP32  fonctionnelle à partir d'un serveur WEB. Communication de l'application vers ESP32 impossible. Nous n'avons pas réussi à nous connecter à la socket créé sur l'esp32.&lt;br /&gt;
&lt;br /&gt;
* La communication entre l'application mobile et l'ESP32 est fonctionnelle, nous envoyons ainsi un message formé des consignes sur la socket.&lt;br /&gt;
&lt;br /&gt;
'''Régulation avec deux moteurs'''&lt;br /&gt;
&lt;br /&gt;
Après avoir constaté que la fonction compensateBatteryDrop() était devenue obsolète en raison de l'ajout de notre PDB (Power Distributor Board), nous avons décidé de l'enlever de notre boucle (void loop()) améliorer les performances de notre programme. De plus, un pin était utilisé et faussait les calculs. Cette suppression nous a permis, effectivement, de constater une nette amélioration dans la gestion de la régulation.&lt;br /&gt;
&lt;br /&gt;
Lukas a alors pu réguler le drone avec deux moteurs sur un axe (Roll). Cette régulation a été menée à bien et le drone se stabilise sur un axe jusqu'à ce que nous soyons à court de batterie (nous nous rechargions à Robotech) avec les valeurs suivantes :&lt;br /&gt;
*kp Roll = 1.25  ki Roll = 0.05  kd Roll = 22.00&lt;br /&gt;
&lt;br /&gt;
L'objectif maintenant est, dès qu'on le pourra, après la fin du semestre de se réunir, d'installer les 4 nouveaux ESC et d'effectuer une régulation complète afin de finir complètement la conception de notre drone.&lt;br /&gt;
&lt;br /&gt;
===Documents Rendus===&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2018/2020_P4&amp;diff=84607</id>
		<title>IMA3/IMA4 2018/2020 P4</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2018/2020_P4&amp;diff=84607"/>
				<updated>2020-05-03T12:15:22Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Liste des tâches à effectuer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;include nopre noesc src=&amp;quot;/home/pedago/pimasc/include/video-ConstructionDroneIMA32018-iframe.html&amp;quot; /&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre du projet IMA3/4, nous avons choisi le sujet P4 : '''Construction d'un drone volant'''. Notre groupe se compose de Maxime CLAUDEL, Lukas FAUCHOIS, Evan GURY et Richard Simonin.&lt;br /&gt;
Nous avions dans un premier temps décidé de réaliser notre projet autour d'un drone servant à la livraison de petit colis, cependant dans un souci concernant la matériel mis à notre disposition et de budget, nous avons finalement opté pour un drone &amp;quot;loisir&amp;quot;.&lt;br /&gt;
Ce dernier sera destiné à un public amateur, dans un but d'apprentissage et/ou d'amusement et sera ainsi plus en adéquation avec nos contraintes et compétences, de plus amples informations sont décrites ci-dessous dans la partie '''Objectifs''' de notre présentation.&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
A terme, l'objectif principal de ce projet est de concevoir et construire entièrement un drone &amp;quot;made in Polytech Lille&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nous allons alors répartir notre travail en deux sessions, une première réalisée en IMA (S6) et une seconde en IMA4.&lt;br /&gt;
&lt;br /&gt;
Pour la fin de cette première session de projet, nous avons pour objectif de faire voler notre drone. Pour ce faire, nous n'avons évidemment pas le temps de nous occuper de la partie concernant le vol nous-mêmes, c'est pour quoi nous avons opté pour l'utilisation d'un contrôleur de vol n'ayant qu'à être configuré.&lt;br /&gt;
&lt;br /&gt;
Parallèlement à cela, nous comptons réaliser nous-mêmes la commande permettant de communiquer avec ce dernier pendant qu'une autre partie des membres du projet s’attellera à la partie mécanique et électrique du drone.&lt;br /&gt;
&lt;br /&gt;
Ce faisant et si tout se passe bien, nous pourrons avoir pour débuter l'année prochaine une base solide pour concevoir nous-mêmes notre contrôleur de vol. Ce qui nous amène à notre second point, puisque nous comptons dans un second temps réaliser notre propre contrôleur de vol, une fois le premier objectif atteint.&lt;br /&gt;
&lt;br /&gt;
=Analyse du projet=&lt;br /&gt;
&lt;br /&gt;
==Positionnement par rapport à l'existant==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:parrot.jpg|right|thumb|PARROT AR.DRONE 2.0]]&lt;br /&gt;
[[Fichier:udi.jpg|right|thumb|UDI U818S]]&lt;br /&gt;
&lt;br /&gt;
===Analyse du premier concurrent : PARROT AR.DRONE 2.0===&lt;br /&gt;
&lt;br /&gt;
Le [https://www.parrot.com/fr/drones/parrot-ardrone-20-elite-edition PARROT AR.DRONE 2.0], tout comme le notre, est destiné à un usage ludique. En dehors de la camera que nous n'envisageons pas d'intégrer à notre drone pour le moment, il dispose de toutes les caractéristiques que nous souhaiterions obtenir. A savoir une portée d'environ 100m, une autonomie de plus de 10min et une vitesse moyenne d'environ 20 km/h pour un prix avoisinant les 100 euros.&lt;br /&gt;
&lt;br /&gt;
Notre avantage peut se jouer sur la camera, en effet, en enlevant cette dernière nous pouvons réaliser des économies. De plus, si une personne recherche un drone simplement pour prendre du plaisir à le faire voler, il ne souhaitera pas forcément gaspiller son argent dans une camera qu'il n'aurait surement de base pas voulu.&lt;br /&gt;
&lt;br /&gt;
===Analyse du second concurrent : UDI U818S===&lt;br /&gt;
&lt;br /&gt;
Fabriqué par la marque UDI, le [https://www.maisondudrone.com/prod/udi-u818s-avec-camera-hd-2-0mp-blanc-1400.html UDI U818S] est un drone au caractéristiques similaires au précédent, à l'exception de la camera.&lt;br /&gt;
En effet, cette fois nous sommes face à un concurrent qui tout comme nous, propose simplement la fonctionnalité de base d'un drone, à savoir voler et cela se fait ressentir sur le prix puisque nous passons sur un prix d'environ 50 euros.&lt;br /&gt;
Face à un concurrent proposant un produit similaire au notre et à un prix au plus bas pour ces caractéristiques, difficile de faire mieux sur le plan technique. Peut être serait il alors plus judicieux de proposer un produit plus haute gamme, plus chère, mais destiné à un public désireux de s'amuser avec un produit de qualité.&lt;br /&gt;
&lt;br /&gt;
==Scénario d'usage du produit ou du concept envisagé==&lt;br /&gt;
&lt;br /&gt;
'''A qui notre drone peut-il servir ?'''&lt;br /&gt;
&lt;br /&gt;
Le drone &amp;quot;made in Polytech Lille&amp;quot; s'adresse à tout public n'ayant que pour objectif l'amusement''&lt;br /&gt;
&lt;br /&gt;
Toute personne souhaitant débuter avec un drone de qualité, sans s'encombrer de fonctionnalité ne s'avérant pas utiles peut être amenées a utiliser notre drone.&lt;br /&gt;
&lt;br /&gt;
'''Pour quel type d'utilisation ?'''&lt;br /&gt;
&lt;br /&gt;
Nombre de notre génération ont déjà reçu comme cadeau une voiture RC. Cette dernière n'avait que pour objectif de rouler à toute vitesse pour nous satisfaire. Nul besoin d'embarquer des caméras, stabilisateurs et nombres d'autres gadgets inutile à la vocation initiale de notre voiture, rouler. &lt;br /&gt;
&lt;br /&gt;
Avec notre drone, nous voulons remettre cela en avant, le simple plaisir de piloter une voiture RC appliqué aux drones. Alors enfant, adultes et nostalgiques pourront par le biais de notre produit découvrir ou redécouvrir le plaisir de piloter un engin motorisé, qui plus est cette-ci fois dans les airs.&lt;br /&gt;
&lt;br /&gt;
==Réponse à la question difficile==&lt;br /&gt;
&lt;br /&gt;
'''Qu'en est-il du dimensionnement des composants pour permettre à votre drone de porter une telle charge ?'''&lt;br /&gt;
&lt;br /&gt;
Nos contraintes et objectif ayant totalement changé, la question ne se pose plus vraiment. En effet nous avons suites à notre présentation réalisé des calculs en terme de puissance et nous nous sommes très vite rendu compte de l'impossibilité à réaliser notre projet.&lt;br /&gt;
&lt;br /&gt;
En effet, au vu de notre budget, l'achat d'un seul des quatre moteurs nécessaire à l'atteinte des chiffres que nous avions avancés était déjà impossible. Nous avons donc totalement changé d'objectif et avons récupéré du matériel déjà présent à Polytech, à savoir quatre moteurs et leur ESC. Nous avons pris le problème à l'envers et avons réfléchi à ce que nous pouvions réaliser avec le budget et le matériel à disposition.&lt;br /&gt;
&lt;br /&gt;
C'est de cette manière que nous avons eu l'idée d'un drone &amp;quot;loisir&amp;quot;, effaçant ainsi la question de la charge.&lt;br /&gt;
&lt;br /&gt;
==Bibliographie et webographie==&lt;br /&gt;
&lt;br /&gt;
===Arducopter===&lt;br /&gt;
&lt;br /&gt;
 https://www.digi.com/resources/documentation/digidocs/PDFs/90000976.pdf&lt;br /&gt;
 http://jeromeabel.net/wiki/xbee/xbee-arduino.pdf&lt;br /&gt;
 https://www.digi.com/resources/documentation/digidocs/pdfs/90001942-13.pdf&lt;br /&gt;
 https://www.arduino.cc/en/Reference/Servo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Manuel d'utilisation&lt;br /&gt;
 http://ardupilot.org/copter/index.html&lt;br /&gt;
&lt;br /&gt;
* Tutoriels vidéos&lt;br /&gt;
 Première installation et setup : https://www.youtube.com/watch?v=30cCs4aHdB0&amp;amp;t=754s&lt;br /&gt;
 Alimentation de l'Ardupilot : https://www.youtube.com/watch?v=TS4OWAcfAQY&amp;amp;t=270s&lt;br /&gt;
 Calibration des ESC : https://youtu.be/gYoknRObfOg&lt;br /&gt;
&lt;br /&gt;
=Préparation du projet=&lt;br /&gt;
&lt;br /&gt;
==Cahier des charges du groupe==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Diagramme bête à cornes'''&lt;br /&gt;
&lt;br /&gt;
Le diagramme bête à cornes nous permet de faire une analyse fonctionnelle du besoin. Notre drone permet à utilisateur de découvrir l'aéronautique à travers une activité ludique à l'aide d'une télécommande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bete_a_cornes.png | center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Diagramme en pieuvre'''&lt;br /&gt;
&lt;br /&gt;
Le diagramme en pieuvre permet quant à lui de répertorier toutes les fonctions (principales et de service) et d'analyser l'importance des besoins de notre projet&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pieuvredrone.png | center]]&lt;br /&gt;
&lt;br /&gt;
'''Tableau de fonctions'''&lt;br /&gt;
&lt;br /&gt;
Le tableau ci-dessous liste les fonctions principales (FP) et les fonctions contraintes (FC), dans l'orde d'importance, les accompagnant d'une petite description.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tableau_fonctions.jpeg | 500px | center]]&lt;br /&gt;
&lt;br /&gt;
==Cahier des charges des équipes==&lt;br /&gt;
===Equipe 1 : Gestion de la commande (Evan Gury et Richard Simonin)===&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie, est de créer une télécommande ainsi que le récepteur. Nous devons lire les valeurs des potentiomètres, créer des trames, envoyer les trames et analyser les trames reçus. Notre système doit être performant en matière de vitesse ainsi qu'en précision.&lt;br /&gt;
&lt;br /&gt;
===Equipe 2 : Contrôleur de vol (Maxime Claudel et Lukas Fauchois)===&lt;br /&gt;
&lt;br /&gt;
L'objectif de l'équipe est d'utiliser une carte de contrôle pouvant être liée à un logiciel de contrôle de vol. Etant donné notre projet, la carte doit respecter certaines contraintes : être adaptée à un drone à quatre hélices (quadcopter), fonctionner sur batterie (car positionnée sur le chassis du drone), être déjà programmée et relativement simple d'utilisation. Le logiciel doit quant à lui nous permettre de gérer le vol du drone et de calibrer les commandes.&lt;br /&gt;
&lt;br /&gt;
==Choix techniques : matériel et logiciel==&lt;br /&gt;
===Equipe 1===&lt;br /&gt;
&lt;br /&gt;
'''Émetteur'''&lt;br /&gt;
&lt;br /&gt;
Pour la réalisation de l'émetteur, nous avons choisi de travailler avec une Arduino ainsi que '''deux joysticks''' et un '''émetteur Xbee'''. Nous voulons une télécommande petite c'est pourquoi nous avons pris avec une '''Arduino NANO'''. Le drone a besoin de deux joysticks pour être dirigé selon 3 axes.&lt;br /&gt;
&lt;br /&gt;
'''Récepteur'''&lt;br /&gt;
&lt;br /&gt;
Pour la réalisation du récepteur, qui sera situé sur le drone nous avons commencé par utiliser une '''Arduino UNO''' mais nous souhaitons changer pour une NANO afin d'optimiser le poids ainsi que l'espace. Nous avons aussi besoin d'un '''récepteur Xbee''' afin de recevoir les trames.&lt;br /&gt;
&lt;br /&gt;
===Equipe 2===&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi pour notre carte de contrôle un '''Ardupilot 2.8''', son prix est raisonnable (une trentaine d'euros) et nous trouvons beaucoup de tutoriels l'utilisant sur YouTube.&lt;br /&gt;
&lt;br /&gt;
Pour le logiciel, deux choix relativement similaires s'offraient à nous : Mission Planner ou APM Planner. Les deux logiciels ont à peu près la même interface et permettent tous les deux d'effectuer les mêmes étapes de calibrage de l'Ardupilot et des commandes avant le premier vol.&lt;br /&gt;
&lt;br /&gt;
Nous avons d'abord commencé sur Mission Planner mais des problèmes de mises à jour du firmware de l'Ardupilot nous ont empêché de calibrer les '''ESC du drone'''. Nous sommes donc ensuite passés sur '''APM Planner''' car il permet d'éviter ce problème de mises à jour.&lt;br /&gt;
&lt;br /&gt;
===Bilan===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:materieldrone.jpg|right|thumb|Matériel nécessaire à la conception]]&lt;br /&gt;
&lt;br /&gt;
* '''Matériel''' :&lt;br /&gt;
**2 joysticks&lt;br /&gt;
**Emetteur Xbee&lt;br /&gt;
**Récepteur Xbee&lt;br /&gt;
**Arduino NANO&lt;br /&gt;
**Arduino UNO&lt;br /&gt;
**Ardupilot 2.8&lt;br /&gt;
**Câblage&lt;br /&gt;
&lt;br /&gt;
* '''Logiciels''' :&lt;br /&gt;
**Arduino&lt;br /&gt;
**Mission Planner&lt;br /&gt;
**APM Planner 2.0&lt;br /&gt;
&lt;br /&gt;
==Liste des tâches à effectuer==&lt;br /&gt;
===Equipe 1===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser la partie gestion de la commande, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Analyse du projet&lt;br /&gt;
* Découverte Xbee&lt;br /&gt;
* Prise en main Xbee&lt;br /&gt;
* Envoi de trames&lt;br /&gt;
* Réception de trames&lt;br /&gt;
* Optimisation de la programmation&lt;br /&gt;
* Test sur maquette&lt;br /&gt;
* Réalisation du PCB&lt;br /&gt;
* Mise en œuvre sur notre drone&lt;br /&gt;
&lt;br /&gt;
===Equipe 2===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser la partie contrôleur de vol, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Analyse du projet&lt;br /&gt;
* Choix d'une carte de contrôle&lt;br /&gt;
* Documentation, recherche d'un software&lt;br /&gt;
* Calibration de la carte&lt;br /&gt;
* Réalisation des branchements&lt;br /&gt;
* Mise en application sur la maquette&lt;br /&gt;
* Mise en relation avec la partie commande&lt;br /&gt;
&lt;br /&gt;
==Calendrier prévisionnel==&lt;br /&gt;
Nous avons décidé de réaliser un diagramme de GANTT pour chacun des calendriers prévisionnels (un par équipe). Sur chaque tâche, nous avions prévu un temps de travail en bleu dans les diagrammes et le temps réel consacré en jaune.&lt;br /&gt;
===Equipe 1 : Calendrier prévisionnel pour la gestion de la commande===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:equipe1cal.jpg|500px|center|&amp;quot;Calendrier de l'Equipe 1&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Equipe 2 : Calendrier prévisionnel pour le contrôleur de vol===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:equipe2cal.jpg|500px|center|&amp;quot;Calendrier de l'Equipe 2&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet S6==&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 et 6===&lt;br /&gt;
&lt;br /&gt;
Avant de scinder le groupe en deux équipes, nous avons passés les deux premières séances à évaluer les besoins de conception de notre projet pour pouvoir ensuite réaliser un cahier des charges et établir un calendrier prévisionnel des tâches à effectuer.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:xbeedrone.jpg|200px|thumb|Xbee]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Etant donné que nous avons décidé d'utiliser des modules XBee, nous avons consacrés cette semaine à la documentation, afin de comprendre comment configurer et utiliser ces derniers.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ardupilot28.jpeg|300px|right|thumb|Ardupilot 2.8]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Sur le principe de la semaine 7, nous nous sommes documentés sur les XBee afin de comprendre comment les configurer et les utiliser.&lt;br /&gt;
&lt;br /&gt;
Pour la configuration, nous avons retenu le logiciel XCTU qui est celui recommandé pour configurer les XBee. Cependant, nous gardons quand même de côté Legacy XCTU qui est l'ancienne version XCTU mais qui reste tout de même viable.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Nous avons consacré cette séance de documentation à la recherche d'une carte de contrôle de vol satisfaisant nos exigences. Nous cherchions donc une carte facilement connectable avec un Arduino Uno/Micro. Nous avons opté pour l'Ardupilot 2.8. Il comprend tout le nécessaire pour diriger un drone quadcopter, centrale gyroscopique, accéléromètres, interface de radiocommande. &lt;br /&gt;
Nous avons donc commandé l'Ardupilot via le site Alibaba.com (30€) et nous l'avons reçu trois semaines plus tard.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Après avoir effectués diverses recherches sur les modules XBee et effectué de nombreux tests (XCTU, legacy XCTU), nous avons abandonné l'utilisation du logiciel XCTU, étant donné que nous n'utilisons que deux XBee, nous pouvons les initialiser directement dans le programme avec le programme suivant:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:inixbeedrone.png]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
En attendant la réception du colis de l'Ardupilot, nous nous sommes documentés sur les différents logiciels de contrôle de vol à notre disposition. L'objectif étant de trouver un logiciel compatible avec l'Ardupilot 2.8 et avec suffisamment de documentation et tutoriels d'utilisation. Les deux logiciels qui sont ressortis le plus dans nos recherches sont Mission Planner et APM Planner 2. Ces deux logiciels sont très similaires au niveau de l'interface et des options de calibration de la carte de vol à laquelle ils sont connectés.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:apm20.png|300px|center]][[Fichier:missionplanner.jpg|300px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En connectant l'Ardupilot via un câble USB, le logiciel le reconnait et une démarche de calibration peut être entamée : boussole, accéléromètres, radiocommande, ESC.&lt;br /&gt;
&lt;br /&gt;
===Semaine 10===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur la transmission, la réception et le traitement des trames.&lt;br /&gt;
&lt;br /&gt;
Pour la transmission, nous avons mis en place le système suivant:&lt;br /&gt;
&lt;br /&gt;
*On lit la valeur des potentiomètres&lt;br /&gt;
*On convertit la valeur en une chaîne de caractère et on lui attribue un indice qui est propre à chaque position des joysticks.&lt;br /&gt;
*On envoie la chaîne de caractère par liaison série.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la réception, nous avons mis en place le système suivant:&lt;br /&gt;
&lt;br /&gt;
*On reçoit un tableau de caractère qui contient la consigne entre 0 et 1023 et un indice pour dire à quel joystick et quelle position la consigne correspond.&lt;br /&gt;
*On converti le tableau en entier et à l'aide de la fonction map on adapte la consigne pour qu'elle est une valeur entre 0 et 180.&lt;br /&gt;
*On transmet la consigne à l'ardupilot.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Idem semaine 9.&lt;br /&gt;
&lt;br /&gt;
===Semaine 11===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Débogage de la communication entre les modules XBee et l'ardupilot.&lt;br /&gt;
&lt;br /&gt;
En utilisant deux terminaux, la communication était réalisé entre les deux XBee  cependant une fois branché sur l'ardupilot nous avons eu des difficultés à traiter les trames, du au fait d'une transmission trop rapide.&lt;br /&gt;
&lt;br /&gt;
De plus nous avons passé un certains temps à vouloir utiliser une arduino micro mais avons finalement décidé de laisser tomber, puisque nous n'avons pas réussi à réceptionner les trames XBee.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Idem semaine 9.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Optimisation du format des trames et réglage de la vitesse de transmission.&lt;br /&gt;
&lt;br /&gt;
Passage d'une Arduino UNO à une Arduino Nano pour l'envoie des trames dans l'optique de réaliser un PCB pour la commande.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
A ce stade du projet nous ne pouvions qu'expérimenter les calibrations de la boussole et des accéléromètres de l'Ardupilot car la partie commande n'était pas terminée.&lt;br /&gt;
&lt;br /&gt;
La calibration de la boussole s'effectue en bougeant l'Ardupilot selon tous ces axes pendant une période de temps donnée jusqu'à ce que les informations nécessaires soient récoltées.&lt;br /&gt;
La calibration des accéléromètres s'effectue en positionnant l'Ardupilot dans des positions définies (sur le côté gauche, sur la face avant, etc.). (cliquer sur l'image ci-dessous pour lancer le GIF)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:compasscalib.gif|300px|center]][[Fichier:compasscalib.png|300px|center]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Réglage des trames pour la commande du prototype.&lt;br /&gt;
&lt;br /&gt;
Nous avons rencontré quelques problème de sensibilité au niveau des joysticks et du traitement du signal de commande transmis à l'ardupilot.&lt;br /&gt;
&lt;br /&gt;
En effet, ayant trouvé très peu de documentation sur l'ardupilot, nous avons eu du mal à générer les bons signaux de commande.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes ensuite consacrés à la partie alimentation de l'Ardupilot et du drone. En se documentant sur le site servant de manuel d'utilisation d'Ardupilot et des logiciels Mission Planner et APM Planner 2, nous avons trouvé que l'Ardupilot pouvait être alimenté via les ESC.&lt;br /&gt;
Une batterie LiPo alimente les ESC qui elles-mêmes alimentent l'Ardupilot via les broches Output. L'Ardupilot alimente ensuite l'Arduino qui réceptionne les trames reçues par le récepteur Xbee. Sur les sorties (Output) de l'Ardupilot sont aussi branchés les fils permettant la réception du signal envoyé aux moteurs.&lt;br /&gt;
Ainsi, tous les composants nécessaires au drone sont alimentés.&lt;br /&gt;
&lt;br /&gt;
===Semaine 14===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Conception du PCB pour la commande en essayant de limiter le plus possible les vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pcbdrone.png|400px|PCB]]&lt;br /&gt;
&lt;br /&gt;
Vérification de l'envoie des trames à l'aide de l'ordinateur et test de réception sur l'Ardupilot.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Branchements comme indiqués à la semaine précédente, alimentation et tests de bon fonctionnement des moteurs, Ardupilot et Arduino.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:branchementesc.jpg|300px]][[Fichier:branchementardu.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 15===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Fabrication de la manette&lt;br /&gt;
&lt;br /&gt;
[[Fichier:manettedrone.jpg|400px|PCB]]&lt;br /&gt;
&lt;br /&gt;
Modification de l'envoie des trames. Tests de transmission.&lt;br /&gt;
Implémentation du programme sur le prototype.&lt;br /&gt;
&lt;br /&gt;
Les deux équipes ont passé la semaine à réunir leur travail, nous avons ainsi tous pu réaliser de nombreux tests du prototype, avec réussite, hormis un léger accident qui à entraîné la destruction de deux hélices. &lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
A ce stade, la commande étant terminée et nous avons pu nous lier à l'équipe 1 pour mettre en relation la télécommande et l'Ardupilot. Après avoir utilisé Mission Planner pendant plusieurs semaines, un problème de mise-à-jour du software de l'Ardupilot nous empêchait toujours d'effectuer la calibration de la radiocommande. Nous sommes donc passés sur APM Planner 2 et la mise-à-jour n'était plus demandée, nous avons donc enfin pu terminer l'intégralité de la phase de calibration. Comme expliqué ci-dessus, nous avons effectué de nombreux tests pour atteindre notre objectif.&lt;br /&gt;
&lt;br /&gt;
===Documents Rendus===&lt;br /&gt;
&lt;br /&gt;
Rapport : [[fichier:rapport_groupe_4.pdf]]&lt;br /&gt;
&lt;br /&gt;
==Projet S7==&lt;br /&gt;
&lt;br /&gt;
===De nouveaux objectifs===&lt;br /&gt;
&lt;br /&gt;
Durant le semestre 6, nous avons réussi à concevoir un drone volant fonctionnel régulé à l'aide d'une carte de contrôle OpenSource '''Ardupilot 2.8'''. Concernant la commande, nous avions fait le choix d'utiliser une carte communication Xbee ainsi qu'une Arduino NANO et des joysticks.&lt;br /&gt;
&lt;br /&gt;
Cette année, nous avons décidé de développer plus amplement notre projet et de pratiquement repartir du point de départ. En effet, nos objectifs cette année sont :&lt;br /&gt;
*'''d'utiliser de nouveaux composants dont nous connaissons les propriétés (moteurs, ESCs, etc)'''&lt;br /&gt;
*'''d'utiliser une télécommande de modélisme ainsi qu'un récepteur adapté à des portées plus élevées que celles que permettait l'Xbee'''&lt;br /&gt;
*'''de concevoir notre propre contrôleur de vol'''&lt;br /&gt;
*'''Bonus''' : d'intégrer une régulation GPS et un mode automatique en cas de perte de signal&lt;br /&gt;
&lt;br /&gt;
===Reprise du cahier des charges===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 : Gestion de la commande et initialisation (Richard Simonin &amp;amp; Lukas Fauchois)'''&lt;br /&gt;
&lt;br /&gt;
L'objectif de la nouvelle gestion de la commande est d'utiliser une télécommande de modélisme capable de transmettre les différentes données nécessaires (Throttle, Yaw, Pitch) à un récepteur relié à une Arduino UNO, ce qui nous permettra d'être performant en terme de vitesse et de précision. De plus, cette partie de la conception consiste également à calibrer les quatre ESCs que nous utilisons. &lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 : Contrôleur de vol (Evan Gury &amp;amp; Maxime Claudel)&lt;br /&gt;
&lt;br /&gt;
L'objectif ici est d'implémenter notre propre contrôleur de vol (software et hardware) à l'aide de composants individuels, principalement d'une centrale inertielle 3 axes ainsi que d'un accéléromètre 3 axes.&lt;br /&gt;
&lt;br /&gt;
===Nouveaux choix techniques===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
Pour réaliser la commande du drone, nous avons décidé d'utiliser une télécommande [https://fr.banggood.com/Flysky-FS-i6X-2_4GHz-10CH-AFHDS-2A-RC-Transmitter-With-X6B-i-BUS-Receiver-p-1090406.html?rmmds=myorder&amp;amp;ID=42482530817&amp;amp;cur_warehouse=CN '''Flysky FS-I6X'''] accompagnée de son récepteur '''FS-X6B''' qui possède une portée assez élevée pour la réalisation de notre projet. Ce récepteur sera alors relié à une carte '''Arduino UNO''' (qui servira également au contrôleur de vol).&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
Concernant la réalisation du contrôleur de vol, nous choisissons d'utiliser une centrale inertielle [https://fr.banggood.com/3pcs-6DOF-MPU-6050-3-Axis-Gyro-With-Accelerometer-Sensor-Controller-Module-For-Arduino-p-1430733.html?rmmds=search&amp;amp;cur_warehouse=CN '''MPU6050'''] possédant un accéléromètre 3 axes ainsi qu'un gyroscope 3 axes, ce qui convient parfaitement à l'utilisation que l'on veut en faire. De plus, c'est une centrale qui est documentée et à coût raisonnable, elle dispose de son propre processeur, ce qui réduit considérablement la quantité de calculs à effectuer par notre micro-contrôleur. Nous relierons également cette centrale inertielle à la carte '''Arduino UNO'''.&lt;br /&gt;
&lt;br /&gt;
'''Conception générale du drone :'''&lt;br /&gt;
&lt;br /&gt;
Comme évoqué précédemment, pour le coeur d'une drone, nous utiliserons une carte '''Arduino UNO''' qui possède un nombre suffisant de ports d'interruptions, de ports PWM et d'une puissance de calcul suffisante pour traiter toutes les informations des différents capteurs.&lt;br /&gt;
&lt;br /&gt;
Nous avons également décidé de fabriquer notre propre chassis basé sur le design du précédent et d'utiliser de nouveaux ESCs dédiés spécialement au drone volant ([https://fr.banggood.com/EMAX-BLHeli-Series-6A-12A-20A-30A-ESC-p-963634.html?rmmds=search&amp;amp;ID=45170&amp;amp;cur_warehouse=CN '''EMAX BLHELI SERIES 20A''']). Nous avons également choisi de nouveaux moteurs brushless : les [https://fr.banggood.com/1000KV-Brushless-Motor-3_17mm-Shaft-Electric-Motor-p-1102054.html?rmmds=search&amp;amp;cur_warehouse=CN '''A2212/13T'''].&lt;br /&gt;
&lt;br /&gt;
'''Bilan'''&lt;br /&gt;
*'''Matériel'''&lt;br /&gt;
**Chassis&lt;br /&gt;
**4 ESCs EMAX BLHELI 20A&lt;br /&gt;
**4 moteurs A2212/13T&lt;br /&gt;
**Batterie LI-PO 11,1V - 2700mAh&lt;br /&gt;
**Arduino UNO&lt;br /&gt;
**Télécommande Flysky FS-I6X&lt;br /&gt;
**Récepteur FS-X6B&lt;br /&gt;
**Centrale inertielle MPU6050&lt;br /&gt;
*'''Logiciel'''&lt;br /&gt;
**Arduino&lt;br /&gt;
&lt;br /&gt;
'''Note''' : grâce au travail d'Evan Gury, nous avons pu acquérir tout ce matériel et il a pu concevoir le chassis avant même le commencement du semestre 7, ce qui nous a permis de nous avancer sur le travail à réaliser.&lt;br /&gt;
&lt;br /&gt;
===Liste des tâches à effectuer===&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser la nouvelle gestion de la commande et l'initialisation, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Découverte télécommande Flysky FS-I6X et son récepteur FS-X6B&lt;br /&gt;
* Configurer la télécommande&lt;br /&gt;
* Lecture des joysticks par Arduino&lt;br /&gt;
* Initialiser les extremums des joysticks&lt;br /&gt;
* Optimisation de la programmation&lt;br /&gt;
* Test de transmission sur les ESCs&lt;br /&gt;
* Mise en œuvre sur notre drone&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser le contrôleur de vol, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Découverte du MPU6050&lt;br /&gt;
* Configuration des registres du MPU6050&lt;br /&gt;
* Récupération des mesures angulaires en °/s&lt;br /&gt;
* Intégration des mesures pour récupérer les positions en degrés&lt;br /&gt;
* Calcul de la consigne&lt;br /&gt;
* Calcul de l'erreur&lt;br /&gt;
* Calcul du correcteur&lt;br /&gt;
* Application de la correction aux ESCs&lt;br /&gt;
&lt;br /&gt;
===Semaine 45===&lt;br /&gt;
&lt;br /&gt;
[[Fichier: flyskyFSI6X.jpg|200px|right|thumb|Flysky FS-I6X et FS-X6B]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Lors de la première semaine, nous avons fait le choix d'utiliser un mode de transmission existant et d'abandonner la télécommande conçue au semestre précédent. Nous avons alors choisi d'utiliser la télécommande de modélisme Flysky FS-I6X et son récepteur FS-X6B. &lt;br /&gt;
&lt;br /&gt;
*Nous avons dû dans un premier temps configurer la télécommande et comprendre comment transmettre les informations des deux joysticks.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Nous avons passé la première séance à nous documenter le plus possible sur le MPU6050 qui est le cœur de notre contrôleur de vol.&lt;br /&gt;
*Nous avons ainsi pu trouver de nombreux documents concernant la configuration des différents registre du MPU6050, de manière à avoir une utilisation correspondant au mieux à un drone volant.&lt;br /&gt;
&lt;br /&gt;
===Semaine 46===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Pour la réception des informations et le traitement des données, nous avons branché le récepteur sur une carte Arduino. Deux choix s'offraient à nous, utiliser des broches PWM ou une broche PPM. Le PPM a pour avantage d'utiliser un unique câble, tous les canaux sont transmis à la suite contrairement au PWM, un câble est nécessaire à chaque canal. L'Arduino UNO ne nous limitant pas pour l'utilisation de 1 broche ou 4 broches, nous avons décider d'utiliser le PWM.&lt;br /&gt;
&lt;br /&gt;
*Nous avons programmé notre Arduino UNO afin de récupérer les informations sur nos canaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Nous avons passé tout notre temps à tenter de récuperer les coordonnées YAW-PITCH-ROLL du mpu6050 et ce de la manière la plus rapide possible afin d'optimiser au mieux la régulation.&lt;br /&gt;
&lt;br /&gt;
===Semaine 47===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Nous avons finalisé la conception de notre drone, nous avons finalisé le câblage et ainsi pu faire des tests sur le prototype.&lt;br /&gt;
&lt;br /&gt;
*Pour commander les moteurs, les ESCs sont nécessaires. L'utilisation est plutôt simple car ils s'utilisent comme des servomoteurs, ainsi la bibliothèque ''servo.h'' d'Arduino nous a permis de les initialiser et donc de faire tourner les moteurs.&lt;br /&gt;
&lt;br /&gt;
*Le projet avance vite et nous avons beaucoup d'ambition et d'idées pour la suite.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Même si le MPU6050 est très bien documenté nous avons passé de nombreuses heures a tenter de récupérer les coordonnées YAW, PITCH et ROLL pour notre drone mais sans succès. Le principal problème était que deux des trois MPUs que nous avions commandés sur Banggood ne marchaient pas correctement.&lt;br /&gt;
*Au final nous arrivons désormais à récupérer ces informations suffisamment vite pour pouvoir espérer effectuer une correction correcte.&lt;br /&gt;
&lt;br /&gt;
===Semaine 48===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Correction du calibrage des ESCs à travers l'Arduino.&lt;br /&gt;
*Début de la commande des moteurs grâce à notre télécommande Flysky. Cependant, nous avons rencontré quelques soucis dans notre programme, il nous faut alors revoir ce code Arduino pour réussir cette étape.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Mise en commun de la partie programmation Arduino avec l'équipe 1. &lt;br /&gt;
*Première prise de renseignements sur les GPS dans l'optique d'en utiliser un pour commander le drone s'il nous reste du temps en fin de projet.&lt;br /&gt;
&lt;br /&gt;
===Documents Rendus===&lt;br /&gt;
&lt;br /&gt;
Soutenance : [[fichier:soutenance_S7_P4.pdf]]&lt;br /&gt;
&lt;br /&gt;
==Projet S8==&lt;br /&gt;
&lt;br /&gt;
[[Fichier: pcb_drone_p4.png|400px|right|thumb|PCB réalisé sur Altium]]&lt;br /&gt;
&lt;br /&gt;
===Liste des tâches à effectuer===&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Après analyse du travail réalisé au S7, nous devons désormais réaliser les tâches suivantes :&lt;br /&gt;
*Conception d'un PCB (pour l'ensemble du système)&lt;br /&gt;
*Optimiser la distribution de la puissance (esthétiquement)&lt;br /&gt;
*Finition de la partie communication envoie/reception de trame validé&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Après analyse du travail réalisé au S7, nous devons désormais réaliser les tâches suivantes :&lt;br /&gt;
*Mise en place et réglage de la régulation PID: &lt;br /&gt;
**Calcul de la consigne  &lt;br /&gt;
**Calcul des erreurs  &lt;br /&gt;
**Calcul des consignes à appliquer aux moteurs après correction&lt;br /&gt;
**Application des consignes&lt;br /&gt;
&lt;br /&gt;
*Implémenter un système de guidage GPS (à voir avec le temps dont on disposera)&lt;br /&gt;
&lt;br /&gt;
===Semaine 3===&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Réflexion et réalisation du PCB sur ''Altium Designer''&lt;br /&gt;
*Mise en relation des différentes variables de notre programme avec celui de l'équipe 2&lt;br /&gt;
*Choix et commande d'un distributeur de puissance (PDB) pour câbler plus proprement les ESCs&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Mise en relation du programme avec l'équipe 1&lt;br /&gt;
*Finalisation du programme total, y compris la partie régulation PID&lt;br /&gt;
&lt;br /&gt;
===Semaine 4===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
* Finition du PCB sur altium et création du même PCB sur Fritzing.&lt;br /&gt;
* Reprise de l'ancienne maquette pour effectuer la régulation&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Réalisation d'un programme Arduino permettant de lire la valeur de 3 potentiomètres afin de pouvoir régler les coefficients du PID.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5===&lt;br /&gt;
&lt;br /&gt;
[[Fichier: testregubar.mp4|350px|right|thumb|Essai de calibration sur deux axes avec le premier dispositif (drone fixé par le haut et le bas grâce à des câbles)]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Impression du PCB et branchement sur la maquette (2)&lt;br /&gt;
*Début des tests de régulation en mode suspendu (sans grande réussite pour le moment)&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Tests de régulation en mode suspendu (avec l'équipe 1)&lt;br /&gt;
*Début de conception d'un PCB permettant de fixer l'ensemble des composants (les nombreux fils commencent à devenir trop gênants pour les tests)&lt;br /&gt;
&lt;br /&gt;
===Semaine 6===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Modification du programme afin de détecter l'arrêt du microcontrôleur Atemega 328P. &lt;br /&gt;
* Resolution de l'erreur lié à la carte et au programme, suspicion de l'ISR mais le problème était du à une division par 0 (Probleme de maquette avec le MPU 6050).  &lt;br /&gt;
&lt;br /&gt;
[[Fichier: calibration-un-axe.mp4|250px|right|thumb|Essai de calibration sur un axe avec le deuxième dispositif]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Mise en place de support en PVC (voir photo) afin de ne laisser au drone qu'un seul degrés de liberté et ainsi permettre de le réguler plus facilement, suite à l'échec de la régulation suspendue.&lt;br /&gt;
*Problème sur un moteur ou un ESC de notre nouveau drone, un des moteurs ne tourne pas lorsque nous montons l'hélice dessus.&lt;br /&gt;
*Problème sur un moteur du nouveau drone qui se coupe totalement à une consigne bien précise et redémarre ensuite.&lt;br /&gt;
&lt;br /&gt;
[[Fichier: testesc.jpg|400px|center|thumb|Test des valeurs de courant reçues par les ESC]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 : coupure pédagogique===&lt;br /&gt;
&lt;br /&gt;
===Semaine 8===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 &amp;amp; 2 :'''&lt;br /&gt;
&lt;br /&gt;
* Lors de cette semaine, nous nous sommes penchés sur les problèmes physiques rencontrés précédemment. &lt;br /&gt;
Pour cela nous avons utilisé un oscilloscope équipé d'une sonde afin de relever les valeurs clés de tension et de courant.&lt;br /&gt;
Nous utilisons un programme qui envoie la même consigne aux 4 moteurs afin de comparer les vitesses de rotation.&lt;br /&gt;
Nous nous sommes aperçu que sur la maquette n°1, les 4 moteurs fonctionnent correctement mais qu'un ESC (Contrôleur moteur) est défaillant.&lt;br /&gt;
Sur la maquette n°2, un moteur et un ESC sont obsolètes. &lt;br /&gt;
Nous avons essayé de mixer les deux maquettes pour faire fonctionner un drone.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 &amp;amp; 2 :'''&lt;br /&gt;
&lt;br /&gt;
* Commande et attente des ESC pour finaliser la régulation.&lt;br /&gt;
* Création d'un boitier PID pour simplifier la régulation. Ce boiter va nous permettre de modifier facilement les valeurs des coefficients de notre PID numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Nous avons créé un programme, permettant de prendre en entrée le boitier PID, et de lire la valeur des potentiomètres pour modifier en instantané les valeurs du PID numérique.&lt;br /&gt;
*Le boitier comporte 3 potentiomètres, un pour chaque la valeur du I, la valeur du P et la valeur du D.&lt;br /&gt;
*Les valeurs du PID varient entre des plages bien précises: P: I: D:&lt;br /&gt;
&lt;br /&gt;
===Semaine 10===&lt;br /&gt;
&lt;br /&gt;
Re-structuration du projet suite aux événements du COVID-19:&lt;br /&gt;
&lt;br /&gt;
* Régulation sur deux ESCs : Lukas (dispose de tout le matériel)&lt;br /&gt;
* Création application mobile, communication entre téléphone et le drone. (Richard et Evan)&lt;br /&gt;
* Simuler le drone en C. (Maxime)&lt;br /&gt;
&lt;br /&gt;
===Semaine 11===&lt;br /&gt;
&lt;br /&gt;
'''Régulation avec 2 ESCs (Lukas) :'''&lt;br /&gt;
&lt;br /&gt;
* Test du boîtier permettant le contrôle des différents coefficients du PID. En effet, lors de sa conception, un faux contact avait été constaté : problème résolu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Pid_controller_P4.jpg|300px|center|thumb|Boîtier de contrôle du PID]]&lt;br /&gt;
&lt;br /&gt;
'''Application mobile :'''&lt;br /&gt;
&lt;br /&gt;
* Début de l'apprentissage de la création d'une application Android à l'aide de ANDROID STUDIO&lt;br /&gt;
&lt;br /&gt;
===Semaine 12===&lt;br /&gt;
&lt;br /&gt;
[[Fichier: regulation_4_esc.mp4|300px|left|thumb|Régulation presque adaptée sur 4 ESCs]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Application mobile :'''&lt;br /&gt;
*Réalisation d'une application Android, sous Android Studio, permettant de simuler une commande afin de piloter le drone.&lt;br /&gt;
*Les joysticks envoient une consigne variant de 1000 à 2000 pour le throttle et les axes Yaw, Pitch, Roll, valeurs attendues par le drone afin de générer les signaux PWM pour les ESCs.&lt;br /&gt;
*L'interface de l'application est terminée, il reste désormais à programmer la partie concernant l'ESP-32.&lt;br /&gt;
[[Fichier: applicationAndroid.mp4|520px|center|thumb|Présentation de l'application]]&lt;br /&gt;
&lt;br /&gt;
'''Régulation avec 2 ESCs'''&lt;br /&gt;
*Test de régulation sur le banc d'essai avec les valeurs du PID testée sur les derniers tests à 4 ESCs : vidéo ci-contre&lt;br /&gt;
*Test du programme utilisant le boitier PID permettant de modifier nos valeurs en direct&lt;br /&gt;
&lt;br /&gt;
===Semaine 13===&lt;br /&gt;
&lt;br /&gt;
* Reception d'un ESP32 et debut de la programmation. Création d'un Serveur WIFI, il reste à faire communiquer l'application et l'ESP32.&lt;br /&gt;
&lt;br /&gt;
* Modification du code pour réguler deux moteurs&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 et 15 : coupure pédagogique===&lt;br /&gt;
&lt;br /&gt;
* Communication telephone-ESP32  fonctionnelle à partir d'un serveur WEB. Communication de l'application vers ESP32 impossible. Nous n'avons pas réussi à nous connecter à la socket créé sur l'esp32.&lt;br /&gt;
&lt;br /&gt;
* La communication entre l'application mobile et l'ESP32 est fonctionnelle, nous envoyons ainsi un message formé des consignes sur la socket.&lt;br /&gt;
&lt;br /&gt;
'''Régulation avec deux moteurs'''&lt;br /&gt;
&lt;br /&gt;
Après avoir constaté que la fonction compensateBatteryDrop() était devenue obsolète en raison de l'ajout de notre PDB (Power Distributor Board), nous avons décidé de l'enlever de notre boucle (void loop()) améliorer les performances de notre programme. De plus, un pin était utilisé et faussait les calculs. Cette suppression nous a permis, effectivement, de constater une nette amélioration dans la gestion de la régulation.&lt;br /&gt;
&lt;br /&gt;
Lukas a alors pu réguler le drone avec deux moteurs sur un axe (Roll). Cette régulation a été menée à bien et le drone se stabilise sur un axe jusqu'à ce que nous soyons à court de batterie (nous nous rechargions à Robotech) avec les valeurs suivantes :&lt;br /&gt;
*kp Roll = 1.25  ki Roll = 0.05  kd Roll = 22.00&lt;br /&gt;
&lt;br /&gt;
L'objectif maintenant est, dès qu'on le pourra, après la fin du semestre de se réunir, d'installer les 4 nouveaux ESC et d'effectuer une régulation complète afin de finir complètement la conception de notre drone.&lt;br /&gt;
&lt;br /&gt;
===Documents Rendus===&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2018/2020_P4&amp;diff=84606</id>
		<title>IMA3/IMA4 2018/2020 P4</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2018/2020_P4&amp;diff=84606"/>
				<updated>2020-05-03T12:13:14Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Liste des tâches à effectuer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;include nopre noesc src=&amp;quot;/home/pedago/pimasc/include/video-ConstructionDroneIMA32018-iframe.html&amp;quot; /&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre du projet IMA3/4, nous avons choisi le sujet P4 : '''Construction d'un drone volant'''. Notre groupe se compose de Maxime CLAUDEL, Lukas FAUCHOIS, Evan GURY et Richard Simonin.&lt;br /&gt;
Nous avions dans un premier temps décidé de réaliser notre projet autour d'un drone servant à la livraison de petit colis, cependant dans un souci concernant la matériel mis à notre disposition et de budget, nous avons finalement opté pour un drone &amp;quot;loisir&amp;quot;.&lt;br /&gt;
Ce dernier sera destiné à un public amateur, dans un but d'apprentissage et/ou d'amusement et sera ainsi plus en adéquation avec nos contraintes et compétences, de plus amples informations sont décrites ci-dessous dans la partie '''Objectifs''' de notre présentation.&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
A terme, l'objectif principal de ce projet est de concevoir et construire entièrement un drone &amp;quot;made in Polytech Lille&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nous allons alors répartir notre travail en deux sessions, une première réalisée en IMA (S6) et une seconde en IMA4.&lt;br /&gt;
&lt;br /&gt;
Pour la fin de cette première session de projet, nous avons pour objectif de faire voler notre drone. Pour ce faire, nous n'avons évidemment pas le temps de nous occuper de la partie concernant le vol nous-mêmes, c'est pour quoi nous avons opté pour l'utilisation d'un contrôleur de vol n'ayant qu'à être configuré.&lt;br /&gt;
&lt;br /&gt;
Parallèlement à cela, nous comptons réaliser nous-mêmes la commande permettant de communiquer avec ce dernier pendant qu'une autre partie des membres du projet s’attellera à la partie mécanique et électrique du drone.&lt;br /&gt;
&lt;br /&gt;
Ce faisant et si tout se passe bien, nous pourrons avoir pour débuter l'année prochaine une base solide pour concevoir nous-mêmes notre contrôleur de vol. Ce qui nous amène à notre second point, puisque nous comptons dans un second temps réaliser notre propre contrôleur de vol, une fois le premier objectif atteint.&lt;br /&gt;
&lt;br /&gt;
=Analyse du projet=&lt;br /&gt;
&lt;br /&gt;
==Positionnement par rapport à l'existant==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:parrot.jpg|right|thumb|PARROT AR.DRONE 2.0]]&lt;br /&gt;
[[Fichier:udi.jpg|right|thumb|UDI U818S]]&lt;br /&gt;
&lt;br /&gt;
===Analyse du premier concurrent : PARROT AR.DRONE 2.0===&lt;br /&gt;
&lt;br /&gt;
Le [https://www.parrot.com/fr/drones/parrot-ardrone-20-elite-edition PARROT AR.DRONE 2.0], tout comme le notre, est destiné à un usage ludique. En dehors de la camera que nous n'envisageons pas d'intégrer à notre drone pour le moment, il dispose de toutes les caractéristiques que nous souhaiterions obtenir. A savoir une portée d'environ 100m, une autonomie de plus de 10min et une vitesse moyenne d'environ 20 km/h pour un prix avoisinant les 100 euros.&lt;br /&gt;
&lt;br /&gt;
Notre avantage peut se jouer sur la camera, en effet, en enlevant cette dernière nous pouvons réaliser des économies. De plus, si une personne recherche un drone simplement pour prendre du plaisir à le faire voler, il ne souhaitera pas forcément gaspiller son argent dans une camera qu'il n'aurait surement de base pas voulu.&lt;br /&gt;
&lt;br /&gt;
===Analyse du second concurrent : UDI U818S===&lt;br /&gt;
&lt;br /&gt;
Fabriqué par la marque UDI, le [https://www.maisondudrone.com/prod/udi-u818s-avec-camera-hd-2-0mp-blanc-1400.html UDI U818S] est un drone au caractéristiques similaires au précédent, à l'exception de la camera.&lt;br /&gt;
En effet, cette fois nous sommes face à un concurrent qui tout comme nous, propose simplement la fonctionnalité de base d'un drone, à savoir voler et cela se fait ressentir sur le prix puisque nous passons sur un prix d'environ 50 euros.&lt;br /&gt;
Face à un concurrent proposant un produit similaire au notre et à un prix au plus bas pour ces caractéristiques, difficile de faire mieux sur le plan technique. Peut être serait il alors plus judicieux de proposer un produit plus haute gamme, plus chère, mais destiné à un public désireux de s'amuser avec un produit de qualité.&lt;br /&gt;
&lt;br /&gt;
==Scénario d'usage du produit ou du concept envisagé==&lt;br /&gt;
&lt;br /&gt;
'''A qui notre drone peut-il servir ?'''&lt;br /&gt;
&lt;br /&gt;
Le drone &amp;quot;made in Polytech Lille&amp;quot; s'adresse à tout public n'ayant que pour objectif l'amusement''&lt;br /&gt;
&lt;br /&gt;
Toute personne souhaitant débuter avec un drone de qualité, sans s'encombrer de fonctionnalité ne s'avérant pas utiles peut être amenées a utiliser notre drone.&lt;br /&gt;
&lt;br /&gt;
'''Pour quel type d'utilisation ?'''&lt;br /&gt;
&lt;br /&gt;
Nombre de notre génération ont déjà reçu comme cadeau une voiture RC. Cette dernière n'avait que pour objectif de rouler à toute vitesse pour nous satisfaire. Nul besoin d'embarquer des caméras, stabilisateurs et nombres d'autres gadgets inutile à la vocation initiale de notre voiture, rouler. &lt;br /&gt;
&lt;br /&gt;
Avec notre drone, nous voulons remettre cela en avant, le simple plaisir de piloter une voiture RC appliqué aux drones. Alors enfant, adultes et nostalgiques pourront par le biais de notre produit découvrir ou redécouvrir le plaisir de piloter un engin motorisé, qui plus est cette-ci fois dans les airs.&lt;br /&gt;
&lt;br /&gt;
==Réponse à la question difficile==&lt;br /&gt;
&lt;br /&gt;
'''Qu'en est-il du dimensionnement des composants pour permettre à votre drone de porter une telle charge ?'''&lt;br /&gt;
&lt;br /&gt;
Nos contraintes et objectif ayant totalement changé, la question ne se pose plus vraiment. En effet nous avons suites à notre présentation réalisé des calculs en terme de puissance et nous nous sommes très vite rendu compte de l'impossibilité à réaliser notre projet.&lt;br /&gt;
&lt;br /&gt;
En effet, au vu de notre budget, l'achat d'un seul des quatre moteurs nécessaire à l'atteinte des chiffres que nous avions avancés était déjà impossible. Nous avons donc totalement changé d'objectif et avons récupéré du matériel déjà présent à Polytech, à savoir quatre moteurs et leur ESC. Nous avons pris le problème à l'envers et avons réfléchi à ce que nous pouvions réaliser avec le budget et le matériel à disposition.&lt;br /&gt;
&lt;br /&gt;
C'est de cette manière que nous avons eu l'idée d'un drone &amp;quot;loisir&amp;quot;, effaçant ainsi la question de la charge.&lt;br /&gt;
&lt;br /&gt;
==Bibliographie et webographie==&lt;br /&gt;
&lt;br /&gt;
===Arducopter===&lt;br /&gt;
&lt;br /&gt;
 https://www.digi.com/resources/documentation/digidocs/PDFs/90000976.pdf&lt;br /&gt;
 http://jeromeabel.net/wiki/xbee/xbee-arduino.pdf&lt;br /&gt;
 https://www.digi.com/resources/documentation/digidocs/pdfs/90001942-13.pdf&lt;br /&gt;
 https://www.arduino.cc/en/Reference/Servo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Manuel d'utilisation&lt;br /&gt;
 http://ardupilot.org/copter/index.html&lt;br /&gt;
&lt;br /&gt;
* Tutoriels vidéos&lt;br /&gt;
 Première installation et setup : https://www.youtube.com/watch?v=30cCs4aHdB0&amp;amp;t=754s&lt;br /&gt;
 Alimentation de l'Ardupilot : https://www.youtube.com/watch?v=TS4OWAcfAQY&amp;amp;t=270s&lt;br /&gt;
 Calibration des ESC : https://youtu.be/gYoknRObfOg&lt;br /&gt;
&lt;br /&gt;
=Préparation du projet=&lt;br /&gt;
&lt;br /&gt;
==Cahier des charges du groupe==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Diagramme bête à cornes'''&lt;br /&gt;
&lt;br /&gt;
Le diagramme bête à cornes nous permet de faire une analyse fonctionnelle du besoin. Notre drone permet à utilisateur de découvrir l'aéronautique à travers une activité ludique à l'aide d'une télécommande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bete_a_cornes.png | center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Diagramme en pieuvre'''&lt;br /&gt;
&lt;br /&gt;
Le diagramme en pieuvre permet quant à lui de répertorier toutes les fonctions (principales et de service) et d'analyser l'importance des besoins de notre projet&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pieuvredrone.png | center]]&lt;br /&gt;
&lt;br /&gt;
'''Tableau de fonctions'''&lt;br /&gt;
&lt;br /&gt;
Le tableau ci-dessous liste les fonctions principales (FP) et les fonctions contraintes (FC), dans l'orde d'importance, les accompagnant d'une petite description.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tableau_fonctions.jpeg | 500px | center]]&lt;br /&gt;
&lt;br /&gt;
==Cahier des charges des équipes==&lt;br /&gt;
===Equipe 1 : Gestion de la commande (Evan Gury et Richard Simonin)===&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie, est de créer une télécommande ainsi que le récepteur. Nous devons lire les valeurs des potentiomètres, créer des trames, envoyer les trames et analyser les trames reçus. Notre système doit être performant en matière de vitesse ainsi qu'en précision.&lt;br /&gt;
&lt;br /&gt;
===Equipe 2 : Contrôleur de vol (Maxime Claudel et Lukas Fauchois)===&lt;br /&gt;
&lt;br /&gt;
L'objectif de l'équipe est d'utiliser une carte de contrôle pouvant être liée à un logiciel de contrôle de vol. Etant donné notre projet, la carte doit respecter certaines contraintes : être adaptée à un drone à quatre hélices (quadcopter), fonctionner sur batterie (car positionnée sur le chassis du drone), être déjà programmée et relativement simple d'utilisation. Le logiciel doit quant à lui nous permettre de gérer le vol du drone et de calibrer les commandes.&lt;br /&gt;
&lt;br /&gt;
==Choix techniques : matériel et logiciel==&lt;br /&gt;
===Equipe 1===&lt;br /&gt;
&lt;br /&gt;
'''Émetteur'''&lt;br /&gt;
&lt;br /&gt;
Pour la réalisation de l'émetteur, nous avons choisi de travailler avec une Arduino ainsi que '''deux joysticks''' et un '''émetteur Xbee'''. Nous voulons une télécommande petite c'est pourquoi nous avons pris avec une '''Arduino NANO'''. Le drone a besoin de deux joysticks pour être dirigé selon 3 axes.&lt;br /&gt;
&lt;br /&gt;
'''Récepteur'''&lt;br /&gt;
&lt;br /&gt;
Pour la réalisation du récepteur, qui sera situé sur le drone nous avons commencé par utiliser une '''Arduino UNO''' mais nous souhaitons changer pour une NANO afin d'optimiser le poids ainsi que l'espace. Nous avons aussi besoin d'un '''récepteur Xbee''' afin de recevoir les trames.&lt;br /&gt;
&lt;br /&gt;
===Equipe 2===&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi pour notre carte de contrôle un '''Ardupilot 2.8''', son prix est raisonnable (une trentaine d'euros) et nous trouvons beaucoup de tutoriels l'utilisant sur YouTube.&lt;br /&gt;
&lt;br /&gt;
Pour le logiciel, deux choix relativement similaires s'offraient à nous : Mission Planner ou APM Planner. Les deux logiciels ont à peu près la même interface et permettent tous les deux d'effectuer les mêmes étapes de calibrage de l'Ardupilot et des commandes avant le premier vol.&lt;br /&gt;
&lt;br /&gt;
Nous avons d'abord commencé sur Mission Planner mais des problèmes de mises à jour du firmware de l'Ardupilot nous ont empêché de calibrer les '''ESC du drone'''. Nous sommes donc ensuite passés sur '''APM Planner''' car il permet d'éviter ce problème de mises à jour.&lt;br /&gt;
&lt;br /&gt;
===Bilan===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:materieldrone.jpg|right|thumb|Matériel nécessaire à la conception]]&lt;br /&gt;
&lt;br /&gt;
* '''Matériel''' :&lt;br /&gt;
**2 joysticks&lt;br /&gt;
**Emetteur Xbee&lt;br /&gt;
**Récepteur Xbee&lt;br /&gt;
**Arduino NANO&lt;br /&gt;
**Arduino UNO&lt;br /&gt;
**Ardupilot 2.8&lt;br /&gt;
**Câblage&lt;br /&gt;
&lt;br /&gt;
* '''Logiciels''' :&lt;br /&gt;
**Arduino&lt;br /&gt;
**Mission Planner&lt;br /&gt;
**APM Planner 2.0&lt;br /&gt;
&lt;br /&gt;
==Liste des tâches à effectuer==&lt;br /&gt;
===Equipe 1===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser la partie gestion de la commande, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Analyse du projet&lt;br /&gt;
* Découverte Xbee&lt;br /&gt;
* Prise en main Xbee&lt;br /&gt;
* Envoi de trames&lt;br /&gt;
* Réception de trames&lt;br /&gt;
* Optimisation de la programmation&lt;br /&gt;
* Test sur maquette&lt;br /&gt;
* Réalisation du PCB&lt;br /&gt;
* Mise en œuvre sur notre drone&lt;br /&gt;
&lt;br /&gt;
===Equipe 2===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser la partie contrôleur de vol, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Analyse du projet&lt;br /&gt;
* Choix d'une carte de contrôle&lt;br /&gt;
* Documentation, recherche d'un software&lt;br /&gt;
* Calibration de la carte&lt;br /&gt;
* Réalisation des branchements&lt;br /&gt;
* Mise en application sur la maquette&lt;br /&gt;
* Mise en relation avec la partie commande&lt;br /&gt;
&lt;br /&gt;
==Calendrier prévisionnel==&lt;br /&gt;
Nous avons décidé de réaliser un diagramme de GANTT pour chacun des calendriers prévisionnels (un par équipe). Sur chaque tâche, nous avions prévu un temps de travail en bleu dans les diagrammes et le temps réel consacré en jaune.&lt;br /&gt;
===Equipe 1 : Calendrier prévisionnel pour la gestion de la commande===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:equipe1cal.jpg|500px|center|&amp;quot;Calendrier de l'Equipe 1&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Equipe 2 : Calendrier prévisionnel pour le contrôleur de vol===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:equipe2cal.jpg|500px|center|&amp;quot;Calendrier de l'Equipe 2&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet S6==&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 et 6===&lt;br /&gt;
&lt;br /&gt;
Avant de scinder le groupe en deux équipes, nous avons passés les deux premières séances à évaluer les besoins de conception de notre projet pour pouvoir ensuite réaliser un cahier des charges et établir un calendrier prévisionnel des tâches à effectuer.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:xbeedrone.jpg|200px|thumb|Xbee]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Etant donné que nous avons décidé d'utiliser des modules XBee, nous avons consacrés cette semaine à la documentation, afin de comprendre comment configurer et utiliser ces derniers.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ardupilot28.jpeg|300px|right|thumb|Ardupilot 2.8]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Sur le principe de la semaine 7, nous nous sommes documentés sur les XBee afin de comprendre comment les configurer et les utiliser.&lt;br /&gt;
&lt;br /&gt;
Pour la configuration, nous avons retenu le logiciel XCTU qui est celui recommandé pour configurer les XBee. Cependant, nous gardons quand même de côté Legacy XCTU qui est l'ancienne version XCTU mais qui reste tout de même viable.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Nous avons consacré cette séance de documentation à la recherche d'une carte de contrôle de vol satisfaisant nos exigences. Nous cherchions donc une carte facilement connectable avec un Arduino Uno/Micro. Nous avons opté pour l'Ardupilot 2.8. Il comprend tout le nécessaire pour diriger un drone quadcopter, centrale gyroscopique, accéléromètres, interface de radiocommande. &lt;br /&gt;
Nous avons donc commandé l'Ardupilot via le site Alibaba.com (30€) et nous l'avons reçu trois semaines plus tard.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Après avoir effectués diverses recherches sur les modules XBee et effectué de nombreux tests (XCTU, legacy XCTU), nous avons abandonné l'utilisation du logiciel XCTU, étant donné que nous n'utilisons que deux XBee, nous pouvons les initialiser directement dans le programme avec le programme suivant:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:inixbeedrone.png]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
En attendant la réception du colis de l'Ardupilot, nous nous sommes documentés sur les différents logiciels de contrôle de vol à notre disposition. L'objectif étant de trouver un logiciel compatible avec l'Ardupilot 2.8 et avec suffisamment de documentation et tutoriels d'utilisation. Les deux logiciels qui sont ressortis le plus dans nos recherches sont Mission Planner et APM Planner 2. Ces deux logiciels sont très similaires au niveau de l'interface et des options de calibration de la carte de vol à laquelle ils sont connectés.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:apm20.png|300px|center]][[Fichier:missionplanner.jpg|300px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En connectant l'Ardupilot via un câble USB, le logiciel le reconnait et une démarche de calibration peut être entamée : boussole, accéléromètres, radiocommande, ESC.&lt;br /&gt;
&lt;br /&gt;
===Semaine 10===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur la transmission, la réception et le traitement des trames.&lt;br /&gt;
&lt;br /&gt;
Pour la transmission, nous avons mis en place le système suivant:&lt;br /&gt;
&lt;br /&gt;
*On lit la valeur des potentiomètres&lt;br /&gt;
*On convertit la valeur en une chaîne de caractère et on lui attribue un indice qui est propre à chaque position des joysticks.&lt;br /&gt;
*On envoie la chaîne de caractère par liaison série.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la réception, nous avons mis en place le système suivant:&lt;br /&gt;
&lt;br /&gt;
*On reçoit un tableau de caractère qui contient la consigne entre 0 et 1023 et un indice pour dire à quel joystick et quelle position la consigne correspond.&lt;br /&gt;
*On converti le tableau en entier et à l'aide de la fonction map on adapte la consigne pour qu'elle est une valeur entre 0 et 180.&lt;br /&gt;
*On transmet la consigne à l'ardupilot.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Idem semaine 9.&lt;br /&gt;
&lt;br /&gt;
===Semaine 11===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Débogage de la communication entre les modules XBee et l'ardupilot.&lt;br /&gt;
&lt;br /&gt;
En utilisant deux terminaux, la communication était réalisé entre les deux XBee  cependant une fois branché sur l'ardupilot nous avons eu des difficultés à traiter les trames, du au fait d'une transmission trop rapide.&lt;br /&gt;
&lt;br /&gt;
De plus nous avons passé un certains temps à vouloir utiliser une arduino micro mais avons finalement décidé de laisser tomber, puisque nous n'avons pas réussi à réceptionner les trames XBee.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Idem semaine 9.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Optimisation du format des trames et réglage de la vitesse de transmission.&lt;br /&gt;
&lt;br /&gt;
Passage d'une Arduino UNO à une Arduino Nano pour l'envoie des trames dans l'optique de réaliser un PCB pour la commande.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
A ce stade du projet nous ne pouvions qu'expérimenter les calibrations de la boussole et des accéléromètres de l'Ardupilot car la partie commande n'était pas terminée.&lt;br /&gt;
&lt;br /&gt;
La calibration de la boussole s'effectue en bougeant l'Ardupilot selon tous ces axes pendant une période de temps donnée jusqu'à ce que les informations nécessaires soient récoltées.&lt;br /&gt;
La calibration des accéléromètres s'effectue en positionnant l'Ardupilot dans des positions définies (sur le côté gauche, sur la face avant, etc.). (cliquer sur l'image ci-dessous pour lancer le GIF)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:compasscalib.gif|300px|center]][[Fichier:compasscalib.png|300px|center]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Réglage des trames pour la commande du prototype.&lt;br /&gt;
&lt;br /&gt;
Nous avons rencontré quelques problème de sensibilité au niveau des joysticks et du traitement du signal de commande transmis à l'ardupilot.&lt;br /&gt;
&lt;br /&gt;
En effet, ayant trouvé très peu de documentation sur l'ardupilot, nous avons eu du mal à générer les bons signaux de commande.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes ensuite consacrés à la partie alimentation de l'Ardupilot et du drone. En se documentant sur le site servant de manuel d'utilisation d'Ardupilot et des logiciels Mission Planner et APM Planner 2, nous avons trouvé que l'Ardupilot pouvait être alimenté via les ESC.&lt;br /&gt;
Une batterie LiPo alimente les ESC qui elles-mêmes alimentent l'Ardupilot via les broches Output. L'Ardupilot alimente ensuite l'Arduino qui réceptionne les trames reçues par le récepteur Xbee. Sur les sorties (Output) de l'Ardupilot sont aussi branchés les fils permettant la réception du signal envoyé aux moteurs.&lt;br /&gt;
Ainsi, tous les composants nécessaires au drone sont alimentés.&lt;br /&gt;
&lt;br /&gt;
===Semaine 14===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Conception du PCB pour la commande en essayant de limiter le plus possible les vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pcbdrone.png|400px|PCB]]&lt;br /&gt;
&lt;br /&gt;
Vérification de l'envoie des trames à l'aide de l'ordinateur et test de réception sur l'Ardupilot.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Branchements comme indiqués à la semaine précédente, alimentation et tests de bon fonctionnement des moteurs, Ardupilot et Arduino.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:branchementesc.jpg|300px]][[Fichier:branchementardu.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 15===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Fabrication de la manette&lt;br /&gt;
&lt;br /&gt;
[[Fichier:manettedrone.jpg|400px|PCB]]&lt;br /&gt;
&lt;br /&gt;
Modification de l'envoie des trames. Tests de transmission.&lt;br /&gt;
Implémentation du programme sur le prototype.&lt;br /&gt;
&lt;br /&gt;
Les deux équipes ont passé la semaine à réunir leur travail, nous avons ainsi tous pu réaliser de nombreux tests du prototype, avec réussite, hormis un léger accident qui à entraîné la destruction de deux hélices. &lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
A ce stade, la commande étant terminée et nous avons pu nous lier à l'équipe 1 pour mettre en relation la télécommande et l'Ardupilot. Après avoir utilisé Mission Planner pendant plusieurs semaines, un problème de mise-à-jour du software de l'Ardupilot nous empêchait toujours d'effectuer la calibration de la radiocommande. Nous sommes donc passés sur APM Planner 2 et la mise-à-jour n'était plus demandée, nous avons donc enfin pu terminer l'intégralité de la phase de calibration. Comme expliqué ci-dessus, nous avons effectué de nombreux tests pour atteindre notre objectif.&lt;br /&gt;
&lt;br /&gt;
===Documents Rendus===&lt;br /&gt;
&lt;br /&gt;
Rapport : [[fichier:rapport_groupe_4.pdf]]&lt;br /&gt;
&lt;br /&gt;
==Projet S7==&lt;br /&gt;
&lt;br /&gt;
===De nouveaux objectifs===&lt;br /&gt;
&lt;br /&gt;
Durant le semestre 6, nous avons réussi à concevoir un drone volant fonctionnel régulé à l'aide d'une carte de contrôle OpenSource '''Ardupilot 2.8'''. Concernant la commande, nous avions fait le choix d'utiliser une carte communication Xbee ainsi qu'une Arduino NANO et des joysticks.&lt;br /&gt;
&lt;br /&gt;
Cette année, nous avons décidé de développer plus amplement notre projet et de pratiquement repartir du point de départ. En effet, nos objectifs cette année sont :&lt;br /&gt;
*'''d'utiliser de nouveaux composants dont nous connaissons les propriétés (moteurs, ESCs, etc)'''&lt;br /&gt;
*'''d'utiliser une télécommande de modélisme ainsi qu'un récepteur adapté à des portées plus élevées que celles que permettait l'Xbee'''&lt;br /&gt;
*'''de concevoir notre propre contrôleur de vol'''&lt;br /&gt;
*'''Bonus''' : d'intégrer une régulation GPS et un mode automatique en cas de perte de signal&lt;br /&gt;
&lt;br /&gt;
===Reprise du cahier des charges===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 : Gestion de la commande et initialisation (Richard Simonin &amp;amp; Lukas Fauchois)'''&lt;br /&gt;
&lt;br /&gt;
L'objectif de la nouvelle gestion de la commande est d'utiliser une télécommande de modélisme capable de transmettre les différentes données nécessaires (Throttle, Yaw, Pitch) à un récepteur relié à une Arduino UNO, ce qui nous permettra d'être performant en terme de vitesse et de précision. De plus, cette partie de la conception consiste également à calibrer les quatre ESCs que nous utilisons. &lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 : Contrôleur de vol (Evan Gury &amp;amp; Maxime Claudel)&lt;br /&gt;
&lt;br /&gt;
L'objectif ici est d'implémenter notre propre contrôleur de vol (software et hardware) à l'aide de composants individuels, principalement d'une centrale inertielle 3 axes ainsi que d'un accéléromètre 3 axes.&lt;br /&gt;
&lt;br /&gt;
===Nouveaux choix techniques===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
Pour réaliser la commande du drone, nous avons décidé d'utiliser une télécommande [https://fr.banggood.com/Flysky-FS-i6X-2_4GHz-10CH-AFHDS-2A-RC-Transmitter-With-X6B-i-BUS-Receiver-p-1090406.html?rmmds=myorder&amp;amp;ID=42482530817&amp;amp;cur_warehouse=CN '''Flysky FS-I6X'''] accompagnée de son récepteur '''FS-X6B''' qui possède une portée assez élevée pour la réalisation de notre projet. Ce récepteur sera alors relié à une carte '''Arduino UNO''' (qui servira également au contrôleur de vol).&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
Concernant la réalisation du contrôleur de vol, nous choisissons d'utiliser une centrale inertielle [https://fr.banggood.com/3pcs-6DOF-MPU-6050-3-Axis-Gyro-With-Accelerometer-Sensor-Controller-Module-For-Arduino-p-1430733.html?rmmds=search&amp;amp;cur_warehouse=CN '''MPU6050'''] possédant un accéléromètre 3 axes ainsi qu'un gyroscope 3 axes, ce qui convient parfaitement à l'utilisation que l'on veut en faire. De plus, c'est une centrale qui est documentée et à coût raisonnable, elle dispose de son propre processeur, ce qui réduit considérablement la quantité de calculs à effectuer par notre micro-contrôleur. Nous relierons également cette centrale inertielle à la carte '''Arduino UNO'''.&lt;br /&gt;
&lt;br /&gt;
'''Conception générale du drone :'''&lt;br /&gt;
&lt;br /&gt;
Comme évoqué précédemment, pour le coeur d'une drone, nous utiliserons une carte '''Arduino UNO''' qui possède un nombre suffisant de ports d'interruptions, de ports PWM et d'une puissance de calcul suffisante pour traiter toutes les informations des différents capteurs.&lt;br /&gt;
&lt;br /&gt;
Nous avons également décidé de fabriquer notre propre chassis basé sur le design du précédent et d'utiliser de nouveaux ESCs dédiés spécialement au drone volant ([https://fr.banggood.com/EMAX-BLHeli-Series-6A-12A-20A-30A-ESC-p-963634.html?rmmds=search&amp;amp;ID=45170&amp;amp;cur_warehouse=CN '''EMAX BLHELI SERIES 20A''']). Nous avons également choisi de nouveaux moteurs brushless : les [https://fr.banggood.com/1000KV-Brushless-Motor-3_17mm-Shaft-Electric-Motor-p-1102054.html?rmmds=search&amp;amp;cur_warehouse=CN '''A2212/13T'''].&lt;br /&gt;
&lt;br /&gt;
'''Bilan'''&lt;br /&gt;
*'''Matériel'''&lt;br /&gt;
**Chassis&lt;br /&gt;
**4 ESCs EMAX BLHELI 20A&lt;br /&gt;
**4 moteurs A2212/13T&lt;br /&gt;
**Batterie LI-PO 11,1V - 2700mAh&lt;br /&gt;
**Arduino UNO&lt;br /&gt;
**Télécommande Flysky FS-I6X&lt;br /&gt;
**Récepteur FS-X6B&lt;br /&gt;
**Centrale inertielle MPU6050&lt;br /&gt;
*'''Logiciel'''&lt;br /&gt;
**Arduino&lt;br /&gt;
&lt;br /&gt;
'''Note''' : grâce au travail d'Evan Gury, nous avons pu acquérir tout ce matériel et il a pu concevoir le chassis avant même le commencement du semestre 7, ce qui nous a permis de nous avancer sur le travail à réaliser.&lt;br /&gt;
&lt;br /&gt;
===Liste des tâches à effectuer===&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser la nouvelle gestion de la commande et l'initialisation, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Découverte télécommande Flysky FS-I6X et son récepteur FS-X6B&lt;br /&gt;
* Configurer la télécommande&lt;br /&gt;
* Lecture des joysticks par Arduino&lt;br /&gt;
* Initialiser les extremums des joysticks&lt;br /&gt;
* Optimisation de la programmation&lt;br /&gt;
* Test de transmission sur les ESCs&lt;br /&gt;
* Mise en œuvre sur notre drone&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser le contrôleur de vol, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Découverte du MPU6050&lt;br /&gt;
* Configuration des registres du MPU6050&lt;br /&gt;
* Récupération des mesures angulaires en °/s&lt;br /&gt;
* Intégration des mesures pour récupérer les positions en degrés&lt;br /&gt;
* Calcul de la consigne&lt;br /&gt;
* Calcul de l'erreur&lt;br /&gt;
* Calcul du correcteur&lt;br /&gt;
* Application de la correction aux ESCs&lt;br /&gt;
&lt;br /&gt;
===Semaine 45===&lt;br /&gt;
&lt;br /&gt;
[[Fichier: flyskyFSI6X.jpg|200px|right|thumb|Flysky FS-I6X et FS-X6B]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Lors de la première semaine, nous avons fait le choix d'utiliser un mode de transmission existant et d'abandonner la télécommande conçue au semestre précédent. Nous avons alors choisi d'utiliser la télécommande de modélisme Flysky FS-I6X et son récepteur FS-X6B. &lt;br /&gt;
&lt;br /&gt;
*Nous avons dû dans un premier temps configurer la télécommande et comprendre comment transmettre les informations des deux joysticks.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Nous avons passé la première séance à nous documenter le plus possible sur le MPU6050 qui est le cœur de notre contrôleur de vol.&lt;br /&gt;
*Nous avons ainsi pu trouver de nombreux documents concernant la configuration des différents registre du MPU6050, de manière à avoir une utilisation correspondant au mieux à un drone volant.&lt;br /&gt;
&lt;br /&gt;
===Semaine 46===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Pour la réception des informations et le traitement des données, nous avons branché le récepteur sur une carte Arduino. Deux choix s'offraient à nous, utiliser des broches PWM ou une broche PPM. Le PPM a pour avantage d'utiliser un unique câble, tous les canaux sont transmis à la suite contrairement au PWM, un câble est nécessaire à chaque canal. L'Arduino UNO ne nous limitant pas pour l'utilisation de 1 broche ou 4 broches, nous avons décider d'utiliser le PWM.&lt;br /&gt;
&lt;br /&gt;
*Nous avons programmé notre Arduino UNO afin de récupérer les informations sur nos canaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Nous avons passé tout notre temps à tenter de récuperer les coordonnées YAW-PITCH-ROLL du mpu6050 et ce de la manière la plus rapide possible afin d'optimiser au mieux la régulation.&lt;br /&gt;
&lt;br /&gt;
===Semaine 47===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Nous avons finalisé la conception de notre drone, nous avons finalisé le câblage et ainsi pu faire des tests sur le prototype.&lt;br /&gt;
&lt;br /&gt;
*Pour commander les moteurs, les ESCs sont nécessaires. L'utilisation est plutôt simple car ils s'utilisent comme des servomoteurs, ainsi la bibliothèque ''servo.h'' d'Arduino nous a permis de les initialiser et donc de faire tourner les moteurs.&lt;br /&gt;
&lt;br /&gt;
*Le projet avance vite et nous avons beaucoup d'ambition et d'idées pour la suite.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Même si le MPU6050 est très bien documenté nous avons passé de nombreuses heures a tenter de récupérer les coordonnées YAW, PITCH et ROLL pour notre drone mais sans succès. Le principal problème était que deux des trois MPUs que nous avions commandés sur Banggood ne marchaient pas correctement.&lt;br /&gt;
*Au final nous arrivons désormais à récupérer ces informations suffisamment vite pour pouvoir espérer effectuer une correction correcte.&lt;br /&gt;
&lt;br /&gt;
===Semaine 48===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Correction du calibrage des ESCs à travers l'Arduino.&lt;br /&gt;
*Début de la commande des moteurs grâce à notre télécommande Flysky. Cependant, nous avons rencontré quelques soucis dans notre programme, il nous faut alors revoir ce code Arduino pour réussir cette étape.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Mise en commun de la partie programmation Arduino avec l'équipe 1. &lt;br /&gt;
*Première prise de renseignements sur les GPS dans l'optique d'en utiliser un pour commander le drone s'il nous reste du temps en fin de projet.&lt;br /&gt;
&lt;br /&gt;
===Documents Rendus===&lt;br /&gt;
&lt;br /&gt;
Soutenance : [[fichier:soutenance_S7_P4.pdf]]&lt;br /&gt;
&lt;br /&gt;
==Projet S8==&lt;br /&gt;
&lt;br /&gt;
[[Fichier: pcb_drone_p4.png|400px|right|thumb|PCB réalisé sur Altium]]&lt;br /&gt;
&lt;br /&gt;
===Liste des tâches à effectuer===&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Après analyse du travail réalisé au S7, nous devons désormais réaliser les tâches suivantes :&lt;br /&gt;
*Conception d'un PCB (pour l'ensemble du système)&lt;br /&gt;
*Optimiser la distribution de la puissance (esthétiquement)&lt;br /&gt;
*Finition de la partie communication envoie/reception de trame validé&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Après analyse du travail réalisé au S7, nous devons désormais réaliser les tâches suivantes :&lt;br /&gt;
*Mise en place et réglages de la régulation PID: &lt;br /&gt;
**Calcul de la consigne  &lt;br /&gt;
**Calcul des erreurs  &lt;br /&gt;
**Calcul des consignes à appliquer aux moteurs après correction&lt;br /&gt;
**Application des consignes&lt;br /&gt;
&lt;br /&gt;
*Implémenter un système de guidage GPS (à voir avec le temps que l'on dispose)&lt;br /&gt;
&lt;br /&gt;
===Semaine 3===&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Réflexion et réalisation du PCB sur ''Altium Designer''&lt;br /&gt;
*Mise en relation des différentes variables de notre programme avec celui de l'équipe 2&lt;br /&gt;
*Choix et commande d'un distributeur de puissance (PDB) pour câbler plus proprement les ESCs&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Mise en relation du programme avec l'équipe 1&lt;br /&gt;
*Finalisation du programme total, y compris la partie régulation PID&lt;br /&gt;
&lt;br /&gt;
===Semaine 4===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
* Finition du PCB sur altium et création du même PCB sur Fritzing.&lt;br /&gt;
* Reprise de l'ancienne maquette pour effectuer la régulation&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Réalisation d'un programme Arduino permettant de lire la valeur de 3 potentiomètres afin de pouvoir régler les coefficients du PID.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5===&lt;br /&gt;
&lt;br /&gt;
[[Fichier: testregubar.mp4|350px|right|thumb|Essai de calibration sur deux axes avec le premier dispositif (drone fixé par le haut et le bas grâce à des câbles)]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Impression du PCB et branchement sur la maquette (2)&lt;br /&gt;
*Début des tests de régulation en mode suspendu (sans grande réussite pour le moment)&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Tests de régulation en mode suspendu (avec l'équipe 1)&lt;br /&gt;
*Début de conception d'un PCB permettant de fixer l'ensemble des composants (les nombreux fils commencent à devenir trop gênants pour les tests)&lt;br /&gt;
&lt;br /&gt;
===Semaine 6===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Modification du programme afin de détecter l'arrêt du microcontrôleur Atemega 328P. &lt;br /&gt;
* Resolution de l'erreur lié à la carte et au programme, suspicion de l'ISR mais le problème était du à une division par 0 (Probleme de maquette avec le MPU 6050).  &lt;br /&gt;
&lt;br /&gt;
[[Fichier: calibration-un-axe.mp4|250px|right|thumb|Essai de calibration sur un axe avec le deuxième dispositif]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Mise en place de support en PVC (voir photo) afin de ne laisser au drone qu'un seul degrés de liberté et ainsi permettre de le réguler plus facilement, suite à l'échec de la régulation suspendue.&lt;br /&gt;
*Problème sur un moteur ou un ESC de notre nouveau drone, un des moteurs ne tourne pas lorsque nous montons l'hélice dessus.&lt;br /&gt;
*Problème sur un moteur du nouveau drone qui se coupe totalement à une consigne bien précise et redémarre ensuite.&lt;br /&gt;
&lt;br /&gt;
[[Fichier: testesc.jpg|400px|center|thumb|Test des valeurs de courant reçues par les ESC]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 : coupure pédagogique===&lt;br /&gt;
&lt;br /&gt;
===Semaine 8===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 &amp;amp; 2 :'''&lt;br /&gt;
&lt;br /&gt;
* Lors de cette semaine, nous nous sommes penchés sur les problèmes physiques rencontrés précédemment. &lt;br /&gt;
Pour cela nous avons utilisé un oscilloscope équipé d'une sonde afin de relever les valeurs clés de tension et de courant.&lt;br /&gt;
Nous utilisons un programme qui envoie la même consigne aux 4 moteurs afin de comparer les vitesses de rotation.&lt;br /&gt;
Nous nous sommes aperçu que sur la maquette n°1, les 4 moteurs fonctionnent correctement mais qu'un ESC (Contrôleur moteur) est défaillant.&lt;br /&gt;
Sur la maquette n°2, un moteur et un ESC sont obsolètes. &lt;br /&gt;
Nous avons essayé de mixer les deux maquettes pour faire fonctionner un drone.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 &amp;amp; 2 :'''&lt;br /&gt;
&lt;br /&gt;
* Commande et attente des ESC pour finaliser la régulation.&lt;br /&gt;
* Création d'un boitier PID pour simplifier la régulation. Ce boiter va nous permettre de modifier facilement les valeurs des coefficients de notre PID numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Nous avons créé un programme, permettant de prendre en entrée le boitier PID, et de lire la valeur des potentiomètres pour modifier en instantané les valeurs du PID numérique.&lt;br /&gt;
*Le boitier comporte 3 potentiomètres, un pour chaque la valeur du I, la valeur du P et la valeur du D.&lt;br /&gt;
*Les valeurs du PID varient entre des plages bien précises: P: I: D:&lt;br /&gt;
&lt;br /&gt;
===Semaine 10===&lt;br /&gt;
&lt;br /&gt;
Re-structuration du projet suite aux événements du COVID-19:&lt;br /&gt;
&lt;br /&gt;
* Régulation sur deux ESCs : Lukas (dispose de tout le matériel)&lt;br /&gt;
* Création application mobile, communication entre téléphone et le drone. (Richard et Evan)&lt;br /&gt;
* Simuler le drone en C. (Maxime)&lt;br /&gt;
&lt;br /&gt;
===Semaine 11===&lt;br /&gt;
&lt;br /&gt;
'''Régulation avec 2 ESCs (Lukas) :'''&lt;br /&gt;
&lt;br /&gt;
* Test du boîtier permettant le contrôle des différents coefficients du PID. En effet, lors de sa conception, un faux contact avait été constaté : problème résolu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Pid_controller_P4.jpg|300px|center|thumb|Boîtier de contrôle du PID]]&lt;br /&gt;
&lt;br /&gt;
'''Application mobile :'''&lt;br /&gt;
&lt;br /&gt;
* Début de l'apprentissage de la création d'une application Android à l'aide de ANDROID STUDIO&lt;br /&gt;
&lt;br /&gt;
===Semaine 12===&lt;br /&gt;
&lt;br /&gt;
[[Fichier: regulation_4_esc.mp4|300px|left|thumb|Régulation presque adaptée sur 4 ESCs]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Application mobile :'''&lt;br /&gt;
*Réalisation d'une application Android, sous Android Studio, permettant de simuler une commande afin de piloter le drone.&lt;br /&gt;
*Les joysticks envoient une consigne variant de 1000 à 2000 pour le throttle et les axes Yaw, Pitch, Roll, valeurs attendues par le drone afin de générer les signaux PWM pour les ESCs.&lt;br /&gt;
*L'interface de l'application est terminée, il reste désormais à programmer la partie concernant l'ESP-32.&lt;br /&gt;
[[Fichier: applicationAndroid.mp4|520px|center|thumb|Présentation de l'application]]&lt;br /&gt;
&lt;br /&gt;
'''Régulation avec 2 ESCs'''&lt;br /&gt;
*Test de régulation sur le banc d'essai avec les valeurs du PID testée sur les derniers tests à 4 ESCs : vidéo ci-contre&lt;br /&gt;
*Test du programme utilisant le boitier PID permettant de modifier nos valeurs en direct&lt;br /&gt;
&lt;br /&gt;
===Semaine 13===&lt;br /&gt;
&lt;br /&gt;
* Reception d'un ESP32 et debut de la programmation. Création d'un Serveur WIFI, il reste à faire communiquer l'application et l'ESP32.&lt;br /&gt;
&lt;br /&gt;
* Modification du code pour réguler deux moteurs&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 et 15 : coupure pédagogique===&lt;br /&gt;
&lt;br /&gt;
* Communication telephone-ESP32  fonctionnelle à partir d'un serveur WEB. Communication de l'application vers ESP32 impossible. Nous n'avons pas réussi à nous connecter à la socket créé sur l'esp32.&lt;br /&gt;
&lt;br /&gt;
* La communication entre l'application mobile et l'ESP32 est fonctionnelle, nous envoyons ainsi un message formé des consignes sur la socket.&lt;br /&gt;
&lt;br /&gt;
'''Régulation avec deux moteurs'''&lt;br /&gt;
&lt;br /&gt;
Après avoir constaté que la fonction compensateBatteryDrop() était devenue obsolète en raison de l'ajout de notre PDB (Power Distributor Board), nous avons décidé de l'enlever de notre boucle (void loop()) améliorer les performances de notre programme. De plus, un pin était utilisé et faussait les calculs. Cette suppression nous a permis, effectivement, de constater une nette amélioration dans la gestion de la régulation.&lt;br /&gt;
&lt;br /&gt;
Lukas a alors pu réguler le drone avec deux moteurs sur un axe (Roll). Cette régulation a été menée à bien et le drone se stabilise sur un axe jusqu'à ce que nous soyons à court de batterie (nous nous rechargions à Robotech) avec les valeurs suivantes :&lt;br /&gt;
*kp Roll = 1.25  ki Roll = 0.05  kd Roll = 22.00&lt;br /&gt;
&lt;br /&gt;
L'objectif maintenant est, dès qu'on le pourra, après la fin du semestre de se réunir, d'installer les 4 nouveaux ESC et d'effectuer une régulation complète afin de finir complètement la conception de notre drone.&lt;br /&gt;
&lt;br /&gt;
===Documents Rendus===&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2018/2020_P4&amp;diff=84386</id>
		<title>IMA3/IMA4 2018/2020 P4</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2018/2020_P4&amp;diff=84386"/>
				<updated>2020-05-02T15:19:04Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : /* Semaine 14 et 15 : coupure pédagogique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;include nopre noesc src=&amp;quot;/home/pedago/pimasc/include/video-ConstructionDroneIMA32018-iframe.html&amp;quot; /&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre du projet IMA3/4, nous avons choisi le sujet P4 : '''Construction d'un drone volant'''. Notre groupe se compose de Maxime CLAUDEL, Lukas FAUCHOIS, Evan GURY et Richard Simonin.&lt;br /&gt;
Nous avions dans un premier temps décidé de réaliser notre projet autour d'un drone servant à la livraison de petit colis, cependant dans un souci concernant la matériel mis à notre disposition et de budget, nous avons finalement opté pour un drone &amp;quot;loisir&amp;quot;.&lt;br /&gt;
Ce dernier sera destiné à un public amateur, dans un but d'apprentissage et/ou d'amusement et sera ainsi plus en adéquation avec nos contraintes et compétences, de plus amples informations sont décrites ci-dessous dans la partie '''Objectifs''' de notre présentation.&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
A terme, l'objectif principal de ce projet est de concevoir et construire entièrement un drone &amp;quot;made in Polytech Lille&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nous allons alors répartir notre travail en deux sessions, une première réalisée en IMA (S6) et une seconde en IMA4.&lt;br /&gt;
&lt;br /&gt;
Pour la fin de cette première session de projet, nous avons pour objectif de faire voler notre drone. Pour ce faire, nous n'avons évidemment pas le temps de nous occuper de la partie concernant le vol nous-mêmes, c'est pour quoi nous avons opté pour l'utilisation d'un contrôleur de vol n'ayant qu'à être configuré.&lt;br /&gt;
&lt;br /&gt;
Parallèlement à cela, nous comptons réaliser nous-mêmes la commande permettant de communiquer avec ce dernier pendant qu'une autre partie des membres du projet s’attellera à la partie mécanique et électrique du drone.&lt;br /&gt;
&lt;br /&gt;
Ce faisant et si tout se passe bien, nous pourrons avoir pour débuter l'année prochaine une base solide pour concevoir nous-mêmes notre contrôleur de vol. Ce qui nous amène à notre second point, puisque nous comptons dans un second temps réaliser notre propre contrôleur de vol, une fois le premier objectif atteint.&lt;br /&gt;
&lt;br /&gt;
=Analyse du projet=&lt;br /&gt;
&lt;br /&gt;
==Positionnement par rapport à l'existant==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:parrot.jpg|right|thumb|PARROT AR.DRONE 2.0]]&lt;br /&gt;
[[Fichier:udi.jpg|right|thumb|UDI U818S]]&lt;br /&gt;
&lt;br /&gt;
===Analyse du premier concurrent : PARROT AR.DRONE 2.0===&lt;br /&gt;
&lt;br /&gt;
Le [https://www.parrot.com/fr/drones/parrot-ardrone-20-elite-edition PARROT AR.DRONE 2.0], tout comme le notre, est destiné à un usage ludique. En dehors de la camera que nous n'envisageons pas d'intégrer à notre drone pour le moment, il dispose de toutes les caractéristiques que nous souhaiterions obtenir. A savoir une portée d'environ 100m, une autonomie de plus de 10min et une vitesse moyenne d'environ 20 km/h pour un prix avoisinant les 100 euros.&lt;br /&gt;
&lt;br /&gt;
Notre avantage peut se jouer sur la camera, en effet, en enlevant cette dernière nous pouvons réaliser des économies. De plus, si une personne recherche un drone simplement pour prendre du plaisir à le faire voler, il ne souhaitera pas forcément gaspiller son argent dans une camera qu'il n'aurait surement de base pas voulu.&lt;br /&gt;
&lt;br /&gt;
===Analyse du second concurrent : UDI U818S===&lt;br /&gt;
&lt;br /&gt;
Fabriqué par la marque UDI, le [https://www.maisondudrone.com/prod/udi-u818s-avec-camera-hd-2-0mp-blanc-1400.html UDI U818S] est un drone au caractéristiques similaires au précédent, à l'exception de la camera.&lt;br /&gt;
En effet, cette fois nous sommes face à un concurrent qui tout comme nous, propose simplement la fonctionnalité de base d'un drone, à savoir voler et cela se fait ressentir sur le prix puisque nous passons sur un prix d'environ 50 euros.&lt;br /&gt;
Face à un concurrent proposant un produit similaire au notre et à un prix au plus bas pour ces caractéristiques, difficile de faire mieux sur le plan technique. Peut être serait il alors plus judicieux de proposer un produit plus haute gamme, plus chère, mais destiné à un public désireux de s'amuser avec un produit de qualité.&lt;br /&gt;
&lt;br /&gt;
==Scénario d'usage du produit ou du concept envisagé==&lt;br /&gt;
&lt;br /&gt;
'''A qui notre drone peut-il servir ?'''&lt;br /&gt;
&lt;br /&gt;
Le drone &amp;quot;made in Polytech Lille&amp;quot; s'adresse à tout public n'ayant que pour objectif l'amusement''&lt;br /&gt;
&lt;br /&gt;
Toute personne souhaitant débuter avec un drone de qualité, sans s'encombrer de fonctionnalité ne s'avérant pas utiles peut être amenées a utiliser notre drone.&lt;br /&gt;
&lt;br /&gt;
'''Pour quel type d'utilisation ?'''&lt;br /&gt;
&lt;br /&gt;
Nombre de notre génération ont déjà reçu comme cadeau une voiture RC. Cette dernière n'avait que pour objectif de rouler à toute vitesse pour nous satisfaire. Nul besoin d'embarquer des caméras, stabilisateurs et nombres d'autres gadgets inutile à la vocation initiale de notre voiture, rouler. &lt;br /&gt;
&lt;br /&gt;
Avec notre drone, nous voulons remettre cela en avant, le simple plaisir de piloter une voiture RC appliqué aux drones. Alors enfant, adultes et nostalgiques pourront par le biais de notre produit découvrir ou redécouvrir le plaisir de piloter un engin motorisé, qui plus est cette-ci fois dans les airs.&lt;br /&gt;
&lt;br /&gt;
==Réponse à la question difficile==&lt;br /&gt;
&lt;br /&gt;
'''Qu'en est-il du dimensionnement des composants pour permettre à votre drone de porter une telle charge ?'''&lt;br /&gt;
&lt;br /&gt;
Nos contraintes et objectif ayant totalement changé, la question ne se pose plus vraiment. En effet nous avons suites à notre présentation réalisé des calculs en terme de puissance et nous nous sommes très vite rendu compte de l'impossibilité à réaliser notre projet.&lt;br /&gt;
&lt;br /&gt;
En effet, au vu de notre budget, l'achat d'un seul des quatre moteurs nécessaire à l'atteinte des chiffres que nous avions avancés était déjà impossible. Nous avons donc totalement changé d'objectif et avons récupéré du matériel déjà présent à Polytech, à savoir quatre moteurs et leur ESC. Nous avons pris le problème à l'envers et avons réfléchi à ce que nous pouvions réaliser avec le budget et le matériel à disposition.&lt;br /&gt;
&lt;br /&gt;
C'est de cette manière que nous avons eu l'idée d'un drone &amp;quot;loisir&amp;quot;, effaçant ainsi la question de la charge.&lt;br /&gt;
&lt;br /&gt;
==Bibliographie et webographie==&lt;br /&gt;
&lt;br /&gt;
===Arducopter===&lt;br /&gt;
&lt;br /&gt;
 https://www.digi.com/resources/documentation/digidocs/PDFs/90000976.pdf&lt;br /&gt;
 http://jeromeabel.net/wiki/xbee/xbee-arduino.pdf&lt;br /&gt;
 https://www.digi.com/resources/documentation/digidocs/pdfs/90001942-13.pdf&lt;br /&gt;
 https://www.arduino.cc/en/Reference/Servo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Manuel d'utilisation&lt;br /&gt;
 http://ardupilot.org/copter/index.html&lt;br /&gt;
&lt;br /&gt;
* Tutoriels vidéos&lt;br /&gt;
 Première installation et setup : https://www.youtube.com/watch?v=30cCs4aHdB0&amp;amp;t=754s&lt;br /&gt;
 Alimentation de l'Ardupilot : https://www.youtube.com/watch?v=TS4OWAcfAQY&amp;amp;t=270s&lt;br /&gt;
 Calibration des ESC : https://youtu.be/gYoknRObfOg&lt;br /&gt;
&lt;br /&gt;
=Préparation du projet=&lt;br /&gt;
&lt;br /&gt;
==Cahier des charges du groupe==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Diagramme bête à cornes'''&lt;br /&gt;
&lt;br /&gt;
Le diagramme bête à cornes nous permet de faire une analyse fonctionnelle du besoin. Notre drone permet à utilisateur de découvrir l'aéronautique à travers une activité ludique à l'aide d'une télécommande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bete_a_cornes.png | center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Diagramme en pieuvre'''&lt;br /&gt;
&lt;br /&gt;
Le diagramme en pieuvre permet quant à lui de répertorier toutes les fonctions (principales et de service) et d'analyser l'importance des besoins de notre projet&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pieuvredrone.png | center]]&lt;br /&gt;
&lt;br /&gt;
'''Tableau de fonctions'''&lt;br /&gt;
&lt;br /&gt;
Le tableau ci-dessous liste les fonctions principales (FP) et les fonctions contraintes (FC), dans l'orde d'importance, les accompagnant d'une petite description.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tableau_fonctions.jpeg | 500px | center]]&lt;br /&gt;
&lt;br /&gt;
==Cahier des charges des équipes==&lt;br /&gt;
===Equipe 1 : Gestion de la commande (Evan Gury et Richard Simonin)===&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie, est de créer une télécommande ainsi que le récepteur. Nous devons lire les valeurs des potentiomètres, créer des trames, envoyer les trames et analyser les trames reçus. Notre système doit être performant en matière de vitesse ainsi qu'en précision.&lt;br /&gt;
&lt;br /&gt;
===Equipe 2 : Contrôleur de vol (Maxime Claudel et Lukas Fauchois)===&lt;br /&gt;
&lt;br /&gt;
L'objectif de l'équipe est d'utiliser une carte de contrôle pouvant être liée à un logiciel de contrôle de vol. Etant donné notre projet, la carte doit respecter certaines contraintes : être adaptée à un drone à quatre hélices (quadcopter), fonctionner sur batterie (car positionnée sur le chassis du drone), être déjà programmée et relativement simple d'utilisation. Le logiciel doit quant à lui nous permettre de gérer le vol du drone et de calibrer les commandes.&lt;br /&gt;
&lt;br /&gt;
==Choix techniques : matériel et logiciel==&lt;br /&gt;
===Equipe 1===&lt;br /&gt;
&lt;br /&gt;
'''Émetteur'''&lt;br /&gt;
&lt;br /&gt;
Pour la réalisation de l'émetteur, nous avons choisi de travailler avec une Arduino ainsi que '''deux joysticks''' et un '''émetteur Xbee'''. Nous voulons une télécommande petite c'est pourquoi nous avons pris avec une '''Arduino NANO'''. Le drone a besoin de deux joysticks pour être dirigé selon 3 axes.&lt;br /&gt;
&lt;br /&gt;
'''Récepteur'''&lt;br /&gt;
&lt;br /&gt;
Pour la réalisation du récepteur, qui sera situé sur le drone nous avons commencé par utiliser une '''Arduino UNO''' mais nous souhaitons changer pour une NANO afin d'optimiser le poids ainsi que l'espace. Nous avons aussi besoin d'un '''récepteur Xbee''' afin de recevoir les trames.&lt;br /&gt;
&lt;br /&gt;
===Equipe 2===&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi pour notre carte de contrôle un '''Ardupilot 2.8''', son prix est raisonnable (une trentaine d'euros) et nous trouvons beaucoup de tutoriels l'utilisant sur YouTube.&lt;br /&gt;
&lt;br /&gt;
Pour le logiciel, deux choix relativement similaires s'offraient à nous : Mission Planner ou APM Planner. Les deux logiciels ont à peu près la même interface et permettent tous les deux d'effectuer les mêmes étapes de calibrage de l'Ardupilot et des commandes avant le premier vol.&lt;br /&gt;
&lt;br /&gt;
Nous avons d'abord commencé sur Mission Planner mais des problèmes de mises à jour du firmware de l'Ardupilot nous ont empêché de calibrer les '''ESC du drone'''. Nous sommes donc ensuite passés sur '''APM Planner''' car il permet d'éviter ce problème de mises à jour.&lt;br /&gt;
&lt;br /&gt;
===Bilan===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:materieldrone.jpg|right|thumb|Matériel nécessaire à la conception]]&lt;br /&gt;
&lt;br /&gt;
* '''Matériel''' :&lt;br /&gt;
**2 joysticks&lt;br /&gt;
**Emetteur Xbee&lt;br /&gt;
**Récepteur Xbee&lt;br /&gt;
**Arduino NANO&lt;br /&gt;
**Arduino UNO&lt;br /&gt;
**Ardupilot 2.8&lt;br /&gt;
**Câblage&lt;br /&gt;
&lt;br /&gt;
* '''Logiciels''' :&lt;br /&gt;
**Arduino&lt;br /&gt;
**Mission Planner&lt;br /&gt;
**APM Planner 2.0&lt;br /&gt;
&lt;br /&gt;
==Liste des tâches à effectuer==&lt;br /&gt;
===Equipe 1===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser la partie gestion de la commande, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Analyse du projet&lt;br /&gt;
* Découverte Xbee&lt;br /&gt;
* Prise en main Xbee&lt;br /&gt;
* Envoi de trames&lt;br /&gt;
* Réception de trames&lt;br /&gt;
* Optimisation de la programmation&lt;br /&gt;
* Test sur maquette&lt;br /&gt;
* Réalisation du PCB&lt;br /&gt;
* Mise en œuvre sur notre drone&lt;br /&gt;
&lt;br /&gt;
===Equipe 2===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser la partie contrôleur de vol, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Analyse du projet&lt;br /&gt;
* Choix d'une carte de contrôle&lt;br /&gt;
* Documentation, recherche d'un software&lt;br /&gt;
* Calibration de la carte&lt;br /&gt;
* Réalisation des branchements&lt;br /&gt;
* Mise en application sur la maquette&lt;br /&gt;
* Mise en relation avec la partie commande&lt;br /&gt;
&lt;br /&gt;
==Calendrier prévisionnel==&lt;br /&gt;
Nous avons décidé de réaliser un diagramme de GANTT pour chacun des calendriers prévisionnels (un par équipe). Sur chaque tâche, nous avions prévu un temps de travail en bleu dans les diagrammes et le temps réel consacré en jaune.&lt;br /&gt;
===Equipe 1 : Calendrier prévisionnel pour la gestion de la commande===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:equipe1cal.jpg|500px|center|&amp;quot;Calendrier de l'Equipe 1&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Equipe 2 : Calendrier prévisionnel pour le contrôleur de vol===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:equipe2cal.jpg|500px|center|&amp;quot;Calendrier de l'Equipe 2&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet S6==&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 et 6===&lt;br /&gt;
&lt;br /&gt;
Avant de scinder le groupe en deux équipes, nous avons passés les deux premières séances à évaluer les besoins de conception de notre projet pour pouvoir ensuite réaliser un cahier des charges et établir un calendrier prévisionnel des tâches à effectuer.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:xbeedrone.jpg|200px|thumb|Xbee]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Etant donné que nous avons décidé d'utiliser des modules XBee, nous avons consacrés cette semaine à la documentation, afin de comprendre comment configurer et utiliser ces derniers.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ardupilot28.jpeg|300px|right|thumb|Ardupilot 2.8]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Sur le principe de la semaine 7, nous nous sommes documentés sur les XBee afin de comprendre comment les configurer et les utiliser.&lt;br /&gt;
&lt;br /&gt;
Pour la configuration, nous avons retenu le logiciel XCTU qui est celui recommandé pour configurer les XBee. Cependant, nous gardons quand même de côté Legacy XCTU qui est l'ancienne version XCTU mais qui reste tout de même viable.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Nous avons consacré cette séance de documentation à la recherche d'une carte de contrôle de vol satisfaisant nos exigences. Nous cherchions donc une carte facilement connectable avec un Arduino Uno/Micro. Nous avons opté pour l'Ardupilot 2.8. Il comprend tout le nécessaire pour diriger un drone quadcopter, centrale gyroscopique, accéléromètres, interface de radiocommande. &lt;br /&gt;
Nous avons donc commandé l'Ardupilot via le site Alibaba.com (30€) et nous l'avons reçu trois semaines plus tard.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Après avoir effectués diverses recherches sur les modules XBee et effectué de nombreux tests (XCTU, legacy XCTU), nous avons abandonné l'utilisation du logiciel XCTU, étant donné que nous n'utilisons que deux XBee, nous pouvons les initialiser directement dans le programme avec le programme suivant:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:inixbeedrone.png]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
En attendant la réception du colis de l'Ardupilot, nous nous sommes documentés sur les différents logiciels de contrôle de vol à notre disposition. L'objectif étant de trouver un logiciel compatible avec l'Ardupilot 2.8 et avec suffisamment de documentation et tutoriels d'utilisation. Les deux logiciels qui sont ressortis le plus dans nos recherches sont Mission Planner et APM Planner 2. Ces deux logiciels sont très similaires au niveau de l'interface et des options de calibration de la carte de vol à laquelle ils sont connectés.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:apm20.png|300px|center]][[Fichier:missionplanner.jpg|300px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En connectant l'Ardupilot via un câble USB, le logiciel le reconnait et une démarche de calibration peut être entamée : boussole, accéléromètres, radiocommande, ESC.&lt;br /&gt;
&lt;br /&gt;
===Semaine 10===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur la transmission, la réception et le traitement des trames.&lt;br /&gt;
&lt;br /&gt;
Pour la transmission, nous avons mis en place le système suivant:&lt;br /&gt;
&lt;br /&gt;
*On lit la valeur des potentiomètres&lt;br /&gt;
*On convertit la valeur en une chaîne de caractère et on lui attribue un indice qui est propre à chaque position des joysticks.&lt;br /&gt;
*On envoie la chaîne de caractère par liaison série.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la réception, nous avons mis en place le système suivant:&lt;br /&gt;
&lt;br /&gt;
*On reçoit un tableau de caractère qui contient la consigne entre 0 et 1023 et un indice pour dire à quel joystick et quelle position la consigne correspond.&lt;br /&gt;
*On converti le tableau en entier et à l'aide de la fonction map on adapte la consigne pour qu'elle est une valeur entre 0 et 180.&lt;br /&gt;
*On transmet la consigne à l'ardupilot.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Idem semaine 9.&lt;br /&gt;
&lt;br /&gt;
===Semaine 11===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Débogage de la communication entre les modules XBee et l'ardupilot.&lt;br /&gt;
&lt;br /&gt;
En utilisant deux terminaux, la communication était réalisé entre les deux XBee  cependant une fois branché sur l'ardupilot nous avons eu des difficultés à traiter les trames, du au fait d'une transmission trop rapide.&lt;br /&gt;
&lt;br /&gt;
De plus nous avons passé un certains temps à vouloir utiliser une arduino micro mais avons finalement décidé de laisser tomber, puisque nous n'avons pas réussi à réceptionner les trames XBee.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Idem semaine 9.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Optimisation du format des trames et réglage de la vitesse de transmission.&lt;br /&gt;
&lt;br /&gt;
Passage d'une Arduino UNO à une Arduino Nano pour l'envoie des trames dans l'optique de réaliser un PCB pour la commande.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
A ce stade du projet nous ne pouvions qu'expérimenter les calibrations de la boussole et des accéléromètres de l'Ardupilot car la partie commande n'était pas terminée.&lt;br /&gt;
&lt;br /&gt;
La calibration de la boussole s'effectue en bougeant l'Ardupilot selon tous ces axes pendant une période de temps donnée jusqu'à ce que les informations nécessaires soient récoltées.&lt;br /&gt;
La calibration des accéléromètres s'effectue en positionnant l'Ardupilot dans des positions définies (sur le côté gauche, sur la face avant, etc.). (cliquer sur l'image ci-dessous pour lancer le GIF)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:compasscalib.gif|300px|center]][[Fichier:compasscalib.png|300px|center]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Réglage des trames pour la commande du prototype.&lt;br /&gt;
&lt;br /&gt;
Nous avons rencontré quelques problème de sensibilité au niveau des joysticks et du traitement du signal de commande transmis à l'ardupilot.&lt;br /&gt;
&lt;br /&gt;
En effet, ayant trouvé très peu de documentation sur l'ardupilot, nous avons eu du mal à générer les bons signaux de commande.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes ensuite consacrés à la partie alimentation de l'Ardupilot et du drone. En se documentant sur le site servant de manuel d'utilisation d'Ardupilot et des logiciels Mission Planner et APM Planner 2, nous avons trouvé que l'Ardupilot pouvait être alimenté via les ESC.&lt;br /&gt;
Une batterie LiPo alimente les ESC qui elles-mêmes alimentent l'Ardupilot via les broches Output. L'Ardupilot alimente ensuite l'Arduino qui réceptionne les trames reçues par le récepteur Xbee. Sur les sorties (Output) de l'Ardupilot sont aussi branchés les fils permettant la réception du signal envoyé aux moteurs.&lt;br /&gt;
Ainsi, tous les composants nécessaires au drone sont alimentés.&lt;br /&gt;
&lt;br /&gt;
===Semaine 14===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Conception du PCB pour la commande en essayant de limiter le plus possible les vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pcbdrone.png|400px|PCB]]&lt;br /&gt;
&lt;br /&gt;
Vérification de l'envoie des trames à l'aide de l'ordinateur et test de réception sur l'Ardupilot.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Branchements comme indiqués à la semaine précédente, alimentation et tests de bon fonctionnement des moteurs, Ardupilot et Arduino.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:branchementesc.jpg|300px]][[Fichier:branchementardu.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 15===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Fabrication de la manette&lt;br /&gt;
&lt;br /&gt;
[[Fichier:manettedrone.jpg|400px|PCB]]&lt;br /&gt;
&lt;br /&gt;
Modification de l'envoie des trames. Tests de transmission.&lt;br /&gt;
Implémentation du programme sur le prototype.&lt;br /&gt;
&lt;br /&gt;
Les deux équipes ont passé la semaine à réunir leur travail, nous avons ainsi tous pu réaliser de nombreux tests du prototype, avec réussite, hormis un léger accident qui à entraîné la destruction de deux hélices. &lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
A ce stade, la commande étant terminée et nous avons pu nous lier à l'équipe 1 pour mettre en relation la télécommande et l'Ardupilot. Après avoir utilisé Mission Planner pendant plusieurs semaines, un problème de mise-à-jour du software de l'Ardupilot nous empêchait toujours d'effectuer la calibration de la radiocommande. Nous sommes donc passés sur APM Planner 2 et la mise-à-jour n'était plus demandée, nous avons donc enfin pu terminer l'intégralité de la phase de calibration. Comme expliqué ci-dessus, nous avons effectué de nombreux tests pour atteindre notre objectif.&lt;br /&gt;
&lt;br /&gt;
===Documents Rendus===&lt;br /&gt;
&lt;br /&gt;
Rapport : [[fichier:rapport_groupe_4.pdf]]&lt;br /&gt;
&lt;br /&gt;
==Projet S7==&lt;br /&gt;
&lt;br /&gt;
===De nouveaux objectifs===&lt;br /&gt;
&lt;br /&gt;
Durant le semestre 6, nous avons réussi à concevoir un drone volant fonctionnel régulé à l'aide d'une carte de contrôle OpenSource '''Ardupilot 2.8'''. Concernant la commande, nous avions fait le choix d'utiliser une carte communication Xbee ainsi qu'une Arduino NANO et des joysticks.&lt;br /&gt;
&lt;br /&gt;
Cette année, nous avons décidé de développer plus amplement notre projet et de pratiquement repartir du point de départ. En effet, nos objectifs cette année sont :&lt;br /&gt;
*'''d'utiliser de nouveaux composants dont nous connaissons les propriétés (moteurs, ESCs, etc)'''&lt;br /&gt;
*'''d'utiliser une télécommande de modélisme ainsi qu'un récepteur adapté à des portées plus élevées que celles que permettait l'Xbee'''&lt;br /&gt;
*'''de concevoir notre propre contrôleur de vol'''&lt;br /&gt;
*'''Bonus''' : d'intégrer une régulation GPS et un mode automatique en cas de perte de signal&lt;br /&gt;
&lt;br /&gt;
===Reprise du cahier des charges===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 : Gestion de la commande et initialisation (Richard Simonin &amp;amp; Lukas Fauchois)'''&lt;br /&gt;
&lt;br /&gt;
L'objectif de la nouvelle gestion de la commande est d'utiliser une télécommande de modélisme capable de transmettre les différentes données nécessaires (Throttle, Yaw, Pitch) à un récepteur relié à une Arduino UNO, ce qui nous permettra d'être performant en terme de vitesse et de précision. De plus, cette partie de la conception consiste également à calibrer les quatre ESCs que nous utilisons. &lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 : Contrôleur de vol (Evan Gury &amp;amp; Maxime Claudel)&lt;br /&gt;
&lt;br /&gt;
L'objectif ici est d'implémenter notre propre contrôleur de vol (software et hardware) à l'aide de composants individuels, principalement d'une centrale inertielle 3 axes ainsi que d'un accéléromètre 3 axes.&lt;br /&gt;
&lt;br /&gt;
===Nouveaux choix techniques===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
Pour réaliser la commande du drone, nous avons décidé d'utiliser une télécommande [https://fr.banggood.com/Flysky-FS-i6X-2_4GHz-10CH-AFHDS-2A-RC-Transmitter-With-X6B-i-BUS-Receiver-p-1090406.html?rmmds=myorder&amp;amp;ID=42482530817&amp;amp;cur_warehouse=CN '''Flysky FS-I6X'''] accompagnée de son récepteur '''FS-X6B''' qui possède une portée assez élevée pour la réalisation de notre projet. Ce récepteur sera alors relié à une carte '''Arduino UNO''' (qui servira également au contrôleur de vol).&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
Concernant la réalisation du contrôleur de vol, nous choisissons d'utiliser une centrale inertielle [https://fr.banggood.com/3pcs-6DOF-MPU-6050-3-Axis-Gyro-With-Accelerometer-Sensor-Controller-Module-For-Arduino-p-1430733.html?rmmds=search&amp;amp;cur_warehouse=CN '''MPU6050'''] possédant un accéléromètre 3 axes ainsi qu'un gyroscope 3 axes, ce qui convient parfaitement à l'utilisation que l'on veut en faire. De plus, c'est une centrale qui est documentée et à coût raisonnable, elle dispose de son propre processeur, ce qui réduit considérablement la quantité de calculs à effectuer par notre micro-contrôleur. Nous relierons également cette centrale inertielle à la carte '''Arduino UNO'''.&lt;br /&gt;
&lt;br /&gt;
'''Conception générale du drone :'''&lt;br /&gt;
&lt;br /&gt;
Comme évoqué précédemment, pour le coeur d'une drone, nous utiliserons une carte '''Arduino UNO''' qui possède un nombre suffisant de ports d'interruptions, de ports PWM et d'une puissance de calcul suffisante pour traiter toutes les informations des différents capteurs.&lt;br /&gt;
&lt;br /&gt;
Nous avons également décidé de fabriquer notre propre chassis basé sur le design du précédent et d'utiliser de nouveaux ESCs dédiés spécialement au drone volant ([https://fr.banggood.com/EMAX-BLHeli-Series-6A-12A-20A-30A-ESC-p-963634.html?rmmds=search&amp;amp;ID=45170&amp;amp;cur_warehouse=CN '''EMAX BLHELI SERIES 20A''']). Nous avons également choisi de nouveaux moteurs brushless : les [https://fr.banggood.com/1000KV-Brushless-Motor-3_17mm-Shaft-Electric-Motor-p-1102054.html?rmmds=search&amp;amp;cur_warehouse=CN '''A2212/13T'''].&lt;br /&gt;
&lt;br /&gt;
'''Bilan'''&lt;br /&gt;
*'''Matériel'''&lt;br /&gt;
**Chassis&lt;br /&gt;
**4 ESCs EMAX BLHELI 20A&lt;br /&gt;
**4 moteurs A2212/13T&lt;br /&gt;
**Batterie LI-PO 11,1V - 2700mAh&lt;br /&gt;
**Arduino UNO&lt;br /&gt;
**Télécommande Flysky FS-I6X&lt;br /&gt;
**Récepteur FS-X6B&lt;br /&gt;
**Centrale inertielle MPU6050&lt;br /&gt;
*'''Logiciel'''&lt;br /&gt;
**Arduino&lt;br /&gt;
&lt;br /&gt;
'''Note''' : grâce au travail d'Evan Gury, nous avons pu acquérir tout ce matériel et il a pu concevoir le chassis avant même le commencement du semestre 7, ce qui nous a permis de nous avancer sur le travail à réaliser.&lt;br /&gt;
&lt;br /&gt;
===Liste des tâches à effectuer===&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser la nouvelle gestion de la commande et l'initialisation, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Découverte télécommande Flysky FS-I6X et son récepteur FS-X6B&lt;br /&gt;
* Configurer la télécommande&lt;br /&gt;
* Lecture des joysticks par Arduino&lt;br /&gt;
* Initialiser les extremums des joysticks&lt;br /&gt;
* Optimisation de la programmation&lt;br /&gt;
* Test de transmission sur les ESCs&lt;br /&gt;
* Mise en œuvre sur notre drone&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser le contrôleur de vol, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Découverte du MPU6050&lt;br /&gt;
* Configuration des registres du MPU6050&lt;br /&gt;
* Récupération des mesures angulaires en °/s&lt;br /&gt;
* Intégration des mesures pour récupérer les positions en degrés&lt;br /&gt;
* Calcul de la consigne&lt;br /&gt;
* Calcul de l'erreur&lt;br /&gt;
* Calcul du correcteur&lt;br /&gt;
* Application de la correction aux ESCs&lt;br /&gt;
&lt;br /&gt;
===Semaine 45===&lt;br /&gt;
&lt;br /&gt;
[[Fichier: flyskyFSI6X.jpg|200px|right|thumb|Flysky FS-I6X et FS-X6B]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Lors de la première semaine, nous avons fait le choix d'utiliser un mode de transmission existant et d'abandonner la télécommande conçue au semestre précédent. Nous avons alors choisi d'utiliser la télécommande de modélisme Flysky FS-I6X et son récepteur FS-X6B. &lt;br /&gt;
&lt;br /&gt;
*Nous avons dû dans un premier temps configurer la télécommande et comprendre comment transmettre les informations des deux joysticks.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Nous avons passé la première séance à nous documenter le plus possible sur le MPU6050 qui est le cœur de notre contrôleur de vol.&lt;br /&gt;
*Nous avons ainsi pu trouver de nombreux documents concernant la configuration des différents registre du MPU6050, de manière à avoir une utilisation correspondant au mieux à un drone volant.&lt;br /&gt;
&lt;br /&gt;
===Semaine 46===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Pour la réception des informations et le traitement des données, nous avons branché le récepteur sur une carte Arduino. Deux choix s'offraient à nous, utiliser des broches PWM ou une broche PPM. Le PPM a pour avantage d'utiliser un unique câble, tous les canaux sont transmis à la suite contrairement au PWM, un câble est nécessaire à chaque canal. L'Arduino UNO ne nous limitant pas pour l'utilisation de 1 broche ou 4 broches, nous avons décider d'utiliser le PWM.&lt;br /&gt;
&lt;br /&gt;
*Nous avons programmé notre Arduino UNO afin de récupérer les informations sur nos canaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Nous avons passé tout notre temps à tenter de récuperer les coordonnées YAW-PITCH-ROLL du mpu6050 et ce de la manière la plus rapide possible afin d'optimiser au mieux la régulation.&lt;br /&gt;
&lt;br /&gt;
===Semaine 47===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Nous avons finalisé la conception de notre drone, nous avons finalisé le câblage et ainsi pu faire des tests sur le prototype.&lt;br /&gt;
&lt;br /&gt;
*Pour commander les moteurs, les ESCs sont nécessaires. L'utilisation est plutôt simple car ils s'utilisent comme des servomoteurs, ainsi la bibliothèque ''servo.h'' d'Arduino nous a permis de les initialiser et donc de faire tourner les moteurs.&lt;br /&gt;
&lt;br /&gt;
*Le projet avance vite et nous avons beaucoup d'ambition et d'idées pour la suite.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Même si le MPU6050 est très bien documenté nous avons passé de nombreuses heures a tenter de récupérer les coordonnées YAW, PITCH et ROLL pour notre drone mais sans succès. Le principal problème était que deux des trois MPUs que nous avions commandés sur Banggood ne marchaient pas correctement.&lt;br /&gt;
*Au final nous arrivons désormais à récupérer ces informations suffisamment vite pour pouvoir espérer effectuer une correction correcte.&lt;br /&gt;
&lt;br /&gt;
===Semaine 48===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Correction du calibrage des ESCs à travers l'Arduino.&lt;br /&gt;
*Début de la commande des moteurs grâce à notre télécommande Flysky. Cependant, nous avons rencontré quelques soucis dans notre programme, il nous faut alors revoir ce code Arduino pour réussir cette étape.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Mise en commun de la partie programmation Arduino avec l'équipe 1. &lt;br /&gt;
*Première prise de renseignements sur les GPS dans l'optique d'en utiliser un pour commander le drone s'il nous reste du temps en fin de projet.&lt;br /&gt;
&lt;br /&gt;
===Documents Rendus===&lt;br /&gt;
&lt;br /&gt;
Soutenance : [[fichier:soutenance_S7_P4.pdf]]&lt;br /&gt;
&lt;br /&gt;
==Projet S8==&lt;br /&gt;
&lt;br /&gt;
[[Fichier: pcb_drone_p4.png|400px|right|thumb|PCB réalisé sur Altium]]&lt;br /&gt;
&lt;br /&gt;
===Liste des tâches à effectuer===&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Après analyse du travail réalisé au S7, nous devons désormais réaliser les tâches suivantes :&lt;br /&gt;
*Conception d'un PCB (pour l'ensemble du système)&lt;br /&gt;
*Optimiser la distribution de la puissance (esthétiquement)&lt;br /&gt;
*Finition de la partie communication envoie/reception de trame validé&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Après analyse du travail réalisé au S7, nous devons désormais réaliser les tâches suivantes :&lt;br /&gt;
*Tests et réglages de la régulation PID&lt;br /&gt;
*Implémenter un système de guidage GPS (à voir avec le temps que l'on dispose)&lt;br /&gt;
&lt;br /&gt;
===Semaine 3===&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Réflexion et réalisation du PCB sur ''Altium Designer''&lt;br /&gt;
*Mise en relation des différentes variables de notre programme avec celui de l'équipe 2&lt;br /&gt;
*Choix et commande d'un distributeur de puissance (PDB) pour câbler plus proprement les ESCs&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Mise en relation du programme avec l'équipe 1&lt;br /&gt;
*Finalisation du programme total, y compris la partie régulation PID&lt;br /&gt;
&lt;br /&gt;
===Semaine 4===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
* Finition du PCB sur altium et création du même PCB sur Fritzing.&lt;br /&gt;
* Reprise de l'ancienne maquette pour effectuer la régulation&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Réalisation d'un programme Arduino permettant de lire la valeur de 3 potentiomètres afin de pouvoir régler les coefficients du PID.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5===&lt;br /&gt;
&lt;br /&gt;
[[Fichier: testregubar.mp4|350px|right|thumb|Essai de calibration sur deux axes avec le premier dispositif (drone fixé par le haut et le bas grâce à des câbles)]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Impression du PCB et branchement sur la maquette (2)&lt;br /&gt;
*Début des tests de régulation en mode suspendu (sans grande réussite pour le moment)&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Tests de régulation en mode suspendu (avec l'équipe 1)&lt;br /&gt;
*Début de conception d'un PCB permettant de fixer l'ensemble des composants (les nombreux fils commencent à devenir trop gênants pour les tests)&lt;br /&gt;
&lt;br /&gt;
===Semaine 6===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Modification du programme afin de détecter l'arrêt du microcontrôleur Atemega 328P. &lt;br /&gt;
* Resolution de l'erreur lié à la carte et au programme, suspicion de l'ISR mais le problème était du à une division par 0 (Probleme de maquette avec le MPU 6050).  &lt;br /&gt;
&lt;br /&gt;
[[Fichier: calibration-un-axe.mp4|250px|right|thumb|Essai de calibration sur un axe avec le deuxième dispositif]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Mise en place de support en PVC (voir photo) afin de ne laisser au drone qu'un seul degrés de liberté et ainsi permettre de le réguler plus facilement, suite à l'échec de la régulation suspendue.&lt;br /&gt;
*Problème sur un moteur ou un ESC de notre nouveau drone, un des moteurs ne tourne pas lorsque nous montons l'hélice dessus.&lt;br /&gt;
*Problème sur un moteur du nouveau drone qui se coupe totalement à une consigne bien précise et redémarre ensuite.&lt;br /&gt;
&lt;br /&gt;
[[Fichier: testesc.jpg|400px|center|thumb|Test des valeurs de courant reçues par les ESC]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 7 : coupure pédagogique===&lt;br /&gt;
&lt;br /&gt;
===Semaine 8===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 &amp;amp; 2 :'''&lt;br /&gt;
&lt;br /&gt;
* Lors de cette semaine, nous nous sommes penchés sur les problèmes physiques rencontrés précédemment. &lt;br /&gt;
Pour cela nous avons utilisé un oscilloscope équipé d'une sonde afin de relever les valeurs clés de tension et de courant.&lt;br /&gt;
Nous utilisons un programme qui envoie la même consigne aux 4 moteurs afin de comparer les vitesses de rotation.&lt;br /&gt;
Nous nous sommes aperçu que sur la maquette n°1, les 4 moteurs fonctionnent correctement mais qu'un ESC (Contrôleur moteur) est défaillant.&lt;br /&gt;
Sur la maquette n°2, un moteur et un ESC sont obsolètes. &lt;br /&gt;
Nous avons essayé de mixer les deux maquettes pour faire fonctionner un drone.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 &amp;amp; 2 :'''&lt;br /&gt;
&lt;br /&gt;
* Commande et attente des ESC pour finaliser la régulation.&lt;br /&gt;
* Création d'un boitier PID pour simplifier la régulation. Ce boiter va nous permettre de modifier facilement les valeurs des coefficients de notre PID numérique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Nous avons créé un programme, permettant de prendre en entrée le boitier PID, et de lire la valeur des potentiomètres pour modifier en instantané les valeurs du PID numérique.&lt;br /&gt;
*Le boitier comporte 3 potentiomètres, un pour chaque la valeur du I, la valeur du P et la valeur du D.&lt;br /&gt;
*Les valeurs du PID varient entre des plages bien précises: P: I: D:&lt;br /&gt;
&lt;br /&gt;
===Semaine 10===&lt;br /&gt;
&lt;br /&gt;
Re-structuration du projet suite aux événements du COVID-19:&lt;br /&gt;
&lt;br /&gt;
* Régulation sur deux ESCs : Lukas (dispose de tout le matériel)&lt;br /&gt;
* Création application mobile, communication entre téléphone et le drone. (Richard et Evan)&lt;br /&gt;
* Simuler le drone en C. (Maxime)&lt;br /&gt;
&lt;br /&gt;
===Semaine 11===&lt;br /&gt;
&lt;br /&gt;
'''Régulation avec 2 ESCs (Lukas) :'''&lt;br /&gt;
&lt;br /&gt;
* Test du boîtier permettant le contrôle des différents coefficients du PID. En effet, lors de sa conception, un faux contact avait été constaté : problème résolu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Pid_controller_P4.jpg|300px|center|thumb|Boîtier de contrôle du PID]]&lt;br /&gt;
&lt;br /&gt;
'''Application mobile :'''&lt;br /&gt;
&lt;br /&gt;
* Début de l'apprentissage de la création d'une application Android à l'aide de ANDROID STUDIO&lt;br /&gt;
&lt;br /&gt;
===Semaine 12===&lt;br /&gt;
&lt;br /&gt;
[[Fichier: regulation_4_esc.mp4|300px|left|thumb|Régulation presque adaptée sur 4 ESCs]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Application mobile :'''&lt;br /&gt;
*Réalisation d'une application Android, sous Android Studio, permettant de simuler une commande afin de piloter le drone.&lt;br /&gt;
*Les joysticks envoient une consigne variant de 1000 à 2000 pour le throttle et les axes Yaw, Pitch, Roll, valeurs attendues par le drone afin de générer les signaux PWM pour les ESCs.&lt;br /&gt;
*L'interface de l'application est terminée, il reste désormais à programmer la partie concernant l'ESP-32.&lt;br /&gt;
[[Fichier: applicationAndroid.mp4|520px|center|thumb|Présentation de l'application]]&lt;br /&gt;
&lt;br /&gt;
'''Régulation avec 2 ESCs'''&lt;br /&gt;
*Test de régulation sur le banc d'essai avec les valeurs du PID testée sur les derniers tests à 4 ESCs : vidéo ci-contre&lt;br /&gt;
*Test du programme utilisant le boitier PID permettant de modifier nos valeurs en direct&lt;br /&gt;
&lt;br /&gt;
===Semaine 13===&lt;br /&gt;
&lt;br /&gt;
* Reception d'un ESP32 et debut de la programmation. Création d'un Serveur WIFI, il reste à faire communiquer l'application et l'ESP32.&lt;br /&gt;
&lt;br /&gt;
* Modification du code pour réguler deux moteurs&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 et 15 : coupure pédagogique===&lt;br /&gt;
&lt;br /&gt;
* Communication telephone-ESP32  fonctionnelle à partir d'un serveur WEB. Communication de l'application vers ESP32 impossible. Nous n'avons pas réussi à nous connecter à la socket créé sur l'esp32.&lt;br /&gt;
&lt;br /&gt;
* La communication entre l'application mobile et l'ESP32 est fonctionnelle, nous envoyons ainsi un message formé des consignes sur la socket.&lt;br /&gt;
&lt;br /&gt;
'''Régulation avec deux moteurs'''&lt;br /&gt;
&lt;br /&gt;
Après avoir constaté que la fonction compensateBatteryDrop() était devenue obsolète en raison de l'ajout de notre PDB (Power Distributor Board), nous avons décidé de l'enlever de notre boucle (void loop()) améliorer les performances de notre programme. De plus, un pin était utilisé et faussait les calculs. Cette suppression nous a permis, effectivement, de constater une nette amélioration dans la gestion de la régulation.&lt;br /&gt;
&lt;br /&gt;
Lukas a alors pu réguler le drone avec deux moteurs sur un axe (Roll). Cette régulation a été menée à bien et le drone se stabilise sur un axe jusqu'à ce que nous soyons à court de batterie (nous nous rechargions à Robotech) avec les valeurs suivantes :&lt;br /&gt;
*kp Roll = 1.25  ki Roll = 0.05  kd Roll = 22.00&lt;br /&gt;
&lt;br /&gt;
L'objectif maintenant est, dès qu'on le pourra, après la fin du semestre de se réunir, d'installer les 4 nouveaux ESC et d'effectuer une régulation complète afin de finir complètement la conception de notre drone.&lt;br /&gt;
&lt;br /&gt;
===Documents Rendus===&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2018/2020_P4&amp;diff=83363</id>
		<title>IMA3/IMA4 2018/2020 P4</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2018/2020_P4&amp;diff=83363"/>
				<updated>2020-03-31T22:59:13Z</updated>
		
		<summary type="html">&lt;p&gt;Egury : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;include nopre noesc src=&amp;quot;/home/pedago/pimasc/include/video-ConstructionDroneIMA32018-iframe.html&amp;quot; /&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Présentation générale=&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre du projet IMA3/4, nous avons choisi le sujet P4 : '''Construction d'un drone volant'''. Notre groupe se compose de Maxime CLAUDEL, Lukas FAUCHOIS, Evan GURY et Richard Simonin.&lt;br /&gt;
Nous avions dans un premier temps décidé de réaliser notre projet autour d'un drone servant à la livraison de petit colis, cependant dans un souci concernant la matériel mis à notre disposition et de budget, nous avons finalement opté pour un drone &amp;quot;loisir&amp;quot;.&lt;br /&gt;
Ce dernier sera destiné à un public amateur, dans un but d'apprentissage et/ou d'amusement et sera ainsi plus en adéquation avec nos contraintes et compétences, de plus amples informations sont décrites ci-dessous dans la partie '''Objectifs''' de notre présentation.&lt;br /&gt;
&lt;br /&gt;
==Objectifs==&lt;br /&gt;
&lt;br /&gt;
A terme, l'objectif principal de ce projet est de concevoir et construire entièrement un drone &amp;quot;made in Polytech Lille&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nous allons alors répartir notre travail en deux sessions, une première réalisée en IMA (S6) et une seconde en IMA4.&lt;br /&gt;
&lt;br /&gt;
Pour la fin de cette première session de projet, nous avons pour objectif de faire voler notre drone. Pour ce faire, nous n'avons évidemment pas le temps de nous occuper de la partie concernant le vol nous-mêmes, c'est pour quoi nous avons opté pour l'utilisation d'un contrôleur de vol n'ayant qu'à être configuré.&lt;br /&gt;
&lt;br /&gt;
Parallèlement à cela, nous comptons réaliser nous-mêmes la commande permettant de communiquer avec ce dernier pendant qu'une autre partie des membres du projet s’attellera à la partie mécanique et électrique du drone.&lt;br /&gt;
&lt;br /&gt;
Ce faisant et si tout se passe bien, nous pourrons avoir pour débuter l'année prochaine une base solide pour concevoir nous-mêmes notre contrôleur de vol. Ce qui nous amène à notre second point, puisque nous comptons dans un second temps réaliser notre propre contrôleur de vol, une fois le premier objectif atteint.&lt;br /&gt;
&lt;br /&gt;
=Analyse du projet=&lt;br /&gt;
&lt;br /&gt;
==Positionnement par rapport à l'existant==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:parrot.jpg|right|thumb|PARROT AR.DRONE 2.0]]&lt;br /&gt;
[[Fichier:udi.jpg|right|thumb|UDI U818S]]&lt;br /&gt;
&lt;br /&gt;
===Analyse du premier concurrent : PARROT AR.DRONE 2.0===&lt;br /&gt;
&lt;br /&gt;
Le [https://www.parrot.com/fr/drones/parrot-ardrone-20-elite-edition PARROT AR.DRONE 2.0], tout comme le notre, est destiné à un usage ludique. En dehors de la camera que nous n'envisageons pas d'intégrer à notre drone pour le moment, il dispose de toutes les caractéristiques que nous souhaiterions obtenir. A savoir une portée d'environ 100m, une autonomie de plus de 10min et une vitesse moyenne d'environ 20 km/h pour un prix avoisinant les 100 euros.&lt;br /&gt;
&lt;br /&gt;
Notre avantage peut se jouer sur la camera, en effet, en enlevant cette dernière nous pouvons réaliser des économies. De plus, si une personne recherche un drone simplement pour prendre du plaisir à le faire voler, il ne souhaitera pas forcément gaspiller son argent dans une camera qu'il n'aurait surement de base pas voulu.&lt;br /&gt;
&lt;br /&gt;
===Analyse du second concurrent : UDI U818S===&lt;br /&gt;
&lt;br /&gt;
Fabriqué par la marque UDI, le [https://www.maisondudrone.com/prod/udi-u818s-avec-camera-hd-2-0mp-blanc-1400.html UDI U818S] est un drone au caractéristiques similaires au précédent, à l'exception de la camera.&lt;br /&gt;
En effet, cette fois nous sommes face à un concurrent qui tout comme nous, propose simplement la fonctionnalité de base d'un drone, à savoir voler et cela se fait ressentir sur le prix puisque nous passons sur un prix d'environ 50 euros.&lt;br /&gt;
Face à un concurrent proposant un produit similaire au notre et à un prix au plus bas pour ces caractéristiques, difficile de faire mieux sur le plan technique. Peut être serait il alors plus judicieux de proposer un produit plus haute gamme, plus chère, mais destiné à un public désireux de s'amuser avec un produit de qualité.&lt;br /&gt;
&lt;br /&gt;
==Scénario d'usage du produit ou du concept envisagé==&lt;br /&gt;
&lt;br /&gt;
'''A qui notre drone peut-il servir ?'''&lt;br /&gt;
&lt;br /&gt;
Le drone &amp;quot;made in Polytech Lille&amp;quot; s'adresse à tout public n'ayant que pour objectif l'amusement''&lt;br /&gt;
&lt;br /&gt;
Toute personne souhaitant débuter avec un drone de qualité, sans s'encombrer de fonctionnalité ne s'avérant pas utiles peut être amenées a utiliser notre drone.&lt;br /&gt;
&lt;br /&gt;
'''Pour quel type d'utilisation ?'''&lt;br /&gt;
&lt;br /&gt;
Nombre de notre génération ont déjà reçu comme cadeau une voiture RC. Cette dernière n'avait que pour objectif de rouler à toute vitesse pour nous satisfaire. Nul besoin d'embarquer des caméras, stabilisateurs et nombres d'autres gadgets inutile à la vocation initiale de notre voiture, rouler. &lt;br /&gt;
&lt;br /&gt;
Avec notre drone, nous voulons remettre cela en avant, le simple plaisir de piloter une voiture RC appliqué aux drones. Alors enfant, adultes et nostalgiques pourront par le biais de notre produit découvrir ou redécouvrir le plaisir de piloter un engin motorisé, qui plus est cette-ci fois dans les airs.&lt;br /&gt;
&lt;br /&gt;
==Réponse à la question difficile==&lt;br /&gt;
&lt;br /&gt;
'''Qu'en est-il du dimensionnement des composants pour permettre à votre drone de porter une telle charge ?'''&lt;br /&gt;
&lt;br /&gt;
Nos contraintes et objectif ayant totalement changé, la question ne se pose plus vraiment. En effet nous avons suites à notre présentation réalisé des calculs en terme de puissance et nous nous sommes très vite rendu compte de l'impossibilité à réaliser notre projet.&lt;br /&gt;
&lt;br /&gt;
En effet, au vu de notre budget, l'achat d'un seul des quatre moteurs nécessaire à l'atteinte des chiffres que nous avions avancés était déjà impossible. Nous avons donc totalement changé d'objectif et avons récupéré du matériel déjà présent à Polytech, à savoir quatre moteurs et leur ESC. Nous avons pris le problème à l'envers et avons réfléchi à ce que nous pouvions réaliser avec le budget et le matériel à disposition.&lt;br /&gt;
&lt;br /&gt;
C'est de cette manière que nous avons eu l'idée d'un drone &amp;quot;loisir&amp;quot;, effaçant ainsi la question de la charge.&lt;br /&gt;
&lt;br /&gt;
==Bibliographie et webographie==&lt;br /&gt;
&lt;br /&gt;
===Arducopter===&lt;br /&gt;
&lt;br /&gt;
 https://www.digi.com/resources/documentation/digidocs/PDFs/90000976.pdf&lt;br /&gt;
 http://jeromeabel.net/wiki/xbee/xbee-arduino.pdf&lt;br /&gt;
 https://www.digi.com/resources/documentation/digidocs/pdfs/90001942-13.pdf&lt;br /&gt;
 https://www.arduino.cc/en/Reference/Servo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Manuel d'utilisation&lt;br /&gt;
 http://ardupilot.org/copter/index.html&lt;br /&gt;
&lt;br /&gt;
* Tutoriels vidéos&lt;br /&gt;
 Première installation et setup : https://www.youtube.com/watch?v=30cCs4aHdB0&amp;amp;t=754s&lt;br /&gt;
 Alimentation de l'Ardupilot : https://www.youtube.com/watch?v=TS4OWAcfAQY&amp;amp;t=270s&lt;br /&gt;
 Calibration des ESC : https://youtu.be/gYoknRObfOg&lt;br /&gt;
&lt;br /&gt;
=Préparation du projet=&lt;br /&gt;
&lt;br /&gt;
==Cahier des charges du groupe==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Diagramme bête à cornes'''&lt;br /&gt;
&lt;br /&gt;
Le diagramme bête à cornes nous permet de faire une analyse fonctionnelle du besoin. Notre drone permet à utilisateur de découvrir l'aéronautique à travers une activité ludique à l'aide d'une télécommande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bete_a_cornes.png | center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Diagramme en pieuvre'''&lt;br /&gt;
&lt;br /&gt;
Le diagramme en pieuvre permet quant à lui de répertorier toutes les fonctions (principales et de service) et d'analyser l'importance des besoins de notre projet&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pieuvredrone.png | center]]&lt;br /&gt;
&lt;br /&gt;
'''Tableau de fonctions'''&lt;br /&gt;
&lt;br /&gt;
Le tableau ci-dessous liste les fonctions principales (FP) et les fonctions contraintes (FC), dans l'orde d'importance, les accompagnant d'une petite description.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tableau_fonctions.jpeg | 500px | center]]&lt;br /&gt;
&lt;br /&gt;
==Cahier des charges des équipes==&lt;br /&gt;
===Equipe 1 : Gestion de la commande (Evan Gury et Richard Simonin)===&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie, est de créer une télécommande ainsi que le récepteur. Nous devons lire les valeurs des potentiomètres, créer des trames, envoyer les trames et analyser les trames reçus. Notre système doit être performant en matière de vitesse ainsi qu'en précision.&lt;br /&gt;
&lt;br /&gt;
===Equipe 2 : Contrôleur de vol (Maxime Claudel et Lukas Fauchois)===&lt;br /&gt;
&lt;br /&gt;
L'objectif de l'équipe est d'utiliser une carte de contrôle pouvant être liée à un logiciel de contrôle de vol. Etant donné notre projet, la carte doit respecter certaines contraintes : être adaptée à un drone à quatre hélices (quadcopter), fonctionner sur batterie (car positionnée sur le chassis du drone), être déjà programmée et relativement simple d'utilisation. Le logiciel doit quant à lui nous permettre de gérer le vol du drone et de calibrer les commandes.&lt;br /&gt;
&lt;br /&gt;
==Choix techniques : matériel et logiciel==&lt;br /&gt;
===Equipe 1===&lt;br /&gt;
&lt;br /&gt;
'''Émetteur'''&lt;br /&gt;
&lt;br /&gt;
Pour la réalisation de l'émetteur, nous avons choisi de travailler avec une Arduino ainsi que '''deux joysticks''' et un '''émetteur Xbee'''. Nous voulons une télécommande petite c'est pourquoi nous avons pris avec une '''Arduino NANO'''. Le drone a besoin de deux joysticks pour être dirigé selon 3 axes.&lt;br /&gt;
&lt;br /&gt;
'''Récepteur'''&lt;br /&gt;
&lt;br /&gt;
Pour la réalisation du récepteur, qui sera situé sur le drone nous avons commencé par utiliser une '''Arduino UNO''' mais nous souhaitons changer pour une NANO afin d'optimiser le poids ainsi que l'espace. Nous avons aussi besoin d'un '''récepteur Xbee''' afin de recevoir les trames.&lt;br /&gt;
&lt;br /&gt;
===Equipe 2===&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi pour notre carte de contrôle un '''Ardupilot 2.8''', son prix est raisonnable (une trentaine d'euros) et nous trouvons beaucoup de tutoriels l'utilisant sur YouTube.&lt;br /&gt;
&lt;br /&gt;
Pour le logiciel, deux choix relativement similaires s'offraient à nous : Mission Planner ou APM Planner. Les deux logiciels ont à peu près la même interface et permettent tous les deux d'effectuer les mêmes étapes de calibrage de l'Ardupilot et des commandes avant le premier vol.&lt;br /&gt;
&lt;br /&gt;
Nous avons d'abord commencé sur Mission Planner mais des problèmes de mises à jour du firmware de l'Ardupilot nous ont empêché de calibrer les '''ESC du drone'''. Nous sommes donc ensuite passés sur '''APM Planner''' car il permet d'éviter ce problème de mises à jour.&lt;br /&gt;
&lt;br /&gt;
===Bilan===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:materieldrone.jpg|right|thumb|Matériel nécessaire à la conception]]&lt;br /&gt;
&lt;br /&gt;
* '''Matériel''' :&lt;br /&gt;
**2 joysticks&lt;br /&gt;
**Emetteur Xbee&lt;br /&gt;
**Récepteur Xbee&lt;br /&gt;
**Arduino NANO&lt;br /&gt;
**Arduino UNO&lt;br /&gt;
**Ardupilot 2.8&lt;br /&gt;
**Câblage&lt;br /&gt;
&lt;br /&gt;
* '''Logiciels''' :&lt;br /&gt;
**Arduino&lt;br /&gt;
**Mission Planner&lt;br /&gt;
**APM Planner 2.0&lt;br /&gt;
&lt;br /&gt;
==Liste des tâches à effectuer==&lt;br /&gt;
===Equipe 1===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser la partie gestion de la commande, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Analyse du projet&lt;br /&gt;
* Découverte Xbee&lt;br /&gt;
* Prise en main Xbee&lt;br /&gt;
* Envoi de trames&lt;br /&gt;
* Réception de trames&lt;br /&gt;
* Optimisation de la programmation&lt;br /&gt;
* Test sur maquette&lt;br /&gt;
* Réalisation du PCB&lt;br /&gt;
* Mise en œuvre sur notre drone&lt;br /&gt;
&lt;br /&gt;
===Equipe 2===&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser la partie contrôleur de vol, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Analyse du projet&lt;br /&gt;
* Choix d'une carte de contrôle&lt;br /&gt;
* Documentation, recherche d'un software&lt;br /&gt;
* Calibration de la carte&lt;br /&gt;
* Réalisation des branchements&lt;br /&gt;
* Mise en application sur la maquette&lt;br /&gt;
* Mise en relation avec la partie commande&lt;br /&gt;
&lt;br /&gt;
==Calendrier prévisionnel==&lt;br /&gt;
Nous avons décidé de réaliser un diagramme de GANTT pour chacun des calendriers prévisionnels (un par équipe). Sur chaque tâche, nous avions prévu un temps de travail en bleu dans les diagrammes et le temps réel consacré en jaune.&lt;br /&gt;
===Equipe 1 : Calendrier prévisionnel pour la gestion de la commande===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:equipe1cal.jpg|500px|center|&amp;quot;Calendrier de l'Equipe 1&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Equipe 2 : Calendrier prévisionnel pour le contrôleur de vol===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:equipe2cal.jpg|500px|center|&amp;quot;Calendrier de l'Equipe 2&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
=Réalisation du Projet=&lt;br /&gt;
&lt;br /&gt;
==Projet S6==&lt;br /&gt;
&lt;br /&gt;
===Semaine 5 et 6===&lt;br /&gt;
&lt;br /&gt;
Avant de scinder le groupe en deux équipes, nous avons passés les deux premières séances à évaluer les besoins de conception de notre projet pour pouvoir ensuite réaliser un cahier des charges et établir un calendrier prévisionnel des tâches à effectuer.&lt;br /&gt;
&lt;br /&gt;
===Semaine 7===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:xbeedrone.jpg|200px|thumb|Xbee]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Etant donné que nous avons décidé d'utiliser des modules XBee, nous avons consacrés cette semaine à la documentation, afin de comprendre comment configurer et utiliser ces derniers.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ardupilot28.jpeg|300px|right|thumb|Ardupilot 2.8]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Sur le principe de la semaine 7, nous nous sommes documentés sur les XBee afin de comprendre comment les configurer et les utiliser.&lt;br /&gt;
&lt;br /&gt;
Pour la configuration, nous avons retenu le logiciel XCTU qui est celui recommandé pour configurer les XBee. Cependant, nous gardons quand même de côté Legacy XCTU qui est l'ancienne version XCTU mais qui reste tout de même viable.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Nous avons consacré cette séance de documentation à la recherche d'une carte de contrôle de vol satisfaisant nos exigences. Nous cherchions donc une carte facilement connectable avec un Arduino Uno/Micro. Nous avons opté pour l'Ardupilot 2.8. Il comprend tout le nécessaire pour diriger un drone quadcopter, centrale gyroscopique, accéléromètres, interface de radiocommande. &lt;br /&gt;
Nous avons donc commandé l'Ardupilot via le site Alibaba.com (30€) et nous l'avons reçu trois semaines plus tard.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Après avoir effectués diverses recherches sur les modules XBee et effectué de nombreux tests (XCTU, legacy XCTU), nous avons abandonné l'utilisation du logiciel XCTU, étant donné que nous n'utilisons que deux XBee, nous pouvons les initialiser directement dans le programme avec le programme suivant:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:inixbeedrone.png]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
En attendant la réception du colis de l'Ardupilot, nous nous sommes documentés sur les différents logiciels de contrôle de vol à notre disposition. L'objectif étant de trouver un logiciel compatible avec l'Ardupilot 2.8 et avec suffisamment de documentation et tutoriels d'utilisation. Les deux logiciels qui sont ressortis le plus dans nos recherches sont Mission Planner et APM Planner 2. Ces deux logiciels sont très similaires au niveau de l'interface et des options de calibration de la carte de vol à laquelle ils sont connectés.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:apm20.png|300px|center]][[Fichier:missionplanner.jpg|300px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En connectant l'Ardupilot via un câble USB, le logiciel le reconnait et une démarche de calibration peut être entamée : boussole, accéléromètres, radiocommande, ESC.&lt;br /&gt;
&lt;br /&gt;
===Semaine 10===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Nous avons travaillé sur la transmission, la réception et le traitement des trames.&lt;br /&gt;
&lt;br /&gt;
Pour la transmission, nous avons mis en place le système suivant:&lt;br /&gt;
&lt;br /&gt;
*On lit la valeur des potentiomètres&lt;br /&gt;
*On convertit la valeur en une chaîne de caractère et on lui attribue un indice qui est propre à chaque position des joysticks.&lt;br /&gt;
*On envoie la chaîne de caractère par liaison série.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la réception, nous avons mis en place le système suivant:&lt;br /&gt;
&lt;br /&gt;
*On reçoit un tableau de caractère qui contient la consigne entre 0 et 1023 et un indice pour dire à quel joystick et quelle position la consigne correspond.&lt;br /&gt;
*On converti le tableau en entier et à l'aide de la fonction map on adapte la consigne pour qu'elle est une valeur entre 0 et 180.&lt;br /&gt;
*On transmet la consigne à l'ardupilot.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Idem semaine 9.&lt;br /&gt;
&lt;br /&gt;
===Semaine 11===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Débogage de la communication entre les modules XBee et l'ardupilot.&lt;br /&gt;
&lt;br /&gt;
En utilisant deux terminaux, la communication était réalisé entre les deux XBee  cependant une fois branché sur l'ardupilot nous avons eu des difficultés à traiter les trames, du au fait d'une transmission trop rapide.&lt;br /&gt;
&lt;br /&gt;
De plus nous avons passé un certains temps à vouloir utiliser une arduino micro mais avons finalement décidé de laisser tomber, puisque nous n'avons pas réussi à réceptionner les trames XBee.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Idem semaine 9.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Optimisation du format des trames et réglage de la vitesse de transmission.&lt;br /&gt;
&lt;br /&gt;
Passage d'une Arduino UNO à une Arduino Nano pour l'envoie des trames dans l'optique de réaliser un PCB pour la commande.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
A ce stade du projet nous ne pouvions qu'expérimenter les calibrations de la boussole et des accéléromètres de l'Ardupilot car la partie commande n'était pas terminée.&lt;br /&gt;
&lt;br /&gt;
La calibration de la boussole s'effectue en bougeant l'Ardupilot selon tous ces axes pendant une période de temps donnée jusqu'à ce que les informations nécessaires soient récoltées.&lt;br /&gt;
La calibration des accéléromètres s'effectue en positionnant l'Ardupilot dans des positions définies (sur le côté gauche, sur la face avant, etc.). (cliquer sur l'image ci-dessous pour lancer le GIF)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:compasscalib.gif|300px|center]][[Fichier:compasscalib.png|300px|center]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 13===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Réglage des trames pour la commande du prototype.&lt;br /&gt;
&lt;br /&gt;
Nous avons rencontré quelques problème de sensibilité au niveau des joysticks et du traitement du signal de commande transmis à l'ardupilot.&lt;br /&gt;
&lt;br /&gt;
En effet, ayant trouvé très peu de documentation sur l'ardupilot, nous avons eu du mal à générer les bons signaux de commande.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes ensuite consacrés à la partie alimentation de l'Ardupilot et du drone. En se documentant sur le site servant de manuel d'utilisation d'Ardupilot et des logiciels Mission Planner et APM Planner 2, nous avons trouvé que l'Ardupilot pouvait être alimenté via les ESC.&lt;br /&gt;
Une batterie LiPo alimente les ESC qui elles-mêmes alimentent l'Ardupilot via les broches Output. L'Ardupilot alimente ensuite l'Arduino qui réceptionne les trames reçues par le récepteur Xbee. Sur les sorties (Output) de l'Ardupilot sont aussi branchés les fils permettant la réception du signal envoyé aux moteurs.&lt;br /&gt;
Ainsi, tous les composants nécessaires au drone sont alimentés.&lt;br /&gt;
&lt;br /&gt;
===Semaine 14===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Conception du PCB pour la commande en essayant de limiter le plus possible les vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pcbdrone.png|400px|PCB]]&lt;br /&gt;
&lt;br /&gt;
Vérification de l'envoie des trames à l'aide de l'ordinateur et test de réception sur l'Ardupilot.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Branchements comme indiqués à la semaine précédente, alimentation et tests de bon fonctionnement des moteurs, Ardupilot et Arduino.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:branchementesc.jpg|300px]][[Fichier:branchementardu.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
===Semaine 15===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Fabrication de la manette&lt;br /&gt;
&lt;br /&gt;
[[Fichier:manettedrone.jpg|400px|PCB]]&lt;br /&gt;
&lt;br /&gt;
Modification de l'envoie des trames. Tests de transmission.&lt;br /&gt;
Implémentation du programme sur le prototype.&lt;br /&gt;
&lt;br /&gt;
Les deux équipes ont passé la semaine à réunir leur travail, nous avons ainsi tous pu réaliser de nombreux tests du prototype, avec réussite, hormis un léger accident qui à entraîné la destruction de deux hélices. &lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
A ce stade, la commande étant terminée et nous avons pu nous lier à l'équipe 1 pour mettre en relation la télécommande et l'Ardupilot. Après avoir utilisé Mission Planner pendant plusieurs semaines, un problème de mise-à-jour du software de l'Ardupilot nous empêchait toujours d'effectuer la calibration de la radiocommande. Nous sommes donc passés sur APM Planner 2 et la mise-à-jour n'était plus demandée, nous avons donc enfin pu terminer l'intégralité de la phase de calibration. Comme expliqué ci-dessus, nous avons effectué de nombreux tests pour atteindre notre objectif.&lt;br /&gt;
&lt;br /&gt;
===Documents Rendus===&lt;br /&gt;
&lt;br /&gt;
Rapport : [[fichier:rapport_groupe_4.pdf]]&lt;br /&gt;
&lt;br /&gt;
==Projet S7==&lt;br /&gt;
&lt;br /&gt;
===De nouveaux objectifs===&lt;br /&gt;
&lt;br /&gt;
Durant le semestre 6, nous avons réussi à concevoir un drone volant fonctionnel régulé à l'aide d'une carte de contrôle OpenSource '''Ardupilot 2.8'''. Concernant la commande, nous avions fait le choix d'utiliser une carte communication Xbee ainsi qu'une Arduino NANO et des joysticks.&lt;br /&gt;
&lt;br /&gt;
Cette année, nous avons décidé de développer plus amplement notre projet et de pratiquement repartir du point de départ. En effet, nos objectifs cette année sont :&lt;br /&gt;
*'''d'utiliser de nouveaux composants dont nous connaissons les propriétés (moteurs, ESCs, etc)'''&lt;br /&gt;
*'''d'utiliser une télécommande de modélisme ainsi qu'un récepteur adapté à des portées plus élevées que celles que permettait l'Xbee'''&lt;br /&gt;
*'''de concevoir notre propre contrôleur de vol'''&lt;br /&gt;
*'''Bonus''' : d'intégrer une régulation GPS et un mode automatique en cas de perte de signal&lt;br /&gt;
&lt;br /&gt;
===Reprise du cahier des charges===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 : Gestion de la commande et initialisation (Richard Simonin &amp;amp; Lukas Fauchois)'''&lt;br /&gt;
&lt;br /&gt;
L'objectif de la nouvelle gestion de la commande est d'utiliser une télécommande de modélisme capable de transmettre les différentes données nécessaires (Throttle, Yaw, Pitch) à un récepteur relié à une Arduino UNO, ce qui nous permettra d'être performant en terme de vitesse et de précision. De plus, cette partie de la conception consiste également à calibrer les quatre ESCs que nous utilisons. &lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 : Contrôleur de vol (Evan Gury &amp;amp; Maxime Claudel)&lt;br /&gt;
&lt;br /&gt;
A compléter&lt;br /&gt;
&lt;br /&gt;
===Nouveaux choix techniques===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
Pour réaliser la commande du drone, nous avons décidé d'utiliser une télécommande [https://fr.banggood.com/Flysky-FS-i6X-2_4GHz-10CH-AFHDS-2A-RC-Transmitter-With-X6B-i-BUS-Receiver-p-1090406.html?rmmds=myorder&amp;amp;ID=42482530817&amp;amp;cur_warehouse=CN '''Flysky FS-I6X'''] accompagnée de son récepteur '''FS-X6B''' qui possède une portée assez élevée pour la réalisation de notre projet. Ce récepteur sera alors relié à une carte '''Arduino UNO''' (qui servira également au contrôleur de vol).&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
Concernant la réalisation du contrôleur de vol, nous choisissons d'utiliser une centrale inertielle [https://fr.banggood.com/3pcs-6DOF-MPU-6050-3-Axis-Gyro-With-Accelerometer-Sensor-Controller-Module-For-Arduino-p-1430733.html?rmmds=search&amp;amp;cur_warehouse=CN '''MPU6050'''] possédant un accéléromètre 3 axes ainsi qu'un gyroscope 3 axes, ce qui convient parfaitement à l'utilisation que l'on veut en faire. De plus, c'est une centrale qui est documentée et à coût raisonnable, elle dispose de son propre processeur, ce qui réduit considérablement la quantité de calculs à effectuer par notre micro-contrôleur. Nous relierons également cette centrale inertielle à la carte '''Arduino UNO'''.&lt;br /&gt;
&lt;br /&gt;
'''Conception générale du drone :'''&lt;br /&gt;
&lt;br /&gt;
Comme évoqué précédemment, pour le coeur d'une drone, nous utiliserons une carte '''Arduino UNO''' qui possède un nombre suffisant de ports d'interruptions, de ports PWM et d'une puissance de calcul suffisante pour traiter toutes les informations des différents capteurs.&lt;br /&gt;
&lt;br /&gt;
Nous avons également décidé de fabriquer notre propre chassis basé sur le design du précédent et d'utiliser de nouveaux ESCs dédiés spécialement au drone volant ([https://fr.banggood.com/EMAX-BLHeli-Series-6A-12A-20A-30A-ESC-p-963634.html?rmmds=search&amp;amp;ID=45170&amp;amp;cur_warehouse=CN '''EMAX BLHELI SERIES 20A''']). Nous avons également choisi de nouveaux moteurs brushless : les [https://fr.banggood.com/1000KV-Brushless-Motor-3_17mm-Shaft-Electric-Motor-p-1102054.html?rmmds=search&amp;amp;cur_warehouse=CN '''A2212/13T'''].&lt;br /&gt;
&lt;br /&gt;
'''Bilan'''&lt;br /&gt;
*'''Matériel'''&lt;br /&gt;
**Chassis&lt;br /&gt;
**4 ESCs EMAX BLHELI 20A&lt;br /&gt;
**4 moteurs A2212/13T&lt;br /&gt;
**Batterie LI-PO 11,1V - 2700mAh&lt;br /&gt;
**Arduino UNO&lt;br /&gt;
**Télécommande Flysky FS-I6X&lt;br /&gt;
**Récepteur FS-X6B&lt;br /&gt;
**Centrale inertielle MPU6050&lt;br /&gt;
*'''Logiciel'''&lt;br /&gt;
**Arduino&lt;br /&gt;
&lt;br /&gt;
'''Note''' : grâce au travail d'Evan Gury, nous avons pu acquérir tout ce matériel et il a pu concevoir le chassis avant même le commencement du semestre 7, ce qui nous a permis de nous avancer sur le travail à réaliser.&lt;br /&gt;
&lt;br /&gt;
===Liste des tâches à effectuer===&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser la nouvelle gestion de la commande et l'initialisation, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Découverte télécommande Flysky FS-I6X et son récepteur FS-X6B&lt;br /&gt;
* Configurer la télécommande&lt;br /&gt;
* Lecture des joysticks par Arduino&lt;br /&gt;
* Initialiser les extremums des joysticks&lt;br /&gt;
* Optimisation de la programmation&lt;br /&gt;
* Test de transmission sur les ESCs&lt;br /&gt;
* Mise en œuvre sur notre drone&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir réaliser le contrôleur de vol, nous devons réaliser les tâches suivantes&lt;br /&gt;
* Découverte du MPU6050&lt;br /&gt;
* Configuration des registres du MPU6050&lt;br /&gt;
* Récupération des mesures angulaires en °/s&lt;br /&gt;
* Intégration des mesures pour récupérer les positions en degrés&lt;br /&gt;
* Calcul de la consigne&lt;br /&gt;
* Calcul de l'erreur&lt;br /&gt;
* Calcul du correcteur&lt;br /&gt;
* Application de la correction aux ESCs&lt;br /&gt;
&lt;br /&gt;
===Semaine 45===&lt;br /&gt;
&lt;br /&gt;
[[Fichier: flyskyFSI6X.jpg|200px|right|thumb|Flysky FS-I6X et FS-X6B]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Lors de la première semaine, nous avons fait le choix d'utiliser un mode de transmission existant et d'abandonner la télécommande conçue au semestre précédent. Nous avons alors choisi d'utiliser la télécommande de modélisme Flysky FS-I6X et son récepteur FS-X6B. &lt;br /&gt;
&lt;br /&gt;
*Nous avons dû dans un premier temps configurer la télécommande et comprendre comment transmettre les informations des deux joysticks.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Nous avons passé la première séance à nous documenter le plus possible sur le MPU6050 qui est le cœur de notre contrôleur de vol.&lt;br /&gt;
*Nous avons ainsi pu trouver de nombreux documents concernant la configuration des différents registre du MPU6050, de manière à avoir une utilisation correspondant au mieux à un drone volant.&lt;br /&gt;
&lt;br /&gt;
===Semaine 46===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Pour la réception des informations et le traitement des données, nous avons branché le récepteur sur une carte Arduino. Deux choix s'offraient à nous, utiliser des broches PWM ou une broche PPM. Le PPM a pour avantage d'utiliser un unique câble, tous les canaux sont transmis à la suite contrairement au PWM, un câble est nécessaire à chaque canal. L'Arduino UNO ne nous limitant pas pour l'utilisation de 1 broche ou 4 broches, nous avons décider d'utiliser le PWM.&lt;br /&gt;
&lt;br /&gt;
*Nous avons programmé notre Arduino UNO afin de récupérer les informations sur nos canaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Nous avons passé tout notre temps à tenter de récuperer les coordonnées YAW-PITCH-ROLL du mpu6050 et ce de la manière la plus rapide possible afin d'optimiser au mieux la régulation.&lt;br /&gt;
&lt;br /&gt;
===Semaine 47===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Nous avons finalisé la conception de notre drone, nous avons finalisé le câblage et ainsi pu faire des tests sur le prototype.&lt;br /&gt;
&lt;br /&gt;
*Pour commander les moteurs, les ESCs sont nécessaires. L'utilisation est plutôt simple car ils s'utilisent comme des servomoteurs, ainsi la bibliothèque ''servo.h'' d'Arduino nous a permis de les initialiser et donc de faire tourner les moteurs.&lt;br /&gt;
&lt;br /&gt;
*Le projet avance vite et nous avons beaucoup d'ambition et d'idées pour la suite.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Même si le MPU6050 est très bien documenté nous avons passé de nombreuses heures a tenter de récupérer les coordonnées YAW, PITCH et ROLL pour notre drone mais sans succès. Le principal problème était que deux des trois MPUs que nous avions commandés sur Banggood ne marchaient pas correctement.&lt;br /&gt;
*Au final nous arrivons désormais à récupérer ces informations suffisamment vite pour pouvoir espérer effectuer une correction correcte.&lt;br /&gt;
&lt;br /&gt;
===Semaine 48===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Correction du calibrage des ESCs à travers l'Arduino.&lt;br /&gt;
*Début de la commande des moteurs grâce à notre télécommande Flysky. Cependant, nous avons rencontré quelques soucis dans notre programme, il nous faut alors revoir ce code Arduino pour réussir cette étape.&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Mise en commun de la partie programmation Arduino avec l'équipe 1. &lt;br /&gt;
*Première prise de renseignements sur les GPS dans l'optique d'en utiliser un pour commander le drone s'il nous reste du temps en fin de projet.&lt;br /&gt;
&lt;br /&gt;
===Documents Rendus===&lt;br /&gt;
&lt;br /&gt;
Soutenance : [[fichier:soutenance_S7_P4.pdf]]&lt;br /&gt;
&lt;br /&gt;
==Projet S8==&lt;br /&gt;
&lt;br /&gt;
[[Fichier: pcb_drone_p4.png|500px|right|thumb|PCB réalisé sur Altium]]&lt;br /&gt;
&lt;br /&gt;
===Liste des tâches à effectuer===&lt;br /&gt;
'''Equipe 1'''&lt;br /&gt;
&lt;br /&gt;
Après analyse du travail réalisé au S7, nous devons désormais réaliser les tâches suivantes :&lt;br /&gt;
*Conception d'un PCB (pour l'ensemble du système)&lt;br /&gt;
*Optimiser la distribution de la puissance (esthétiquement)&lt;br /&gt;
*Finition de la partie communication envoie/reception de trame validé&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2'''&lt;br /&gt;
&lt;br /&gt;
Après analyse du travail réalisé au S7, nous devons désormais réaliser les tâches suivantes :&lt;br /&gt;
*Tests et réglages de la régulation PID&lt;br /&gt;
*Implémenter un système de guidage GPS (à voir avec le temps que l'on dispose)&lt;br /&gt;
&lt;br /&gt;
===Semaine 3===&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Réflexion et réalisation du PCB sur ''Altium Designer''&lt;br /&gt;
*Mise en relation des différentes variables de notre programme avec celui de l'équipe 2&lt;br /&gt;
*Choix et commande d'un distributeur de puissance (PDB) pour câbler plus proprement les ESCs&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Mise en relation du programme avec l'équipe 1&lt;br /&gt;
*Finalisation du programme total, y compris la partie régulation PID&lt;br /&gt;
&lt;br /&gt;
===Semaine 4===&lt;br /&gt;
&lt;br /&gt;
[[Fichier: testregubar.mp4|350px|right|thumb|Essai de calibration sur deux axes avec le premier dispositif (drone fixé par le haut et le bas grâce à des câbles)]]&lt;br /&gt;
[[Fichier: calibration-un-axe.mp4|250px|right|thumb|Essai de calibration sur un axe avec le deuxième dispositif]]&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
* Finition du PCB sur altium et création du même PCB sur Fritzing.&lt;br /&gt;
* Reprise de l'ancienne maquette pour effectuer la régulation&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Réalisation d'un programme Arduino permettant de lire la valeur de 3 potentiomètres afin de pouvoir régler les coefficients du PID.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Impression du PCB et branchement sur la maquette (2)&lt;br /&gt;
*Début des tests de régulation en mode suspendu (sans grande réussite pour le moment)&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Tests de régulation en mode suspendu (avec l'équipe 1)&lt;br /&gt;
*Début de conception d'un PCB permettant de fixer l'ensemble des composants (les nombreux fils commencent à devenir trop gênants pour les tests)&lt;br /&gt;
&lt;br /&gt;
===Semaine 6===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*Modification du programme afin de détecter l'arrêt du microcontrôleur Atemega 328P. &lt;br /&gt;
* Resolution de l'erreur lié à la carte et au programme, suspicion de l'ISR mais le problème était du à une division par 0 (Probleme de maquette avec le MPU 6050).  &lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*Mise en place de support en PVC (voir photo) afin de ne laisser au drone qu'un seul degrés de liberté et ainsi permettre de le réguler plus facilement, suite à l'échec de la régulation suspendue.&lt;br /&gt;
*Problème sur un moteur ou un ESC de notre nouveau drone, un des moteurs ne tourne pas lorsque nous montons l'hélice dessus.&lt;br /&gt;
*Problème sur un moteur du nouveau drone qui se coupe totalement à une consigne bien précise et redémarre ensuite.&lt;br /&gt;
&lt;br /&gt;
[[Fichier: testesc.jpg|400px|right|thumb|Test des valeurs de courant reçues par les ESC]]&lt;br /&gt;
===Semaine 7 : coupure pédagogique===&lt;br /&gt;
&lt;br /&gt;
===Semaine 8===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 &amp;amp; 2 :'''&lt;br /&gt;
&lt;br /&gt;
* Lors de cette semaine, nous nous sommes penchés sur les problèmes physiques rencontrés précédemment. &lt;br /&gt;
Pour cela nous avons utilisé un oscilloscope équipé d'une sonde afin de relever les valeurs clés de tension et de courant.&lt;br /&gt;
Nous utilisons un programme qui envoie la même consigne aux 4 moteurs afin de comparer les vitesses de rotation.&lt;br /&gt;
Nous nous sommes aperçu que sur la maquette n°1, les 4 moteurs fonctionnent correctement mais qu'un ESC (Contrôleur moteur) est défaillant.&lt;br /&gt;
Sur la maquette n°2, un moteur et un ESC sont obsolètes. &lt;br /&gt;
Nous avons essayé de mixer les deux maquettes pour faire fonctionner un drone.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 &amp;amp; 2 :'''&lt;br /&gt;
&lt;br /&gt;
* Commande et attente des ESC pour finaliser la régulation.&lt;br /&gt;
* Création d'un boitier PID pour simplifier la régulation. Ce boiter va nous permettre de modifier facilement les valeurs des coefficients de notre PID numérique.&lt;br /&gt;
&lt;br /&gt;
===Semaine 10===&lt;br /&gt;
&lt;br /&gt;
Re-structuration du projet suite aux événements du COVID-19:&lt;br /&gt;
&lt;br /&gt;
* Régulation sur deux ESCs : Lukas (dispose de tout le matériel)&lt;br /&gt;
* Création application mobile, communication entre téléphone et le drone. (Richard et Evan)&lt;br /&gt;
* Simuler le drone en C. (Maxime)&lt;br /&gt;
&lt;br /&gt;
===Semaine 11===&lt;br /&gt;
&lt;br /&gt;
'''Regulation avec 2 ESC :'''&lt;br /&gt;
&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
'''Application mobile :'''&lt;br /&gt;
&lt;br /&gt;
* Debut de l'apprentissage de la creation d'une application Android à l'aide de ANDROID STUDIO&lt;br /&gt;
&lt;br /&gt;
'''modélisation drone en C :'''&lt;br /&gt;
&lt;br /&gt;
*&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
===Semaine 12===&lt;br /&gt;
&lt;br /&gt;
*Réalisation d'une application android, sous Android Studio, permettant de simuler une commande afin de piloter le drone.&lt;br /&gt;
*Les JoyStick envoient une consigne variant de 1000 à 2000 pour le throttle et les axes Yaw, Pitch, Roll, valeurs attendues par le drone afin de générer la PWM pour les ESCs.&lt;br /&gt;
*L'interface de l'application est terminée, il reste désormais a programmer la partie concernant l'ESP32.&lt;br /&gt;
&lt;br /&gt;
[[Fichier: applicationAndroid.mp4|500px|left|thumb|Presentation de l'application]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Semaine 13===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
===Semaine 14 et 15 : coupure pédagogique===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Semaine 16===&lt;br /&gt;
&lt;br /&gt;
'''Equipe 1 :'''&lt;br /&gt;
&lt;br /&gt;
*&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
'''Equipe 2 :'''&lt;br /&gt;
&lt;br /&gt;
*&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
===Documents Rendus===&lt;/div&gt;</summary>
		<author><name>Egury</name></author>	</entry>

	</feed>