<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
		<id>https://wiki-ima.plil.fr/mediawiki//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bcartier</id>
		<title>Wiki d'activités IMA - Contributions de l’utilisateur [fr]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki-ima.plil.fr/mediawiki//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bcartier"/>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php/Sp%C3%A9cial:Contributions/Bcartier"/>
		<updated>2026-04-24T15:56:13Z</updated>
		<subtitle>Contributions de l’utilisateur</subtitle>
		<generator>MediaWiki 1.29.2</generator>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P6_IOT_2018&amp;diff=49320</id>
		<title>P6 IOT 2018</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P6_IOT_2018&amp;diff=49320"/>
				<updated>2019-01-14T15:35:18Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : /* Séance 4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
&lt;br /&gt;
===Présentation générale du projet===&lt;br /&gt;
&lt;br /&gt;
====Contexte====&lt;br /&gt;
Dans le cadre du module transversal Internet des Objets (IOT), nous devons réaliser un objet connecté correspondant à une problématique du quotidien.&lt;br /&gt;
&lt;br /&gt;
La recherche d'objets importants égarés est fatiguante pour une personne malvoyante. Une aide à la réalisation d'une telle tâche augmenterait grandement la qualité de vie de ces personnes.&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
L'objectif du projet est de concevoir un système connecté permettant la localisation d'objets importants pour une personne malvoyante ne pouvant pas facilement les rechercher.&lt;br /&gt;
&lt;br /&gt;
Ce système doit être simple d'utilisation et adapté.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
Le système se décompose en 3 parties :&lt;br /&gt;
* Une station de base&lt;br /&gt;
* Une aide mobile/un radar&lt;br /&gt;
* L'objet à retrouver&lt;br /&gt;
&lt;br /&gt;
La station de base et l'objet, pour commencer un téléphone, doivent être connectés au même réseau WiFi.&lt;br /&gt;
&lt;br /&gt;
La station de base, suite à une action mécanique, envoie un message à l'objet pour lui indiquer d'émettre un son pour la personne et un signal pour le radar.&lt;br /&gt;
&lt;br /&gt;
Le radar capte le signal du téléphone et permet de donner des informations sur la localisation de l'objet.&lt;br /&gt;
&lt;br /&gt;
Le téléphone cessera d'émettre suite à une action mécanique sur la Station de base seulement si le radar est replacé sur la Station.&lt;br /&gt;
&lt;br /&gt;
====Choix techniques====&lt;br /&gt;
La station de base sera composée d'un Raspberry Pi et d'un actionneur (gros bouton rouge). Le raspberry aura un module WiFi afin de se connecter à la box du logement.&lt;br /&gt;
&lt;br /&gt;
Le radar sera composé d'un rapsberry, d'une batterie et d'un ou plusieurs vibreurs.&lt;br /&gt;
&lt;br /&gt;
L'objet à retrouver (le téléphone) doit pouvoir faire fonctionner une application mobile et comporter une sortie audio.&lt;br /&gt;
&lt;br /&gt;
Toutes les communications se feront via le Wifi.&lt;br /&gt;
&lt;br /&gt;
La localisation du téléphone sera faite de plusieurs façons simultanées : &lt;br /&gt;
* Signal sonore pour la personne&lt;br /&gt;
* Message Wifi pour le radar&lt;br /&gt;
&lt;br /&gt;
Le radar pourrait déterminer la position du téléphone de plusieurs manières :&lt;br /&gt;
* Localisation par puissance du signal reçu, tel un jeu &amp;quot;Chaud/Froid&amp;quot;&lt;br /&gt;
* Localisation par trilatéralisation&lt;br /&gt;
&lt;br /&gt;
Les échanges entre le radar et le téléphone peuvent être faits de plusieurs manières :&lt;br /&gt;
* Le radar écoute toutes les communications Wifi et cherche sur le réseau du logement les messages du téléphone à destination de la box.&lt;br /&gt;
* Le radar crée son propre réseau Wifi, et l'application sur le téléphone force ce dernier à se connecter au réseau nouvellement créé.&lt;br /&gt;
&lt;br /&gt;
L'application sera développée exclusivement pour un support Android.&lt;br /&gt;
&lt;br /&gt;
====Matériel nécessaire====&lt;br /&gt;
&lt;br /&gt;
* 2 Raspberry Pi avec WiFi&lt;br /&gt;
* 1 vibreur&lt;br /&gt;
* 1 bouton/interrupteur&lt;br /&gt;
* 1 batterie&lt;br /&gt;
* 1 cable d'alimentation pour Raspberry&lt;br /&gt;
* 1 téléphone sous android&lt;br /&gt;
&lt;br /&gt;
==Étapes du projet==&lt;br /&gt;
*Paramétrage des Raspbarry Pi&lt;br /&gt;
*Programmation de la Station&lt;br /&gt;
*Développement de l'application sur téléphone&lt;br /&gt;
*Programmation du Radar&lt;br /&gt;
*Tests&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
&lt;br /&gt;
===Séance 1===&lt;br /&gt;
*Choix d'un sujet&lt;br /&gt;
*Définition du cahier des charges&lt;br /&gt;
*Schématisation du système&lt;br /&gt;
*Etablissement des matériels nécessaires&lt;br /&gt;
&lt;br /&gt;
===Séance 2===&lt;br /&gt;
*Mise en route des Raspberry Pi&lt;br /&gt;
*Résolution de problèmes de réseau&lt;br /&gt;
*Recherches sur le type de codage nécessaire pour chaque partie&lt;br /&gt;
&lt;br /&gt;
===Séance 3===&lt;br /&gt;
*Codage de la station pour l'envoi d'un message en cas d'appui par l'utilisateur sur un bouton raccordé à la Station&lt;br /&gt;
*Mise en place d'un réseau internet [Echec, passage sur un cisco]&lt;br /&gt;
*Création de l'application mobile pour la communication entre la Station et le Téléphone&lt;br /&gt;
&lt;br /&gt;
===Séance 4===&lt;br /&gt;
*Modification du code de la Station&lt;br /&gt;
====Mise en place du réseau Cisco====&lt;br /&gt;
Configuration du router Cisco :&lt;br /&gt;
 enable&lt;br /&gt;
 conf t&lt;br /&gt;
 int bvi1&lt;br /&gt;
 ip address 192.168.145.1 255.255.255.0&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 conf t&lt;br /&gt;
 ip dhcp excluded-address 192.168.145.1&lt;br /&gt;
 ip dhcp pool IoT&lt;br /&gt;
 network 192.168.145.0 255.255.255.0&lt;br /&gt;
 lease 10&lt;br /&gt;
 default-router 192.168.145.1&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
 conf t&lt;br /&gt;
 dot11 ssid IoT2019&lt;br /&gt;
 authentication open&lt;br /&gt;
 guest-mode&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
 conf t&lt;br /&gt;
 int dot11radio0&lt;br /&gt;
 ssid IoT2019&lt;br /&gt;
 no shutdown&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
==Poster==&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P6_IOT_2018&amp;diff=49239</id>
		<title>P6 IOT 2018</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P6_IOT_2018&amp;diff=49239"/>
				<updated>2019-01-07T17:47:57Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : /* Choix techniques */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
&lt;br /&gt;
===Présentation générale du projet===&lt;br /&gt;
&lt;br /&gt;
====Contexte====&lt;br /&gt;
Dans le cadre du module transversal Internet des Objets (IOT), nous devons réaliser un objet connecté correspondant à une problématique du quotidien.&lt;br /&gt;
&lt;br /&gt;
La recherche d'objets importants égérés est fatiguante pour une personne malvoyante. Une aide à la réalisation une telle tâche augmenterait grandement la qualité de vie de ces personnes.&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
L'objectif du projet est de concevoir un système connecté permettant la localisation d'objets importants pour une personne malvoyante ne pouvant pas facilement les rechercher.&lt;br /&gt;
&lt;br /&gt;
Ce système doit être simple d'utilisation et adapté.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
Le système se décompose en 3 parties :&lt;br /&gt;
* une station de base&lt;br /&gt;
* une aide mobile/un radar&lt;br /&gt;
* l'objet à retrouver&lt;br /&gt;
&lt;br /&gt;
La station de base et l'objet, pour commencer un téléphone, doivent être connectés au même réseau WiFi.&lt;br /&gt;
&lt;br /&gt;
La station de base, suite à une action mécanique, envoie un message à l'objet pour lui indiquer d'émettre un son pour la personne et un signal pour le radar.&lt;br /&gt;
&lt;br /&gt;
Le radar capte le signal du téléphone et permet de donner des informations sur la localisation de l'objet.&lt;br /&gt;
&lt;br /&gt;
Le téléphone cessera d'émettre suite à une action mécanique sur la Station de base seulement si le radar est replacé sur la Station.&lt;br /&gt;
&lt;br /&gt;
====Choix techniques====&lt;br /&gt;
La station de base sera composée d'un Raspberry Pi et d'un actionneur (gros bouton rouge). Le raspberry aura un module WiFi afin de se connecter à la box du logement.&lt;br /&gt;
&lt;br /&gt;
Le radar sera composé d'un rapsberry, d'une batterie et d'un ou plusieurs vibreurs.&lt;br /&gt;
&lt;br /&gt;
L'objet à retrouver (le téléphone) doit pouvoir faire fonctionner une application mobile et comporter une sortie audio.&lt;br /&gt;
&lt;br /&gt;
Toutes les communications se feront via le Wifi.&lt;br /&gt;
&lt;br /&gt;
La localisation du téléphone sera faite de plusieurs façons simultanées : &lt;br /&gt;
* Signal sonore pour la personne&lt;br /&gt;
* Message Wifi pour le radar&lt;br /&gt;
&lt;br /&gt;
Le radar pourrait déterminer la position du téléphone de plusieurs manières :&lt;br /&gt;
* Localisation par puissance du signal reçu, style jeu &amp;quot;Chaud/Froid&amp;quot;&lt;br /&gt;
* Localisation par trilatéralisation&lt;br /&gt;
&lt;br /&gt;
Les échanges entre le radar et le téléphone peuvent être faits de plusieurs manières :&lt;br /&gt;
* Le radar écoute toutes les communications wifi et cherche sur le réseau wifi du logement les messages du téléphone à destination de la box.&lt;br /&gt;
* Le radar crée son propore réseau wifi, et l'application sur le téléphone force ce dernier à se connecter au réseau nouvellement créé.&lt;br /&gt;
&lt;br /&gt;
L'application sera développée exclusivement pour un support Android.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Matériel nécessaire====&lt;br /&gt;
&lt;br /&gt;
* 2 Raspberry Pi avec WiFi&lt;br /&gt;
* 1 vibreur&lt;br /&gt;
* 1 bouton/interrupteur&lt;br /&gt;
* 1 batterie&lt;br /&gt;
* 1 cable d'alimentation pour Raspberry&lt;br /&gt;
* 1 téléphone sous android&lt;br /&gt;
&lt;br /&gt;
==Étapes du projet==&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
&lt;br /&gt;
===Séance 1===&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P6_IOT_2018&amp;diff=49235</id>
		<title>P6 IOT 2018</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P6_IOT_2018&amp;diff=49235"/>
				<updated>2019-01-07T17:40:17Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : /* Contexte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
&lt;br /&gt;
===Présentation générale du projet===&lt;br /&gt;
&lt;br /&gt;
====Contexte====&lt;br /&gt;
Dans le cadre du module transversal Internet des Objets (IOT), nous devons réaliser un objet connecté correspondant à une problématique du quotidien.&lt;br /&gt;
&lt;br /&gt;
La recherche d'objets importants égérés est fatiguante pour une personne malvoyante. Une aide à la réalisation une telle tâche augmenterait grandement la qualité de vie de ces personnes.&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
L'objectif du projet est de concevoir un système connecté permettant la localisation d'objets importants pour une personne malvoyante ne pouvant pas facilement les rechercher.&lt;br /&gt;
&lt;br /&gt;
Ce système doit être simple d'utilisation et adapté.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
Le système se décompose en 3 parties :&lt;br /&gt;
* une station de base&lt;br /&gt;
* une aide mobile/un radar&lt;br /&gt;
* l'objet à retrouver&lt;br /&gt;
&lt;br /&gt;
La station de base et l'objet, pour commencer un téléphone, doivent être connectés au même réseau WiFi.&lt;br /&gt;
&lt;br /&gt;
La station de base, suite à une action mécanique, envoie un message à l'objet pour lui indiquer d'émettre un son pour la personne et un signal pour le radar.&lt;br /&gt;
&lt;br /&gt;
Le radar capte le signal du téléphone et permet de donner des informations sur la localisation de l'objet.&lt;br /&gt;
&lt;br /&gt;
Le téléphone cessera d'émettre suite à une action mécanique sur la Station de base seulement si le radar est replacé sur la Station.&lt;br /&gt;
&lt;br /&gt;
====Choix techniques====&lt;br /&gt;
La station de base sera composée d'un Raspberry Pi et d'un actionneur (gros bouton rouge). Le raspberry aura un module WiFi afin de se connecter à la box du logement.&lt;br /&gt;
&lt;br /&gt;
Le radar sera composé d'un rapsberry, d'une batterie et d'un ou plusieurs vibreurs.&lt;br /&gt;
&lt;br /&gt;
L'objet à retrouver (le téléphone) doit pouvoir faire fonctionner une application mobile et comporter une sortie audio.&lt;br /&gt;
&lt;br /&gt;
Toutes les communications se feront via le Wifi.&lt;br /&gt;
&lt;br /&gt;
La localisation du téléphone sera faite de plusieurs façons simultanées : &lt;br /&gt;
* Signal sonore pour la personne&lt;br /&gt;
* Message Wifi pour le radar&lt;br /&gt;
&lt;br /&gt;
Le radar pourrait déterminer la position du téléphone de plusieurs manières :&lt;br /&gt;
* Localisation par puissance du signal reçu, style jeu &amp;quot;Chaud/Froid&amp;quot;&lt;br /&gt;
* Localisation par trilatéralisation&lt;br /&gt;
&lt;br /&gt;
Les échanges entre le radar et le téléphone peuvent être faits de plusieurs manières :&lt;br /&gt;
* Le radar écoute toutes les communications wifi et cherche sur le réseau wifi du logement les messages du téléphone à destination de la box.&lt;br /&gt;
* Le radar crée son propore réseau wifi, et l'application sur le téléphone force ce dernier à se connecter au réseau nouvellement créé.&lt;br /&gt;
&lt;br /&gt;
L'application sera développée exclusivement pour un support Android.&lt;br /&gt;
&lt;br /&gt;
==Étapes du projet==&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
&lt;br /&gt;
===Séance 1===&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P6_IOT_2018&amp;diff=49225</id>
		<title>P6 IOT 2018</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P6_IOT_2018&amp;diff=49225"/>
				<updated>2019-01-07T17:33:46Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : /* Choix techniques */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
&lt;br /&gt;
===Présentation générale du projet===&lt;br /&gt;
&lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
L'objectif du projet est de concevoir un système connecté permettant la localisation d'objets importants pour une personne malvoyante ne pouvant pas facilement les rechercher.&lt;br /&gt;
&lt;br /&gt;
Ce système doit être simple d'utilisation et adapté.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
Le système se décompose en 3 parties :&lt;br /&gt;
* une station de base&lt;br /&gt;
* une aide mobile/un radar&lt;br /&gt;
* l'objet à retrouver&lt;br /&gt;
&lt;br /&gt;
La station de base et l'objet, pour commencer un téléphone, doivent être connectés au même réseau WiFi.&lt;br /&gt;
&lt;br /&gt;
La station de base, suite à une action mécanique, envoie un message à l'objet pour lui indiquer d'émettre un son pour la personne et un signal pour le radar.&lt;br /&gt;
&lt;br /&gt;
Le radar capte le signal du téléphone et permet de donner des informations sur la localisation de l'objet.&lt;br /&gt;
&lt;br /&gt;
Le téléphone cessera d'émettre suite à une action mécanique sur la Station de base seulement si le radar est replacé sur la Station.&lt;br /&gt;
&lt;br /&gt;
====Choix techniques====&lt;br /&gt;
La station de base sera composée d'un Raspberry Pi et d'un actionneur (gros bouton rouge). Le raspberry aura un module WiFi afin de se connecter à la box du logement.&lt;br /&gt;
&lt;br /&gt;
Le radar sera composé d'un rapsberry, d'une batterie et d'un ou plusieurs vibreurs.&lt;br /&gt;
&lt;br /&gt;
L'objet à retrouver (le téléphone) doit pouvoir faire fonctionner une application mobile et comporter une sortie audio.&lt;br /&gt;
&lt;br /&gt;
Toutes les communications se feront via le Wifi.&lt;br /&gt;
&lt;br /&gt;
La localisation du téléphone sera faite de plusieurs façons simultanées : &lt;br /&gt;
* Signal sonore pour la personne&lt;br /&gt;
* Message Wifi pour le radar&lt;br /&gt;
&lt;br /&gt;
Le radar pourrait déterminer la position du téléphone de plusieurs manières :&lt;br /&gt;
* Localisation par puissance du signal reçu, style jeu &amp;quot;Chaud/Froid&amp;quot;&lt;br /&gt;
* Localisation par trilatéralisation&lt;br /&gt;
&lt;br /&gt;
Les échanges entre le radar et le téléphone peuvent être faits de plusieurs manières :&lt;br /&gt;
* Le radar écoute toutes les communications wifi et cherche sur le réseau wifi du logement les messages du téléphone à destination de la box.&lt;br /&gt;
* Le radar crée son propore réseau wifi, et l'application sur le téléphone force ce dernier à se connecter au réseau nouvellement créé.&lt;br /&gt;
&lt;br /&gt;
L'application sera développée exclusivement pour un support Android.&lt;br /&gt;
&lt;br /&gt;
==Étapes du projet==&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
&lt;br /&gt;
===Séance 1===&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P6_IOT_2018&amp;diff=49212</id>
		<title>P6 IOT 2018</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P6_IOT_2018&amp;diff=49212"/>
				<updated>2019-01-07T17:14:05Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : /* Description du projet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
&lt;br /&gt;
===Présentation générale du projet===&lt;br /&gt;
&lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
L'objectif du projet est de concevoir un système connecté permettant la localisation d'objets importants pour une personne malvoyante ne pouvant pas facilement les rechercher.&lt;br /&gt;
&lt;br /&gt;
Ce système doit être simple d'utilisation et adapté.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
Le système se décompose en 3 parties :&lt;br /&gt;
* une station de base&lt;br /&gt;
* une aide mobile/un radar&lt;br /&gt;
* l'objet à retrouver&lt;br /&gt;
&lt;br /&gt;
La station de base et l'objet, pour commencer un téléphone, doivent être connectés au même réseau WiFi.&lt;br /&gt;
&lt;br /&gt;
La station de base, suite à une action mécanique, envoie un message à l'objet pour lui indiquer d'émettre un son pour la personne et un signal pour le radar.&lt;br /&gt;
&lt;br /&gt;
Le radar capte le signal du téléphone et permet de donner des informations sur la localisation de l'objet.&lt;br /&gt;
&lt;br /&gt;
Le téléphone cessera d'émettre suite à une action mécanique sur la Station de base seulement si le radar est replacé sur la Station.&lt;br /&gt;
&lt;br /&gt;
====Choix techniques====&lt;br /&gt;
&lt;br /&gt;
==Étapes du projet==&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
&lt;br /&gt;
===Séance 1===&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P6_IOT_2018&amp;diff=49208</id>
		<title>P6 IOT 2018</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P6_IOT_2018&amp;diff=49208"/>
				<updated>2019-01-07T16:52:31Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : /* Objectif du projet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
&lt;br /&gt;
===Présentation générale du projet===&lt;br /&gt;
&lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
L'objectif du projet est de concevoir un système connecté permettant la localisation d'objets importants pour une personne malvoyante ne pouvant pas facilement les rechercher.&lt;br /&gt;
&lt;br /&gt;
Ce système doit être simple d'utilisation et adapté.&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
&lt;br /&gt;
====Choix techniques====&lt;br /&gt;
&lt;br /&gt;
==Étapes du projet==&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
&lt;br /&gt;
===Séance 1===&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P6_IOT_2018&amp;diff=49207</id>
		<title>P6 IOT 2018</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P6_IOT_2018&amp;diff=49207"/>
				<updated>2019-01-07T16:43:33Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : Page créée avec « ==Cahier des charges==  ===Présentation générale du projet===  ====Contexte====  ====Objectif du projet====  ====Description du projet====  ====Choix techniques====  ==... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
&lt;br /&gt;
===Présentation générale du projet===&lt;br /&gt;
&lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
&lt;br /&gt;
====Choix techniques====&lt;br /&gt;
&lt;br /&gt;
==Étapes du projet==&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
&lt;br /&gt;
===Séance 1===&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Option_Internet_des_objets_2018/2019&amp;diff=49206</id>
		<title>Option Internet des objets 2018/2019</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Option_Internet_des_objets_2018/2019&amp;diff=49206"/>
				<updated>2019-01-07T16:41:37Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Répartition des binômes =&lt;br /&gt;
&lt;br /&gt;
Ecrivez vos noms sous le format exact &amp;quot;Prénom Nom&amp;quot;, séparez vos noms par des virgules. Modifiez aussi l'intitulé de votre projet.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Projet !! Elèves&lt;br /&gt;
|-&lt;br /&gt;
| [[Poubelle connectée]] || Raphael Morin, Brahim Ahammou&lt;br /&gt;
|-&lt;br /&gt;
| [[Cadenas connecté|Cadenas connecté]] || Tony Jongmanee, Walid Ziyate&lt;br /&gt;
|-&lt;br /&gt;
| [[P3_IOT_2018|Rideau connecté]] || Lijie YAO, Ji YANG&lt;br /&gt;
|-&lt;br /&gt;
| [[P4_IOT_2018|Timer connecté]] || Naif Mehanna, Maxime Créteur, Amine El Messaoudi&lt;br /&gt;
|-&lt;br /&gt;
| [[P5_IOT_2018| Noeud papillon connecté]] || Moustafa THIAM, Nicolas HAVARD&lt;br /&gt;
|-&lt;br /&gt;
| [[P6_IOT_2018|Localisation pour Malvoyant ]] || Quentin Hochart, Baptiste Cartier&lt;br /&gt;
|-&lt;br /&gt;
| [[P7_IOT_2018|Sujet 7]] || Prénom Nom, Prénom Nom&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=TP_sysres_IMA5sc_2018/2019_G1&amp;diff=49056</id>
		<title>TP sysres IMA5sc 2018/2019 G1</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=TP_sysres_IMA5sc_2018/2019_G1&amp;diff=49056"/>
				<updated>2018-12-20T14:30:39Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : /* Cassage de mot de passe WPA-PSK par force brute */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Séance 1==&lt;br /&gt;
&lt;br /&gt;
===Creation conteneur Unshare===&lt;br /&gt;
&lt;br /&gt;
 export proxy ...&lt;br /&gt;
 dd if=/dev/zero of= bs=1024k count=10240&lt;br /&gt;
 mkfs Partition&lt;br /&gt;
 umount Partition&lt;br /&gt;
 mount Partition /tmp/pointd'acancrage&lt;br /&gt;
 debootstrap stable --include=vim,apache2&lt;br /&gt;
&lt;br /&gt;
 unshare -p -f -m -u -n chroot /tmp/fs[1-3] /bin/sh -c &amp;quot;mount /proc ; /bin/bash&amp;quot; ; &lt;br /&gt;
&lt;br /&gt;
===Configuration switch virtuelle===&lt;br /&gt;
&lt;br /&gt;
Création de deux interfaces liées :&lt;br /&gt;
&lt;br /&gt;
 ip link add vif1 type veth peer name eth0@vif1&lt;br /&gt;
 ip link add vif2 type veth peer name eth0@vif2&lt;br /&gt;
 ip link add vif3 type veth peer name eth0@vif3&lt;br /&gt;
 ip link add vif4 type veth peer name eth1@vif4&lt;br /&gt;
&lt;br /&gt;
Déplacement du pair dans un espace réseau différent :&lt;br /&gt;
&lt;br /&gt;
 ip link set eth0@vif1 netns /proc/14601/ns/net name eth0&lt;br /&gt;
 ip link set eth0@vif2 netns /proc/14612/ns/net name eth0&lt;br /&gt;
 ip link set eth0@vif3 netns /proc/14620/ns/net name eth0&lt;br /&gt;
 ip link set eth1@vif4 netns /proc/14620/ns/net name eth1&lt;br /&gt;
&lt;br /&gt;
Configuration réseau dans l’espace alternatif :&lt;br /&gt;
&lt;br /&gt;
 nsenter -t 14601 -n ip address add dev eth0 192.168.0.101/24&lt;br /&gt;
 nsenter -t 14620 -n ip address add dev eth1 172.26.145.243/24&lt;br /&gt;
 nsenter -t 14612 -n ip address add dev eth0 192.168.0.102/24&lt;br /&gt;
 nsenter -t 14620 -n ip address add dev eth0 192.168.0.103/24&lt;br /&gt;
&lt;br /&gt;
Routage sur routeur depuis Proxy Inverse:&lt;br /&gt;
&lt;br /&gt;
 ip route add default via 172.26.145.254 dev eth1&lt;br /&gt;
&lt;br /&gt;
brctl show:&lt;br /&gt;
&lt;br /&gt;
 bridge name	bridge id		STP enabled	interfaces&lt;br /&gt;
 br-50de43cf6b72		8000.024270463a85	no		&lt;br /&gt;
 br-9964383bb7d2		8000.0242c526b998	no		&lt;br /&gt;
 bridge		8000.00224d7af070	no		eth0 eth1 vif4&lt;br /&gt;
 docker0		8000.0242e82e829c	no	veth5fcd2d1&lt;br /&gt;
 vSwitchBanane		8000.3299e99137df	no	vif1 vif2 vif3&lt;br /&gt;
&lt;br /&gt;
Activation:&lt;br /&gt;
&lt;br /&gt;
 ip link set vif1,2,3,4 up&lt;br /&gt;
 ip link set vSwtichBanane up&lt;br /&gt;
 ip link set vif4 master bridge&lt;br /&gt;
&lt;br /&gt;
Flush docker:&lt;br /&gt;
&lt;br /&gt;
 iptables -F&lt;br /&gt;
 iptables -F -t nat&lt;br /&gt;
 iptables -P FORWARD ACCEPT&lt;br /&gt;
 &lt;br /&gt;
Ping reverse proxy vers conteneur2:&lt;br /&gt;
&lt;br /&gt;
 root@zabeth08:/# ping 192.168.0.102&lt;br /&gt;
 PING 192.168.0.102 (192.168.0.102) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from 192.168.0.102: icmp_seq=19 ttl=64 time=1024 ms&lt;br /&gt;
 64 bytes from 192.168.0.102: icmp_seq=20 ttl=64 time=0.110 ms&lt;br /&gt;
 64 bytes from 192.168.0.102: icmp_seq=21 ttl=64 time=0.056 ms&lt;br /&gt;
&lt;br /&gt;
===Config Reverse Proxy===&lt;br /&gt;
&lt;br /&gt;
Import proxy &amp;amp; http_proxy libraries:&lt;br /&gt;
&lt;br /&gt;
 a2nmod proxy_http proxy&lt;br /&gt;
&lt;br /&gt;
Dans site-available/000-config.conf:&lt;br /&gt;
&lt;br /&gt;
 ProxyPass /site1 http://192.168.0.101/&lt;br /&gt;
 ProxyPassReverse /site1 http://192.168.0.101/&lt;br /&gt;
 ProxyPass /site2 http://192.168.0.102/&lt;br /&gt;
 ProxyPassReverse /site2 http://192.168.0.102/&lt;br /&gt;
 ProxyRequests Off&lt;br /&gt;
&lt;br /&gt;
DNS A Record sur gandi.net:&lt;br /&gt;
&lt;br /&gt;
 Domain &amp;gt; DNS Record &amp;gt; Type A - Name DC - TTL 1800 - Adress 172.26.145.243&lt;br /&gt;
&lt;br /&gt;
10H15 =&amp;gt; Serveurs Web OK&lt;br /&gt;
&lt;br /&gt;
===Installation et configuration Docker===&lt;br /&gt;
&lt;br /&gt;
 docker create -t -i debian bash&lt;br /&gt;
 docker run -i --network=reseau_docker -t reverse-proxy:version1&lt;br /&gt;
 docker commit 85b84891f0ac reverse-proxy:version1&lt;br /&gt;
 docker run -p 80:80 -i --network=reseau_docker -t reverse-proxy:version1 -&amp;gt; reverse proxy&lt;br /&gt;
&lt;br /&gt;
10h20 Serveurs Web (docker) OK&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 2==&lt;br /&gt;
&lt;br /&gt;
===Configuration des bornes Wifi=== &lt;br /&gt;
&lt;br /&gt;
====Tests sur des AP non sécurisés====&lt;br /&gt;
&lt;br /&gt;
On commence dans un premier temps par mettre un point d'accès non sécurisé pour tester la mise en place de plusieurs AP simultanément:&lt;br /&gt;
&lt;br /&gt;
Création d'un AP de SSID '''test1''':&lt;br /&gt;
&lt;br /&gt;
 Enable&lt;br /&gt;
 Conf t&lt;br /&gt;
 Dot11 ssid test1&lt;br /&gt;
 Vlan 10&lt;br /&gt;
 Authentication open&lt;br /&gt;
 Mbssid Guest-mode&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
Création d'un AP de SSID '''test2''':&lt;br /&gt;
&lt;br /&gt;
 Enable&lt;br /&gt;
 Conf t&lt;br /&gt;
 Dot11 ssid test2&lt;br /&gt;
 Vlan 20&lt;br /&gt;
 Authentication open&lt;br /&gt;
 Mbssid Guest-mode&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
On relie les SSID à l'interface wifi '''dot11Radio0''':&lt;br /&gt;
&lt;br /&gt;
 Enable&lt;br /&gt;
 Conf t&lt;br /&gt;
 int dot11radio0&lt;br /&gt;
 Mbssid          // permet d'avoir plusieur SSID en guest-mode&lt;br /&gt;
 ssid test1&lt;br /&gt;
 ssid test2&lt;br /&gt;
&lt;br /&gt;
Encapsulation des vlans dans l'interface '''dot11radio0''': &lt;br /&gt;
&lt;br /&gt;
 Enable&lt;br /&gt;
 Conf t&lt;br /&gt;
 int dot11radio0.10&lt;br /&gt;
 encapsulation dot1Q 10&lt;br /&gt;
&lt;br /&gt;
 Enable&lt;br /&gt;
 Conf t&lt;br /&gt;
 int dot11radio0.20&lt;br /&gt;
 encapsulation dot1Q 20&lt;br /&gt;
&lt;br /&gt;
====Sécurisation des AP en WPA2-EAP====&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé durant cette séance à tester la sécurisation des AP en WPA2-EAP&lt;br /&gt;
&lt;br /&gt;
 Enable&lt;br /&gt;
 Conf t&lt;br /&gt;
 dot11 ssid &amp;lt;nom_ssid&amp;gt;&lt;br /&gt;
 authentication network-eap eap_methods&lt;br /&gt;
 authentication key-management wpa&lt;br /&gt;
&lt;br /&gt;
 Enable&lt;br /&gt;
 Conf t&lt;br /&gt;
 int dot11radio0&lt;br /&gt;
 encryption vlan 10 mode ciphers tkip&lt;br /&gt;
 encryption vlan 20 mode ciphers tkip&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Création VM===&lt;br /&gt;
&lt;br /&gt;
Creation Vm:&lt;br /&gt;
&lt;br /&gt;
 xen-create-image --hostname=thot \&lt;br /&gt;
   --memory=256mb \&lt;br /&gt;
   --vcpus=1 \&lt;br /&gt;
   --dir=/usr/local/xen \&lt;br /&gt;
   --ip=193.48.57.177 \&lt;br /&gt;
   --netmask=255.255.255.240 \&lt;br /&gt;
   --dist=stable \&lt;br /&gt;
   --size=10Gb \&lt;br /&gt;
   --swap=128mb &lt;br /&gt;
&lt;br /&gt;
 ps: 7Jb7J8tqfRrPGe6S2RHJJb4&lt;br /&gt;
&lt;br /&gt;
==Séance 3==&lt;br /&gt;
&lt;br /&gt;
===Mise en place d'un serveur freeradius===&lt;br /&gt;
&lt;br /&gt;
'''Installation:'''&lt;br /&gt;
&lt;br /&gt;
  apt-get install freeradius&lt;br /&gt;
&lt;br /&gt;
'''Configuration:'''&lt;br /&gt;
&lt;br /&gt;
Création d'un utilisateur thot:glopglop&lt;br /&gt;
&lt;br /&gt;
 # Dans le fichier /etc/freeradius/3.0/users:&lt;br /&gt;
 thot Cleartext-Password := &amp;quot;glopglop&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Configuration de freeradius PEAP-MSCHAPv2:&lt;br /&gt;
&lt;br /&gt;
 # fichier /etc/freeradius/3.0/mods-enabled/eap.conf:&lt;br /&gt;
 default_eap_type = peap&lt;br /&gt;
&lt;br /&gt;
 # fichier /etc/freeradius/mods-enabled/mschap&lt;br /&gt;
 use_mppe = yes&lt;br /&gt;
 require_encryption = yes&lt;br /&gt;
 require_strong = yes&lt;br /&gt;
 with_ntdomain_hack = yes&lt;br /&gt;
&lt;br /&gt;
On recharge les librairies grâce à la commande suivante:&lt;br /&gt;
&lt;br /&gt;
 ldconfig &lt;br /&gt;
&lt;br /&gt;
On configure la borne WiFi pour lui donner une adresse IP ainsi qu'une route par défaut:&lt;br /&gt;
&lt;br /&gt;
 enable&lt;br /&gt;
 conf t&lt;br /&gt;
 int bvi1&lt;br /&gt;
 ip address 192.168.0.10 255.255.255.0&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
 enable&lt;br /&gt;
 conf t&lt;br /&gt;
 ip default-gateway 192.168.0.254&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
On ajoute le client, c'est à dire le point d'accès, dans le fichier clients de freeradius:&lt;br /&gt;
&lt;br /&gt;
 client 192.168.0.10/32 &lt;br /&gt;
 {&lt;br /&gt;
    secret = secretIMA5SC&lt;br /&gt;
    shortname = borneDivinite&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Sécurisation Wifi par WPA2-EAP===&lt;br /&gt;
&lt;br /&gt;
On poursuit ensuite la mise en places des AP en configurant reliant la borne pour qu'elle puisse envoyer des requêtes au serveur freeradius de chaque binomes lors d'une authentification:&lt;br /&gt;
&lt;br /&gt;
'''Les méthodes suivantes sont données à titre d'exemple pour la VM thot et devront être reproduite pour chaque AP:'''&lt;br /&gt;
&lt;br /&gt;
Activation de la fonction 'aaa' et Création des entitées radius_goup (donnant des infos sur le serveur freeradius) et eap_group (liste contenant les méthodes d'authentification, ici eap) pour chaque binômes: &lt;br /&gt;
&lt;br /&gt;
 enable&lt;br /&gt;
 conf t&lt;br /&gt;
 aaa new-model&lt;br /&gt;
 aaa authentication login eap_group11 group radius_group11&lt;br /&gt;
 aaa group server radius radius_group11&lt;br /&gt;
 server 193.48.57.177 auth-port 1812 acct-port 1813&lt;br /&gt;
 radius-server host 193.48.57.177 auth-port 1812 acct-port 1813 key secretIMA5SC&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
Mise en place du ssid 'thot' et intégration dans la vlan 11:&lt;br /&gt;
&lt;br /&gt;
 enable&lt;br /&gt;
 conf t&lt;br /&gt;
 dot11 ssid Thot&lt;br /&gt;
 vlan 11&lt;br /&gt;
 authentication open eap eap_group11&lt;br /&gt;
 authentication network-eap eap_group11&lt;br /&gt;
 authentication key-management wpa&lt;br /&gt;
 Mbssid Guest-mode&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
Liaison interface wifi dot11radio0 avec la vlan et méthode encryption:&lt;br /&gt;
&lt;br /&gt;
 Enable&lt;br /&gt;
 Conf t&lt;br /&gt;
 int dot11radio0&lt;br /&gt;
 Mbssid&lt;br /&gt;
 ssid Thot&lt;br /&gt;
 encryption vlan 11 mode ciphers aes-ccm tkip&lt;br /&gt;
&lt;br /&gt;
Encapsulation:&lt;br /&gt;
&lt;br /&gt;
 Enable&lt;br /&gt;
 Conf t&lt;br /&gt;
 int dot11radio0.11&lt;br /&gt;
 encapsulation dot1Q 11&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
===Configuration du serveur DNS sur notre VM===&lt;br /&gt;
&lt;br /&gt;
====Configuration de Bind9====&lt;br /&gt;
&lt;br /&gt;
Nous avons installé les paquets &amp;lt;code&amp;gt;bind9&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;apache2&amp;lt;/code&amp;gt;c afin de mettre en place notre serveur DNS et notre serveur web. Nous avons ensuite modifié la page &amp;lt;code&amp;gt;index.html&amp;lt;/code&amp;gt; situé dans le répertoire&lt;br /&gt;
 /var/www/html/&lt;br /&gt;
avec un extrait de la page Wikipedia à propos du dieu Thot.&lt;br /&gt;
&lt;br /&gt;
Nous avons acheté le nom de domaine &amp;lt;code&amp;gt;thotplil.space&amp;lt;/code&amp;gt; sur le site &amp;lt;code&amp;gt;gandi.net&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite configuré &amp;lt;code&amp;gt;bind&amp;lt;/code&amp;gt; en créant le fichier &amp;lt;code&amp;gt;db.thotplil.space&amp;lt;/code&amp;gt; dans le dossier &amp;lt;code&amp;gt;/etc/bind/&amp;lt;/code&amp;gt;  &lt;br /&gt;
 @	IN      SOA     ns.thotplil.space. root.thotplil.space (&lt;br /&gt;
                         2           ; Serial&lt;br /&gt;
                         604800      ; Refresh&lt;br /&gt;
                         86400       ; Retry&lt;br /&gt;
                         2419200     ; Expire&lt;br /&gt;
                         604800 )    ; Negative Cache TTL&lt;br /&gt;
 ;&lt;br /&gt;
 &lt;br /&gt;
         IN      NS      ns.thotplil.space.&lt;br /&gt;
 	IN	NS	ns6.gandi.net. &lt;br /&gt;
 @	IN	A	193.48.57.177 &lt;br /&gt;
 ns      IN      A       193.48.57.177&lt;br /&gt;
 www     IN      A       193.48.57.177&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons spécifié la zone dans le fichier &amp;lt;code&amp;gt;named.conf.local&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 zone &amp;quot;thotplil.space&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.thotplil.space&amp;quot;;&lt;br /&gt;
        allow-transfer {217.70.177.40;};&lt;br /&gt;
        notify no;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
====Configuration Gandi.net====&lt;br /&gt;
&lt;br /&gt;
Nous sommes allez sur &amp;lt;code&amp;gt;gandi.net --&amp;gt; Domains --&amp;gt; Glue Record&amp;lt;/code&amp;gt; pour y ajouter notre espace de nom (namespace) &amp;lt;code&amp;gt;thotplil.space&amp;lt;/code&amp;gt; et notre IP.&lt;br /&gt;
&lt;br /&gt;
Nous avons ajouté sur gandi notre DNS principal et notre DNS secondaire dans &amp;lt;code&amp;gt;gandi.net --&amp;gt; Domains --&amp;gt; Nameservers&amp;lt;/code&amp;gt; avec :&lt;br /&gt;
*DNS1 : ns.thotplil.space&lt;br /&gt;
*DNS2 : ns6.gandi.net&lt;br /&gt;
&lt;br /&gt;
====Sécurisation de notre serveur web par certificat SSL====&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par générer un certificate request grâce à la commande suivante: &lt;br /&gt;
&lt;br /&gt;
 openssl req -nodes -newkey rsa:2048 -sha1 -keyout thotplil.space.key -out thotplil.space.csr&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite acheté sur gandi.net un certificat SSL en indiquant le code généré et placé le fichier obtenu dans le répertoire suivant: &amp;lt;code&amp;gt;/var/www/html/.well-known/pki-validation&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Le certificat ainsi que le fichier .pem sont ensuite téléchargé et placé dans le répertoire suivant: &amp;lt;code&amp;gt;/etc/ssl/certs&amp;lt;/code&amp;gt;.&lt;br /&gt;
Le fichier .key précédemment généré se place quant à lui dans le répertoire &amp;lt;code&amp;gt;/etc/ssl/private&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On créer un fichier de configuration &amp;lt;code&amp;gt;/etc/apache2/sites-available/000-thotplil.space-ssl.conf&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;VirtualHost 193.48.57.177:443&amp;gt;&lt;br /&gt;
       ServerName www.thotplil.space&lt;br /&gt;
       ServerAlias thotplil.space&lt;br /&gt;
       DocumentRoot /var/www/html/&lt;br /&gt;
       CustomLog /var/log/apache2/secure_acces.log combined&lt;br /&gt;
       SSLEngine on&lt;br /&gt;
       SSLCertificateFile /etc/ssl/certs/thotplil.space.crt&lt;br /&gt;
       SSLCertificateKeyFile /etc/ssl/private/thotplil.space.key&lt;br /&gt;
       SSLCertificateChainFile /etc/ssl/certs/GandiStandardSSLCA2.pem&lt;br /&gt;
       SSLVerifyClient None&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;VirtualHost 193.48.57.182:80&amp;gt;&lt;br /&gt;
       ServerName www.thotplil.space&lt;br /&gt;
       ServerAlias thotplil.space&lt;br /&gt;
       Redirect / https://thotplil.space&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On active la configuration du site:&lt;br /&gt;
&lt;br /&gt;
 a2enmod ssl &lt;br /&gt;
 a2ensite 000-thotplil.space-ssl.conf &lt;br /&gt;
 service apache2 restart&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Connexion au site en https:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Https.png]]&lt;br /&gt;
&lt;br /&gt;
====Mise en place du DNSSEC====&lt;br /&gt;
&lt;br /&gt;
Modification dans le fichier &amp;lt;code&amp;gt;named.conf.options&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 dnssec-validation auto;&lt;br /&gt;
 dnssec-enable yes;&lt;br /&gt;
&lt;br /&gt;
On génère ensuite deux paires de clés ZSK et KSK:&lt;br /&gt;
&lt;br /&gt;
 dnssec-keygen -a RSASHA1 -b 2048 -f KSK -n ZONE thotplil.space&lt;br /&gt;
 dnssec-keygen -a RSASHA1 -b 1024 -n ZONE thotplil.space&lt;br /&gt;
&lt;br /&gt;
On inclut ensuite les clés dans le fichier &amp;lt;code&amp;gt;/etc/bind/db.thotplil.space&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 $include /etc/bind/thotplil.space.dnssec/thotplil.space-ksk.key&lt;br /&gt;
 $include /etc/bind/thotplil.space.dnssec/thotplil.space-zsk.key&lt;br /&gt;
&lt;br /&gt;
On prend soin de mettre &amp;lt;code&amp;gt;$TTL 604800&amp;lt;/code&amp;gt; au début du fichier.&lt;br /&gt;
&lt;br /&gt;
On signe enfin la zone avec les clés ZSK et KSK:&lt;br /&gt;
&lt;br /&gt;
 dnssec-signzone -o thotplil.space -k thotplil.space-ksk ../db.thotplil.space thot.space-zsk&lt;br /&gt;
&lt;br /&gt;
On renseigne ensuite les clés signé sur gandi.net -&amp;gt; Domains -&amp;gt; thotplil.space -&amp;gt; DNSSEC&lt;br /&gt;
&lt;br /&gt;
===Tests d’intrusion===&lt;br /&gt;
&lt;br /&gt;
Dans cette section nous allons tester différentes méthodes de sécurisations&lt;br /&gt;
&lt;br /&gt;
====Cassage de mot de passe WPA-PSK par force brute====&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé les outils du paquetage '''aircrack-ng''' pour capturer des paquets d'identifications.&lt;br /&gt;
&lt;br /&gt;
Notre point d'accès est '''cracotte01'''. &lt;br /&gt;
&lt;br /&gt;
Il faut tout d'abord mettre la carte réseau wifi de notre machine de travail en mode écoute, cela est fait grâce à la commande :&lt;br /&gt;
 airmon-ng start wlp2s0&lt;br /&gt;
avec wlp2s0 le nom de l'interface réseau wifi de notre machine.&lt;br /&gt;
&lt;br /&gt;
Cela &amp;quot;supprime&amp;quot; notre interface wlp2s0 et en créé une autre nommé wlp2s0mon.&lt;br /&gt;
&lt;br /&gt;
En utilisant la commande&lt;br /&gt;
 airodump-ng wlp2s0mon&lt;br /&gt;
&lt;br /&gt;
on trouve l'adresse MAC de notre point d'accès cracotte01 :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;importimage&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On capture ensuite les paquets de handshake voulu grâce à la commande&lt;br /&gt;
 airodump-ng wlp2s0mon --channel 9 --bssid 04:DA:D:9C:50:50 --write capture&lt;br /&gt;
&lt;br /&gt;
Une fois le paquet capturé, on peut attaquer grâce à un simple brute force par dictionnaire.&lt;br /&gt;
&lt;br /&gt;
On suppose que la clé est composé de 8 chiffres, on créé donc un document dico.txt contenant toutes les combinaisons de 8 chiffres possibles.&lt;br /&gt;
&lt;br /&gt;
On lance ensuite la commande&lt;br /&gt;
 aircrack-ng capture.cap -w dico.txt&lt;br /&gt;
&lt;br /&gt;
On obtient finalement le résultat suivant:&lt;br /&gt;
&lt;br /&gt;
 Time left: 2 hours, 5 minutes, 55 seconds                 41.28%&lt;br /&gt;
 &lt;br /&gt;
                           KEY FOUND! [ 42429901 ]&lt;br /&gt;
                                   &lt;br /&gt;
 &lt;br /&gt;
      Master Key     : 11 6A 5E CD 2B 05 7B 1E 5A 3D A0 35 83 6E 25 28 &lt;br /&gt;
                       00 82 6D 3D 4F E7 13 ED 90 67 1C ED 8D 49 EC 6B &lt;br /&gt;
 &lt;br /&gt;
      Transient Key  : B6 52 3A 23 86 D0 32 90 BD 95 E4 E8 ED B6 0F 3C &lt;br /&gt;
                       D7 7A 7D 3A D9 07 AB 0F BE 97 59 F3 81 9E B9 E8 &lt;br /&gt;
                       0F 5D 8B 27 1B DA 39 FC E9 2F 82 B2 61 D3 C2 CE &lt;br /&gt;
                       85 02 D9 25 3C E1 BB 7A 58 18 7E 26 EC F3 25 F5 &lt;br /&gt;
 &lt;br /&gt;
      EAPOL HMAC     : 38 E3 C5 40 0F 0F 52 23 BD 8D 12 A8 32 3E 14 B7&lt;br /&gt;
&lt;br /&gt;
===Cassage de mot de passe WEP===&lt;br /&gt;
&lt;br /&gt;
Le cassage de clé WEP s'effectue d'une manière similaire.&lt;br /&gt;
On capture les paquets grâce à la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 sudo airodump-ng --bssid 04:DA:D2:9C:50:50 --ch 12 --write wepcassage wlp2s0mon&lt;br /&gt;
&lt;br /&gt;
On simule des paquets d'authentifications avec la commandes&lt;br /&gt;
&lt;br /&gt;
 sudo aireplay-ng --fakeauth 30 -a 04:DA:D2:9C:50:50 wlp2s0mon&lt;br /&gt;
&lt;br /&gt;
On vérifie que l'on areçu des données avec&lt;br /&gt;
&lt;br /&gt;
 sudo aireplay-ng --fragment -b 04:DA:D2:9C:50:50 -r wepcassage-04.cap wlp2s0mon&lt;br /&gt;
&lt;br /&gt;
Si des données on été capturés, on peut casser la clé très rapidement avec&lt;br /&gt;
&lt;br /&gt;
 sudo aircrack-ng wepcassage-04.cap &lt;br /&gt;
&lt;br /&gt;
On obtient le résulat suivant :&lt;br /&gt;
&lt;br /&gt;
                            [00:00:00] Tested 577 keys (got 40557 IVs)&lt;br /&gt;
 &lt;br /&gt;
    KB    depth   byte(vote)&lt;br /&gt;
     0    1/  2   3F(50944) BF(48128) 2F(47360) DB(47104) 22(46848) 74(46848) 99(46848) &lt;br /&gt;
     1    8/  1   09(46336) 2F(46080) 36(45824) 5C(45824) BC(45824) 2D(45056) 5D(45056) &lt;br /&gt;
     2    3/  2   DD(48128) 03(46592) 2A(46336) 7E(46336) 34(45824) 68(45824) 0E(45568) &lt;br /&gt;
     3    1/  4   C2(49408) 62(47616) 96(47616) A7(47360) 4C(47104) FD(46592) 40(46336) &lt;br /&gt;
     4    2/  7   87(48128) 8E(47872) 9D(47872) AB(47872) 88(47616) 7F(47360) 15(47104)  &lt;br /&gt;
 &lt;br /&gt;
              KEY FOUND! [ EE:EE:EE:EE:EE:EE:EE:EE:E4:44:44:44:44 ] &lt;br /&gt;
 	Decrypted correctly: 100%&lt;br /&gt;
&lt;br /&gt;
==Séance 4==&lt;br /&gt;
&lt;br /&gt;
===Création des partitions virtuelles===&lt;br /&gt;
&lt;br /&gt;
On commence par créer des partitions virtuelles pour les fichier /home et /var sur cordouan:&lt;br /&gt;
&lt;br /&gt;
 lvcreate -L10G -n thot-home virtual&lt;br /&gt;
 lvcreate -L10G -n thot-var virtual&lt;br /&gt;
&lt;br /&gt;
On créé ensuite les partitions pour le RAID5&lt;br /&gt;
&lt;br /&gt;
 lvcreate -L10G -n thot-part1 virtual&lt;br /&gt;
 lvcreate -L10G -n thot-part2 virtual&lt;br /&gt;
 lvcreate -L10G -n thot-part3 virtual&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On modifie ensuite le fichier de configuration de la VM:&lt;br /&gt;
&lt;br /&gt;
 disk        = [&lt;br /&gt;
                   'file:/usr/local/xen/domains/thot/disk.img,xvda2,w',&lt;br /&gt;
                   'file:/usr/local/xen/domains/thot/swap.img,xvda1,w',&lt;br /&gt;
  		  'phy:/dev/virtual/thot-home,xvdb1,w',&lt;br /&gt;
  		  'phy:/dev/virtual/thot-var,xvdc1,w',&lt;br /&gt;
 		  'phy:/dev/virtual/thot-part1,xvdd1,w',&lt;br /&gt;
 		  'phy:/dev/virtual/thot-part2,xvde1,w',&lt;br /&gt;
 		  'phy:/dev/virtual/thot-part3,xvdf1,w'&lt;br /&gt;
              ]&lt;br /&gt;
&lt;br /&gt;
===Migration===&lt;br /&gt;
&lt;br /&gt;
On entreprend ensuite de migrer les dossier /var et /home dans les partitions nouvellement créées&lt;br /&gt;
&lt;br /&gt;
Sur la VM, on créer un système de fichier sur /dev/xvdb1 et /dev/xvdc1 &lt;br /&gt;
&lt;br /&gt;
 mkfs -t ext4 /dev/xvdb1&lt;br /&gt;
 mkfs -t ext4 /dev/xvdc1&lt;br /&gt;
&lt;br /&gt;
Dans /etc/fstab, on modifie directement le point d'ancrage du fichier /home, étant donné que ce dernier est vide:&lt;br /&gt;
&lt;br /&gt;
  /dev/xvdb1 /home ext4 defaults 0 2&lt;br /&gt;
&lt;br /&gt;
Pour migrer le var, il va être nécessaire creer un point d'ancrage temporaire:&lt;br /&gt;
&lt;br /&gt;
 mkdir /mnt_var&lt;br /&gt;
 mount /dev/xvdc1 /mnt_var&lt;br /&gt;
&lt;br /&gt;
On tranfère me contenu du dossier var dans la nouvelle partition:&lt;br /&gt;
&lt;br /&gt;
 cd /var&lt;br /&gt;
 cp -ax * /mnt_var&lt;br /&gt;
&lt;br /&gt;
On fait ensuite une backup l'ancien dossier var, et on recréer un point de montage sur la nouvelle partition:&lt;br /&gt;
&lt;br /&gt;
 mkdir /var&lt;br /&gt;
 umount /dev/xvdc1&lt;br /&gt;
 mount /dev/xvdc1 /var&lt;br /&gt;
 &lt;br /&gt;
Une fois cette étape terminé, on ajoute le nouveau point d'ancrage de /var dans /etc/fstab:&lt;br /&gt;
&lt;br /&gt;
 /dev/xvdc1 /var ext4 defaults 0 0&lt;br /&gt;
&lt;br /&gt;
Enfin, on supprime les dossier /mnt_var /var.old.&lt;br /&gt;
&lt;br /&gt;
===Mise en place du RAID===&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant mettre en place un RAID5 logiciel avec les 3 partitons /dev/xvdd1, /dev/xvde1, et /dev/xvdf1.&lt;br /&gt;
&lt;br /&gt;
On utilisera l'outil mdadm.&lt;br /&gt;
&lt;br /&gt;
Création du raid5 sur /dev/md0:&lt;br /&gt;
&lt;br /&gt;
 mdadm --create /dev/md0 --level=5 --assume-clean --raid-devices=3 /dev/xvdd1 /dev/xvde1 /dev/xvdf1&lt;br /&gt;
&lt;br /&gt;
Création d'un filesystem ans la nouvelle partition raid :&lt;br /&gt;
&lt;br /&gt;
 mkfs -t ext4 /dev/md0&lt;br /&gt;
&lt;br /&gt;
Puis on monte cette partition :&lt;br /&gt;
&lt;br /&gt;
 mkdir /mnt_raid5&lt;br /&gt;
 mount /dev/md0 /raid5&lt;br /&gt;
&lt;br /&gt;
On utilise la commande suivante pour automatiser la création de la grappe :&lt;br /&gt;
&lt;br /&gt;
 mdadm --monitor --daemonise /dev/md0&lt;br /&gt;
&lt;br /&gt;
On ajoute ensuite la ligne suivante pour automatiser l'ancrage de la partition md0 sur /raid5&lt;br /&gt;
&lt;br /&gt;
 /dev/md0 /raid5/ ext4 defaults 0 1&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=TP_sysres_IMA5sc_2018/2019_G1&amp;diff=48611</id>
		<title>TP sysres IMA5sc 2018/2019 G1</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=TP_sysres_IMA5sc_2018/2019_G1&amp;diff=48611"/>
				<updated>2018-12-11T15:33:34Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : /* Séance 3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Séance 1==&lt;br /&gt;
&lt;br /&gt;
===Creation conteneur Unshare===&lt;br /&gt;
&lt;br /&gt;
 export proxy ...&lt;br /&gt;
 dd if=/dev/zero of= bs=1024k count=10240&lt;br /&gt;
 mkfs Partition&lt;br /&gt;
 umount Partition&lt;br /&gt;
 mount Partition /tmp/pointd'acancrage&lt;br /&gt;
 debootstrap stable --include=vim,apache2&lt;br /&gt;
&lt;br /&gt;
 unshare -p -f -m -u -n chroot /tmp/fs[1-3] /bin/sh -c &amp;quot;mount /proc ; /bin/bash&amp;quot; ; &lt;br /&gt;
&lt;br /&gt;
===Configuration switch virtuelle===&lt;br /&gt;
&lt;br /&gt;
Création de deux interfaces liées :&lt;br /&gt;
&lt;br /&gt;
 ip link add vif1 type veth peer name eth0@vif1&lt;br /&gt;
 ip link add vif2 type veth peer name eth0@vif2&lt;br /&gt;
 ip link add vif3 type veth peer name eth0@vif3&lt;br /&gt;
 ip link add vif4 type veth peer name eth1@vif4&lt;br /&gt;
&lt;br /&gt;
Déplacement du pair dans un espace réseau différent :&lt;br /&gt;
&lt;br /&gt;
 ip link set eth0@vif1 netns /proc/14601/ns/net name eth0&lt;br /&gt;
 ip link set eth0@vif2 netns /proc/14612/ns/net name eth0&lt;br /&gt;
 ip link set eth0@vif3 netns /proc/14620/ns/net name eth0&lt;br /&gt;
 ip link set eth1@vif4 netns /proc/14620/ns/net name eth1&lt;br /&gt;
&lt;br /&gt;
Configuration réseau dans l’espace alternatif :&lt;br /&gt;
&lt;br /&gt;
 nsenter -t 14601 -n ip address add dev eth0 192.168.0.101/24&lt;br /&gt;
 nsenter -t 14620 -n ip address add dev eth1 172.26.145.243/24&lt;br /&gt;
 nsenter -t 14612 -n ip address add dev eth0 192.168.0.102/24&lt;br /&gt;
 nsenter -t 14620 -n ip address add dev eth0 192.168.0.103/24&lt;br /&gt;
&lt;br /&gt;
Routage sur routeur depuis Proxy Inverse:&lt;br /&gt;
&lt;br /&gt;
 ip route add default via 172.26.145.254 dev eth1&lt;br /&gt;
&lt;br /&gt;
brctl show:&lt;br /&gt;
&lt;br /&gt;
 bridge name	bridge id		STP enabled	interfaces&lt;br /&gt;
 br-50de43cf6b72		8000.024270463a85	no		&lt;br /&gt;
 br-9964383bb7d2		8000.0242c526b998	no		&lt;br /&gt;
 bridge		8000.00224d7af070	no		eth0 eth1 vif4&lt;br /&gt;
 docker0		8000.0242e82e829c	no	veth5fcd2d1&lt;br /&gt;
 vSwitchBanane		8000.3299e99137df	no	vif1 vif2 vif3&lt;br /&gt;
&lt;br /&gt;
Activation:&lt;br /&gt;
&lt;br /&gt;
 ip link set vif1,2,3,4 up&lt;br /&gt;
 ip link set vSwtichBanane up&lt;br /&gt;
 ip link set vif4 master bridge&lt;br /&gt;
&lt;br /&gt;
Flush docker:&lt;br /&gt;
&lt;br /&gt;
 iptables -F&lt;br /&gt;
 iptables -F -t nat&lt;br /&gt;
 iptables -P FORWARD ACCEPT&lt;br /&gt;
 &lt;br /&gt;
Ping reverse proxy vers conteneur2:&lt;br /&gt;
&lt;br /&gt;
 root@zabeth08:/# ping 192.168.0.102&lt;br /&gt;
 PING 192.168.0.102 (192.168.0.102) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from 192.168.0.102: icmp_seq=19 ttl=64 time=1024 ms&lt;br /&gt;
 64 bytes from 192.168.0.102: icmp_seq=20 ttl=64 time=0.110 ms&lt;br /&gt;
 64 bytes from 192.168.0.102: icmp_seq=21 ttl=64 time=0.056 ms&lt;br /&gt;
&lt;br /&gt;
===Config Reverse Proxy===&lt;br /&gt;
&lt;br /&gt;
Import proxy &amp;amp; http_proxy libraries:&lt;br /&gt;
&lt;br /&gt;
 a2nmod proxy_http proxy&lt;br /&gt;
&lt;br /&gt;
Dans site-available/000-config.conf:&lt;br /&gt;
&lt;br /&gt;
 ProxyPass /site1 http://192.168.0.101/&lt;br /&gt;
 ProxyPassReverse /site1 http://192.168.0.101/&lt;br /&gt;
 ProxyPass /site2 http://192.168.0.102/&lt;br /&gt;
 ProxyPassReverse /site2 http://192.168.0.102/&lt;br /&gt;
 ProxyRequests Off&lt;br /&gt;
&lt;br /&gt;
DNS A Record sur gandi.net:&lt;br /&gt;
&lt;br /&gt;
 Domain &amp;gt; DNS Record &amp;gt; Type A - Name DC - TTL 1800 - Adress 172.26.145.243&lt;br /&gt;
&lt;br /&gt;
10H15 =&amp;gt; Serveurs Web OK&lt;br /&gt;
&lt;br /&gt;
===Installation et configuration Docker===&lt;br /&gt;
&lt;br /&gt;
 docker create -t -i debian bash&lt;br /&gt;
 docker run -i --network=reseau_docker -t reverse-proxy:version1&lt;br /&gt;
 docker commit 85b84891f0ac reverse-proxy:version1&lt;br /&gt;
 docker run -p 80:80 -i --network=reseau_docker -t reverse-proxy:version1 -&amp;gt; reverse proxy&lt;br /&gt;
&lt;br /&gt;
10h20 Serveurs Web (docker) OK&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 2==&lt;br /&gt;
&lt;br /&gt;
===Configuration des bornes Wifi=== &lt;br /&gt;
&lt;br /&gt;
====Tests sur des AP non sécurisés====&lt;br /&gt;
&lt;br /&gt;
On commence dans un premier temps par mettre un point d'accès non sécurisé pour tester la mise en place de plusieurs AP simultanément:&lt;br /&gt;
&lt;br /&gt;
Création d'un AP de SSID '''test1''':&lt;br /&gt;
&lt;br /&gt;
 Enable&lt;br /&gt;
 Conf t&lt;br /&gt;
 Dot11 ssid test1&lt;br /&gt;
 Vlan 10&lt;br /&gt;
 Authentication open&lt;br /&gt;
 Mbssid Guest-mode&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
Création d'un AP de SSID '''test2''':&lt;br /&gt;
&lt;br /&gt;
 Enable&lt;br /&gt;
 Conf t&lt;br /&gt;
 Dot11 ssid test2&lt;br /&gt;
 Vlan 20&lt;br /&gt;
 Authentication open&lt;br /&gt;
 Mbssid Guest-mode&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
On relie les SSID à l'interface wifi '''dot11Radio0''':&lt;br /&gt;
&lt;br /&gt;
 Enable&lt;br /&gt;
 Conf t&lt;br /&gt;
 int dot11radio0&lt;br /&gt;
 Mbssid          // permet d'avoir plusieur SSID en guest-mode&lt;br /&gt;
 ssid test1&lt;br /&gt;
 ssid test2&lt;br /&gt;
&lt;br /&gt;
Encapsulation des vlans dans l'interface '''dot11radio0''': &lt;br /&gt;
&lt;br /&gt;
 Enable&lt;br /&gt;
 Conf t&lt;br /&gt;
 int dot11radio0.10&lt;br /&gt;
 encapsulation dot1Q 10&lt;br /&gt;
&lt;br /&gt;
 Enable&lt;br /&gt;
 Conf t&lt;br /&gt;
 int dot11radio0.20&lt;br /&gt;
 encapsulation dot1Q 20&lt;br /&gt;
&lt;br /&gt;
====Sécurisation des AP en WPA2-EAP====&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé durant cette séance à tester la sécurisation des AP en WPA2-EAP&lt;br /&gt;
&lt;br /&gt;
 Enable&lt;br /&gt;
 Conf t&lt;br /&gt;
 dot11 ssid &amp;lt;nom_ssid&amp;gt;&lt;br /&gt;
 authentication network-eap eap_methods&lt;br /&gt;
 authentication key-management wpa&lt;br /&gt;
&lt;br /&gt;
 Enable&lt;br /&gt;
 Conf t&lt;br /&gt;
 int dot11radio0&lt;br /&gt;
 encryption vlan 10 mode ciphers tkip&lt;br /&gt;
 encryption vlan 20 mode ciphers tkip&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Création VM===&lt;br /&gt;
&lt;br /&gt;
Creation Vm:&lt;br /&gt;
&lt;br /&gt;
 xen-create-image --hostname=thot \&lt;br /&gt;
   --memory=256mb \&lt;br /&gt;
   --vcpus=1 \&lt;br /&gt;
   --dir=/usr/local/xen \&lt;br /&gt;
   --ip=193.48.57.177 \&lt;br /&gt;
   --netmask=255.255.255.240 \&lt;br /&gt;
   --dist=stable \&lt;br /&gt;
   --size=10Gb \&lt;br /&gt;
   --swap=128mb &lt;br /&gt;
&lt;br /&gt;
 ps: 7Jb7J8tqfRrPGe6S2RHJJb4&lt;br /&gt;
&lt;br /&gt;
==Séance 3==&lt;br /&gt;
&lt;br /&gt;
===Mise en place d'un serveur freeradius===&lt;br /&gt;
&lt;br /&gt;
'''Installation:'''&lt;br /&gt;
&lt;br /&gt;
  apt-get install freeradius&lt;br /&gt;
&lt;br /&gt;
'''Configuration:'''&lt;br /&gt;
&lt;br /&gt;
Création d'un utilisateur thot:glopglop&lt;br /&gt;
&lt;br /&gt;
 # Dans le fichier /etc/freeradius/3.0/users:&lt;br /&gt;
 thot Cleartext-Password := &amp;quot;glopglop&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Configuration de freeradius PEAP-MSCHAPv2:&lt;br /&gt;
&lt;br /&gt;
 # fichier /etc/freeradius/mods-enabled/eap.conf:&lt;br /&gt;
 default_eap_type = peap&lt;br /&gt;
&lt;br /&gt;
 # fichier /etc/freeradius/mods-enabled/mschap&lt;br /&gt;
 use_mppe = yes&lt;br /&gt;
 require_encryption = yes&lt;br /&gt;
 require_strong = yes&lt;br /&gt;
 with_ntdomain_hack = yes&lt;br /&gt;
&lt;br /&gt;
On recharge les librairies grâce à la commande suivante:&lt;br /&gt;
&lt;br /&gt;
 ldconfig &lt;br /&gt;
&lt;br /&gt;
On configure la borne WiFi pour lui donner une adresse IP ainsi qu'une route par défaut:&lt;br /&gt;
&lt;br /&gt;
 enable&lt;br /&gt;
 conf t&lt;br /&gt;
 int bvi1&lt;br /&gt;
 ip address 192.168.0.10 255.255.255.0&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
 enable&lt;br /&gt;
 conf t&lt;br /&gt;
 ip default-gateway 192.168.0.254&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
On ajoute le client, c'est à dire le point d'accès, dans le fichier clients de freeradius:&lt;br /&gt;
&lt;br /&gt;
 client 192.168.0.10/32 &lt;br /&gt;
 {&lt;br /&gt;
    secret = secretIMA5SC&lt;br /&gt;
    shortname = borneDivinite&lt;br /&gt;
 } &lt;br /&gt;
&lt;br /&gt;
===Sécurisation Wifi par WPA2-EAP===&lt;br /&gt;
&lt;br /&gt;
On poursuit ensuite la mise en places des AP en configurant reliant la borne pour qu'elle puisse envoyer des requêtes au serveur freeradius de chaque binomes lors d'une authentification:&lt;br /&gt;
&lt;br /&gt;
'''Les méthodes suivantes sont données à titre d'exemple pour la VM thot et devront être reproduite pour chaque AP:'''&lt;br /&gt;
&lt;br /&gt;
Activation de la fonction 'aaa' et Création des entitées radius_goup (donnant des infos sur le serveur freeradius) et eap_group (liste contenant les méthodes d'authentification, ici eap) pour chaque binômes: &lt;br /&gt;
&lt;br /&gt;
 enable&lt;br /&gt;
 conf t&lt;br /&gt;
 aaa new-model&lt;br /&gt;
 aaa authentication login eap_group11 group radius_group11&lt;br /&gt;
 aaa group server radius radius_group11&lt;br /&gt;
 server 193.48.57.177 auth-port 1812 acct-port 1813&lt;br /&gt;
 radius-server host 193.48.57.177 auth-port 1812 acct-port 1813 key secretIMA5SC&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
Mise en place du ssid 'thot' et intégration dans la vlan 11:&lt;br /&gt;
&lt;br /&gt;
 enable&lt;br /&gt;
 conf t&lt;br /&gt;
 dot11 ssid Thot&lt;br /&gt;
 vlan 11&lt;br /&gt;
 authentication open eap eap_group11&lt;br /&gt;
 authentication network-eap eap_group11&lt;br /&gt;
 authentication key-management wpa&lt;br /&gt;
 Mbssid Guest-mode&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
Liaison interface wifi dot11radio0 avec la vlan et méthode encryption:&lt;br /&gt;
&lt;br /&gt;
 Enable&lt;br /&gt;
 Conf t&lt;br /&gt;
 int dot11radio0&lt;br /&gt;
 Mbssid&lt;br /&gt;
 ssid Thot&lt;br /&gt;
 encryption vlan 11 mode ciphers aes-ccm tkip&lt;br /&gt;
&lt;br /&gt;
Encapsulation:&lt;br /&gt;
&lt;br /&gt;
 Enable&lt;br /&gt;
 Conf t&lt;br /&gt;
 int dot11radio0.11&lt;br /&gt;
 encapsulation dot1Q 11&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
===Configuration du serveur DNS sur notre VM===&lt;br /&gt;
&lt;br /&gt;
Nous avons installé les paquets &amp;lt;code&amp;gt;bind9&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;apache2&amp;lt;/code&amp;gt;c afin de mettre en place notre serveur DNS et notre serveur web. Nous avons ensuite modifié la page &amp;lt;code&amp;gt;index.html&amp;lt;/code&amp;gt; situé dans le répertoire&lt;br /&gt;
 /var/www/html/&lt;br /&gt;
avec un extrait de la page Wikipedia à propos du dieu Thot.&lt;br /&gt;
&lt;br /&gt;
Nous avons acheté le nom de domaine &amp;lt;code&amp;gt;thotplil.space&amp;lt;/code&amp;gt; sur le site &amp;lt;code&amp;gt;gandi.net&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite configuré &amp;lt;code&amp;gt;bind&amp;lt;/code&amp;gt; en créant le fichier &amp;lt;code&amp;gt;db.thotplil.space&amp;lt;/code&amp;gt; dans le dossier &amp;lt;code&amp;gt;/etc/bind/&amp;lt;/code&amp;gt;  &lt;br /&gt;
 @	IN      SOA     ns.thotplil.space. root.thotplil.space (&lt;br /&gt;
                         2           ; Serial&lt;br /&gt;
                         604800      ; Refresh&lt;br /&gt;
                         86400       ; Retry&lt;br /&gt;
                         2419200     ; Expire&lt;br /&gt;
                         604800 )    ; Negative Cache TTL&lt;br /&gt;
 ;&lt;br /&gt;
 &lt;br /&gt;
         IN      NS      ns.thotplil.space.&lt;br /&gt;
 	IN	NS	ns6.gandi.net. &lt;br /&gt;
 @	IN	A	193.48.57.177 &lt;br /&gt;
 ns      IN      A       193.48.57.177&lt;br /&gt;
 www     IN      A       193.48.57.177&lt;br /&gt;
&lt;br /&gt;
Nous sommes allez sur &amp;lt;code&amp;gt;gandi.net --&amp;gt; Domains --&amp;gt; Glue Record&amp;lt;/code&amp;gt; pour y ajouter notre espace de nom (namespace) &amp;lt;code&amp;gt;thotplil.space&amp;lt;/code&amp;gt; et notre IP.&lt;br /&gt;
&lt;br /&gt;
Nous avons ajouté sur gandi notre DNS principal et notre DNS secondaire dans &amp;lt;code&amp;gt;gandi.net --&amp;gt; Domains --&amp;gt; Nameservers&amp;lt;/code&amp;gt; avec :&lt;br /&gt;
*DNS1 : ns.thotplil.space&lt;br /&gt;
*DNS2 : ns6.gandi.net&lt;br /&gt;
&lt;br /&gt;
===Tests d’intrusion===&lt;br /&gt;
&lt;br /&gt;
Dans cette section nous allons tester différentes méthodes de sécurisations&lt;br /&gt;
&lt;br /&gt;
====Cassage de mot de passe WPA-PSK par force brute====&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé les outils du paquetage '''aircrack-ng''' pour capturer des paquets d'identifications.&lt;br /&gt;
&lt;br /&gt;
Notre point d'accès est '''cracotte01'''. &lt;br /&gt;
&lt;br /&gt;
Il faut tout d'abord mettre la carte réseau wifi de notre machine de travail en mode écoute, cela est fait grâce à la commande :&lt;br /&gt;
 airmon-ng start wlp2s0&lt;br /&gt;
avec wlp2s0 le nom de l'interface réseau wifi de notre machine.&lt;br /&gt;
&lt;br /&gt;
Cela &amp;quot;supprime&amp;quot; notre interface wlp2s0 et en créé une autre nommé wlp2s0mon.&lt;br /&gt;
&lt;br /&gt;
En utilisant la commande&lt;br /&gt;
 airodump-ng wlp2s0mon&lt;br /&gt;
&lt;br /&gt;
on trouve l'adresse MAC de notre point d'accès cracotte01 :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;importimage&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On capture ensuite les paquets de handshake voulu grâce à la commande&lt;br /&gt;
 airodump-ng wlp2s0mon --channel 9 --bssid 04:DA:D:9C:50:50 --write capture&lt;br /&gt;
&lt;br /&gt;
Une fois le paquet capturé, on peut attaquer grâce à un simple brute force par dictionnaire.&lt;br /&gt;
&lt;br /&gt;
On suppose que la clé est composé de 8 chiffres, on créé donc un document dico.txt contenant toutes les combinaisons de 8 chiffres possibles.&lt;br /&gt;
&lt;br /&gt;
On lance ensuite la commande&lt;br /&gt;
 aircrack-ng capture.cap -w dico.txt&lt;br /&gt;
&lt;br /&gt;
Après &amp;lt;insertheure&amp;gt; de brute force, on récupère la clé suivante :&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=TP_sysres_IMA5sc_2018/2019_G1&amp;diff=48601</id>
		<title>TP sysres IMA5sc 2018/2019 G1</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=TP_sysres_IMA5sc_2018/2019_G1&amp;diff=48601"/>
				<updated>2018-12-11T15:08:48Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : /* Séance 3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Séance 1==&lt;br /&gt;
&lt;br /&gt;
===Creation conteneur Unshare===&lt;br /&gt;
&lt;br /&gt;
 export proxy ...&lt;br /&gt;
 dd if=/dev/zero of= bs=1024k count=10240&lt;br /&gt;
 mkfs Partition&lt;br /&gt;
 umount Partition&lt;br /&gt;
 mount Partition /tmp/pointd'acancrage&lt;br /&gt;
 debootstrap stable --include=vim,apache2&lt;br /&gt;
&lt;br /&gt;
 unshare -p -f -m -u -n chroot /tmp/fs[1-3] /bin/sh -c &amp;quot;mount /proc ; /bin/bash&amp;quot; ; &lt;br /&gt;
&lt;br /&gt;
===Configuration switch virtuelle===&lt;br /&gt;
&lt;br /&gt;
Création de deux interfaces liées :&lt;br /&gt;
&lt;br /&gt;
 ip link add vif1 type veth peer name eth0@vif1&lt;br /&gt;
 ip link add vif2 type veth peer name eth0@vif2&lt;br /&gt;
 ip link add vif3 type veth peer name eth0@vif3&lt;br /&gt;
 ip link add vif4 type veth peer name eth1@vif4&lt;br /&gt;
&lt;br /&gt;
Déplacement du pair dans un espace réseau différent :&lt;br /&gt;
&lt;br /&gt;
 ip link set eth0@vif1 netns /proc/14601/ns/net name eth0&lt;br /&gt;
 ip link set eth0@vif2 netns /proc/14612/ns/net name eth0&lt;br /&gt;
 ip link set eth0@vif3 netns /proc/14620/ns/net name eth0&lt;br /&gt;
 ip link set eth1@vif4 netns /proc/14620/ns/net name eth1&lt;br /&gt;
&lt;br /&gt;
Configuration réseau dans l’espace alternatif :&lt;br /&gt;
&lt;br /&gt;
 nsenter -t 14601 -n ip address add dev eth0 192.168.0.101/24&lt;br /&gt;
 nsenter -t 14620 -n ip address add dev eth1 172.26.145.243/24&lt;br /&gt;
 nsenter -t 14612 -n ip address add dev eth0 192.168.0.102/24&lt;br /&gt;
 nsenter -t 14620 -n ip address add dev eth0 192.168.0.103/24&lt;br /&gt;
&lt;br /&gt;
Routage sur routeur depuis Proxy Inverse:&lt;br /&gt;
&lt;br /&gt;
 ip route add default via 172.26.145.254 dev eth1&lt;br /&gt;
&lt;br /&gt;
brctl show:&lt;br /&gt;
&lt;br /&gt;
 bridge name	bridge id		STP enabled	interfaces&lt;br /&gt;
 br-50de43cf6b72		8000.024270463a85	no		&lt;br /&gt;
 br-9964383bb7d2		8000.0242c526b998	no		&lt;br /&gt;
 bridge		8000.00224d7af070	no		eth0 eth1 vif4&lt;br /&gt;
 docker0		8000.0242e82e829c	no	veth5fcd2d1&lt;br /&gt;
 vSwitchBanane		8000.3299e99137df	no	vif1 vif2 vif3&lt;br /&gt;
&lt;br /&gt;
Activation:&lt;br /&gt;
&lt;br /&gt;
 ip link set vif1,2,3,4 up&lt;br /&gt;
 ip link set vSwtichBanane up&lt;br /&gt;
 ip link set vif4 master bridge&lt;br /&gt;
&lt;br /&gt;
Flush docker:&lt;br /&gt;
&lt;br /&gt;
 iptables -F&lt;br /&gt;
 iptables -F -t nat&lt;br /&gt;
 iptables -P FORWARD ACCEPT&lt;br /&gt;
 &lt;br /&gt;
Ping reverse proxy vers conteneur2:&lt;br /&gt;
&lt;br /&gt;
 root@zabeth08:/# ping 192.168.0.102&lt;br /&gt;
 PING 192.168.0.102 (192.168.0.102) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from 192.168.0.102: icmp_seq=19 ttl=64 time=1024 ms&lt;br /&gt;
 64 bytes from 192.168.0.102: icmp_seq=20 ttl=64 time=0.110 ms&lt;br /&gt;
 64 bytes from 192.168.0.102: icmp_seq=21 ttl=64 time=0.056 ms&lt;br /&gt;
&lt;br /&gt;
===Config Reverse Proxy===&lt;br /&gt;
&lt;br /&gt;
Import proxy &amp;amp; http_proxy libraries:&lt;br /&gt;
&lt;br /&gt;
 a2nmod proxy_http proxy&lt;br /&gt;
&lt;br /&gt;
Dans site-available/000-config.conf:&lt;br /&gt;
&lt;br /&gt;
 ProxyPass /site1 http://192.168.0.101/&lt;br /&gt;
 ProxyPassReverse /site1 http://192.168.0.101/&lt;br /&gt;
 ProxyPass /site2 http://192.168.0.102/&lt;br /&gt;
 ProxyPassReverse /site2 http://192.168.0.102/&lt;br /&gt;
 ProxyRequests Off&lt;br /&gt;
&lt;br /&gt;
DNS A Record sur gandi.net:&lt;br /&gt;
&lt;br /&gt;
 Domain &amp;gt; DNS Record &amp;gt; Type A - Name DC - TTL 1800 - Adress 172.26.145.243&lt;br /&gt;
&lt;br /&gt;
10H15 =&amp;gt; Serveurs Web OK&lt;br /&gt;
&lt;br /&gt;
===Installation et configuration Docker===&lt;br /&gt;
&lt;br /&gt;
 docker create -t -i debian bash&lt;br /&gt;
 docker run -i --network=reseau_docker -t reverse-proxy:version1&lt;br /&gt;
 docker commit 85b84891f0ac reverse-proxy:version1&lt;br /&gt;
 docker run -p 80:80 -i --network=reseau_docker -t reverse-proxy:version1 -&amp;gt; reverse proxy&lt;br /&gt;
&lt;br /&gt;
10h20 Serveurs Web (docker) OK&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance 2==&lt;br /&gt;
&lt;br /&gt;
===Configuration des bornes Wifi=== &lt;br /&gt;
&lt;br /&gt;
====Tests sur des AP non sécurisés====&lt;br /&gt;
&lt;br /&gt;
On commence dans un premier temps par mettre un point d'accès non sécurisé pour tester la mise en place de plusieurs AP simultanément:&lt;br /&gt;
&lt;br /&gt;
Création d'un AP de SSID '''test1''':&lt;br /&gt;
&lt;br /&gt;
 Enable&lt;br /&gt;
 Conf t&lt;br /&gt;
 Dot11 ssid test1&lt;br /&gt;
 Vlan 10&lt;br /&gt;
 Authentication open&lt;br /&gt;
 Mbssid Guest-mode&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
Création d'un AP de SSID '''test2''':&lt;br /&gt;
&lt;br /&gt;
 Enable&lt;br /&gt;
 Conf t&lt;br /&gt;
 Dot11 ssid test2&lt;br /&gt;
 Vlan 20&lt;br /&gt;
 Authentication open&lt;br /&gt;
 Mbssid Guest-mode&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
On relie les SSID à l'interface wifi '''dot11Radio0''':&lt;br /&gt;
&lt;br /&gt;
 Enable&lt;br /&gt;
 Conf t&lt;br /&gt;
 int dot11radio0&lt;br /&gt;
 Mbssid          // permet d'avoir plusieur SSID en guest-mode&lt;br /&gt;
 ssid test1&lt;br /&gt;
 ssid test2&lt;br /&gt;
&lt;br /&gt;
Encapsulation des vlans dans l'interface '''dot11radio0''': &lt;br /&gt;
&lt;br /&gt;
 Enable&lt;br /&gt;
 Conf t&lt;br /&gt;
 int dot11radio0.10&lt;br /&gt;
 encapsulation dot1Q 10&lt;br /&gt;
&lt;br /&gt;
 Enable&lt;br /&gt;
 Conf t&lt;br /&gt;
 int dot11radio0.20&lt;br /&gt;
 encapsulation dot1Q 20&lt;br /&gt;
&lt;br /&gt;
====Sécurisation des AP en WPA2-EAP====&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé durant cette séance à tester la sécurisation des AP en WPA2-EAP&lt;br /&gt;
&lt;br /&gt;
 Enable&lt;br /&gt;
 Conf t&lt;br /&gt;
 dot11 ssid &amp;lt;nom_ssid&amp;gt;&lt;br /&gt;
 authentication network-eap eap_methods&lt;br /&gt;
 authentication key-management wpa&lt;br /&gt;
&lt;br /&gt;
 Enable&lt;br /&gt;
 Conf t&lt;br /&gt;
 int dot11radio0&lt;br /&gt;
 encryption vlan 10 mode ciphers tkip&lt;br /&gt;
 encryption vlan 20 mode ciphers tkip&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Création VM===&lt;br /&gt;
&lt;br /&gt;
Creation Vm:&lt;br /&gt;
&lt;br /&gt;
 xen-create-image --hostname=thot \&lt;br /&gt;
   --memory=256mb \&lt;br /&gt;
   --vcpus=1 \&lt;br /&gt;
   --dir=/usr/local/xen \&lt;br /&gt;
   --ip=193.48.57.177 \&lt;br /&gt;
   --netmask=255.255.255.240 \&lt;br /&gt;
   --dist=stable \&lt;br /&gt;
   --size=10Gb \&lt;br /&gt;
   --swap=128mb &lt;br /&gt;
&lt;br /&gt;
 ps: 7Jb7J8tqfRrPGe6S2RHJJb4&lt;br /&gt;
&lt;br /&gt;
==Séance 3==&lt;br /&gt;
&lt;br /&gt;
===Mise en place d'un serveur freeradius===&lt;br /&gt;
&lt;br /&gt;
'''Installation:'''&lt;br /&gt;
&lt;br /&gt;
  apt-get install freeradius&lt;br /&gt;
&lt;br /&gt;
'''Configuration:'''&lt;br /&gt;
&lt;br /&gt;
Création d'un utilisateur thot:glopglop&lt;br /&gt;
&lt;br /&gt;
 # Dans le fichier /etc/freeradius/3.0/users:&lt;br /&gt;
 thot Cleartext-Password := &amp;quot;glopglop&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Configuration de freeradius PEAP-MSCHAPv2:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Sécurisation Wifi par WPA2-EAP===&lt;br /&gt;
&lt;br /&gt;
Pour la partie&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Tests d’intrusion===&lt;br /&gt;
&lt;br /&gt;
Dans cette section nous allons tester différentes méthodes de sécurisations&lt;br /&gt;
&lt;br /&gt;
====Cassage de mot de passe WPA-PSK par force brute====&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé les outils du paquetage '''aircrack-ng''' pour capturer des paquets d'identifications.&lt;br /&gt;
&lt;br /&gt;
Notre point d'accès est '''cracotte01'''. &lt;br /&gt;
&lt;br /&gt;
Il faut tout d'abord mettre la carte réseau wifi de notre machine de travail en mode écoute, cela est fait grâce à la commande :&lt;br /&gt;
 airmon-ng start wlp2s0&lt;br /&gt;
avec wlp2s0 le nom de l'interface réseau wifi de notre machine.&lt;br /&gt;
&lt;br /&gt;
Cela &amp;quot;supprime&amp;quot; notre interface wlp2s0 et en créé une autre nommé wlp2s0mon.&lt;br /&gt;
&lt;br /&gt;
En utilisant la commande&lt;br /&gt;
 airodump-ng wlp2s0mon&lt;br /&gt;
&lt;br /&gt;
on trouve l'adresse MAC de notre point d'accès cracotte01 :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;importimage&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On capture ensuite les paquets de handshake voulu grâce à la commande&lt;br /&gt;
 airodump-ng wlp2s0mon --channel 9 --bssid 04:DA:D:9C:50:50 --write capture&lt;br /&gt;
&lt;br /&gt;
Une fois le paquet capturé, on peut attaquer grâce à un simple brute force par dictionnaire.&lt;br /&gt;
&lt;br /&gt;
On suppose que la clé est composé de 8 chiffres, on créé donc un document dico.txt contenant toutes les combinaisons de 8 chiffres possibles.&lt;br /&gt;
&lt;br /&gt;
On lance ensuite la commande&lt;br /&gt;
 aircrack-ng capture.cap -w dico.txt&lt;br /&gt;
&lt;br /&gt;
Après &amp;lt;insertheure&amp;gt; de brute force, on récupère la clé suivante :&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43783</id>
		<title>Projet IMA3 P5, 2016/2017, TD1</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43783"/>
				<updated>2017-06-12T13:55:31Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : /* Connexion série coté RPi */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet IMA3-SC 2016/2017 : Synt'Harpe (Sainte) Laser =&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Description du système ===&lt;br /&gt;
&lt;br /&gt;
Pour le projet Système Communicant, nous allons réaliser une harpe laser. Notre but est de créer un instrument de musique similaire à une harpe, où les cordes sont remplacées par des capteurs infra-rouges.&lt;br /&gt;
&lt;br /&gt;
Un son sera émis par l'ordinateur dès que le capteur IR captera une main et le joueur pourra avec son autre main moduler l'amplitude de la note.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on travaillera sur une gamme de son sur 8 bits. Puis, nous implémenterons une banque de sons qui nous permettra de sélectionner l'instrument désiré, d'où l'appellation Synt'Harpe.&lt;br /&gt;
&lt;br /&gt;
L'ordinateur décidera du fonctionnement ou non de la harpe. C'est aussi grâce à lui qu'on pourra choisir la banque de sons voulue.&lt;br /&gt;
&lt;br /&gt;
Toutes les banques de sons seront enregistrées sur le Raspberry.&lt;br /&gt;
Les LEDs signaleront l'emplacement des cordes.&lt;br /&gt;
&lt;br /&gt;
Pour la partie optionnelle, on remplacera les LEDs par des lasers pour un effet visuel de qualité (plus poussé). La fumée permettra de voir les lasers.&lt;br /&gt;
&lt;br /&gt;
=== Le matériel ===&lt;br /&gt;
* Un raspberry pi&lt;br /&gt;
* 8 phototransistors&lt;br /&gt;
* 8 émetteurs lasers&lt;br /&gt;
* Des résistances&lt;br /&gt;
* Une structure&lt;br /&gt;
* Carte d'acquisition de type Arduino au début puis FPGA &lt;br /&gt;
* Un ordinateur&lt;br /&gt;
* Une alimentation&lt;br /&gt;
&lt;br /&gt;
=== Optionnel (visuel) ===&lt;br /&gt;
&lt;br /&gt;
* 8 émetteurs laser&lt;br /&gt;
* Un générateur de fumée&lt;br /&gt;
* Une caméra&lt;br /&gt;
&lt;br /&gt;
== Séance 1 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Le but de cette première séance était de se répartir les tâches, de tester le matériel mit à disposition et de découvrir le fonctionnement du FPGA.&lt;br /&gt;
&lt;br /&gt;
Le principe de fonctionnement de la harpe est le suivant:&lt;br /&gt;
Chaque capteur sera situé en face d'un laser. Les capteurs seront dans la partie haute de la harpe afin de limiter les interférences dues à d'autres sources lumineuses. Chaque laser pointera vers un capteur. &lt;br /&gt;
&lt;br /&gt;
 * Ajout du dessin de la harpe * &lt;br /&gt;
&lt;br /&gt;
Les capteurs enverront tous par défaut la même valeur au FPGA. Quand l'utilisateur passera sa main dans la harpe, un faisceau laser sera coupé. Le capteur n'enverra plus sa valeur seuil au FPGA, il aura donc changé d'état.&lt;br /&gt;
Dès lors que le FPGA détectera un changement d'état, il enverra l'état dans lequel se trouvent les 8 capteurs au Raspberry. &lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé des tests sur les phototransistors et les lasers. Nous avons mis en parallèle un laser et deux capteurs, sans oublier leur résistance de 1.2k Ohms chacune. &lt;br /&gt;
&lt;br /&gt;
Nous avons vu que à luminosité ambiante, quand le laser pointe sur le capteur, celui-ci envoie à l'Arduino une valeur de 950 environ. Ensuite, quand le faisceau laser est coupé, la valeur envoyée par le phototransistor monte à 1020.&lt;br /&gt;
Puis, nous avons réitéré l'expérience en mettant le système dans une boîte. Cette fois, le valeur est passée de 840 quand le capteur est éclairé par le laser à 900 quand le faisceau est coupé.&lt;br /&gt;
Nous en avons déduit que nous allons devoir refaire l'expérience une fois la harpe assemblée.&lt;br /&gt;
&lt;br /&gt;
Les lasers étant très directionnels tout comme les phototransistors, nous n'aurons pas de soucis d'interférences. Un capteur détectera uniquement le laser situé directement en face de lui et non ceux de son voisinage.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Même si il peut paraitre futile d'insérer une partie boitier dans un projet centré sur l'informatique et l'électronique, il s'est avéré que le boitier de notre Harpe nécessitait une attention particulière.&lt;br /&gt;
&lt;br /&gt;
La taille de la harpe à été un sujet de débat, et nous avons réalisé des tests afin de vérifier que des phototransistors trop proches les uns des autres n'allait pas compromettre le bon fonctionnement de la harpe dans son ensemble. En effet, si le phototransistor détectait un autre laser que celui vers lequel il pointe serait extrêmement problématique. Heureusement, il s'est avéré que les phototransistors sont très directionnels, au point que se pose désormais le problème inverse.&lt;br /&gt;
&lt;br /&gt;
Nous allons devoir faire très attention au fait que les lasers soient bien fixés et pointent exactement vers les phototransistors, car dans le cas contraire, ceux-ci ne détectent absolument pas le laser, et tout le principe de fonctionnement s'effondre. La conception et l'assemblage de la boite devront donc être relativement précis, pour éviter ces problèmes.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons dès le départ décidé d'éviter l'utilisation de diodes infra-rouges, pour leur préférer les lasers. Tout d'abord, parce que les diodes ne sont en aucun cas assez puissantes pour être détectées par les phototransistors, ce qui une fois de plus rend notre harpe inutile. Ensuite, parce qu'il nous a semblé que réaliser une harpe 'laser' sans lasers était un concept déconcertant, et enlève beaucoup de l’intérêt de ce projet.&lt;br /&gt;
&lt;br /&gt;
Un premier jet de design avait été réalisé avant cette séance, et au vu des données récoltées pendant celle-ci, nous l'avons modifié pour les prendre en compte, notamment la taille des lasers par rapport aux diodes, et la précision requise. &lt;br /&gt;
&lt;br /&gt;
'insérer photos premiers schémas ici'&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le travail a été séparé en 2 parties, une personne par partie : &lt;br /&gt;
- une première partie sur le serveur même (page web, système de streaming de son depuis la page web)&lt;br /&gt;
- une seconde partie sur la lecture du port série&lt;br /&gt;
&lt;br /&gt;
==== Partie serveur ====&lt;br /&gt;
La première séance a été consacré à deux grands axes : prendre la main à distance sur le raspberry pi et mettre en place le serveur web.&lt;br /&gt;
Afin de pouvoir contrôler et travailler facilement sur le RPi, l'outil vncserver a été installé sur le raspberry, permettant de contrôler via un interface graphique le RPi depuis un ordinateur branché sur le même réseau. Cet utilitaire permettra a l'avenir de travailler directement sur le RPi sans devoir constamment uploader par ssh le travail effectué.&lt;br /&gt;
&lt;br /&gt;
Coté mise en place du serveur web, l'utilitaire de serveur web apache2 a été installé sans soucis, et les pages d'exemples web et javascript fonctionnent. En revanche, l'utilisation du code d'exemple sur les sockets n'est pas utilisable, le paquet proposé n’existe pas et le site du paquet de socket est mort.&lt;br /&gt;
Le reste de la séance a été consacré a des recherches sur les moyens de pouvoir streamer du son, recherches non concluantes. Aucune solution n'a été trouvé sans passer par un service internet hébergé par un tier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Partie lecture port série ====&lt;br /&gt;
&lt;br /&gt;
Cette première séance fut consacrée à la sélection du langage de programmation et à sa prise en main. Il a été décidé d'utiliser Python pour écrire le programme récupérant et traitant les données récupérées à travers le port série. Python étant un langage fort usité, il possède une très large documentation. Ce fut donc facile de trouver la librairie permettant de lire les données envoyées par le port série.&lt;br /&gt;
&lt;br /&gt;
Un doute subsiste encore sur le type de données envoyé par le port série. L'idéal serait de récupérer un tableau de 8 entiers de type binaire correspondant aux états des 8 ports liés aux &amp;quot;cordes&amp;quot; laser, pour pouvoir ensuite traiter ces données facilement.&lt;br /&gt;
&lt;br /&gt;
== Séance 2 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Lors de cette séance, nous avons réalisé le premier circuit sur le FPGA. &lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un circuit simple, qui envoie en permanence l'état des huit phototransistors au port série. Les phototransistors sont alors directement reliés à celui-ci. Nous avons pu tester le bon fonctionnement du système grâce aux diodes du FPGA. Nous avons branché en parallèle sur le circuit les huit diodes, afin de vérifier qu'un signal était bien envoyé en permanence, on a pu les voir s'éteindre lorsqu'on éclairait un laser. &lt;br /&gt;
Ces diodes se sont avérées très utiles, car il n'est pas encore possible d'effectuer les tests sur le port série, car la partie informatique n'est pas encore opérationnelle, on ne peut donc pas lire directement sur le port série pour le moment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Envoiconstant.JPG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite réalisé un montage permettant de faire l'envoi seulement sur changement d'état, comme prévu à la séance 1 Nous avons donc réalisé un système de bascules permettant de comparer l'état actuel de chaque diode avec son état précédent, puis de réaliser l'envoi seulement si une différence était observée. Comme précédemment, les diodes sont reliées directement au Port Série, mais cette fois-ci au lieu de brancher le Bit d'envoi du port Série sur un Vcc, soit un '1' logique, nous l'avons relié à la vérification de changement d'état, qui passe à '1' uniquement avec un changement d'état.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Changementdetat.JPG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème qui s'est alors posé était de savoir si on envoyait le signal assez longtemps pour qu'il puisse être lu. En effet on envoie un signal seulement si il y a changement d'état, et cette vérification se fait à chaque incrément d'horloge. Hors, la différence sera donc observée sur un seul incrément d'horloge, par conséquent, on n'envoie de signal que pendant ce seul incrément. Pour l'instant, nous supposons que le port série est capable de stocker les données à envoyer en un seul incrément d'horloge. &lt;br /&gt;
Cependant, si lors des tests, ça ne fonctionne pas, nous prévoyons d'utiliser un compteur pour pouvoir envoyer le signal plus longtemps au Bit d'envoi du port série, et ainsi laisser le temps au port série d'envoyer l'information.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous nous sommes focalisés sur le FPGA, mais nous avons néanmoins terminé la conception du boitier de la harpe, sous la forme de trois 'boites' crénelées, que nous avons ensuite l'intention de découper au FabLab puis d'assembler.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos des boites ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il s'est avéré que réaliser des boites crénelées rendrait tout le boitier beaucoup plus solide, et donc fiable.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le problème de l'impossibilité d'utiliser l'exemple sur les sockets a été résolu, grâce à l'intervention de M. Redon. Le problème était une différence de version de la distribution Linux entre le RPi utilisé et celle utilisé pour l'exemple. En effet, le RPi de travail est sur une distribution Wheezy, alors que la version la plus récente est la Jessie. Les chemins des dépots des sources de la librairie libwebsocket n’existant pas sur Wheezy, on ne pouvait installer la librairie directement en ligne de commande. M. Redon a ajouté le chemin de la librairie dans le gestionnaire de paquet du RPi et on a pu utiliser sans problèmes la librairie. De plus le site du paquet libwebsocket n'était inaccessible que temporairement.&lt;br /&gt;
La séance a été consacré à comprendre le fonctionnement des sockets et comment l'exemple html interagissait avec.&lt;br /&gt;
&lt;br /&gt;
La partie importante du code d'exemple est la suivante : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;static int callback_my(&lt;br /&gt;
  struct libwebsocket_context * this,&lt;br /&gt;
  struct libwebsocket *wsi,enum libwebsocket_callback_reasons reason,&lt;br /&gt;
  void *user,void *in,size_t len)&lt;br /&gt;
 {&lt;br /&gt;
 static char *message=NULL;&lt;br /&gt;
 static int msize=0;&lt;br /&gt;
 switch(reason){&lt;br /&gt;
  case LWS_CALLBACK_ESTABLISHED:&lt;br /&gt;
    printf(&amp;quot;connection established\n&amp;quot;);&lt;br /&gt;
    message=NULL;&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_RECEIVE:&lt;br /&gt;
                // Ici sont traites les messages envoyes par le navigateur&lt;br /&gt;
    printf(&amp;quot;received data: %s\n&amp;quot;,(char *)in);&lt;br /&gt;
    message=malloc(len+LWS_SEND_BUFFER_PRE_PADDING+LWS_SEND_BUFFER_POST_PADDING);&lt;br /&gt;
    if(message==NULL){ perror(&amp;quot;callback_my.malloc&amp;quot;); exit(EXIT_FAILURE); }&lt;br /&gt;
    memcpy(message+LWS_SEND_BUFFER_PRE_PADDING,in,len);&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    msize=len;&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_SERVER_WRITEABLE:&lt;br /&gt;
                // Ici sont envoyes les messages au navigateur&lt;br /&gt;
    if(message!=NULL){&lt;br /&gt;
      char *out=message+LWS_SEND_BUFFER_PRE_PADDING;&lt;br /&gt;
      libwebsocket_write(wsi,(unsigned char *)out,msize,LWS_WRITE_TEXT);&lt;br /&gt;
      free(message);&lt;br /&gt;
      message=NULL;&lt;br /&gt;
      }&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    break;&lt;br /&gt;
  }&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
Il s'agit d'une fonction de callback gérant à la fois la réception et la transmission. On peut remarquer 3 cas du switch : LWS_CALLBACK_ESTABLISHED correspondant à la création d'un lien entre la page web et le serveur websocket à la demande de la page web, LWS_CALLBACK_RECEIVE correspondant aux actions à entreprendre à la réception d'un message provenant du navigateur web, et LWS_CALLBACK_SERVER_WRITEABLE correspondant aux actions afin d'envoyer un message au navigateur.&lt;br /&gt;
&lt;br /&gt;
Coté HTML, on utilise les sockets grâce à ce code suivant :&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;pre&amp;gt;window.WebSocket=(window.WebSocket||window.MozWebSocket);&lt;br /&gt;
 var websocket=new WebSocket('ws://127.0.0.1:9000','myprotocol');&lt;br /&gt;
 websocket.onopen=function(){ $('h1').css('color','green'); };&lt;br /&gt;
 websocket.onerror=function(){ $('h1').css('color','red'); };&lt;br /&gt;
 websocket.onmessage=function(message){&lt;br /&gt;
 console.log(message.data);&lt;br /&gt;
 $('#messages').append($('&amp;lt;p&amp;gt;',{ text: message.data }));&lt;br /&gt;
 };&lt;br /&gt;
 function sendMessage(){&lt;br /&gt;
 websocket.send($('#message').val());&lt;br /&gt;
 $('#message').val('');&lt;br /&gt;
 }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La fonction websocket.onmessage gère le traitement à faire coté client quand le serveur envoie des informations, et la fonction sendMessage permet l'envoie d'information du client vers le serveur.&lt;br /&gt;
&lt;br /&gt;
Pour notre projet, nous avons besoin principalement, dans un premier temps, d'envoyer des informations du serveur vers le client, nous nous sommes donc concentrer à comprendre et modifier les parties du code fourni suivantes : websocket.onmessage coté client et le &amp;quot;case LWS_CALLBACK_SERVER_WRITEABLE:&amp;quot; coté serveur.&lt;br /&gt;
&lt;br /&gt;
Le but des tests était de réussir à faire jouer deux sons différents par le client, avec changement de son imposé par le serveur. HTML5 propose nativement de lire des sons à partir d'une source grâce à une balise audio :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;audio controls=&amp;quot;controls&amp;quot; id=&amp;quot;mySound&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/audio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On récupère l'identifiant de cette balise avec &lt;br /&gt;
&lt;br /&gt;
 var test1 = document.getElementById(&amp;quot;mySound&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
afin de pouvoir l'utiliser de n'importe où dans le programme.&lt;br /&gt;
On définit la source grâce à &lt;br /&gt;
&lt;br /&gt;
 test1.src=&amp;quot;sound.mp3&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
avec &amp;quot;sound.mp3&amp;quot; le chemin d'accès au fichier son par rapport à l'emplacement du fichier html sur le serveur. Ici, le fichier son sound.mp3 est dans le même dossier que la page index.html.&lt;br /&gt;
Enfin, on peut lire le son avec &lt;br /&gt;
&lt;br /&gt;
 test1.play();&lt;br /&gt;
&lt;br /&gt;
Le but du projet étant d'émettre en continue le son généré par la harpe, l'objectif ici est soit de générer un fichier de streaming que l'on lit en continue, soit de lire un fichier différent par son possible et on change la valeur de test1.src en fonction du son à lire, soit on lit toujours la même source, mais que l'on modifie à la volée en fonction du son voulu. La première option a été étudiée jusqu'en fin de séance.&lt;br /&gt;
Nous n'avons pas réussi à comprendre comment générer un fichier de streaming audio simple, de plus toutes les documentations et exemples trouvés ne concernant qu'un streaming simultanée de son et de vidéo à partir d'une caméra et d'un micro, et nous n'avons pas compris comment adapter ces exemples.&lt;br /&gt;
&lt;br /&gt;
== Séance 3 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous avons pu tester l'envoi sur changement d'état, toujours avec les diodes du FPGA.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par ajouter une horloge sur le détecteur de changement d'état, afin d'augmenter le nombre d'incréments d'horloge sur lequel il est à '1', et ce dans le but de rendre le clignotement d'un diode visible à l’œil nu.&lt;br /&gt;
Ensuite, nous avons relié la sortie du détecteur de changement d'état et des phototransistors par un 'ET' logique, que nous avons ensuite relié aux diodes du FPGA.&lt;br /&gt;
De cette façon, si l'on détecte un changement d'état sur un phototransistor, la nouvelle valeur est alors envoyée sur les diodes. Le système a fonctionné (à voir :p ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos du test avec changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite passé le reste de la séance à mettre en commun notre partie avec la partie informatique, en essayant de leur permettre de lire sur le port série du FPGA. Les essais ont pour l'instant été infructueux, mais des progrès ont été faits. &lt;br /&gt;
&lt;br /&gt;
L'objectif étant que le Raspberry Pi puisse lire les informations envoyées par le FPGA, pour ensuite les transmettre au site Web que nous allons réaliser par la suite.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Au vu des difficultés rencontrées lors de la mise en place d'un véritable système de streaming, nous avons décider d'étudier les autres options possibles.&lt;br /&gt;
Notre deuxième solution était de modifier la valeur de test1.src. Mais cela voulait dire effectuer beaucoup de traitement coté client, et si on décidait de rajouter beaucoup de son, ou de générer de nouveaux fichiers son, ce la demandait soit de modifier le HTML à chaque ajout de fonctionnalité, ou de créer une grande quantité de fichier son qui pollueraient le serveur. Nous avons donc décidé qu'il serait plus pratique de toujours écraser la source avec le nouveau son a lire, et de ne jamais changer la valeur de test1.src.&lt;br /&gt;
&lt;br /&gt;
Afin d'effectuer des tests afin de voir si notre idée marchait bien, nous avons utiliser le code C très simple suivant :&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;pre&amp;gt;int cpt;&lt;br /&gt;
  for (cpt = 0; cpt &amp;lt; 250000000; cpt++);&lt;br /&gt;
&lt;br /&gt;
    boole = !boole;&lt;br /&gt;
	printf(&amp;quot;changement: %d\n&amp;quot;,boole);&lt;br /&gt;
    if(boole)&lt;br /&gt;
      system(&amp;quot;sudo cp Level-complete-sound-effect.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
      system(&amp;quot;sudo cp Raindrops-noise.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce code nous permet de modifier assez fréquemment le fichier source. Les fichiers audio de tests ont été trouvé sur http://www.orangefreesounds.com/ et sont libre de droit.&lt;br /&gt;
&lt;br /&gt;
Dans la page HTML de test nous utilisé les options de la balise source suivante :&lt;br /&gt;
&lt;br /&gt;
 test1.loop = true;&lt;br /&gt;
&lt;br /&gt;
qui permet au son de se jouer en boucle.&lt;br /&gt;
&lt;br /&gt;
Bien que les fichiers soit bien modifiés en local sur le serveur, toujours le même son est joué.&lt;br /&gt;
&lt;br /&gt;
On a donc testé de recharger le son uniquement lorsque le son est modifié, avec un envoi de message du serveur par socket.&lt;br /&gt;
Le serveur est conçu tel que suit : &lt;br /&gt;
  &amp;lt;pre&amp;gt;while(1){&lt;br /&gt;
  int cpt;&lt;br /&gt;
  bool boole;&lt;br /&gt;
  boole = 1;&lt;br /&gt;
  for (cpt = 0; cpt &amp;lt; 50000; cpt++);&lt;br /&gt;
&lt;br /&gt;
    boole = !boole;&lt;br /&gt;
&lt;br /&gt;
    if(boole)&lt;br /&gt;
      system(&amp;quot;cp Level-complete-sound-effect.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
      system(&amp;quot;cp Raindrops-noise.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      libwebsocket_write(test,(unsigned char *)out,1,LWS_WRITE_TEXT);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
 libwebsocket_context_destroy(context);&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On modifie la source, et ensuite on envoi un message, dont le contenu n'est pas important, le message sert juste d'indication au client que la source a changé.&lt;br /&gt;
&lt;br /&gt;
Le code coté client : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;websocket.onmessage=function(message){&lt;br /&gt;
 test1.pause();&lt;br /&gt;
 test1.load();&lt;br /&gt;
 test1.play();&lt;br /&gt;
 };&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A la réception d'un message, on pause le son avec test1.pause() puis on recharge le son afin d'aller chercher la valeur actuelle de la source, puis on relance le son avec test1.play().&lt;br /&gt;
D'après la documentation technique de HTML5, la fonction load() est sensé recharger la source si elle a changé, mais le résultat de ce test n'est pas concluant : le client joue toujours le même son.&lt;br /&gt;
Nous ne comprenons pas pourquoi.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 1 : Réalisation du site Web ==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé ce site web lors de notre temps libre afin de permettre la communication entre le Raspberry Pi et l'ordinateur. En effet, il était inclus dans notre projet de devoir réaliser une communication par internet. Ce site internet va donc remplir cette condition. Sur celui-ci, on pourra trouver une brève description de notre projet, un lien vers le wiki, une image exemple d'un harpe et les boutons Play et Pause qui permettent d'activer et de désactiver la harpe laser.&lt;br /&gt;
==== Partie websocket et échange d'information ====&lt;br /&gt;
Après de nombreux tests sur la communication entre le serveur et le client web et le problème de toujours lire le même son, même si la source a été modifié, il s'est avéré que le client lisait toujours le même son quoi qu'il arrive, même si le fichier cible n’existait plus sur le serveur. Comprendre pourquoi a nécessité quelque recherche et la source du problème était la suivante : les navigateurs utilisés, Mozilla Firefox et Google Chrome, mettaient en cache le fichier son à la première lecture, et ne vérifiait plus l'état du fichier sur le serveur, fichier qui donc pouvait être modifié sans que cela n'ai un impact sur le déroulement coté client. Il a fallut trouver un moyen de contourner le cache. N'ayant aucune connaissance sur le domaine, les recherches ont été infructueuses. Suite à une conversation avec M. Rudametkin, nous avons été orienté vers ce lien https://stackoverflow.com/questions/1077041/refresh-image-with-a-new-one-at-the-same-url/1077051#1077051 qui nous a permit de résoudre le problème.&lt;br /&gt;
En utilisant la commande : &lt;br /&gt;
&lt;br /&gt;
 test1.src=&amp;quot;sound.mp3?&amp;quot;+ new Date().getTime();&lt;br /&gt;
&lt;br /&gt;
nous trompons le cache en forçant la revérification de la source sur le serveur. Grâce a cette méthode nous avons enfin réussi à modifier le son joué par le client, et nous avons pu passer à la gestion de la communication série entre le RPi et le FPGA/Arduino.&lt;br /&gt;
&lt;br /&gt;
Le code fonctionnel de la page web est le suivant : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;audio controls=&amp;quot;controls&amp;quot; id=&amp;quot;mySound&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/audio&amp;gt;&lt;br /&gt;
    &amp;lt;script&lt;br /&gt;
        src=&amp;quot;jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.WebSocket=(window.WebSocket||window.MozWebSocket);&lt;br /&gt;
&lt;br /&gt;
var websocket=new WebSocket('ws://10.42.93:9000','myprotocol');&lt;br /&gt;
var test1 = document.getElementById(&amp;quot;mySound&amp;quot;);&lt;br /&gt;
test1.src=&amp;quot;sound.mp3&amp;quot;;&lt;br /&gt;
test1.autoplay = true;&lt;br /&gt;
websocket.onopen=function(){ $('h1').css('color','green'); };&lt;br /&gt;
&lt;br /&gt;
websocket.onerror=function(){ $('h1').css('color','red'); };&lt;br /&gt;
&lt;br /&gt;
websocket.onmessage=function(message){&lt;br /&gt;
test1.pause();&lt;br /&gt;
test1.src=&amp;quot;sound.mp3?&amp;quot;+ new Date().getTime();&lt;br /&gt;
test1.load();&lt;br /&gt;
test1.play();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function sendMessage(){&lt;br /&gt;
websocket.send($('#message').val());&lt;br /&gt;
$('#message').val('');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var son = document.getELementById(&amp;quot;sound&amp;quot;);&lt;br /&gt;
son.loop = true;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt;WebSockets test&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;message&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;button onclick=&amp;quot;sendMessage();&amp;quot;&amp;gt;Send&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce code n'est pas la version final, juste l'ensemble des parties logiques et fonctionnelles de la page web.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 2 : Réalisation du programme secondaire sur Arduino 'en cas de problèmes' ==&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis à plusieurs occasions en dehors des heures de projet afin d'avancer sur notre harpe. Nous avons donc décidé que nous devions réaliser un programme sur Arduino nous permettant de réaliser des tests de transmission par la liaison série sans avoir besoin du FPGA. Dans un premier temps, nous avons tenté d'utiliser le port USB comme liaison série. Cependant, il s'est avéré que le Raspberry pi ne pouvait pas lire son port USB, ce qui nous a donc forcé à utiliser les pins de communication série de l'Arduino. &lt;br /&gt;
Nous sommes sur un Arduino Mega 2560, nous avons a notre disposition plusieurs pins de communication série différents. Ils seront utilisés uniquement en transmission. Pour communiquer, nous allons ensuite utiliser le pin Tx1. Nous aboutissons donc au programme suivant:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Setup.PNG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Captprog.PNG]]&lt;br /&gt;
&lt;br /&gt;
La communication série de ce programme nous a causé des problèmes, surtout du fait que l'ordinateur ne recevait pas les informations transmises par l'Arduino. Nous avons donc du effectuer de multiples tests afin de voir où se situait le problème. Nous avons pu déterminer que nous avions un problème au niveau de notre pont diviseur de tension entre l'alimentation de l’Arduino et celle du Raspberry Pi, nous avons alors changé les résistances.&lt;br /&gt;
Nous avons également notamment modifié le programme afin de vérifier que l'information était bien transmise sur le Pin Série de l'Arduino, et que le problème ne venait donc pas de l'Arduino mais bien du Raspberry, dont le port série était mal configuré.&lt;br /&gt;
&lt;br /&gt;
==== Connexion série coté RPi ====&lt;br /&gt;
Afin de lire sur la liaison séri du coté de RPi, nous avions écrit le code C suivant : &lt;br /&gt;
 &amp;lt;pre&amp;gt;#include &amp;lt;stdio.h&amp;gt;   /* Standard input/output definitions */&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;  /* String function definitions */&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;  /* UNIX standard function definitions */&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;   /* File control definitions */&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;   /* Error number definitions */&lt;br /&gt;
#include &amp;lt;termios.h&amp;gt; /* POSIX terminal control definitions */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Lecture port série&lt;br /&gt;
&lt;br /&gt;
typedef int serialPort;&lt;br /&gt;
serialPort SerialLib_open(const char * portPath);&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char **argv) {&lt;br /&gt;
   serialPort p = SerialLib_open(&amp;quot;/dev/ttyAMA0&amp;quot;); &lt;br /&gt;
   char buffer[1];&lt;br /&gt;
	printf(&amp;quot;ouverture reussi\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
while(1){&lt;br /&gt;
&lt;br /&gt;
printf(&amp;quot;lecture d'un caractere\n&amp;quot;);&lt;br /&gt;
   read(p, buffer ,1);&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;Message recu: %s \n&amp;quot;,buffer);&lt;br /&gt;
}&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Ouverture du port &lt;br /&gt;
 * &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
serialPort SerialLib_open(const char * serialPortPath) {&lt;br /&gt;
   int fd; &lt;br /&gt;
&lt;br /&gt;
   fd = open(serialPortPath, O_RDWR | O_NOCTTY);&lt;br /&gt;
   if (fd == -1) {&lt;br /&gt;
      &lt;br /&gt;
      printf(&amp;quot;Could not open the serial port : %s - &amp;quot;, serialPortPath);&lt;br /&gt;
   }else {&lt;br /&gt;
      fcntl(fd, F_SETFL, 0);&lt;br /&gt;
   }&lt;br /&gt;
   return (serialPort)fd;&lt;br /&gt;
} &lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce code, combiné avec le programme sur l'Arduino, était sensé permettre la réception d'un caractère sur le RPi et l'afficher sur la sortie standard sur RPi.&lt;br /&gt;
Nous avons eu beaucoup de problème à recevoir notre message avec ce code : en effet, pour une raison qui nous reste inconnue, le programme permet la réception des caractères voulus, mais sur une courte période de temps, puis après cette période, aucun caractère n'est reçu, que l'on relance le serveur ou l'arduino.&lt;br /&gt;
&lt;br /&gt;
Le code d'exemple fournit, en revanche, fonctionne très bien et si utilisé en parallèle avec notre programme, permet le fonctionnement notre programme sans problème. Nous avons donc décidé d'utiliser le code d'exemple comme base : &lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * Test on serial device&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
////&lt;br /&gt;
// Include files&lt;br /&gt;
////&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;termios.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;serial.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
////&lt;br /&gt;
// Constants&lt;br /&gt;
////&lt;br /&gt;
#define         SERIAL_DEVICE           &amp;quot;/dev/ttyACM0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
////&lt;br /&gt;
// Global variables&lt;br /&gt;
////&lt;br /&gt;
&lt;br /&gt;
////&lt;br /&gt;
// Main function&lt;br /&gt;
////&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
int c=0;&lt;br /&gt;
int sd=serialOpen(SERIAL_DEVICE,SERIAL_BOTH);&lt;br /&gt;
serialConfig(sd,B9600);&lt;br /&gt;
if(write(sd,&amp;amp;c,sizeof(char))!=1){ perror(&amp;quot;main.write&amp;quot;); exit(-1); }&lt;br /&gt;
int i;&lt;br /&gt;
for(i=0;i&amp;lt;8;i++){&lt;br /&gt;
  if(read(sd,&amp;amp;c,sizeof(char))!=1){ perror(&amp;quot;main.read&amp;quot;); exit(-1); }&lt;br /&gt;
  printf(&amp;quot;%02x\n&amp;quot;,c);&lt;br /&gt;
  }&lt;br /&gt;
serialClose(sd);&lt;br /&gt;
exit(0);&lt;br /&gt;
}&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 3 : Assemblage de la boite et mise en place des composants ==&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43775</id>
		<title>Projet IMA3 P5, 2016/2017, TD1</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43775"/>
				<updated>2017-06-12T13:22:29Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : /* Connexion série coté RPi */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet IMA3-SC 2016/2017 : Synt'Harpe (Sainte) Laser =&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Description du système ===&lt;br /&gt;
&lt;br /&gt;
Pour le projet Système Communicant, nous allons réaliser une harpe laser. Notre but est de créer un instrument de musique similaire à une harpe, où les cordes sont remplacées par des capteurs infra-rouges.&lt;br /&gt;
&lt;br /&gt;
Un son sera émis par l'ordinateur dès que le capteur IR captera une main et le joueur pourra avec son autre main moduler l'amplitude de la note.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on travaillera sur une gamme de son sur 8 bits. Puis, nous implémenterons une banque de sons qui nous permettra de sélectionner l'instrument désiré, d'où l'appellation Synt'Harpe.&lt;br /&gt;
&lt;br /&gt;
L'ordinateur décidera du fonctionnement ou non de la harpe. C'est aussi grâce à lui qu'on pourra choisir la banque de sons voulue.&lt;br /&gt;
&lt;br /&gt;
Toutes les banques de sons seront enregistrées sur le Raspberry.&lt;br /&gt;
Les LEDs signaleront l'emplacement des cordes.&lt;br /&gt;
&lt;br /&gt;
Pour la partie optionnelle, on remplacera les LEDs par des lasers pour un effet visuel de qualité (plus poussé). La fumée permettra de voir les lasers.&lt;br /&gt;
&lt;br /&gt;
=== Le matériel ===&lt;br /&gt;
* Un raspberry pi&lt;br /&gt;
* 8 phototransistors&lt;br /&gt;
* 8 émetteurs lasers&lt;br /&gt;
* Des résistances&lt;br /&gt;
* Une structure&lt;br /&gt;
* Carte d'acquisition de type Arduino au début puis FPGA &lt;br /&gt;
* Un ordinateur&lt;br /&gt;
* Une alimentation&lt;br /&gt;
&lt;br /&gt;
=== Optionnel (visuel) ===&lt;br /&gt;
&lt;br /&gt;
* 8 émetteurs laser&lt;br /&gt;
* Un générateur de fumée&lt;br /&gt;
* Une caméra&lt;br /&gt;
&lt;br /&gt;
== Séance 1 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Le but de cette première séance était de se répartir les tâches, de tester le matériel mit à disposition et de découvrir le fonctionnement du FPGA.&lt;br /&gt;
&lt;br /&gt;
Le principe de fonctionnement de la harpe est le suivant:&lt;br /&gt;
Chaque capteur sera situé en face d'un laser. Les capteurs seront dans la partie haute de la harpe afin de limiter les interférences dues à d'autres sources lumineuses. Chaque laser pointera vers un capteur. &lt;br /&gt;
&lt;br /&gt;
 * Ajout du dessin de la harpe * &lt;br /&gt;
&lt;br /&gt;
Les capteurs enverront tous par défaut la même valeur au FPGA. Quand l'utilisateur passera sa main dans la harpe, un faisceau laser sera coupé. Le capteur n'enverra plus sa valeur seuil au FPGA, il aura donc changé d'état.&lt;br /&gt;
Dès lors que le FPGA détectera un changement d'état, il enverra l'état dans lequel se trouvent les 8 capteurs au Raspberry. &lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé des tests sur les phototransistors et les lasers. Nous avons mis en parallèle un laser et deux capteurs, sans oublier leur résistance de 1.2k Ohms chacune. &lt;br /&gt;
&lt;br /&gt;
Nous avons vu que à luminosité ambiante, quand le laser pointe sur le capteur, celui-ci envoie à l'Arduino une valeur de 950 environ. Ensuite, quand le faisceau laser est coupé, la valeur envoyée par le phototransistor monte à 1020.&lt;br /&gt;
Puis, nous avons réitéré l'expérience en mettant le système dans une boîte. Cette fois, le valeur est passée de 840 quand le capteur est éclairé par le laser à 900 quand le faisceau est coupé.&lt;br /&gt;
Nous en avons déduit que nous allons devoir refaire l'expérience une fois la harpe assemblée.&lt;br /&gt;
&lt;br /&gt;
Les lasers étant très directionnels tout comme les phototransistors, nous n'aurons pas de soucis d'interférences. Un capteur détectera uniquement le laser situé directement en face de lui et non ceux de son voisinage.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Même si il peut paraitre futile d'insérer une partie boitier dans un projet centré sur l'informatique et l'électronique, il s'est avéré que le boitier de notre Harpe nécessitait une attention particulière.&lt;br /&gt;
&lt;br /&gt;
La taille de la harpe à été un sujet de débat, et nous avons réalisé des tests afin de vérifier que des phototransistors trop proches les uns des autres n'allait pas compromettre le bon fonctionnement de la harpe dans son ensemble. En effet, si le phototransistor détectait un autre laser que celui vers lequel il pointe serait extrêmement problématique. Heureusement, il s'est avéré que les phototransistors sont très directionnels, au point que se pose désormais le problème inverse.&lt;br /&gt;
&lt;br /&gt;
Nous allons devoir faire très attention au fait que les lasers soient bien fixés et pointent exactement vers les phototransistors, car dans le cas contraire, ceux-ci ne détectent absolument pas le laser, et tout le principe de fonctionnement s'effondre. La conception et l'assemblage de la boite devront donc être relativement précis, pour éviter ces problèmes.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons dès le départ décidé d'éviter l'utilisation de diodes infra-rouges, pour leur préférer les lasers. Tout d'abord, parce que les diodes ne sont en aucun cas assez puissantes pour être détectées par les phototransistors, ce qui une fois de plus rend notre harpe inutile. Ensuite, parce qu'il nous a semblé que réaliser une harpe 'laser' sans lasers était un concept déconcertant, et enlève beaucoup de l’intérêt de ce projet.&lt;br /&gt;
&lt;br /&gt;
Un premier jet de design avait été réalisé avant cette séance, et au vu des données récoltées pendant celle-ci, nous l'avons modifié pour les prendre en compte, notamment la taille des lasers par rapport aux diodes, et la précision requise. &lt;br /&gt;
&lt;br /&gt;
'insérer photos premiers schémas ici'&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le travail a été séparé en 2 parties, une personne par partie : &lt;br /&gt;
- une première partie sur le serveur même (page web, système de streaming de son depuis la page web)&lt;br /&gt;
- une seconde partie sur la lecture du port série&lt;br /&gt;
&lt;br /&gt;
==== Partie serveur ====&lt;br /&gt;
La première séance a été consacré à deux grands axes : prendre la main à distance sur le raspberry pi et mettre en place le serveur web.&lt;br /&gt;
Afin de pouvoir contrôler et travailler facilement sur le RPi, l'outil vncserver a été installé sur le raspberry, permettant de contrôler via un interface graphique le RPi depuis un ordinateur branché sur le même réseau. Cet utilitaire permettra a l'avenir de travailler directement sur le RPi sans devoir constamment uploader par ssh le travail effectué.&lt;br /&gt;
&lt;br /&gt;
Coté mise en place du serveur web, l'utilitaire de serveur web apache2 a été installé sans soucis, et les pages d'exemples web et javascript fonctionnent. En revanche, l'utilisation du code d'exemple sur les sockets n'est pas utilisable, le paquet proposé n’existe pas et le site du paquet de socket est mort.&lt;br /&gt;
Le reste de la séance a été consacré a des recherches sur les moyens de pouvoir streamer du son, recherches non concluantes. Aucune solution n'a été trouvé sans passer par un service internet hébergé par un tier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Partie lecture port série ====&lt;br /&gt;
&lt;br /&gt;
Cette première séance fut consacrée à la sélection du langage de programmation et à sa prise en main. Il a été décidé d'utiliser Python pour écrire le programme récupérant et traitant les données récupérées à travers le port série. Python étant un langage fort usité, il possède une très large documentation. Ce fut donc facile de trouver la librairie permettant de lire les données envoyées par le port série.&lt;br /&gt;
&lt;br /&gt;
Un doute subsiste encore sur le type de données envoyé par le port série. L'idéal serait de récupérer un tableau de 8 entiers de type binaire correspondant aux états des 8 ports liés aux &amp;quot;cordes&amp;quot; laser, pour pouvoir ensuite traiter ces données facilement.&lt;br /&gt;
&lt;br /&gt;
== Séance 2 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Lors de cette séance, nous avons réalisé le premier circuit sur le FPGA. &lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un circuit simple, qui envoie en permanence l'état des huit phototransistors au port série. Les phototransistors sont alors directement reliés à celui-ci. Nous avons pu tester le bon fonctionnement du système grâce aux diodes du FPGA. Nous avons branché en parallèle sur le circuit les huit diodes, afin de vérifier qu'un signal était bien envoyé en permanence, on a pu les voir s'éteindre lorsqu'on éclairait un laser. &lt;br /&gt;
Ces diodes se sont avérées très utiles, car il n'est pas encore possible d'effectuer les tests sur le port série, car la partie informatique n'est pas encore opérationnelle, on ne peut donc pas lire directement sur le port série pour le moment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi constant ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite réalisé un montage permettant de faire l'envoi seulement sur changement d'état, comme prévu à la séance 1 Nous avons donc réalisé un système de bascules permettant de comparer l'état actuel de chaque diode avec son état précédent, puis de réaliser l'envoi seulement si une différence était observée. Comme précédemment, les diodes sont reliées directement au Port Série, mais cette fois-ci au lieu de brancher le Bit d'envoi du port Série sur un Vcc, soit un '1' logique, nous l'avons relié à la vérification de changement d'état, qui passe à '1' uniquement avec un changement d'état.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi sur changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème qui s'est alors posé était de savoir si on envoyait le signal assez longtemps pour qu'il puisse être lu. En effet on envoie un signal seulement si il y a changement d'état, et cette vérification se fait à chaque incrément d'horloge. Hors, la différence sera donc observée sur un seul incrément d'horloge, par conséquent, on n'envoie de signal que pendant ce seul incrément. Pour l'instant, nous supposons que le port série est capable de stocker les données à envoyer en un seul incrément d'horloge. &lt;br /&gt;
Cependant, si lors des tests, ça ne fonctionne pas, nous prévoyons d'utiliser un compteur pour pouvoir envoyer le signal plus longtemps au Bit d'envoi du port série, et ainsi laisser le temps au port série d'envoyer l'information.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous nous sommes focalisés sur le FPGA, mais nous avons néanmoins terminé la conception du boitier de la harpe, sous la forme de trois 'boites' crénelées, que nous avons ensuite l'intention de découper au FabLab puis d'assembler.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos des boites ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il s'est avéré que réaliser des boites crénelées rendrait tout le boitier beaucoup plus solide, et donc fiable.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le problème de l'impossibilité d'utiliser l'exemple sur les sockets a été résolu, grâce à l'intervention de M. Redon. Le problème était une différence de version de la distribution Linux entre le RPi utilisé et celle utilisé pour l'exemple. En effet, le RPi de travail est sur une distribution Wheezy, alors que la version la plus récente est la Jessie. Les chemins des dépots des sources de la librairie libwebsocket n’existant pas sur Wheezy, on ne pouvait installer la librairie directement en ligne de commande. M. Redon a ajouté le chemin de la librairie dans le gestionnaire de paquet du RPi et on a pu utiliser sans problèmes la librairie. De plus le site du paquet libwebsocket n'était inaccessible que temporairement.&lt;br /&gt;
La séance a été consacré à comprendre le fonctionnement des sockets et comment l'exemple html interagissait avec.&lt;br /&gt;
&lt;br /&gt;
La partie importante du code d'exemple est la suivante : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;static int callback_my(&lt;br /&gt;
  struct libwebsocket_context * this,&lt;br /&gt;
  struct libwebsocket *wsi,enum libwebsocket_callback_reasons reason,&lt;br /&gt;
  void *user,void *in,size_t len)&lt;br /&gt;
 {&lt;br /&gt;
 static char *message=NULL;&lt;br /&gt;
 static int msize=0;&lt;br /&gt;
 switch(reason){&lt;br /&gt;
  case LWS_CALLBACK_ESTABLISHED:&lt;br /&gt;
    printf(&amp;quot;connection established\n&amp;quot;);&lt;br /&gt;
    message=NULL;&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_RECEIVE:&lt;br /&gt;
                // Ici sont traites les messages envoyes par le navigateur&lt;br /&gt;
    printf(&amp;quot;received data: %s\n&amp;quot;,(char *)in);&lt;br /&gt;
    message=malloc(len+LWS_SEND_BUFFER_PRE_PADDING+LWS_SEND_BUFFER_POST_PADDING);&lt;br /&gt;
    if(message==NULL){ perror(&amp;quot;callback_my.malloc&amp;quot;); exit(EXIT_FAILURE); }&lt;br /&gt;
    memcpy(message+LWS_SEND_BUFFER_PRE_PADDING,in,len);&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    msize=len;&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_SERVER_WRITEABLE:&lt;br /&gt;
                // Ici sont envoyes les messages au navigateur&lt;br /&gt;
    if(message!=NULL){&lt;br /&gt;
      char *out=message+LWS_SEND_BUFFER_PRE_PADDING;&lt;br /&gt;
      libwebsocket_write(wsi,(unsigned char *)out,msize,LWS_WRITE_TEXT);&lt;br /&gt;
      free(message);&lt;br /&gt;
      message=NULL;&lt;br /&gt;
      }&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    break;&lt;br /&gt;
  }&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
Il s'agit d'une fonction de callback gérant à la fois la réception et la transmission. On peut remarquer 3 cas du switch : LWS_CALLBACK_ESTABLISHED correspondant à la création d'un lien entre la page web et le serveur websocket à la demande de la page web, LWS_CALLBACK_RECEIVE correspondant aux actions à entreprendre à la réception d'un message provenant du navigateur web, et LWS_CALLBACK_SERVER_WRITEABLE correspondant aux actions afin d'envoyer un message au navigateur.&lt;br /&gt;
&lt;br /&gt;
Coté HTML, on utilise les sockets grâce à ce code suivant :&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;pre&amp;gt;window.WebSocket=(window.WebSocket||window.MozWebSocket);&lt;br /&gt;
 var websocket=new WebSocket('ws://127.0.0.1:9000','myprotocol');&lt;br /&gt;
 websocket.onopen=function(){ $('h1').css('color','green'); };&lt;br /&gt;
 websocket.onerror=function(){ $('h1').css('color','red'); };&lt;br /&gt;
 websocket.onmessage=function(message){&lt;br /&gt;
 console.log(message.data);&lt;br /&gt;
 $('#messages').append($('&amp;lt;p&amp;gt;',{ text: message.data }));&lt;br /&gt;
 };&lt;br /&gt;
 function sendMessage(){&lt;br /&gt;
 websocket.send($('#message').val());&lt;br /&gt;
 $('#message').val('');&lt;br /&gt;
 }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La fonction websocket.onmessage gère le traitement à faire coté client quand le serveur envoie des informations, et la fonction sendMessage permet l'envoie d'information du client vers le serveur.&lt;br /&gt;
&lt;br /&gt;
Pour notre projet, nous avons besoin principalement, dans un premier temps, d'envoyer des informations du serveur vers le client, nous nous sommes donc concentrer à comprendre et modifier les parties du code fourni suivantes : websocket.onmessage coté client et le &amp;quot;case LWS_CALLBACK_SERVER_WRITEABLE:&amp;quot; coté serveur.&lt;br /&gt;
&lt;br /&gt;
Le but des tests était de réussir à faire jouer deux sons différents par le client, avec changement de son imposé par le serveur. HTML5 propose nativement de lire des sons à partir d'une source grâce à une balise audio :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;audio controls=&amp;quot;controls&amp;quot; id=&amp;quot;mySound&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/audio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On récupère l'identifiant de cette balise avec &lt;br /&gt;
&lt;br /&gt;
 var test1 = document.getElementById(&amp;quot;mySound&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
afin de pouvoir l'utiliser de n'importe où dans le programme.&lt;br /&gt;
On définit la source grâce à &lt;br /&gt;
&lt;br /&gt;
 test1.src=&amp;quot;sound.mp3&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
avec &amp;quot;sound.mp3&amp;quot; le chemin d'accès au fichier son par rapport à l'emplacement du fichier html sur le serveur. Ici, le fichier son sound.mp3 est dans le même dossier que la page index.html.&lt;br /&gt;
Enfin, on peut lire le son avec &lt;br /&gt;
&lt;br /&gt;
 test1.play();&lt;br /&gt;
&lt;br /&gt;
Le but du projet étant d'émettre en continue le son généré par la harpe, l'objectif ici est soit de générer un fichier de streaming que l'on lit en continue, soit de lire un fichier différent par son possible et on change la valeur de test1.src en fonction du son à lire, soit on lit toujours la même source, mais que l'on modifie à la volée en fonction du son voulu. La première option a été étudiée jusqu'en fin de séance.&lt;br /&gt;
Nous n'avons pas réussi à comprendre comment générer un fichier de streaming audio simple, de plus toutes les documentations et exemples trouvés ne concernant qu'un streaming simultanée de son et de vidéo à partir d'une caméra et d'un micro, et nous n'avons pas compris comment adapter ces exemples.&lt;br /&gt;
&lt;br /&gt;
== Séance 3 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous avons pu tester l'envoi sur changement d'état, toujours avec les diodes du FPGA.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par ajouter une horloge sur le détecteur de changement d'état, afin d'augmenter le nombre d'incréments d'horloge sur lequel il est à '1', et ce dans le but de rendre le clignotement d'un diode visible à l’œil nu.&lt;br /&gt;
Ensuite, nous avons relié la sortie du détecteur de changement d'état et des phototransistors par un 'ET' logique, que nous avons ensuite relié aux diodes du FPGA.&lt;br /&gt;
De cette façon, si l'on détecte un changement d'état sur un phototransistor, la nouvelle valeur est alors envoyée sur les diodes. Le système a fonctionné (à voir :p ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos du test avec changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite passé le reste de la séance à mettre en commun notre partie avec la partie informatique, en essayant de leur permettre de lire sur le port série du FPGA. Les essais ont pour l'instant été infructueux, mais des progrès ont été faits. &lt;br /&gt;
&lt;br /&gt;
L'objectif étant que le Raspberry Pi puisse lire les informations envoyées par le FPGA, pour ensuite les transmettre au site Web que nous allons réaliser par la suite.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Au vu des difficultés rencontrées lors de la mise en place d'un véritable système de streaming, nous avons décider d'étudier les autres options possibles.&lt;br /&gt;
Notre deuxième solution était de modifier la valeur de test1.src. Mais cela voulait dire effectuer beaucoup de traitement coté client, et si on décidait de rajouter beaucoup de son, ou de générer de nouveaux fichiers son, ce la demandait soit de modifier le HTML à chaque ajout de fonctionnalité, ou de créer une grande quantité de fichier son qui pollueraient le serveur. Nous avons donc décidé qu'il serait plus pratique de toujours écraser la source avec le nouveau son a lire, et de ne jamais changer la valeur de test1.src.&lt;br /&gt;
&lt;br /&gt;
Afin d'effectuer des tests afin de voir si notre idée marchait bien, nous avons utiliser le code C très simple suivant :&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;pre&amp;gt;int cpt;&lt;br /&gt;
  for (cpt = 0; cpt &amp;lt; 250000000; cpt++);&lt;br /&gt;
&lt;br /&gt;
    boole = !boole;&lt;br /&gt;
	printf(&amp;quot;changement: %d\n&amp;quot;,boole);&lt;br /&gt;
    if(boole)&lt;br /&gt;
      system(&amp;quot;sudo cp Level-complete-sound-effect.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
      system(&amp;quot;sudo cp Raindrops-noise.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce code nous permet de modifier assez fréquemment le fichier source. Les fichiers audio de tests ont été trouvé sur http://www.orangefreesounds.com/ et sont libre de droit.&lt;br /&gt;
&lt;br /&gt;
Dans la page HTML de test nous utilisé les options de la balise source suivante :&lt;br /&gt;
&lt;br /&gt;
 test1.loop = true;&lt;br /&gt;
&lt;br /&gt;
qui permet au son de se jouer en boucle.&lt;br /&gt;
&lt;br /&gt;
Bien que les fichiers soit bien modifiés en local sur le serveur, toujours le même son est joué.&lt;br /&gt;
&lt;br /&gt;
On a donc testé de recharger le son uniquement lorsque le son est modifié, avec un envoi de message du serveur par socket.&lt;br /&gt;
Le serveur est conçu tel que suit : &lt;br /&gt;
  &amp;lt;pre&amp;gt;while(1){&lt;br /&gt;
  int cpt;&lt;br /&gt;
  bool boole;&lt;br /&gt;
  boole = 1;&lt;br /&gt;
  for (cpt = 0; cpt &amp;lt; 50000; cpt++);&lt;br /&gt;
&lt;br /&gt;
    boole = !boole;&lt;br /&gt;
&lt;br /&gt;
    if(boole)&lt;br /&gt;
      system(&amp;quot;cp Level-complete-sound-effect.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
      system(&amp;quot;cp Raindrops-noise.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      libwebsocket_write(test,(unsigned char *)out,1,LWS_WRITE_TEXT);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
 libwebsocket_context_destroy(context);&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On modifie la source, et ensuite on envoi un message, dont le contenu n'est pas important, le message sert juste d'indication au client que la source a changé.&lt;br /&gt;
&lt;br /&gt;
Le code coté client : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;websocket.onmessage=function(message){&lt;br /&gt;
 test1.pause();&lt;br /&gt;
 test1.load();&lt;br /&gt;
 test1.play();&lt;br /&gt;
 };&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A la réception d'un message, on pause le son avec test1.pause() puis on recharge le son afin d'aller chercher la valeur actuelle de la source, puis on relance le son avec test1.play().&lt;br /&gt;
D'après la documentation technique de HTML5, la fonction load() est sensé recharger la source si elle a changé, mais le résultat de ce test n'est pas concluant : le client joue toujours le même son.&lt;br /&gt;
Nous ne comprenons pas pourquoi.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 1 : Réalisation du site Web ==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé ce site web lors de notre temps libre afin de permettre la communication entre le Raspberry Pi et l'ordinateur. En effet, il était inclus dans notre projet de devoir réaliser une communication par internet. Ce site internet va donc remplir cette condition. Sur celui-ci, on pourra trouver une brève description de notre projet, un lien vers le wiki, une image exemple d'un harpe et les boutons Play et Pause qui permettent d'activer et de désactiver la harpe laser.&lt;br /&gt;
==== Partie websocket et échange d'information ====&lt;br /&gt;
Après de nombreux tests sur la communication entre le serveur et le client web et le problème de toujours lire le même son, même si la source a été modifié, il s'est avéré que le client lisait toujours le même son quoi qu'il arrive, même si le fichier cible n’existait plus sur le serveur. Comprendre pourquoi a nécessité quelque recherche et la source du problème était la suivante : les navigateurs utilisés, Mozilla Firefox et Google Chrome, mettaient en cache le fichier son à la première lecture, et ne vérifiait plus l'état du fichier sur le serveur, fichier qui donc pouvait être modifié sans que cela n'ai un impact sur le déroulement coté client. Il a fallut trouver un moyen de contourner le cache. N'ayant aucune connaissance sur le domaine, les recherches ont été infructueuses. Suite à une conversation avec M. Rudametkin, nous avons été orienté vers ce lien https://stackoverflow.com/questions/1077041/refresh-image-with-a-new-one-at-the-same-url/1077051#1077051 qui nous a permit de résoudre le problème.&lt;br /&gt;
En utilisant la commande : &lt;br /&gt;
&lt;br /&gt;
 test1.src=&amp;quot;sound.mp3?&amp;quot;+ new Date().getTime();&lt;br /&gt;
&lt;br /&gt;
nous trompons le cache en forçant la revérification de la source sur le serveur. Grâce a cette méthode nous avons enfin réussi à modifier le son joué par le client, et nous avons pu passer à la gestion de la communication série entre le RPi et le FPGA/Arduino.&lt;br /&gt;
&lt;br /&gt;
Le code fonctionnel de la page web est le suivant : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;audio controls=&amp;quot;controls&amp;quot; id=&amp;quot;mySound&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/audio&amp;gt;&lt;br /&gt;
    &amp;lt;script&lt;br /&gt;
        src=&amp;quot;jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.WebSocket=(window.WebSocket||window.MozWebSocket);&lt;br /&gt;
&lt;br /&gt;
var websocket=new WebSocket('ws://10.42.93:9000','myprotocol');&lt;br /&gt;
var test1 = document.getElementById(&amp;quot;mySound&amp;quot;);&lt;br /&gt;
test1.src=&amp;quot;sound.mp3&amp;quot;;&lt;br /&gt;
test1.autoplay = true;&lt;br /&gt;
websocket.onopen=function(){ $('h1').css('color','green'); };&lt;br /&gt;
&lt;br /&gt;
websocket.onerror=function(){ $('h1').css('color','red'); };&lt;br /&gt;
&lt;br /&gt;
websocket.onmessage=function(message){&lt;br /&gt;
test1.pause();&lt;br /&gt;
test1.src=&amp;quot;sound.mp3?&amp;quot;+ new Date().getTime();&lt;br /&gt;
test1.load();&lt;br /&gt;
test1.play();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function sendMessage(){&lt;br /&gt;
websocket.send($('#message').val());&lt;br /&gt;
$('#message').val('');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var son = document.getELementById(&amp;quot;sound&amp;quot;);&lt;br /&gt;
son.loop = true;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt;WebSockets test&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;message&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;button onclick=&amp;quot;sendMessage();&amp;quot;&amp;gt;Send&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce code n'est pas la version final, juste l'ensemble des parties logiques et fonctionnelles de la page web.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 2 : Réalisation du programme secondaire sur Arduino 'en cas de problèmes' ==&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis à plusieurs occasions en dehors des heures de projet afin d'avancer sur notre harpe. Nous avons donc décidé que nous devions réaliser un programme sur Arduino nous permettant de réaliser des tests de transmission par la liaison série sans avoir besoin du FPGA. Dans un premier temps, nous avons tenté d'utiliser le port USB comme liaison série. Cependant, il s'est avéré que le Raspberry pi ne pouvait pas lire son port USB, ce qui nous a donc forcé à utiliser les pins de communication série de l'Arduino. &lt;br /&gt;
Nous sommes sur un Arduino Mega 2560, nous avons a notre disposition plusieurs pins de communication série différents. Ils seront utilisés uniquement en transmission. Pour communiquer, nous allons ensuite utiliser le pin Tx1. Nous aboutissons donc au programme suivant:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Setup.PNG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Captprog.PNG]]&lt;br /&gt;
&lt;br /&gt;
La communication série de ce programme nous a causé des problèmes, surtout du fait que l'ordinateur ne recevait pas les informations transmises par l'Arduino. Nous avons donc du effectuer de multiples tests afin de voir où se situait le problème. Nous avons pu déterminer que nous avions un problème au niveau de notre pont diviseur de tension entre l'alimentation de l’Arduino et celle du Raspberry Pi, nous avons alors changé les résistances.&lt;br /&gt;
Nous avons également notamment modifié le programme afin de vérifier que l'information était bien transmise sur le Pin Série de l'Arduino, et que le problème ne venait donc pas de l'Arduino mais bien du Raspberry, dont le port série était mal configuré.&lt;br /&gt;
&lt;br /&gt;
==== Connexion série coté RPi ====&lt;br /&gt;
==== Connexion série coté RPi ====&lt;br /&gt;
Afin de lire sur la liaison séri du coté de RPi, nous avions écrit le code C suivant : &lt;br /&gt;
 &amp;lt;pre&amp;gt;#include &amp;lt;stdio.h&amp;gt;   /* Standard input/output definitions */&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;  /* String function definitions */&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;  /* UNIX standard function definitions */&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;   /* File control definitions */&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;   /* Error number definitions */&lt;br /&gt;
#include &amp;lt;termios.h&amp;gt; /* POSIX terminal control definitions */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Lecture port série&lt;br /&gt;
&lt;br /&gt;
typedef int serialPort;&lt;br /&gt;
serialPort SerialLib_open(const char * portPath);&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char **argv) {&lt;br /&gt;
   serialPort p = SerialLib_open(&amp;quot;/dev/ttyAMA0&amp;quot;); &lt;br /&gt;
   char buffer[1];&lt;br /&gt;
	printf(&amp;quot;ouverture reussi\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
while(1){&lt;br /&gt;
&lt;br /&gt;
printf(&amp;quot;lecture d'un caractere\n&amp;quot;);&lt;br /&gt;
   read(p, buffer ,1);&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;Message recu: %s \n&amp;quot;,buffer);&lt;br /&gt;
}&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Ouverture du port &lt;br /&gt;
 * &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
serialPort SerialLib_open(const char * serialPortPath) {&lt;br /&gt;
   int fd; &lt;br /&gt;
&lt;br /&gt;
   fd = open(serialPortPath, O_RDWR | O_NOCTTY);&lt;br /&gt;
   if (fd == -1) {&lt;br /&gt;
      &lt;br /&gt;
      printf(&amp;quot;Could not open the serial port : %s - &amp;quot;, serialPortPath);&lt;br /&gt;
   }else {&lt;br /&gt;
      fcntl(fd, F_SETFL, 0);&lt;br /&gt;
   }&lt;br /&gt;
   return (serialPort)fd;&lt;br /&gt;
} &lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce code, combiné avec le programme sur l'Arduino, était sensé permettre la réception d'un caractère sur le RPi et l'afficher sur la sortie standard sur RPi.&lt;br /&gt;
Nous avons eu beaucoup de problème à recevoir notre message avec ce code : en effet, pour une raison qui nous reste inconnue, le programme permet la réception des caractères voulus, mais sur une courte période de temps, puis après cette période, aucun caractère n'est reçu, que l'on relance le serveur ou l'arduino.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 3 : Assemblage de la boite et mise en place des composants ==&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43774</id>
		<title>Projet IMA3 P5, 2016/2017, TD1</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43774"/>
				<updated>2017-06-12T11:01:33Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : /* Projet IMA3-SC 2016/2017 : Synt'Harpe (Sainte) Laser */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet IMA3-SC 2016/2017 : Synt'Harpe (Sainte) Laser =&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Description du système ===&lt;br /&gt;
&lt;br /&gt;
Pour le projet Système Communicant, nous allons réaliser une harpe laser. Notre but est de créer un instrument de musique similaire à une harpe, où les cordes sont remplacées par des capteurs infra-rouges.&lt;br /&gt;
&lt;br /&gt;
Un son sera émis par l'ordinateur dès que le capteur IR captera une main et le joueur pourra avec son autre main moduler l'amplitude de la note.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on travaillera sur une gamme de son sur 8 bits. Puis, nous implémenterons une banque de sons qui nous permettra de sélectionner l'instrument désiré, d'où l'appellation Synt'Harpe.&lt;br /&gt;
&lt;br /&gt;
L'ordinateur décidera du fonctionnement ou non de la harpe. C'est aussi grâce à lui qu'on pourra choisir la banque de sons voulue.&lt;br /&gt;
&lt;br /&gt;
Toutes les banques de sons seront enregistrées sur le Raspberry.&lt;br /&gt;
Les LEDs signaleront l'emplacement des cordes.&lt;br /&gt;
&lt;br /&gt;
Pour la partie optionnelle, on remplacera les LEDs par des lasers pour un effet visuel de qualité (plus poussé). La fumée permettra de voir les lasers.&lt;br /&gt;
&lt;br /&gt;
=== Le matériel ===&lt;br /&gt;
* Un raspberry pi&lt;br /&gt;
* 8 phototransistors&lt;br /&gt;
* 8 émetteurs lasers&lt;br /&gt;
* Des résistances&lt;br /&gt;
* Une structure&lt;br /&gt;
* Carte d'acquisition de type Arduino au début puis FPGA &lt;br /&gt;
* Un ordinateur&lt;br /&gt;
* Une alimentation&lt;br /&gt;
&lt;br /&gt;
=== Optionnel (visuel) ===&lt;br /&gt;
&lt;br /&gt;
* 8 émetteurs laser&lt;br /&gt;
* Un générateur de fumée&lt;br /&gt;
* Une caméra&lt;br /&gt;
&lt;br /&gt;
== Séance 1 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Le but de cette première séance était de se répartir les tâches, de tester le matériel mit à disposition et de découvrir le fonctionnement du FPGA.&lt;br /&gt;
&lt;br /&gt;
Le principe de fonctionnement de la harpe est le suivant:&lt;br /&gt;
Chaque capteur sera situé en face d'un laser. Les capteurs seront dans la partie haute de la harpe afin de limiter les interférences dues à d'autres sources lumineuses. Chaque laser pointera vers un capteur. &lt;br /&gt;
&lt;br /&gt;
 * Ajout du dessin de la harpe * &lt;br /&gt;
&lt;br /&gt;
Les capteurs enverront tous par défaut la même valeur au FPGA. Quand l'utilisateur passera sa main dans la harpe, un faisceau laser sera coupé. Le capteur n'enverra plus sa valeur seuil au FPGA, il aura donc changé d'état.&lt;br /&gt;
Dès lors que le FPGA détectera un changement d'état, il enverra l'état dans lequel se trouvent les 8 capteurs au Raspberry. &lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé des tests sur les phototransistors et les lasers. Nous avons mis en parallèle un laser et deux capteurs, sans oublier leur résistance de 1.2k Ohms chacune. &lt;br /&gt;
&lt;br /&gt;
Nous avons vu que à luminosité ambiante, quand le laser pointe sur le capteur, celui-ci envoie à l'Arduino une valeur de 950 environ. Ensuite, quand le faisceau laser est coupé, la valeur envoyée par le phototransistor monte à 1020.&lt;br /&gt;
Puis, nous avons réitéré l'expérience en mettant le système dans une boîte. Cette fois, le valeur est passée de 840 quand le capteur est éclairé par le laser à 900 quand le faisceau est coupé.&lt;br /&gt;
Nous en avons déduit que nous allons devoir refaire l'expérience une fois la harpe assemblée.&lt;br /&gt;
&lt;br /&gt;
Les lasers étant très directionnels tout comme les phototransistors, nous n'aurons pas de soucis d'interférences. Un capteur détectera uniquement le laser situé directement en face de lui et non ceux de son voisinage.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Même si il peut paraitre futile d'insérer une partie boitier dans un projet centré sur l'informatique et l'électronique, il s'est avéré que le boitier de notre Harpe nécessitait une attention particulière.&lt;br /&gt;
&lt;br /&gt;
La taille de la harpe à été un sujet de débat, et nous avons réalisé des tests afin de vérifier que des phototransistors trop proches les uns des autres n'allait pas compromettre le bon fonctionnement de la harpe dans son ensemble. En effet, si le phototransistor détectait un autre laser que celui vers lequel il pointe serait extrêmement problématique. Heureusement, il s'est avéré que les phototransistors sont très directionnels, au point que se pose désormais le problème inverse.&lt;br /&gt;
&lt;br /&gt;
Nous allons devoir faire très attention au fait que les lasers soient bien fixés et pointent exactement vers les phototransistors, car dans le cas contraire, ceux-ci ne détectent absolument pas le laser, et tout le principe de fonctionnement s'effondre. La conception et l'assemblage de la boite devront donc être relativement précis, pour éviter ces problèmes.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons dès le départ décidé d'éviter l'utilisation de diodes infra-rouges, pour leur préférer les lasers. Tout d'abord, parce que les diodes ne sont en aucun cas assez puissantes pour être détectées par les phototransistors, ce qui une fois de plus rend notre harpe inutile. Ensuite, parce qu'il nous a semblé que réaliser une harpe 'laser' sans lasers était un concept déconcertant, et enlève beaucoup de l’intérêt de ce projet.&lt;br /&gt;
&lt;br /&gt;
Un premier jet de design avait été réalisé avant cette séance, et au vu des données récoltées pendant celle-ci, nous l'avons modifié pour les prendre en compte, notamment la taille des lasers par rapport aux diodes, et la précision requise. &lt;br /&gt;
&lt;br /&gt;
'insérer photos premiers schémas ici'&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le travail a été séparé en 2 parties, une personne par partie : &lt;br /&gt;
- une première partie sur le serveur même (page web, système de streaming de son depuis la page web)&lt;br /&gt;
- une seconde partie sur la lecture du port série&lt;br /&gt;
&lt;br /&gt;
==== Partie serveur ====&lt;br /&gt;
La première séance a été consacré à deux grands axes : prendre la main à distance sur le raspberry pi et mettre en place le serveur web.&lt;br /&gt;
Afin de pouvoir contrôler et travailler facilement sur le RPi, l'outil vncserver a été installé sur le raspberry, permettant de contrôler via un interface graphique le RPi depuis un ordinateur branché sur le même réseau. Cet utilitaire permettra a l'avenir de travailler directement sur le RPi sans devoir constamment uploader par ssh le travail effectué.&lt;br /&gt;
&lt;br /&gt;
Coté mise en place du serveur web, l'utilitaire de serveur web apache2 a été installé sans soucis, et les pages d'exemples web et javascript fonctionnent. En revanche, l'utilisation du code d'exemple sur les sockets n'est pas utilisable, le paquet proposé n’existe pas et le site du paquet de socket est mort.&lt;br /&gt;
Le reste de la séance a été consacré a des recherches sur les moyens de pouvoir streamer du son, recherches non concluantes. Aucune solution n'a été trouvé sans passer par un service internet hébergé par un tier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Partie lecture port série ====&lt;br /&gt;
&lt;br /&gt;
Cette première séance fut consacrée à la sélection du langage de programmation et à sa prise en main. Il a été décidé d'utiliser Python pour écrire le programme récupérant et traitant les données récupérées à travers le port série. Python étant un langage fort usité, il possède une très large documentation. Ce fut donc facile de trouver la librairie permettant de lire les données envoyées par le port série.&lt;br /&gt;
&lt;br /&gt;
Un doute subsiste encore sur le type de données envoyé par le port série. L'idéal serait de récupérer un tableau de 8 entiers de type binaire correspondant aux états des 8 ports liés aux &amp;quot;cordes&amp;quot; laser, pour pouvoir ensuite traiter ces données facilement.&lt;br /&gt;
&lt;br /&gt;
== Séance 2 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Lors de cette séance, nous avons réalisé le premier circuit sur le FPGA. &lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un circuit simple, qui envoie en permanence l'état des huit phototransistors au port série. Les phototransistors sont alors directement reliés à celui-ci. Nous avons pu tester le bon fonctionnement du système grâce aux diodes du FPGA. Nous avons branché en parallèle sur le circuit les huit diodes, afin de vérifier qu'un signal était bien envoyé en permanence, on a pu les voir s'éteindre lorsqu'on éclairait un laser. &lt;br /&gt;
Ces diodes se sont avérées très utiles, car il n'est pas encore possible d'effectuer les tests sur le port série, car la partie informatique n'est pas encore opérationnelle, on ne peut donc pas lire directement sur le port série pour le moment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi constant ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite réalisé un montage permettant de faire l'envoi seulement sur changement d'état, comme prévu à la séance 1 Nous avons donc réalisé un système de bascules permettant de comparer l'état actuel de chaque diode avec son état précédent, puis de réaliser l'envoi seulement si une différence était observée. Comme précédemment, les diodes sont reliées directement au Port Série, mais cette fois-ci au lieu de brancher le Bit d'envoi du port Série sur un Vcc, soit un '1' logique, nous l'avons relié à la vérification de changement d'état, qui passe à '1' uniquement avec un changement d'état.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi sur changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème qui s'est alors posé était de savoir si on envoyait le signal assez longtemps pour qu'il puisse être lu. En effet on envoie un signal seulement si il y a changement d'état, et cette vérification se fait à chaque incrément d'horloge. Hors, la différence sera donc observée sur un seul incrément d'horloge, par conséquent, on n'envoie de signal que pendant ce seul incrément. Pour l'instant, nous supposons que le port série est capable de stocker les données à envoyer en un seul incrément d'horloge. &lt;br /&gt;
Cependant, si lors des tests, ça ne fonctionne pas, nous prévoyons d'utiliser un compteur pour pouvoir envoyer le signal plus longtemps au Bit d'envoi du port série, et ainsi laisser le temps au port série d'envoyer l'information.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous nous sommes focalisés sur le FPGA, mais nous avons néanmoins terminé la conception du boitier de la harpe, sous la forme de trois 'boites' crénelées, que nous avons ensuite l'intention de découper au FabLab puis d'assembler.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos des boites ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il s'est avéré que réaliser des boites crénelées rendrait tout le boitier beaucoup plus solide, et donc fiable.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le problème de l'impossibilité d'utiliser l'exemple sur les sockets a été résolu, grâce à l'intervention de M. Redon. Le problème était une différence de version de la distribution Linux entre le RPi utilisé et celle utilisé pour l'exemple. En effet, le RPi de travail est sur une distribution Wheezy, alors que la version la plus récente est la Jessie. Les chemins des dépots des sources de la librairie libwebsocket n’existant pas sur Wheezy, on ne pouvait installer la librairie directement en ligne de commande. M. Redon a ajouté le chemin de la librairie dans le gestionnaire de paquet du RPi et on a pu utiliser sans problèmes la librairie. De plus le site du paquet libwebsocket n'était inaccessible que temporairement.&lt;br /&gt;
La séance a été consacré à comprendre le fonctionnement des sockets et comment l'exemple html interagissait avec.&lt;br /&gt;
&lt;br /&gt;
La partie importante du code d'exemple est la suivante : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;static int callback_my(&lt;br /&gt;
  struct libwebsocket_context * this,&lt;br /&gt;
  struct libwebsocket *wsi,enum libwebsocket_callback_reasons reason,&lt;br /&gt;
  void *user,void *in,size_t len)&lt;br /&gt;
 {&lt;br /&gt;
 static char *message=NULL;&lt;br /&gt;
 static int msize=0;&lt;br /&gt;
 switch(reason){&lt;br /&gt;
  case LWS_CALLBACK_ESTABLISHED:&lt;br /&gt;
    printf(&amp;quot;connection established\n&amp;quot;);&lt;br /&gt;
    message=NULL;&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_RECEIVE:&lt;br /&gt;
                // Ici sont traites les messages envoyes par le navigateur&lt;br /&gt;
    printf(&amp;quot;received data: %s\n&amp;quot;,(char *)in);&lt;br /&gt;
    message=malloc(len+LWS_SEND_BUFFER_PRE_PADDING+LWS_SEND_BUFFER_POST_PADDING);&lt;br /&gt;
    if(message==NULL){ perror(&amp;quot;callback_my.malloc&amp;quot;); exit(EXIT_FAILURE); }&lt;br /&gt;
    memcpy(message+LWS_SEND_BUFFER_PRE_PADDING,in,len);&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    msize=len;&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_SERVER_WRITEABLE:&lt;br /&gt;
                // Ici sont envoyes les messages au navigateur&lt;br /&gt;
    if(message!=NULL){&lt;br /&gt;
      char *out=message+LWS_SEND_BUFFER_PRE_PADDING;&lt;br /&gt;
      libwebsocket_write(wsi,(unsigned char *)out,msize,LWS_WRITE_TEXT);&lt;br /&gt;
      free(message);&lt;br /&gt;
      message=NULL;&lt;br /&gt;
      }&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    break;&lt;br /&gt;
  }&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
Il s'agit d'une fonction de callback gérant à la fois la réception et la transmission. On peut remarquer 3 cas du switch : LWS_CALLBACK_ESTABLISHED correspondant à la création d'un lien entre la page web et le serveur websocket à la demande de la page web, LWS_CALLBACK_RECEIVE correspondant aux actions à entreprendre à la réception d'un message provenant du navigateur web, et LWS_CALLBACK_SERVER_WRITEABLE correspondant aux actions afin d'envoyer un message au navigateur.&lt;br /&gt;
&lt;br /&gt;
Coté HTML, on utilise les sockets grâce à ce code suivant :&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;pre&amp;gt;window.WebSocket=(window.WebSocket||window.MozWebSocket);&lt;br /&gt;
 var websocket=new WebSocket('ws://127.0.0.1:9000','myprotocol');&lt;br /&gt;
 websocket.onopen=function(){ $('h1').css('color','green'); };&lt;br /&gt;
 websocket.onerror=function(){ $('h1').css('color','red'); };&lt;br /&gt;
 websocket.onmessage=function(message){&lt;br /&gt;
 console.log(message.data);&lt;br /&gt;
 $('#messages').append($('&amp;lt;p&amp;gt;',{ text: message.data }));&lt;br /&gt;
 };&lt;br /&gt;
 function sendMessage(){&lt;br /&gt;
 websocket.send($('#message').val());&lt;br /&gt;
 $('#message').val('');&lt;br /&gt;
 }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La fonction websocket.onmessage gère le traitement à faire coté client quand le serveur envoie des informations, et la fonction sendMessage permet l'envoie d'information du client vers le serveur.&lt;br /&gt;
&lt;br /&gt;
Pour notre projet, nous avons besoin principalement, dans un premier temps, d'envoyer des informations du serveur vers le client, nous nous sommes donc concentrer à comprendre et modifier les parties du code fourni suivantes : websocket.onmessage coté client et le &amp;quot;case LWS_CALLBACK_SERVER_WRITEABLE:&amp;quot; coté serveur.&lt;br /&gt;
&lt;br /&gt;
Le but des tests était de réussir à faire jouer deux sons différents par le client, avec changement de son imposé par le serveur. HTML5 propose nativement de lire des sons à partir d'une source grâce à une balise audio :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;audio controls=&amp;quot;controls&amp;quot; id=&amp;quot;mySound&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/audio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On récupère l'identifiant de cette balise avec &lt;br /&gt;
&lt;br /&gt;
 var test1 = document.getElementById(&amp;quot;mySound&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
afin de pouvoir l'utiliser de n'importe où dans le programme.&lt;br /&gt;
On définit la source grâce à &lt;br /&gt;
&lt;br /&gt;
 test1.src=&amp;quot;sound.mp3&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
avec &amp;quot;sound.mp3&amp;quot; le chemin d'accès au fichier son par rapport à l'emplacement du fichier html sur le serveur. Ici, le fichier son sound.mp3 est dans le même dossier que la page index.html.&lt;br /&gt;
Enfin, on peut lire le son avec &lt;br /&gt;
&lt;br /&gt;
 test1.play();&lt;br /&gt;
&lt;br /&gt;
Le but du projet étant d'émettre en continue le son généré par la harpe, l'objectif ici est soit de générer un fichier de streaming que l'on lit en continue, soit de lire un fichier différent par son possible et on change la valeur de test1.src en fonction du son à lire, soit on lit toujours la même source, mais que l'on modifie à la volée en fonction du son voulu. La première option a été étudiée jusqu'en fin de séance.&lt;br /&gt;
Nous n'avons pas réussi à comprendre comment générer un fichier de streaming audio simple, de plus toutes les documentations et exemples trouvés ne concernant qu'un streaming simultanée de son et de vidéo à partir d'une caméra et d'un micro, et nous n'avons pas compris comment adapter ces exemples.&lt;br /&gt;
&lt;br /&gt;
== Séance 3 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous avons pu tester l'envoi sur changement d'état, toujours avec les diodes du FPGA.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par ajouter une horloge sur le détecteur de changement d'état, afin d'augmenter le nombre d'incréments d'horloge sur lequel il est à '1', et ce dans le but de rendre le clignotement d'un diode visible à l’œil nu.&lt;br /&gt;
Ensuite, nous avons relié la sortie du détecteur de changement d'état et des phototransistors par un 'ET' logique, que nous avons ensuite relié aux diodes du FPGA.&lt;br /&gt;
De cette façon, si l'on détecte un changement d'état sur un phototransistor, la nouvelle valeur est alors envoyée sur les diodes. Le système a fonctionné (à voir :p ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos du test avec changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite passé le reste de la séance à mettre en commun notre partie avec la partie informatique, en essayant de leur permettre de lire sur le port série du FPGA. Les essais ont pour l'instant été infructueux, mais des progrès ont été faits. &lt;br /&gt;
&lt;br /&gt;
L'objectif étant que le Raspberry Pi puisse lire les informations envoyées par le FPGA, pour ensuite les transmettre au site Web que nous allons réaliser par la suite.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Au vu des difficultés rencontrées lors de la mise en place d'un véritable système de streaming, nous avons décider d'étudier les autres options possibles.&lt;br /&gt;
Notre deuxième solution était de modifier la valeur de test1.src. Mais cela voulait dire effectuer beaucoup de traitement coté client, et si on décidait de rajouter beaucoup de son, ou de générer de nouveaux fichiers son, ce la demandait soit de modifier le HTML à chaque ajout de fonctionnalité, ou de créer une grande quantité de fichier son qui pollueraient le serveur. Nous avons donc décidé qu'il serait plus pratique de toujours écraser la source avec le nouveau son a lire, et de ne jamais changer la valeur de test1.src.&lt;br /&gt;
&lt;br /&gt;
Afin d'effectuer des tests afin de voir si notre idée marchait bien, nous avons utiliser le code C très simple suivant :&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;pre&amp;gt;int cpt;&lt;br /&gt;
  for (cpt = 0; cpt &amp;lt; 250000000; cpt++);&lt;br /&gt;
&lt;br /&gt;
    boole = !boole;&lt;br /&gt;
	printf(&amp;quot;changement: %d\n&amp;quot;,boole);&lt;br /&gt;
    if(boole)&lt;br /&gt;
      system(&amp;quot;sudo cp Level-complete-sound-effect.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
      system(&amp;quot;sudo cp Raindrops-noise.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce code nous permet de modifier assez fréquemment le fichier source. Les fichiers audio de tests ont été trouvé sur http://www.orangefreesounds.com/ et sont libre de droit.&lt;br /&gt;
&lt;br /&gt;
Dans la page HTML de test nous utilisé les options de la balise source suivante :&lt;br /&gt;
&lt;br /&gt;
 test1.loop = true;&lt;br /&gt;
&lt;br /&gt;
qui permet au son de se jouer en boucle.&lt;br /&gt;
&lt;br /&gt;
Bien que les fichiers soit bien modifiés en local sur le serveur, toujours le même son est joué.&lt;br /&gt;
&lt;br /&gt;
On a donc testé de recharger le son uniquement lorsque le son est modifié, avec un envoi de message du serveur par socket.&lt;br /&gt;
Le serveur est conçu tel que suit : &lt;br /&gt;
  &amp;lt;pre&amp;gt;while(1){&lt;br /&gt;
  int cpt;&lt;br /&gt;
  bool boole;&lt;br /&gt;
  boole = 1;&lt;br /&gt;
  for (cpt = 0; cpt &amp;lt; 50000; cpt++);&lt;br /&gt;
&lt;br /&gt;
    boole = !boole;&lt;br /&gt;
&lt;br /&gt;
    if(boole)&lt;br /&gt;
      system(&amp;quot;cp Level-complete-sound-effect.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
      system(&amp;quot;cp Raindrops-noise.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      libwebsocket_write(test,(unsigned char *)out,1,LWS_WRITE_TEXT);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
 libwebsocket_context_destroy(context);&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On modifie la source, et ensuite on envoi un message, dont le contenu n'est pas important, le message sert juste d'indication au client que la source a changé.&lt;br /&gt;
&lt;br /&gt;
Le code coté client : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;websocket.onmessage=function(message){&lt;br /&gt;
 test1.pause();&lt;br /&gt;
 test1.load();&lt;br /&gt;
 test1.play();&lt;br /&gt;
 };&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A la réception d'un message, on pause le son avec test1.pause() puis on recharge le son afin d'aller chercher la valeur actuelle de la source, puis on relance le son avec test1.play().&lt;br /&gt;
D'après la documentation technique de HTML5, la fonction load() est sensé recharger la source si elle a changé, mais le résultat de ce test n'est pas concluant : le client joue toujours le même son.&lt;br /&gt;
Nous ne comprenons pas pourquoi.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 1 : Réalisation du site Web ==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé ce site web lors de notre temps libre afin de permettre la communication entre le Raspberry Pi et l'ordinateur. En effet, il était inclus dans notre projet de devoir réaliser une communication par internet. Ce site internet va donc remplir cette condition. Sur celui-ci, on pourra trouver une brève description de notre projet, un lien vers le wiki, une image exemple d'un harpe et les boutons Play et Pause qui permettent d'activer et de désactiver la harpe laser.&lt;br /&gt;
==== Partie websocket et échange d'information ====&lt;br /&gt;
Après de nombreux tests sur la communication entre le serveur et le client web et le problème de toujours lire le même son, même si la source a été modifié, il s'est avéré que le client lisait toujours le même son quoi qu'il arrive, même si le fichier cible n’existait plus sur le serveur. Comprendre pourquoi a nécessité quelque recherche et la source du problème était la suivante : les navigateurs utilisés, Mozilla Firefox et Google Chrome, mettaient en cache le fichier son à la première lecture, et ne vérifiait plus l'état du fichier sur le serveur, fichier qui donc pouvait être modifié sans que cela n'ai un impact sur le déroulement coté client. Il a fallut trouver un moyen de contourner le cache. N'ayant aucune connaissance sur le domaine, les recherches ont été infructueuses. Suite à une conversation avec M. Rudametkin, nous avons été orienté vers ce lien https://stackoverflow.com/questions/1077041/refresh-image-with-a-new-one-at-the-same-url/1077051#1077051 qui nous a permit de résoudre le problème.&lt;br /&gt;
En utilisant la commande : &lt;br /&gt;
&lt;br /&gt;
 test1.src=&amp;quot;sound.mp3?&amp;quot;+ new Date().getTime();&lt;br /&gt;
&lt;br /&gt;
nous trompons le cache en forçant la revérification de la source sur le serveur. Grâce a cette méthode nous avons enfin réussi à modifier le son joué par le client, et nous avons pu passer à la gestion de la communication série entre le RPi et le FPGA/Arduino.&lt;br /&gt;
&lt;br /&gt;
Le code fonctionnel de la page web est le suivant : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;audio controls=&amp;quot;controls&amp;quot; id=&amp;quot;mySound&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/audio&amp;gt;&lt;br /&gt;
    &amp;lt;script&lt;br /&gt;
        src=&amp;quot;jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.WebSocket=(window.WebSocket||window.MozWebSocket);&lt;br /&gt;
&lt;br /&gt;
var websocket=new WebSocket('ws://10.42.93:9000','myprotocol');&lt;br /&gt;
var test1 = document.getElementById(&amp;quot;mySound&amp;quot;);&lt;br /&gt;
test1.src=&amp;quot;sound.mp3&amp;quot;;&lt;br /&gt;
test1.autoplay = true;&lt;br /&gt;
websocket.onopen=function(){ $('h1').css('color','green'); };&lt;br /&gt;
&lt;br /&gt;
websocket.onerror=function(){ $('h1').css('color','red'); };&lt;br /&gt;
&lt;br /&gt;
websocket.onmessage=function(message){&lt;br /&gt;
test1.pause();&lt;br /&gt;
test1.src=&amp;quot;sound.mp3?&amp;quot;+ new Date().getTime();&lt;br /&gt;
test1.load();&lt;br /&gt;
test1.play();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function sendMessage(){&lt;br /&gt;
websocket.send($('#message').val());&lt;br /&gt;
$('#message').val('');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var son = document.getELementById(&amp;quot;sound&amp;quot;);&lt;br /&gt;
son.loop = true;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt;WebSockets test&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;message&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;button onclick=&amp;quot;sendMessage();&amp;quot;&amp;gt;Send&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce code n'est pas la version final, juste l'ensemble des parties logiques et fonctionnelles de la page web.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 2 : Réalisation du programme secondaire sur Arduino 'en cas de problèmes' ==&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis à plusieurs occasions en dehors des heures de projet afin d'avancer sur notre harpe. Nous avons donc décidé que nous devions réaliser un programme sur Arduino nous permettant de réaliser des tests de transmission par la liaison série sans avoir besoin du FPGA. Dans un premier temps, nous avons tenté d'utiliser le port USB comme liaison série. Cependant, il s'est avéré que le Raspberry pi ne pouvait pas lire son port USB, ce qui nous a donc forcé à utiliser les pins de communication série de l'Arduino. &lt;br /&gt;
Nous sommes sur un Arduino Mega 2560, nous avons a notre disposition plusieurs pins de communication série différents. Ils seront utilisés uniquement en transmission. Pour communiquer, nous allons ensuite utiliser le pin Tx1. Nous aboutissons donc au programme suivant:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Setup.PNG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Captprog.PNG]]&lt;br /&gt;
&lt;br /&gt;
La communication série de ce programme nous a causé des problèmes, surtout du fait que l'ordinateur ne recevait pas les informations transmises par l'Arduino. Nous avons donc du effectuer de multiples tests afin de voir où se situait le problème. Nous avons pu déterminer que nous avions un problème au niveau de notre pont diviseur de tension entre l'alimentation de l’Arduino et celle du Raspberry Pi, nous avons alors changé les résistances.&lt;br /&gt;
Nous avons également notamment modifié le programme afin de vérifier que l'information était bien transmise sur le Pin Série de l'Arduino, et que le problème ne venait donc pas de l'Arduino mais bien du Raspberry, dont le port série était mal configuré.&lt;br /&gt;
&lt;br /&gt;
==== Connexion série coté RPi ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 3 : Assemblage de la boite et mise en place des composants ==&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43773</id>
		<title>Projet IMA3 P5, 2016/2017, TD1</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43773"/>
				<updated>2017-06-12T11:00:37Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : /* Projet IMA3-SC 2016/2017 : Synt'Harpe (Sainte) Laser */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet IMA3-SC 2016/2017 : Synt'Harpe (Sainte) Laser =&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Description du système ===&lt;br /&gt;
&lt;br /&gt;
Pour le projet Système Communicant, nous allons réaliser une harpe laser. Notre but est de créer un instrument de musique similaire à une harpe, où les cordes sont remplacées par des capteurs infra-rouges.&lt;br /&gt;
&lt;br /&gt;
Un son sera émis par l'ordinateur dès que le capteur IR captera une main et le joueur pourra avec son autre main moduler l'amplitude de la note.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on travaillera sur une gamme de son sur 8 bits. Puis, nous implémenterons une banque de sons qui nous permettra de sélectionner l'instrument désiré, d'où l'appellation Synt'Harpe.&lt;br /&gt;
&lt;br /&gt;
L'ordinateur décidera du fonctionnement ou non de la harpe. C'est aussi grâce à lui qu'on pourra choisir la banque de sons voulue.&lt;br /&gt;
&lt;br /&gt;
Toutes les banques de sons seront enregistrées sur le Raspberry.&lt;br /&gt;
Les LEDs signaleront l'emplacement des cordes.&lt;br /&gt;
&lt;br /&gt;
Pour la partie optionnelle, on remplacera les LEDs par des lasers pour un effet visuel de qualité (plus poussé). La fumée permettra de voir les lasers.&lt;br /&gt;
&lt;br /&gt;
=== Le matériel ===&lt;br /&gt;
* Un raspberry pi&lt;br /&gt;
* 8 phototransistors&lt;br /&gt;
* 8 émetteurs lasers&lt;br /&gt;
* Des résistances&lt;br /&gt;
* Une structure&lt;br /&gt;
* Carte d'acquisition de type Arduino au début puis FPGA &lt;br /&gt;
* Un ordinateur&lt;br /&gt;
* Une alimentation&lt;br /&gt;
&lt;br /&gt;
=== Optionnel (visuel) ===&lt;br /&gt;
&lt;br /&gt;
* 8 émetteurs laser&lt;br /&gt;
* Un générateur de fumée&lt;br /&gt;
* Une caméra&lt;br /&gt;
&lt;br /&gt;
== Séance 1 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Le but de cette première séance était de se répartir les tâches, de tester le matériel mit à disposition et de découvrir le fonctionnement du FPGA.&lt;br /&gt;
&lt;br /&gt;
Le principe de fonctionnement de la harpe est le suivant:&lt;br /&gt;
Chaque capteur sera situé en face d'un laser. Les capteurs seront dans la partie haute de la harpe afin de limiter les interférences dues à d'autres sources lumineuses. Chaque laser pointera vers un capteur. &lt;br /&gt;
&lt;br /&gt;
 * Ajout du dessin de la harpe * &lt;br /&gt;
&lt;br /&gt;
Les capteurs enverront tous par défaut la même valeur au FPGA. Quand l'utilisateur passera sa main dans la harpe, un faisceau laser sera coupé. Le capteur n'enverra plus sa valeur seuil au FPGA, il aura donc changé d'état.&lt;br /&gt;
Dès lors que le FPGA détectera un changement d'état, il enverra l'état dans lequel se trouvent les 8 capteurs au Raspberry. &lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé des tests sur les phototransistors et les lasers. Nous avons mis en parallèle un laser et deux capteurs, sans oublier leur résistance de 1.2k Ohms chacune. &lt;br /&gt;
&lt;br /&gt;
Nous avons vu que à luminosité ambiante, quand le laser pointe sur le capteur, celui-ci envoie à l'Arduino une valeur de 950 environ. Ensuite, quand le faisceau laser est coupé, la valeur envoyée par le phototransistor monte à 1020.&lt;br /&gt;
Puis, nous avons réitéré l'expérience en mettant le système dans une boîte. Cette fois, le valeur est passée de 840 quand le capteur est éclairé par le laser à 900 quand le faisceau est coupé.&lt;br /&gt;
Nous en avons déduit que nous allons devoir refaire l'expérience une fois la harpe assemblée.&lt;br /&gt;
&lt;br /&gt;
Les lasers étant très directionnels tout comme les phototransistors, nous n'aurons pas de soucis d'interférences. Un capteur détectera uniquement le laser situé directement en face de lui et non ceux de son voisinage.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Même si il peut paraitre futile d'insérer une partie boitier dans un projet centré sur l'informatique et l'électronique, il s'est avéré que le boitier de notre Harpe nécessitait une attention particulière.&lt;br /&gt;
&lt;br /&gt;
La taille de la harpe à été un sujet de débat, et nous avons réalisé des tests afin de vérifier que des phototransistors trop proches les uns des autres n'allait pas compromettre le bon fonctionnement de la harpe dans son ensemble. En effet, si le phototransistor détectait un autre laser que celui vers lequel il pointe serait extrêmement problématique. Heureusement, il s'est avéré que les phototransistors sont très directionnels, au point que se pose désormais le problème inverse.&lt;br /&gt;
&lt;br /&gt;
Nous allons devoir faire très attention au fait que les lasers soient bien fixés et pointent exactement vers les phototransistors, car dans le cas contraire, ceux-ci ne détectent absolument pas le laser, et tout le principe de fonctionnement s'effondre. La conception et l'assemblage de la boite devront donc être relativement précis, pour éviter ces problèmes.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons dès le départ décidé d'éviter l'utilisation de diodes infra-rouges, pour leur préférer les lasers. Tout d'abord, parce que les diodes ne sont en aucun cas assez puissantes pour être détectées par les phototransistors, ce qui une fois de plus rend notre harpe inutile. Ensuite, parce qu'il nous a semblé que réaliser une harpe 'laser' sans lasers était un concept déconcertant, et enlève beaucoup de l’intérêt de ce projet.&lt;br /&gt;
&lt;br /&gt;
Un premier jet de design avait été réalisé avant cette séance, et au vu des données récoltées pendant celle-ci, nous l'avons modifié pour les prendre en compte, notamment la taille des lasers par rapport aux diodes, et la précision requise. &lt;br /&gt;
&lt;br /&gt;
'insérer photos premiers schémas ici'&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le travail a été séparé en 2 parties, une personne par partie : &lt;br /&gt;
- une première partie sur le serveur même (page web, système de streaming de son depuis la page web)&lt;br /&gt;
- une seconde partie sur la lecture du port série&lt;br /&gt;
&lt;br /&gt;
==== Partie serveur ====&lt;br /&gt;
La première séance a été consacré à deux grands axes : prendre la main à distance sur le raspberry pi et mettre en place le serveur web.&lt;br /&gt;
Afin de pouvoir contrôler et travailler facilement sur le RPi, l'outil vncserver a été installé sur le raspberry, permettant de contrôler via un interface graphique le RPi depuis un ordinateur branché sur le même réseau. Cet utilitaire permettra a l'avenir de travailler directement sur le RPi sans devoir constamment uploader par ssh le travail effectué.&lt;br /&gt;
&lt;br /&gt;
Coté mise en place du serveur web, l'utilitaire de serveur web apache2 a été installé sans soucis, et les pages d'exemples web et javascript fonctionnent. En revanche, l'utilisation du code d'exemple sur les sockets n'est pas utilisable, le paquet proposé n’existe pas et le site du paquet de socket est mort.&lt;br /&gt;
Le reste de la séance a été consacré a des recherches sur les moyens de pouvoir streamer du son, recherches non concluantes. Aucune solution n'a été trouvé sans passer par un service internet hébergé par un tier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Partie lecture port série ====&lt;br /&gt;
&lt;br /&gt;
Cette première séance fut consacrée à la sélection du langage de programmation et à sa prise en main. Il a été décidé d'utiliser Python pour écrire le programme récupérant et traitant les données récupérées à travers le port série. Python étant un langage fort usité, il possède une très large documentation. Ce fut donc facile de trouver la librairie permettant de lire les données envoyées par le port série.&lt;br /&gt;
&lt;br /&gt;
Un doute subsiste encore sur le type de données envoyé par le port série. L'idéal serait de récupérer un tableau de 8 entiers de type binaire correspondant aux états des 8 ports liés aux &amp;quot;cordes&amp;quot; laser, pour pouvoir ensuite traiter ces données facilement.&lt;br /&gt;
&lt;br /&gt;
== Séance 2 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Lors de cette séance, nous avons réalisé le premier circuit sur le FPGA. &lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un circuit simple, qui envoie en permanence l'état des huit phototransistors au port série. Les phototransistors sont alors directement reliés à celui-ci. Nous avons pu tester le bon fonctionnement du système grâce aux diodes du FPGA. Nous avons branché en parallèle sur le circuit les huit diodes, afin de vérifier qu'un signal était bien envoyé en permanence, on a pu les voir s'éteindre lorsqu'on éclairait un laser. &lt;br /&gt;
Ces diodes se sont avérées très utiles, car il n'est pas encore possible d'effectuer les tests sur le port série, car la partie informatique n'est pas encore opérationnelle, on ne peut donc pas lire directement sur le port série pour le moment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi constant ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite réalisé un montage permettant de faire l'envoi seulement sur changement d'état, comme prévu à la séance 1 Nous avons donc réalisé un système de bascules permettant de comparer l'état actuel de chaque diode avec son état précédent, puis de réaliser l'envoi seulement si une différence était observée. Comme précédemment, les diodes sont reliées directement au Port Série, mais cette fois-ci au lieu de brancher le Bit d'envoi du port Série sur un Vcc, soit un '1' logique, nous l'avons relié à la vérification de changement d'état, qui passe à '1' uniquement avec un changement d'état.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi sur changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème qui s'est alors posé était de savoir si on envoyait le signal assez longtemps pour qu'il puisse être lu. En effet on envoie un signal seulement si il y a changement d'état, et cette vérification se fait à chaque incrément d'horloge. Hors, la différence sera donc observée sur un seul incrément d'horloge, par conséquent, on n'envoie de signal que pendant ce seul incrément. Pour l'instant, nous supposons que le port série est capable de stocker les données à envoyer en un seul incrément d'horloge. &lt;br /&gt;
Cependant, si lors des tests, ça ne fonctionne pas, nous prévoyons d'utiliser un compteur pour pouvoir envoyer le signal plus longtemps au Bit d'envoi du port série, et ainsi laisser le temps au port série d'envoyer l'information.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous nous sommes focalisés sur le FPGA, mais nous avons néanmoins terminé la conception du boitier de la harpe, sous la forme de trois 'boites' crénelées, que nous avons ensuite l'intention de découper au FabLab puis d'assembler.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos des boites ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il s'est avéré que réaliser des boites crénelées rendrait tout le boitier beaucoup plus solide, et donc fiable.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le problème de l'impossibilité d'utiliser l'exemple sur les sockets a été résolu, grâce à l'intervention de M. Redon. Le problème était une différence de version de la distribution Linux entre le RPi utilisé et celle utilisé pour l'exemple. En effet, le RPi de travail est sur une distribution Wheezy, alors que la version la plus récente est la Jessie. Les chemins des dépots des sources de la librairie libwebsocket n’existant pas sur Wheezy, on ne pouvait installer la librairie directement en ligne de commande. M. Redon a ajouté le chemin de la librairie dans le gestionnaire de paquet du RPi et on a pu utiliser sans problèmes la librairie. De plus le site du paquet libwebsocket n'était inaccessible que temporairement.&lt;br /&gt;
La séance a été consacré à comprendre le fonctionnement des sockets et comment l'exemple html interagissait avec.&lt;br /&gt;
&lt;br /&gt;
La partie importante du code d'exemple est la suivante : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;static int callback_my(&lt;br /&gt;
  struct libwebsocket_context * this,&lt;br /&gt;
  struct libwebsocket *wsi,enum libwebsocket_callback_reasons reason,&lt;br /&gt;
  void *user,void *in,size_t len)&lt;br /&gt;
 {&lt;br /&gt;
 static char *message=NULL;&lt;br /&gt;
 static int msize=0;&lt;br /&gt;
 switch(reason){&lt;br /&gt;
  case LWS_CALLBACK_ESTABLISHED:&lt;br /&gt;
    printf(&amp;quot;connection established\n&amp;quot;);&lt;br /&gt;
    message=NULL;&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_RECEIVE:&lt;br /&gt;
                // Ici sont traites les messages envoyes par le navigateur&lt;br /&gt;
    printf(&amp;quot;received data: %s\n&amp;quot;,(char *)in);&lt;br /&gt;
    message=malloc(len+LWS_SEND_BUFFER_PRE_PADDING+LWS_SEND_BUFFER_POST_PADDING);&lt;br /&gt;
    if(message==NULL){ perror(&amp;quot;callback_my.malloc&amp;quot;); exit(EXIT_FAILURE); }&lt;br /&gt;
    memcpy(message+LWS_SEND_BUFFER_PRE_PADDING,in,len);&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    msize=len;&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_SERVER_WRITEABLE:&lt;br /&gt;
                // Ici sont envoyes les messages au navigateur&lt;br /&gt;
    if(message!=NULL){&lt;br /&gt;
      char *out=message+LWS_SEND_BUFFER_PRE_PADDING;&lt;br /&gt;
      libwebsocket_write(wsi,(unsigned char *)out,msize,LWS_WRITE_TEXT);&lt;br /&gt;
      free(message);&lt;br /&gt;
      message=NULL;&lt;br /&gt;
      }&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    break;&lt;br /&gt;
  }&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
Il s'agit d'une fonction de callback gérant à la fois la réception et la transmission. On peut remarquer 3 cas du switch : LWS_CALLBACK_ESTABLISHED correspondant à la création d'un lien entre la page web et le serveur websocket à la demande de la page web, LWS_CALLBACK_RECEIVE correspondant aux actions à entreprendre à la réception d'un message provenant du navigateur web, et LWS_CALLBACK_SERVER_WRITEABLE correspondant aux actions afin d'envoyer un message au navigateur.&lt;br /&gt;
&lt;br /&gt;
Coté HTML, on utilise les sockets grâce à ce code suivant :&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;pre&amp;gt;window.WebSocket=(window.WebSocket||window.MozWebSocket);&lt;br /&gt;
 var websocket=new WebSocket('ws://127.0.0.1:9000','myprotocol');&lt;br /&gt;
 websocket.onopen=function(){ $('h1').css('color','green'); };&lt;br /&gt;
 websocket.onerror=function(){ $('h1').css('color','red'); };&lt;br /&gt;
 websocket.onmessage=function(message){&lt;br /&gt;
 console.log(message.data);&lt;br /&gt;
 $('#messages').append($('&amp;lt;p&amp;gt;',{ text: message.data }));&lt;br /&gt;
 };&lt;br /&gt;
 function sendMessage(){&lt;br /&gt;
 websocket.send($('#message').val());&lt;br /&gt;
 $('#message').val('');&lt;br /&gt;
 }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La fonction websocket.onmessage gère le traitement à faire coté client quand le serveur envoie des informations, et la fonction sendMessage permet l'envoie d'information du client vers le serveur.&lt;br /&gt;
&lt;br /&gt;
Pour notre projet, nous avons besoin principalement, dans un premier temps, d'envoyer des informations du serveur vers le client, nous nous sommes donc concentrer à comprendre et modifier les parties du code fourni suivantes : websocket.onmessage coté client et le &amp;quot;case LWS_CALLBACK_SERVER_WRITEABLE:&amp;quot; coté serveur.&lt;br /&gt;
&lt;br /&gt;
Le but des tests était de réussir à faire jouer deux sons différents par le client, avec changement de son imposé par le serveur. HTML5 propose nativement de lire des sons à partir d'une source grâce à une balise audio :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;audio controls=&amp;quot;controls&amp;quot; id=&amp;quot;mySound&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/audio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On récupère l'identifiant de cette balise avec &lt;br /&gt;
&lt;br /&gt;
 var test1 = document.getElementById(&amp;quot;mySound&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
afin de pouvoir l'utiliser de n'importe où dans le programme.&lt;br /&gt;
On définit la source grâce à &lt;br /&gt;
&lt;br /&gt;
 test1.src=&amp;quot;sound.mp3&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
avec &amp;quot;sound.mp3&amp;quot; le chemin d'accès au fichier son par rapport à l'emplacement du fichier html sur le serveur. Ici, le fichier son sound.mp3 est dans le même dossier que la page index.html.&lt;br /&gt;
Enfin, on peut lire le son avec &lt;br /&gt;
&lt;br /&gt;
 test1.play();&lt;br /&gt;
&lt;br /&gt;
Le but du projet étant d'émettre en continue le son généré par la harpe, l'objectif ici est soit de générer un fichier de streaming que l'on lit en continue, soit de lire un fichier différent par son possible et on change la valeur de test1.src en fonction du son à lire, soit on lit toujours la même source, mais que l'on modifie à la volée en fonction du son voulu. La première option a été étudiée jusqu'en fin de séance.&lt;br /&gt;
Nous n'avons pas réussi à comprendre comment générer un fichier de streaming audio simple, de plus toutes les documentations et exemples trouvés ne concernant qu'un streaming simultanée de son et de vidéo à partir d'une caméra et d'un micro, et nous n'avons pas compris comment adapter ces exemples.&lt;br /&gt;
&lt;br /&gt;
== Séance 3 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous avons pu tester l'envoi sur changement d'état, toujours avec les diodes du FPGA.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par ajouter une horloge sur le détecteur de changement d'état, afin d'augmenter le nombre d'incréments d'horloge sur lequel il est à '1', et ce dans le but de rendre le clignotement d'un diode visible à l’œil nu.&lt;br /&gt;
Ensuite, nous avons relié la sortie du détecteur de changement d'état et des phototransistors par un 'ET' logique, que nous avons ensuite relié aux diodes du FPGA.&lt;br /&gt;
De cette façon, si l'on détecte un changement d'état sur un phototransistor, la nouvelle valeur est alors envoyée sur les diodes. Le système a fonctionné (à voir :p ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos du test avec changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite passé le reste de la séance à mettre en commun notre partie avec la partie informatique, en essayant de leur permettre de lire sur le port série du FPGA. Les essais ont pour l'instant été infructueux, mais des progrès ont été faits. &lt;br /&gt;
&lt;br /&gt;
L'objectif étant que le Raspberry Pi puisse lire les informations envoyées par le FPGA, pour ensuite les transmettre au site Web que nous allons réaliser par la suite.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Au vu des difficultés rencontrées lors de la mise en place d'un véritable système de streaming, nous avons décider d'étudier les autres options possibles.&lt;br /&gt;
Notre deuxième solution était de modifier la valeur de test1.src. Mais cela voulait dire effectuer beaucoup de traitement coté client, et si on décidait de rajouter beaucoup de son, ou de générer de nouveaux fichiers son, ce la demandait soit de modifier le HTML à chaque ajout de fonctionnalité, ou de créer une grande quantité de fichier son qui pollueraient le serveur. Nous avons donc décidé qu'il serait plus pratique de toujours écraser la source avec le nouveau son a lire, et de ne jamais changer la valeur de test1.src.&lt;br /&gt;
&lt;br /&gt;
Afin d'effectuer des tests afin de voir si notre idée marchait bien, nous avons utiliser le code C très simple suivant :&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;pre&amp;gt;int cpt;&lt;br /&gt;
  for (cpt = 0; cpt &amp;lt; 250000000; cpt++);&lt;br /&gt;
&lt;br /&gt;
    boole = !boole;&lt;br /&gt;
	printf(&amp;quot;changement: %d\n&amp;quot;,boole);&lt;br /&gt;
    if(boole)&lt;br /&gt;
      system(&amp;quot;sudo cp Level-complete-sound-effect.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
      system(&amp;quot;sudo cp Raindrops-noise.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce code nous permet de modifier assez fréquemment le fichier source. Les fichiers audio de tests ont été trouvé sur http://www.orangefreesounds.com/ et sont libre de droit.&lt;br /&gt;
&lt;br /&gt;
Dans la page HTML de test nous utilisé les options de la balise source suivante :&lt;br /&gt;
&lt;br /&gt;
 test1.loop = true;&lt;br /&gt;
&lt;br /&gt;
qui permet au son de se jouer en boucle.&lt;br /&gt;
&lt;br /&gt;
Bien que les fichiers soit bien modifiés en local sur le serveur, toujours le même son est joué.&lt;br /&gt;
&lt;br /&gt;
On a donc testé de recharger le son uniquement lorsque le son est modifié, avec un envoi de message du serveur par socket.&lt;br /&gt;
Le serveur est conçu tel que suit : &lt;br /&gt;
  &amp;lt;pre&amp;gt;while(1){&lt;br /&gt;
  int cpt;&lt;br /&gt;
  bool boole;&lt;br /&gt;
  boole = 1;&lt;br /&gt;
  for (cpt = 0; cpt &amp;lt; 50000; cpt++);&lt;br /&gt;
&lt;br /&gt;
    boole = !boole;&lt;br /&gt;
&lt;br /&gt;
    if(boole)&lt;br /&gt;
      system(&amp;quot;cp Level-complete-sound-effect.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
      system(&amp;quot;cp Raindrops-noise.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      libwebsocket_write(test,(unsigned char *)out,1,LWS_WRITE_TEXT);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
 libwebsocket_context_destroy(context);&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On modifie la source, et ensuite on envoi un message, dont le contenu n'est pas important, le message sert juste d'indication au client que la source a changé.&lt;br /&gt;
&lt;br /&gt;
Le code coté client : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;websocket.onmessage=function(message){&lt;br /&gt;
 test1.pause();&lt;br /&gt;
 test1.load();&lt;br /&gt;
 test1.play();&lt;br /&gt;
 };&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A la réception d'un message, on pause le son avec test1.pause() puis on recharge le son afin d'aller chercher la valeur actuelle de la source, puis on relance le son avec test1.play().&lt;br /&gt;
D'après la documentation technique de HTML5, la fonction load() est sensé recharger la source si elle a changé, mais le résultat de ce test n'est pas concluant : le client joue toujours le même son.&lt;br /&gt;
Nous ne comprenons pas pourquoi.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 1 : Réalisation du site Web ==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé ce site web lors de notre temps libre afin de permettre la communication entre le Raspberry Pi et l'ordinateur. En effet, il était inclus dans notre projet de devoir réaliser une communication par internet. Ce site internet va donc remplir cette condition. Sur celui-ci, on pourra trouver une brève description de notre projet, un lien vers le wiki, une image exemple d'un harpe et les boutons Play et Pause qui permettent d'activer et de désactiver la harpe laser.&lt;br /&gt;
==== Partie websocket et échange d'information ====&lt;br /&gt;
Après de nombreux tests sur la communication entre le serveur et le client web et le problème de toujours lire le même son, même si la source a été modifié, il s'est avéré que le client lisait toujours le même son quoi qu'il arrive, même si le fichier cible n’existait plus sur le serveur. Comprendre pourquoi a nécessité quelque recherche et la source du problème était la suivante : les navigateurs utilisés, Mozilla Firefox et Google Chrome, mettaient en cache le fichier son à la première lecture, et ne vérifiait plus l'état du fichier sur le serveur, fichier qui donc pouvait être modifié sans que cela n'ai un impact sur le déroulement coté client. Il a fallut trouver un moyen de contourner le cache. N'ayant aucune connaissance sur le domaine, les recherches ont été infructueuses. Suite à une conversation avec M. Rudametkin, nous avons été orienté vers ce lien https://stackoverflow.com/questions/1077041/refresh-image-with-a-new-one-at-the-same-url/1077051#1077051 qui nous a permit de résoudre le problème.&lt;br /&gt;
En utilisant la commande : &lt;br /&gt;
&lt;br /&gt;
 test1.src=&amp;quot;sound.mp3?&amp;quot;+ new Date().getTime();&lt;br /&gt;
&lt;br /&gt;
nous trompons le cache en forçant la revérification de la source sur le serveur. Grâce a cette méthode nous avons enfin réussi à modifier le son joué par le client, et nous avons pu passer à la gestion de la communication série entre le RPi et le FPGA/Arduino.&lt;br /&gt;
&lt;br /&gt;
Le code fonctionnel de la page web est le suivant : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;audio controls=&amp;quot;controls&amp;quot; id=&amp;quot;mySound&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/audio&amp;gt;&lt;br /&gt;
    &amp;lt;script&lt;br /&gt;
        src=&amp;quot;jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.WebSocket=(window.WebSocket||window.MozWebSocket);&lt;br /&gt;
&lt;br /&gt;
var websocket=new WebSocket('ws://10.42.93:9000','myprotocol');&lt;br /&gt;
var test1 = document.getElementById(&amp;quot;mySound&amp;quot;);&lt;br /&gt;
test1.src=&amp;quot;sound.mp3&amp;quot;;&lt;br /&gt;
test1.autoplay = true;&lt;br /&gt;
websocket.onopen=function(){ $('h1').css('color','green'); };&lt;br /&gt;
&lt;br /&gt;
websocket.onerror=function(){ $('h1').css('color','red'); };&lt;br /&gt;
&lt;br /&gt;
websocket.onmessage=function(message){&lt;br /&gt;
test1.pause();&lt;br /&gt;
test1.src=&amp;quot;sound.mp3?&amp;quot;+ new Date().getTime();&lt;br /&gt;
test1.load();&lt;br /&gt;
test1.play();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function sendMessage(){&lt;br /&gt;
websocket.send($('#message').val());&lt;br /&gt;
$('#message').val('');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var son = document.getELementById(&amp;quot;sound&amp;quot;);&lt;br /&gt;
son.loop = true;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt;WebSockets test&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;message&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;button onclick=&amp;quot;sendMessage();&amp;quot;&amp;gt;Send&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce code n'est pas la version final, juste l'ensemble des parties logiques et fonctionnelles de la page web.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 2 : Réalisation du programme secondaire sur Arduino 'en cas de problèmes' ==&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis à plusieurs occasions en dehors des heures de projet afin d'avancer sur notre harpe. Nous avons donc décidé que nous devions réaliser un programme sur Arduino nous permettant de réaliser des tests de transmission par la liaison série sans avoir besoin du FPGA. Dans un premier temps, nous avons tenté d'utiliser le port USB comme liaison série. Cependant, il s'est avéré que le Raspberry pi ne pouvait pas lire son port USB, ce qui nous a donc forcé à utiliser les pins de communication série de l'Arduino. &lt;br /&gt;
Nous sommes sur un Arduino Mega 2560, nous avons a notre disposition plusieurs pins de communication série différents. Ils seront utilisés uniquement en transmission. Pour communiquer, nous allons ensuite utiliser le pin Tx1. Nous aboutissons donc au programme suivant:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Setup.PNG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Captprog.PNG]]&lt;br /&gt;
&lt;br /&gt;
La communication série de ce programme nous a causé des problèmes, surtout du fait que l'ordinateur ne recevait pas les informations transmises par l'Arduino. Nous avons donc du effectuer de multiples tests afin de voir où se situait le problème. Nous avons pu déterminer que nous avions un problème au niveau de notre pont diviseur de tension entre l'alimentation de l’Arduino et celle du Raspberry Pi, nous avons alors changé les résistances.&lt;br /&gt;
Nous avons également notamment modifié le programme afin de vérifier que l'information était bien transmise sur le Pin Série de l'Arduino, et que le problème ne venait donc pas de l'Arduino mais bien du Raspberry, dont le port série était mal configuré.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 3 : Assemblage de la boite et mise en place des composants ==&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43750</id>
		<title>Projet IMA3 P5, 2016/2017, TD1</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43750"/>
				<updated>2017-06-12T10:09:15Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : /* Séance supplémentaire 2 : Réalisation du programme secondaire sur Arduino 'en cas de problèmes' */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet IMA3-SC 2016/2017 : Synt'Harpe (Sainte) Laser =&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Description du système ===&lt;br /&gt;
&lt;br /&gt;
Pour le projet Système Communicant, nous allons réaliser une harpe laser. Notre but est de créer un instrument de musique similaire à une harpe, où les cordes sont remplacées par des capteurs infra-rouges.&lt;br /&gt;
&lt;br /&gt;
Un son sera émis par l'ordinateur dès que le capteur IR captera une main et le joueur pourra avec son autre main moduler l'amplitude de la note.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on travaillera sur une gamme de son sur 8 bits. Puis, nous implémenterons une banque de sons qui nous permettra de sélectionner l'instrument désiré, d'où l'appellation Synt'Harpe.&lt;br /&gt;
&lt;br /&gt;
L'ordinateur décidera du fonctionnement ou non de la harpe. C'est aussi grâce à lui qu'on pourra choisir la banque de sons voulue.&lt;br /&gt;
&lt;br /&gt;
Toutes les banques de sons seront enregistrées sur le Raspberry.&lt;br /&gt;
Les LEDs signaleront l'emplacement des cordes.&lt;br /&gt;
&lt;br /&gt;
Pour la partie optionnelle, on remplacera les LEDs par des lasers pour un effet visuel de qualité (plus poussé). La fumée permettra de voir les lasers.&lt;br /&gt;
&lt;br /&gt;
=== Le matériel ===&lt;br /&gt;
* Un raspberry pi&lt;br /&gt;
* 8 phototransistors&lt;br /&gt;
* 8 émetteurs lasers&lt;br /&gt;
* Des résistances&lt;br /&gt;
* Une structure&lt;br /&gt;
* Carte d'acquisition de type Arduino au début puis FPGA &lt;br /&gt;
* Un ordinateur&lt;br /&gt;
* Une alimentation&lt;br /&gt;
&lt;br /&gt;
=== Optionnel (visuel) ===&lt;br /&gt;
&lt;br /&gt;
* 8 émetteurs laser&lt;br /&gt;
* Un générateur de fumée&lt;br /&gt;
* Une caméra&lt;br /&gt;
&lt;br /&gt;
== Séance 1 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Le but de cette première séance était de se répartir les tâches, de tester le matériel mit à disposition et de découvrir le fonctionnement du FPGA.&lt;br /&gt;
&lt;br /&gt;
Le principe de fonctionnement de la harpe est le suivant:&lt;br /&gt;
Chaque capteur sera situé en face d'un laser. Les capteurs seront dans la partie haute de la harpe afin de limiter les interférences dues à d'autres sources lumineuses. Chaque laser pointera vers un capteur. &lt;br /&gt;
&lt;br /&gt;
 * Ajout du dessin de la harpe * &lt;br /&gt;
&lt;br /&gt;
Les capteurs enverront tous par défaut la même valeur au FPGA. Quand l'utilisateur passera sa main dans la harpe, un faisceau laser sera coupé. Le capteur n'enverra plus sa valeur seuil au FPGA, il aura donc changé d'état.&lt;br /&gt;
Dès lors que le FPGA détectera un changement d'état, il enverra l'état dans lequel se trouvent les 8 capteurs au Raspberry. &lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé des tests sur les phototransistors et les lasers. Nous avons mis en parallèle un laser et deux capteurs, sans oublier leur résistance de 1.2k Ohms chacune. &lt;br /&gt;
&lt;br /&gt;
Nous avons vu que à luminosité ambiante, quand le laser pointe sur le capteur, celui-ci envoie à l'Arduino une valeur de 950 environ. Ensuite, quand le faisceau laser est coupé, la valeur envoyée par le phototransistor monte à 1020.&lt;br /&gt;
Puis, nous avons réitéré l'expérience en mettant le système dans une boîte. Cette fois, le valeur est passée de 840 quand le capteur est éclairé par le laser à 900 quand le faisceau est coupé.&lt;br /&gt;
Nous en avons déduit que nous allons devoir refaire l'expérience une fois la harpe assemblée.&lt;br /&gt;
&lt;br /&gt;
Les lasers étant très directionnels tout comme les phototransistors, nous n'aurons pas de soucis d'interférences. Un capteur détectera uniquement le laser situé directement en face de lui et non ceux de son voisinage.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Même si il peut paraitre futile d'insérer une partie boitier dans un projet centré sur l'informatique et l'électronique, il s'est avéré que le boitier de notre Harpe nécessitait une attention particulière.&lt;br /&gt;
&lt;br /&gt;
La taille de la harpe à été un sujet de débat, et nous avons réalisé des tests afin de vérifier que des phototransistors trop proches les uns des autres n'allait pas compromettre le bon fonctionnement de la harpe dans son ensemble. En effet, si le phototransistor détectait un autre laser que celui vers lequel il pointe serait extrêmement problématique. Heureusement, il s'est avéré que les phototransistors sont très directionnels, au point que se pose désormais le problème inverse.&lt;br /&gt;
&lt;br /&gt;
Nous allons devoir faire très attention au fait que les lasers soient bien fixés et pointent exactement vers les phototransistors, car dans le cas contraire, ceux-ci ne détectent absolument pas le laser, et tout le principe de fonctionnement s'effondre. La conception et l'assemblage de la boite devront donc être relativement précis, pour éviter ces problèmes.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons dès le départ décidé d'éviter l'utilisation de diodes infra-rouges, pour leur préférer les lasers. Tout d'abord, parce que les diodes ne sont en aucun cas assez puissantes pour être détectées par les phototransistors, ce qui une fois de plus rend notre harpe inutile. Ensuite, parce qu'il nous a semblé que réaliser une harpe 'laser' sans lasers était un concept déconcertant, et enlève beaucoup de l’intérêt de ce projet.&lt;br /&gt;
&lt;br /&gt;
Un premier jet de design avait été réalisé avant cette séance, et au vu des données récoltées pendant celle-ci, nous l'avons modifié pour les prendre en compte, notamment la taille des lasers par rapport aux diodes, et la précision requise. &lt;br /&gt;
&lt;br /&gt;
'insérer photos premiers schémas ici'&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le travail a été séparé en 2 parties, une personne par partie : &lt;br /&gt;
- une première partie sur le serveur même (page web, système de streaming de son depuis la page web)&lt;br /&gt;
- une seconde partie sur la lecture du port série&lt;br /&gt;
&lt;br /&gt;
==== Partie serveur ====&lt;br /&gt;
La première séance a été consacré à deux grands axes : prendre la main à distance sur le raspberry pi et mettre en place le serveur web.&lt;br /&gt;
Afin de pouvoir contrôler et travailler facilement sur le RPi, l'outil vncserver a été installé sur le raspberry, permettant de contrôler via un interface graphique le RPi depuis un ordinateur branché sur le même réseau. Cet utilitaire permettra a l'avenir de travailler directement sur le RPi sans devoir constamment uploader par ssh le travail effectué.&lt;br /&gt;
&lt;br /&gt;
Coté mise en place du serveur web, l'utilitaire de serveur web apache2 a été installé sans soucis, et les pages d'exemples web et javascript fonctionnent. En revanche, l'utilisation du code d'exemple sur les sockets n'est pas utilisable, le paquet proposé n’existe pas et le site du paquet de socket est mort.&lt;br /&gt;
Le reste de la séance a été consacré a des recherches sur les moyens de pouvoir streamer du son, recherches non concluantes. Aucune solution n'a été trouvé sans passer par un service internet hébergé par un tier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Partie lecture port série ====&lt;br /&gt;
&lt;br /&gt;
Cette première séance fut consacrée à la sélection du langage de programmation et à sa prise en main. Il a été décidé d'utiliser Python pour écrire le programme récupérant et traitant les données récupérées à travers le port série. Python étant un langage fort usité, il possède une très large documentation. Ce fut donc facile de trouver la librairie permettant de lire les données envoyées par le port série.&lt;br /&gt;
&lt;br /&gt;
Un doute subsiste encore sur le type de données envoyé par le port série. L'idéal serait de récupérer un tableau de 8 entiers de type binaire correspondant aux états des 8 ports liés aux &amp;quot;cordes&amp;quot; laser, pour pouvoir ensuite traiter ces données facilement.&lt;br /&gt;
&lt;br /&gt;
== Séance 2 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Lors de cette séance, nous avons réalisé le premier circuit sur le FPGA. &lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un circuit simple, qui envoie en permanence l'état des huit phototransistors au port série. Les phototransistors sont alors directement reliés à celui-ci. Nous avons pu tester le bon fonctionnement du système grâce aux diodes du FPGA. Nous avons branché en parallèle sur le circuit les huit diodes, afin de vérifier qu'un signal était bien envoyé en permanence, on a pu les voir s'éteindre lorsqu'on éclairait un laser. &lt;br /&gt;
Ces diodes se sont avérées très utiles, car il n'est pas encore possible d'effectuer les tests sur le port série, car la partie informatique n'est pas encore opérationnelle, on ne peut donc pas lire directement sur le port série pour le moment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi constant ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite réalisé un montage permettant de faire l'envoi seulement sur changement d'état, comme prévu à la séance 1 Nous avons donc réalisé un système de bascules permettant de comparer l'état actuel de chaque diode avec son état précédent, puis de réaliser l'envoi seulement si une différence était observée. Comme précédemment, les diodes sont reliées directement au Port Série, mais cette fois-ci au lieu de brancher le Bit d'envoi du port Série sur un Vcc, soit un '1' logique, nous l'avons relié à la vérification de changement d'état, qui passe à '1' uniquement avec un changement d'état.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi sur changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème qui s'est alors posé était de savoir si on envoyait le signal assez longtemps pour qu'il puisse être lu. En effet on envoie un signal seulement si il y a changement d'état, et cette vérification se fait à chaque incrément d'horloge. Hors, la différence sera donc observée sur un seul incrément d'horloge, par conséquent, on n'envoie de signal que pendant ce seul incrément. Pour l'instant, nous supposons que le port série est capable de stocker les données à envoyer en un seul incrément d'horloge. &lt;br /&gt;
Cependant, si lors des tests, ça ne fonctionne pas, nous prévoyons d'utiliser un compteur pour pouvoir envoyer le signal plus longtemps au Bit d'envoi du port série, et ainsi laisser le temps au port série d'envoyer l'information.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous nous sommes focalisés sur le FPGA, mais nous avons néanmoins terminé la conception du boitier de la harpe, sous la forme de trois 'boites' crénelées, que nous avons ensuite l'intention de découper au FabLab puis d'assembler.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos des boites ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il s'est avéré que réaliser des boites crénelées rendrait tout le boitier beaucoup plus solide, et donc fiable.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le problème de l'impossibilité d'utiliser l'exemple sur les sockets a été résolu, grâce à l'intervention de M. Redon. Le problème était une différence de version de la distribution Linux entre le RPi utilisé et celle utilisé pour l'exemple. En effet, le RPi de travail est sur une distribution Wheezy, alors que la version la plus récente est la Jessie. Les chemins des dépots des sources de la librairie libwebsocket n’existant pas sur Wheezy, on ne pouvait installer la librairie directement en ligne de commande. M. Redon a ajouté le chemin de la librairie dans le gestionnaire de paquet du RPi et on a pu utiliser sans problèmes la librairie. De plus le site du paquet libwebsocket n'était inaccessible que temporairement.&lt;br /&gt;
La séance a été consacré à comprendre le fonctionnement des sockets et comment l'exemple html interagissait avec.&lt;br /&gt;
&lt;br /&gt;
La partie importante du code d'exemple est la suivante : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;static int callback_my(&lt;br /&gt;
  struct libwebsocket_context * this,&lt;br /&gt;
  struct libwebsocket *wsi,enum libwebsocket_callback_reasons reason,&lt;br /&gt;
  void *user,void *in,size_t len)&lt;br /&gt;
 {&lt;br /&gt;
 static char *message=NULL;&lt;br /&gt;
 static int msize=0;&lt;br /&gt;
 switch(reason){&lt;br /&gt;
  case LWS_CALLBACK_ESTABLISHED:&lt;br /&gt;
    printf(&amp;quot;connection established\n&amp;quot;);&lt;br /&gt;
    message=NULL;&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_RECEIVE:&lt;br /&gt;
                // Ici sont traites les messages envoyes par le navigateur&lt;br /&gt;
    printf(&amp;quot;received data: %s\n&amp;quot;,(char *)in);&lt;br /&gt;
    message=malloc(len+LWS_SEND_BUFFER_PRE_PADDING+LWS_SEND_BUFFER_POST_PADDING);&lt;br /&gt;
    if(message==NULL){ perror(&amp;quot;callback_my.malloc&amp;quot;); exit(EXIT_FAILURE); }&lt;br /&gt;
    memcpy(message+LWS_SEND_BUFFER_PRE_PADDING,in,len);&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    msize=len;&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_SERVER_WRITEABLE:&lt;br /&gt;
                // Ici sont envoyes les messages au navigateur&lt;br /&gt;
    if(message!=NULL){&lt;br /&gt;
      char *out=message+LWS_SEND_BUFFER_PRE_PADDING;&lt;br /&gt;
      libwebsocket_write(wsi,(unsigned char *)out,msize,LWS_WRITE_TEXT);&lt;br /&gt;
      free(message);&lt;br /&gt;
      message=NULL;&lt;br /&gt;
      }&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    break;&lt;br /&gt;
  }&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
Il s'agit d'une fonction de callback gérant à la fois la réception et la transmission. On peut remarquer 3 cas du switch : LWS_CALLBACK_ESTABLISHED correspondant à la création d'un lien entre la page web et le serveur websocket à la demande de la page web, LWS_CALLBACK_RECEIVE correspondant aux actions à entreprendre à la réception d'un message provenant du navigateur web, et LWS_CALLBACK_SERVER_WRITEABLE correspondant aux actions afin d'envoyer un message au navigateur.&lt;br /&gt;
&lt;br /&gt;
Coté HTML, on utilise les sockets grâce à ce code suivant :&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;pre&amp;gt;window.WebSocket=(window.WebSocket||window.MozWebSocket);&lt;br /&gt;
 var websocket=new WebSocket('ws://127.0.0.1:9000','myprotocol');&lt;br /&gt;
 websocket.onopen=function(){ $('h1').css('color','green'); };&lt;br /&gt;
 websocket.onerror=function(){ $('h1').css('color','red'); };&lt;br /&gt;
 websocket.onmessage=function(message){&lt;br /&gt;
 console.log(message.data);&lt;br /&gt;
 $('#messages').append($('&amp;lt;p&amp;gt;',{ text: message.data }));&lt;br /&gt;
 };&lt;br /&gt;
 function sendMessage(){&lt;br /&gt;
 websocket.send($('#message').val());&lt;br /&gt;
 $('#message').val('');&lt;br /&gt;
 }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La fonction websocket.onmessage gère le traitement à faire coté client quand le serveur envoie des informations, et la fonction sendMessage permet l'envoie d'information du client vers le serveur.&lt;br /&gt;
&lt;br /&gt;
Pour notre projet, nous avons besoin principalement, dans un premier temps, d'envoyer des informations du serveur vers le client, nous nous sommes donc concentrer à comprendre et modifier les parties du code fourni suivantes : websocket.onmessage coté client et le &amp;quot;case LWS_CALLBACK_SERVER_WRITEABLE:&amp;quot; coté serveur.&lt;br /&gt;
&lt;br /&gt;
Le but des tests était de réussir à faire jouer deux sons différents par le client, avec changement de son imposé par le serveur. HTML5 propose nativement de lire des sons à partir d'une source grâce à une balise audio :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;audio controls=&amp;quot;controls&amp;quot; id=&amp;quot;mySound&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/audio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On récupère l'identifiant de cette balise avec &lt;br /&gt;
&lt;br /&gt;
 var test1 = document.getElementById(&amp;quot;mySound&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
afin de pouvoir l'utiliser de n'importe où dans le programme.&lt;br /&gt;
On définit la source grâce à &lt;br /&gt;
&lt;br /&gt;
 test1.src=&amp;quot;sound.mp3&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
avec &amp;quot;sound.mp3&amp;quot; le chemin d'accès au fichier son par rapport à l'emplacement du fichier html sur le serveur. Ici, le fichier son sound.mp3 est dans le même dossier que la page index.html.&lt;br /&gt;
Enfin, on peut lire le son avec &lt;br /&gt;
&lt;br /&gt;
 test1.play();&lt;br /&gt;
&lt;br /&gt;
Le but du projet étant d'émettre en continue le son généré par la harpe, l'objectif ici est soit de générer un fichier de streaming que l'on lit en continue, soit de lire un fichier différent par son possible et on change la valeur de test1.src en fonction du son à lire, soit on lit toujours la même source, mais que l'on modifie à la volée en fonction du son voulu. La première option a été étudiée jusqu'en fin de séance.&lt;br /&gt;
Nous n'avons pas réussi à comprendre comment générer un fichier de streaming audio simple, de plus toutes les documentations et exemples trouvés ne concernant qu'un streaming simultanée de son et de vidéo à partir d'une caméra et d'un micro, et nous n'avons pas compris comment adapter ces exemples.&lt;br /&gt;
&lt;br /&gt;
== Séance 3 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous avons pu tester l'envoi sur changement d'état, toujours avec les diodes du FPGA.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par ajouter une horloge sur le détecteur de changement d'état, afin d'augmenter le nombre d'incréments d'horloge sur lequel il est à '1', et ce dans le but de rendre le clignotement d'un diode visible à l’œil nu.&lt;br /&gt;
Ensuite, nous avons relié la sortie du détecteur de changement d'état et des phototransistors par un 'ET' logique, que nous avons ensuite relié aux diodes du FPGA.&lt;br /&gt;
De cette façon, si l'on détecte un changement d'état sur un phototransistor, la nouvelle valeur est alors envoyée sur les diodes. Le système a fonctionné (à voir :p ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos du test avec changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite passé le reste de la séance à mettre en commun notre partie avec la partie informatique, en essayant de leur permettre de lire sur le port série du FPGA. Les essais ont pour l'instant été infructueux, mais des progrès ont été faits. &lt;br /&gt;
&lt;br /&gt;
L'objectif étant que le Raspberry Pi puisse lire les informations envoyées par le FPGA, pour ensuite les transmettre au site Web que nous allons réaliser par la suite.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Au vu des difficultés rencontrées lors de la mise en place d'un véritable système de streaming, nous avons décider d'étudier les autres options possibles.&lt;br /&gt;
Notre deuxième solution était de modifier la valeur de test1.src. Mais cela voulait dire effectuer beaucoup de traitement coté client, et si on décidait de rajouter beaucoup de son, ou de générer de nouveaux fichiers son, ce la demandait soit de modifier le HTML à chaque ajout de fonctionnalité, ou de créer une grande quantité de fichier son qui pollueraient le serveur. Nous avons donc décidé qu'il serait plus pratique de toujours écraser la source avec le nouveau son a lire, et de ne jamais changer la valeur de test1.src.&lt;br /&gt;
&lt;br /&gt;
Afin d'effectuer des tests afin de voir si notre idée marchait bien, nous avons utiliser le code C très simple suivant :&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;pre&amp;gt;int cpt;&lt;br /&gt;
  for (cpt = 0; cpt &amp;lt; 250000000; cpt++);&lt;br /&gt;
&lt;br /&gt;
    boole = !boole;&lt;br /&gt;
	printf(&amp;quot;changement: %d\n&amp;quot;,boole);&lt;br /&gt;
    if(boole)&lt;br /&gt;
      system(&amp;quot;sudo cp Level-complete-sound-effect.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
      system(&amp;quot;sudo cp Raindrops-noise.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce code nous permet de modifier assez fréquemment le fichier source. Les fichiers audio de tests ont été trouvé sur http://www.orangefreesounds.com/ et sont libre de droit.&lt;br /&gt;
&lt;br /&gt;
Dans la page HTML de test nous utilisé les options de la balise source suivante :&lt;br /&gt;
&lt;br /&gt;
 test1.loop = true;&lt;br /&gt;
&lt;br /&gt;
qui permet au son de se jouer en boucle.&lt;br /&gt;
&lt;br /&gt;
Bien que les fichiers soit bien modifiés en local sur le serveur, toujours le même son est joué.&lt;br /&gt;
&lt;br /&gt;
On a donc testé de recharger le son uniquement lorsque le son est modifié, avec un envoi de message du serveur par socket.&lt;br /&gt;
Le serveur est conçu tel que suit : &lt;br /&gt;
  &amp;lt;pre&amp;gt;while(1){&lt;br /&gt;
  int cpt;&lt;br /&gt;
  bool boole;&lt;br /&gt;
  boole = 1;&lt;br /&gt;
  for (cpt = 0; cpt &amp;lt; 50000; cpt++);&lt;br /&gt;
&lt;br /&gt;
    boole = !boole;&lt;br /&gt;
&lt;br /&gt;
    if(boole)&lt;br /&gt;
      system(&amp;quot;cp Level-complete-sound-effect.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
      system(&amp;quot;cp Raindrops-noise.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      libwebsocket_write(test,(unsigned char *)out,1,LWS_WRITE_TEXT);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
 libwebsocket_context_destroy(context);&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On modifie la source, et ensuite on envoi un message, dont le contenu n'est pas important, le message sert juste d'indication au client que la source a changé.&lt;br /&gt;
&lt;br /&gt;
Le code coté client : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;websocket.onmessage=function(message){&lt;br /&gt;
 test1.pause();&lt;br /&gt;
 test1.load();&lt;br /&gt;
 test1.play();&lt;br /&gt;
 };&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A la réception d'un message, on pause le son avec test1.pause() puis on recharge le son afin d'aller chercher la valeur actuelle de la source, puis on relance le son avec test1.play().&lt;br /&gt;
D'après la documentation technique de HTML5, la fonction load() est sensé recharger la source si elle a changé, mais le résultat de ce test n'est pas concluant : le client joue toujours le même son.&lt;br /&gt;
Nous ne comprenons pas pourquoi.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 1 : Réalisation du site Web ==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé ce site web lors de notre temps libre afin de permettre la communication entre le Raspberry Pi et l'ordinateur. En effet, il était inclus dans notre projet de devoir réaliser une communication par internet. Ce site internet va donc remplir cette condition. Sur celui-ci, on pourra trouver une brève description de notre projet, un lien vers le wiki, une image exemple d'un harpe et les boutons Play et Pause qui permettent d'activer et de désactiver la harpe laser.&lt;br /&gt;
&lt;br /&gt;
Après de nombreux tests sur la communication entre le serveur et le client web et le problème de toujours lire le même son, même si la source a été modifié, il s'est avéré que le client lisait toujours le même son quoi qu'il arrive, même si le fichier cible n’existait plus sur le serveur. Comprendre pourquoi a nécessité quelque recherche et la source du problème était la suivante : les navigateurs utilisés, Mozilla Firefox et Google Chrome, mettaient en cache le fichier son à la première lecture, et ne vérifiait plus l'état du fichier sur le serveur, fichier qui donc pouvait être modifié sans que cela n'ai un impact sur le déroulement coté client. Il a fallut trouver un moyen de contourner le cache. N'ayant aucune connaissance sur le domaine, les recherches ont été infructueuses. Suite à une conversation avec M. Rudametkin, nous avons été orienté vers ce lien https://stackoverflow.com/questions/1077041/refresh-image-with-a-new-one-at-the-same-url/1077051#1077051 qui nous a permit de résoudre le problème.&lt;br /&gt;
En utilisant la commande : &lt;br /&gt;
&lt;br /&gt;
 test1.src=&amp;quot;sound.mp3?&amp;quot;+ new Date().getTime();&lt;br /&gt;
&lt;br /&gt;
nous trompons le cache en forçant la revérification de la source sur le serveur. Grâce a cette méthode nous avons enfin réussi à modifier le son joué par le client, et nous avons pu passer à la gestion de la communication série entre le RPi et le FPGA/Arduino.&lt;br /&gt;
&lt;br /&gt;
Le code fonctionnel de la page web est le suivant : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;audio controls=&amp;quot;controls&amp;quot; id=&amp;quot;mySound&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/audio&amp;gt;&lt;br /&gt;
    &amp;lt;script&lt;br /&gt;
        src=&amp;quot;jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.WebSocket=(window.WebSocket||window.MozWebSocket);&lt;br /&gt;
&lt;br /&gt;
var websocket=new WebSocket('ws://10.42.93:9000','myprotocol');&lt;br /&gt;
var test1 = document.getElementById(&amp;quot;mySound&amp;quot;);&lt;br /&gt;
test1.src=&amp;quot;sound.mp3&amp;quot;;&lt;br /&gt;
test1.autoplay = true;&lt;br /&gt;
websocket.onopen=function(){ $('h1').css('color','green'); };&lt;br /&gt;
&lt;br /&gt;
websocket.onerror=function(){ $('h1').css('color','red'); };&lt;br /&gt;
&lt;br /&gt;
websocket.onmessage=function(message){&lt;br /&gt;
test1.pause();&lt;br /&gt;
test1.src=&amp;quot;sound.mp3?&amp;quot;+ new Date().getTime();&lt;br /&gt;
test1.load();&lt;br /&gt;
test1.play();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function sendMessage(){&lt;br /&gt;
websocket.send($('#message').val());&lt;br /&gt;
$('#message').val('');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var son = document.getELementById(&amp;quot;sound&amp;quot;);&lt;br /&gt;
son.loop = true;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt;WebSockets test&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;message&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;button onclick=&amp;quot;sendMessage();&amp;quot;&amp;gt;Send&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce code n'est pas la version final, juste l'ensemble des parties logiques et fonctionnelles de la page web.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 2 : Réalisation du programme secondaire sur Arduino 'en cas de problèmes' ==&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis à plusieurs occasions en dehors des heures de projet afin d'avancer sur notre harpe. Nous avons donc décidé que nous devions réaliser un programme sur Arduino nous permettant de réaliser des tests de transmission par la liaison série sans avoir besoin du FPGA. Dans un premier temps, nous avons tenté d'utiliser le port USB comme liaison série. Cependant, il s'est avéré que le Raspberry pi ne pouvait pas lire son port USB, ce qui nous a donc forcé à utiliser les pins de communication série de l'Arduino. &lt;br /&gt;
Nous sommes sur un Arduino Mega 2560, nous avons a notre disposition plusieurs pins de communication série différents. Ils seront utilisés uniquement en transmission. Pour communiquer, nous allons ensuite utiliser le pin Tx1. Nous aboutissons donc au programme suivant:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Setup.PNG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Captprog.PNG]]&lt;br /&gt;
&lt;br /&gt;
La communication série de ce programme nous a causé des problèmes, surtout du fait que l'ordinateur ne recevait pas les informations transmises par l'Arduino. Nous avons donc du effectuer de multiples tests afin de voir où se situait le problème. Nous avons pu déterminer que nous avions un problème au niveau de notre pont diviseur de tension entre l'alimentation de l’Arduino et celle du Raspberry Pi, nous avons alors changé les résistances.&lt;br /&gt;
Nous avons également notamment modifié le programme afin de vérifier que l'information était bien transmise sur le Pin Série de l'Arduino, et que le problème ne venait donc pas de l'Arduino mais bien du Raspberry, dont le port série était mal configuré.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 3 : Assemblage de la boite et mise en place des composants ==&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43749</id>
		<title>Projet IMA3 P5, 2016/2017, TD1</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43749"/>
				<updated>2017-06-12T10:07:13Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : /* Partie informatique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet IMA3-SC 2016/2017 : Synt'Harpe (Sainte) Laser =&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Description du système ===&lt;br /&gt;
&lt;br /&gt;
Pour le projet Système Communicant, nous allons réaliser une harpe laser. Notre but est de créer un instrument de musique similaire à une harpe, où les cordes sont remplacées par des capteurs infra-rouges.&lt;br /&gt;
&lt;br /&gt;
Un son sera émis par l'ordinateur dès que le capteur IR captera une main et le joueur pourra avec son autre main moduler l'amplitude de la note.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on travaillera sur une gamme de son sur 8 bits. Puis, nous implémenterons une banque de sons qui nous permettra de sélectionner l'instrument désiré, d'où l'appellation Synt'Harpe.&lt;br /&gt;
&lt;br /&gt;
L'ordinateur décidera du fonctionnement ou non de la harpe. C'est aussi grâce à lui qu'on pourra choisir la banque de sons voulue.&lt;br /&gt;
&lt;br /&gt;
Toutes les banques de sons seront enregistrées sur le Raspberry.&lt;br /&gt;
Les LEDs signaleront l'emplacement des cordes.&lt;br /&gt;
&lt;br /&gt;
Pour la partie optionnelle, on remplacera les LEDs par des lasers pour un effet visuel de qualité (plus poussé). La fumée permettra de voir les lasers.&lt;br /&gt;
&lt;br /&gt;
=== Le matériel ===&lt;br /&gt;
* Un raspberry pi&lt;br /&gt;
* 8 phototransistors&lt;br /&gt;
* 8 émetteurs lasers&lt;br /&gt;
* Des résistances&lt;br /&gt;
* Une structure&lt;br /&gt;
* Carte d'acquisition de type Arduino au début puis FPGA &lt;br /&gt;
* Un ordinateur&lt;br /&gt;
* Une alimentation&lt;br /&gt;
&lt;br /&gt;
=== Optionnel (visuel) ===&lt;br /&gt;
&lt;br /&gt;
* 8 émetteurs laser&lt;br /&gt;
* Un générateur de fumée&lt;br /&gt;
* Une caméra&lt;br /&gt;
&lt;br /&gt;
== Séance 1 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Le but de cette première séance était de se répartir les tâches, de tester le matériel mit à disposition et de découvrir le fonctionnement du FPGA.&lt;br /&gt;
&lt;br /&gt;
Le principe de fonctionnement de la harpe est le suivant:&lt;br /&gt;
Chaque capteur sera situé en face d'un laser. Les capteurs seront dans la partie haute de la harpe afin de limiter les interférences dues à d'autres sources lumineuses. Chaque laser pointera vers un capteur. &lt;br /&gt;
&lt;br /&gt;
 * Ajout du dessin de la harpe * &lt;br /&gt;
&lt;br /&gt;
Les capteurs enverront tous par défaut la même valeur au FPGA. Quand l'utilisateur passera sa main dans la harpe, un faisceau laser sera coupé. Le capteur n'enverra plus sa valeur seuil au FPGA, il aura donc changé d'état.&lt;br /&gt;
Dès lors que le FPGA détectera un changement d'état, il enverra l'état dans lequel se trouvent les 8 capteurs au Raspberry. &lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé des tests sur les phototransistors et les lasers. Nous avons mis en parallèle un laser et deux capteurs, sans oublier leur résistance de 1.2k Ohms chacune. &lt;br /&gt;
&lt;br /&gt;
Nous avons vu que à luminosité ambiante, quand le laser pointe sur le capteur, celui-ci envoie à l'Arduino une valeur de 950 environ. Ensuite, quand le faisceau laser est coupé, la valeur envoyée par le phototransistor monte à 1020.&lt;br /&gt;
Puis, nous avons réitéré l'expérience en mettant le système dans une boîte. Cette fois, le valeur est passée de 840 quand le capteur est éclairé par le laser à 900 quand le faisceau est coupé.&lt;br /&gt;
Nous en avons déduit que nous allons devoir refaire l'expérience une fois la harpe assemblée.&lt;br /&gt;
&lt;br /&gt;
Les lasers étant très directionnels tout comme les phototransistors, nous n'aurons pas de soucis d'interférences. Un capteur détectera uniquement le laser situé directement en face de lui et non ceux de son voisinage.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Même si il peut paraitre futile d'insérer une partie boitier dans un projet centré sur l'informatique et l'électronique, il s'est avéré que le boitier de notre Harpe nécessitait une attention particulière.&lt;br /&gt;
&lt;br /&gt;
La taille de la harpe à été un sujet de débat, et nous avons réalisé des tests afin de vérifier que des phototransistors trop proches les uns des autres n'allait pas compromettre le bon fonctionnement de la harpe dans son ensemble. En effet, si le phototransistor détectait un autre laser que celui vers lequel il pointe serait extrêmement problématique. Heureusement, il s'est avéré que les phototransistors sont très directionnels, au point que se pose désormais le problème inverse.&lt;br /&gt;
&lt;br /&gt;
Nous allons devoir faire très attention au fait que les lasers soient bien fixés et pointent exactement vers les phototransistors, car dans le cas contraire, ceux-ci ne détectent absolument pas le laser, et tout le principe de fonctionnement s'effondre. La conception et l'assemblage de la boite devront donc être relativement précis, pour éviter ces problèmes.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons dès le départ décidé d'éviter l'utilisation de diodes infra-rouges, pour leur préférer les lasers. Tout d'abord, parce que les diodes ne sont en aucun cas assez puissantes pour être détectées par les phototransistors, ce qui une fois de plus rend notre harpe inutile. Ensuite, parce qu'il nous a semblé que réaliser une harpe 'laser' sans lasers était un concept déconcertant, et enlève beaucoup de l’intérêt de ce projet.&lt;br /&gt;
&lt;br /&gt;
Un premier jet de design avait été réalisé avant cette séance, et au vu des données récoltées pendant celle-ci, nous l'avons modifié pour les prendre en compte, notamment la taille des lasers par rapport aux diodes, et la précision requise. &lt;br /&gt;
&lt;br /&gt;
'insérer photos premiers schémas ici'&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le travail a été séparé en 2 parties, une personne par partie : &lt;br /&gt;
- une première partie sur le serveur même (page web, système de streaming de son depuis la page web)&lt;br /&gt;
- une seconde partie sur la lecture du port série&lt;br /&gt;
&lt;br /&gt;
==== Partie serveur ====&lt;br /&gt;
La première séance a été consacré à deux grands axes : prendre la main à distance sur le raspberry pi et mettre en place le serveur web.&lt;br /&gt;
Afin de pouvoir contrôler et travailler facilement sur le RPi, l'outil vncserver a été installé sur le raspberry, permettant de contrôler via un interface graphique le RPi depuis un ordinateur branché sur le même réseau. Cet utilitaire permettra a l'avenir de travailler directement sur le RPi sans devoir constamment uploader par ssh le travail effectué.&lt;br /&gt;
&lt;br /&gt;
Coté mise en place du serveur web, l'utilitaire de serveur web apache2 a été installé sans soucis, et les pages d'exemples web et javascript fonctionnent. En revanche, l'utilisation du code d'exemple sur les sockets n'est pas utilisable, le paquet proposé n’existe pas et le site du paquet de socket est mort.&lt;br /&gt;
Le reste de la séance a été consacré a des recherches sur les moyens de pouvoir streamer du son, recherches non concluantes. Aucune solution n'a été trouvé sans passer par un service internet hébergé par un tier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Partie lecture port série ====&lt;br /&gt;
&lt;br /&gt;
Cette première séance fut consacrée à la sélection du langage de programmation et à sa prise en main. Il a été décidé d'utiliser Python pour écrire le programme récupérant et traitant les données récupérées à travers le port série. Python étant un langage fort usité, il possède une très large documentation. Ce fut donc facile de trouver la librairie permettant de lire les données envoyées par le port série.&lt;br /&gt;
&lt;br /&gt;
Un doute subsiste encore sur le type de données envoyé par le port série. L'idéal serait de récupérer un tableau de 8 entiers de type binaire correspondant aux états des 8 ports liés aux &amp;quot;cordes&amp;quot; laser, pour pouvoir ensuite traiter ces données facilement.&lt;br /&gt;
&lt;br /&gt;
== Séance 2 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Lors de cette séance, nous avons réalisé le premier circuit sur le FPGA. &lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un circuit simple, qui envoie en permanence l'état des huit phototransistors au port série. Les phototransistors sont alors directement reliés à celui-ci. Nous avons pu tester le bon fonctionnement du système grâce aux diodes du FPGA. Nous avons branché en parallèle sur le circuit les huit diodes, afin de vérifier qu'un signal était bien envoyé en permanence, on a pu les voir s'éteindre lorsqu'on éclairait un laser. &lt;br /&gt;
Ces diodes se sont avérées très utiles, car il n'est pas encore possible d'effectuer les tests sur le port série, car la partie informatique n'est pas encore opérationnelle, on ne peut donc pas lire directement sur le port série pour le moment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi constant ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite réalisé un montage permettant de faire l'envoi seulement sur changement d'état, comme prévu à la séance 1 Nous avons donc réalisé un système de bascules permettant de comparer l'état actuel de chaque diode avec son état précédent, puis de réaliser l'envoi seulement si une différence était observée. Comme précédemment, les diodes sont reliées directement au Port Série, mais cette fois-ci au lieu de brancher le Bit d'envoi du port Série sur un Vcc, soit un '1' logique, nous l'avons relié à la vérification de changement d'état, qui passe à '1' uniquement avec un changement d'état.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi sur changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème qui s'est alors posé était de savoir si on envoyait le signal assez longtemps pour qu'il puisse être lu. En effet on envoie un signal seulement si il y a changement d'état, et cette vérification se fait à chaque incrément d'horloge. Hors, la différence sera donc observée sur un seul incrément d'horloge, par conséquent, on n'envoie de signal que pendant ce seul incrément. Pour l'instant, nous supposons que le port série est capable de stocker les données à envoyer en un seul incrément d'horloge. &lt;br /&gt;
Cependant, si lors des tests, ça ne fonctionne pas, nous prévoyons d'utiliser un compteur pour pouvoir envoyer le signal plus longtemps au Bit d'envoi du port série, et ainsi laisser le temps au port série d'envoyer l'information.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous nous sommes focalisés sur le FPGA, mais nous avons néanmoins terminé la conception du boitier de la harpe, sous la forme de trois 'boites' crénelées, que nous avons ensuite l'intention de découper au FabLab puis d'assembler.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos des boites ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il s'est avéré que réaliser des boites crénelées rendrait tout le boitier beaucoup plus solide, et donc fiable.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le problème de l'impossibilité d'utiliser l'exemple sur les sockets a été résolu, grâce à l'intervention de M. Redon. Le problème était une différence de version de la distribution Linux entre le RPi utilisé et celle utilisé pour l'exemple. En effet, le RPi de travail est sur une distribution Wheezy, alors que la version la plus récente est la Jessie. Les chemins des dépots des sources de la librairie libwebsocket n’existant pas sur Wheezy, on ne pouvait installer la librairie directement en ligne de commande. M. Redon a ajouté le chemin de la librairie dans le gestionnaire de paquet du RPi et on a pu utiliser sans problèmes la librairie. De plus le site du paquet libwebsocket n'était inaccessible que temporairement.&lt;br /&gt;
La séance a été consacré à comprendre le fonctionnement des sockets et comment l'exemple html interagissait avec.&lt;br /&gt;
&lt;br /&gt;
La partie importante du code d'exemple est la suivante : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;static int callback_my(&lt;br /&gt;
  struct libwebsocket_context * this,&lt;br /&gt;
  struct libwebsocket *wsi,enum libwebsocket_callback_reasons reason,&lt;br /&gt;
  void *user,void *in,size_t len)&lt;br /&gt;
 {&lt;br /&gt;
 static char *message=NULL;&lt;br /&gt;
 static int msize=0;&lt;br /&gt;
 switch(reason){&lt;br /&gt;
  case LWS_CALLBACK_ESTABLISHED:&lt;br /&gt;
    printf(&amp;quot;connection established\n&amp;quot;);&lt;br /&gt;
    message=NULL;&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_RECEIVE:&lt;br /&gt;
                // Ici sont traites les messages envoyes par le navigateur&lt;br /&gt;
    printf(&amp;quot;received data: %s\n&amp;quot;,(char *)in);&lt;br /&gt;
    message=malloc(len+LWS_SEND_BUFFER_PRE_PADDING+LWS_SEND_BUFFER_POST_PADDING);&lt;br /&gt;
    if(message==NULL){ perror(&amp;quot;callback_my.malloc&amp;quot;); exit(EXIT_FAILURE); }&lt;br /&gt;
    memcpy(message+LWS_SEND_BUFFER_PRE_PADDING,in,len);&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    msize=len;&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_SERVER_WRITEABLE:&lt;br /&gt;
                // Ici sont envoyes les messages au navigateur&lt;br /&gt;
    if(message!=NULL){&lt;br /&gt;
      char *out=message+LWS_SEND_BUFFER_PRE_PADDING;&lt;br /&gt;
      libwebsocket_write(wsi,(unsigned char *)out,msize,LWS_WRITE_TEXT);&lt;br /&gt;
      free(message);&lt;br /&gt;
      message=NULL;&lt;br /&gt;
      }&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    break;&lt;br /&gt;
  }&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
Il s'agit d'une fonction de callback gérant à la fois la réception et la transmission. On peut remarquer 3 cas du switch : LWS_CALLBACK_ESTABLISHED correspondant à la création d'un lien entre la page web et le serveur websocket à la demande de la page web, LWS_CALLBACK_RECEIVE correspondant aux actions à entreprendre à la réception d'un message provenant du navigateur web, et LWS_CALLBACK_SERVER_WRITEABLE correspondant aux actions afin d'envoyer un message au navigateur.&lt;br /&gt;
&lt;br /&gt;
Coté HTML, on utilise les sockets grâce à ce code suivant :&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;pre&amp;gt;window.WebSocket=(window.WebSocket||window.MozWebSocket);&lt;br /&gt;
 var websocket=new WebSocket('ws://127.0.0.1:9000','myprotocol');&lt;br /&gt;
 websocket.onopen=function(){ $('h1').css('color','green'); };&lt;br /&gt;
 websocket.onerror=function(){ $('h1').css('color','red'); };&lt;br /&gt;
 websocket.onmessage=function(message){&lt;br /&gt;
 console.log(message.data);&lt;br /&gt;
 $('#messages').append($('&amp;lt;p&amp;gt;',{ text: message.data }));&lt;br /&gt;
 };&lt;br /&gt;
 function sendMessage(){&lt;br /&gt;
 websocket.send($('#message').val());&lt;br /&gt;
 $('#message').val('');&lt;br /&gt;
 }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La fonction websocket.onmessage gère le traitement à faire coté client quand le serveur envoie des informations, et la fonction sendMessage permet l'envoie d'information du client vers le serveur.&lt;br /&gt;
&lt;br /&gt;
Pour notre projet, nous avons besoin principalement, dans un premier temps, d'envoyer des informations du serveur vers le client, nous nous sommes donc concentrer à comprendre et modifier les parties du code fourni suivantes : websocket.onmessage coté client et le &amp;quot;case LWS_CALLBACK_SERVER_WRITEABLE:&amp;quot; coté serveur.&lt;br /&gt;
&lt;br /&gt;
Le but des tests était de réussir à faire jouer deux sons différents par le client, avec changement de son imposé par le serveur. HTML5 propose nativement de lire des sons à partir d'une source grâce à une balise audio :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;audio controls=&amp;quot;controls&amp;quot; id=&amp;quot;mySound&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/audio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On récupère l'identifiant de cette balise avec &lt;br /&gt;
&lt;br /&gt;
 var test1 = document.getElementById(&amp;quot;mySound&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
afin de pouvoir l'utiliser de n'importe où dans le programme.&lt;br /&gt;
On définit la source grâce à &lt;br /&gt;
&lt;br /&gt;
 test1.src=&amp;quot;sound.mp3&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
avec &amp;quot;sound.mp3&amp;quot; le chemin d'accès au fichier son par rapport à l'emplacement du fichier html sur le serveur. Ici, le fichier son sound.mp3 est dans le même dossier que la page index.html.&lt;br /&gt;
Enfin, on peut lire le son avec &lt;br /&gt;
&lt;br /&gt;
 test1.play();&lt;br /&gt;
&lt;br /&gt;
Le but du projet étant d'émettre en continue le son généré par la harpe, l'objectif ici est soit de générer un fichier de streaming que l'on lit en continue, soit de lire un fichier différent par son possible et on change la valeur de test1.src en fonction du son à lire, soit on lit toujours la même source, mais que l'on modifie à la volée en fonction du son voulu. La première option a été étudiée jusqu'en fin de séance.&lt;br /&gt;
Nous n'avons pas réussi à comprendre comment générer un fichier de streaming audio simple, de plus toutes les documentations et exemples trouvés ne concernant qu'un streaming simultanée de son et de vidéo à partir d'une caméra et d'un micro, et nous n'avons pas compris comment adapter ces exemples.&lt;br /&gt;
&lt;br /&gt;
== Séance 3 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous avons pu tester l'envoi sur changement d'état, toujours avec les diodes du FPGA.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par ajouter une horloge sur le détecteur de changement d'état, afin d'augmenter le nombre d'incréments d'horloge sur lequel il est à '1', et ce dans le but de rendre le clignotement d'un diode visible à l’œil nu.&lt;br /&gt;
Ensuite, nous avons relié la sortie du détecteur de changement d'état et des phototransistors par un 'ET' logique, que nous avons ensuite relié aux diodes du FPGA.&lt;br /&gt;
De cette façon, si l'on détecte un changement d'état sur un phototransistor, la nouvelle valeur est alors envoyée sur les diodes. Le système a fonctionné (à voir :p ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos du test avec changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite passé le reste de la séance à mettre en commun notre partie avec la partie informatique, en essayant de leur permettre de lire sur le port série du FPGA. Les essais ont pour l'instant été infructueux, mais des progrès ont été faits. &lt;br /&gt;
&lt;br /&gt;
L'objectif étant que le Raspberry Pi puisse lire les informations envoyées par le FPGA, pour ensuite les transmettre au site Web que nous allons réaliser par la suite.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Au vu des difficultés rencontrées lors de la mise en place d'un véritable système de streaming, nous avons décider d'étudier les autres options possibles.&lt;br /&gt;
Notre deuxième solution était de modifier la valeur de test1.src. Mais cela voulait dire effectuer beaucoup de traitement coté client, et si on décidait de rajouter beaucoup de son, ou de générer de nouveaux fichiers son, ce la demandait soit de modifier le HTML à chaque ajout de fonctionnalité, ou de créer une grande quantité de fichier son qui pollueraient le serveur. Nous avons donc décidé qu'il serait plus pratique de toujours écraser la source avec le nouveau son a lire, et de ne jamais changer la valeur de test1.src.&lt;br /&gt;
&lt;br /&gt;
Afin d'effectuer des tests afin de voir si notre idée marchait bien, nous avons utiliser le code C très simple suivant :&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;pre&amp;gt;int cpt;&lt;br /&gt;
  for (cpt = 0; cpt &amp;lt; 250000000; cpt++);&lt;br /&gt;
&lt;br /&gt;
    boole = !boole;&lt;br /&gt;
	printf(&amp;quot;changement: %d\n&amp;quot;,boole);&lt;br /&gt;
    if(boole)&lt;br /&gt;
      system(&amp;quot;sudo cp Level-complete-sound-effect.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
      system(&amp;quot;sudo cp Raindrops-noise.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce code nous permet de modifier assez fréquemment le fichier source. Les fichiers audio de tests ont été trouvé sur http://www.orangefreesounds.com/ et sont libre de droit.&lt;br /&gt;
&lt;br /&gt;
Dans la page HTML de test nous utilisé les options de la balise source suivante :&lt;br /&gt;
&lt;br /&gt;
 test1.loop = true;&lt;br /&gt;
&lt;br /&gt;
qui permet au son de se jouer en boucle.&lt;br /&gt;
&lt;br /&gt;
Bien que les fichiers soit bien modifiés en local sur le serveur, toujours le même son est joué.&lt;br /&gt;
&lt;br /&gt;
On a donc testé de recharger le son uniquement lorsque le son est modifié, avec un envoi de message du serveur par socket.&lt;br /&gt;
Le serveur est conçu tel que suit : &lt;br /&gt;
  &amp;lt;pre&amp;gt;while(1){&lt;br /&gt;
  int cpt;&lt;br /&gt;
  bool boole;&lt;br /&gt;
  boole = 1;&lt;br /&gt;
  for (cpt = 0; cpt &amp;lt; 50000; cpt++);&lt;br /&gt;
&lt;br /&gt;
    boole = !boole;&lt;br /&gt;
&lt;br /&gt;
    if(boole)&lt;br /&gt;
      system(&amp;quot;cp Level-complete-sound-effect.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
      system(&amp;quot;cp Raindrops-noise.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      libwebsocket_write(test,(unsigned char *)out,1,LWS_WRITE_TEXT);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
 libwebsocket_context_destroy(context);&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On modifie la source, et ensuite on envoi un message, dont le contenu n'est pas important, le message sert juste d'indication au client que la source a changé.&lt;br /&gt;
&lt;br /&gt;
Le code coté client : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;websocket.onmessage=function(message){&lt;br /&gt;
 test1.pause();&lt;br /&gt;
 test1.load();&lt;br /&gt;
 test1.play();&lt;br /&gt;
 };&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A la réception d'un message, on pause le son avec test1.pause() puis on recharge le son afin d'aller chercher la valeur actuelle de la source, puis on relance le son avec test1.play().&lt;br /&gt;
D'après la documentation technique de HTML5, la fonction load() est sensé recharger la source si elle a changé, mais le résultat de ce test n'est pas concluant : le client joue toujours le même son.&lt;br /&gt;
Nous ne comprenons pas pourquoi.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 1 : Réalisation du site Web ==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé ce site web lors de notre temps libre afin de permettre la communication entre le Raspberry Pi et l'ordinateur. En effet, il était inclus dans notre projet de devoir réaliser une communication par internet. Ce site internet va donc remplir cette condition. Sur celui-ci, on pourra trouver une brève description de notre projet, un lien vers le wiki, une image exemple d'un harpe et les boutons Play et Pause qui permettent d'activer et de désactiver la harpe laser.&lt;br /&gt;
&lt;br /&gt;
Après de nombreux tests sur la communication entre le serveur et le client web et le problème de toujours lire le même son, même si la source a été modifié, il s'est avéré que le client lisait toujours le même son quoi qu'il arrive, même si le fichier cible n’existait plus sur le serveur. Comprendre pourquoi a nécessité quelque recherche et la source du problème était la suivante : les navigateurs utilisés, Mozilla Firefox et Google Chrome, mettaient en cache le fichier son à la première lecture, et ne vérifiait plus l'état du fichier sur le serveur, fichier qui donc pouvait être modifié sans que cela n'ai un impact sur le déroulement coté client. Il a fallut trouver un moyen de contourner le cache. N'ayant aucune connaissance sur le domaine, les recherches ont été infructueuses. Suite à une conversation avec M. Rudametkin, nous avons été orienté vers ce lien https://stackoverflow.com/questions/1077041/refresh-image-with-a-new-one-at-the-same-url/1077051#1077051 qui nous a permit de résoudre le problème.&lt;br /&gt;
En utilisant la commande : &lt;br /&gt;
&lt;br /&gt;
 test1.src=&amp;quot;sound.mp3?&amp;quot;+ new Date().getTime();&lt;br /&gt;
&lt;br /&gt;
nous trompons le cache en forçant la revérification de la source sur le serveur. Grâce a cette méthode nous avons enfin réussi à modifier le son joué par le client, et nous avons pu passer à la gestion de la communication série entre le RPi et le FPGA/Arduino.&lt;br /&gt;
&lt;br /&gt;
Le code fonctionnel de la page web est le suivant : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;audio controls=&amp;quot;controls&amp;quot; id=&amp;quot;mySound&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/audio&amp;gt;&lt;br /&gt;
    &amp;lt;script&lt;br /&gt;
        src=&amp;quot;jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.WebSocket=(window.WebSocket||window.MozWebSocket);&lt;br /&gt;
&lt;br /&gt;
var websocket=new WebSocket('ws://10.42.93:9000','myprotocol');&lt;br /&gt;
var test1 = document.getElementById(&amp;quot;mySound&amp;quot;);&lt;br /&gt;
test1.src=&amp;quot;sound.mp3&amp;quot;;&lt;br /&gt;
test1.autoplay = true;&lt;br /&gt;
websocket.onopen=function(){ $('h1').css('color','green'); };&lt;br /&gt;
&lt;br /&gt;
websocket.onerror=function(){ $('h1').css('color','red'); };&lt;br /&gt;
&lt;br /&gt;
websocket.onmessage=function(message){&lt;br /&gt;
test1.pause();&lt;br /&gt;
test1.src=&amp;quot;sound.mp3?&amp;quot;+ new Date().getTime();&lt;br /&gt;
test1.load();&lt;br /&gt;
test1.play();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function sendMessage(){&lt;br /&gt;
websocket.send($('#message').val());&lt;br /&gt;
$('#message').val('');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var son = document.getELementById(&amp;quot;sound&amp;quot;);&lt;br /&gt;
son.loop = true;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt;WebSockets test&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;message&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;button onclick=&amp;quot;sendMessage();&amp;quot;&amp;gt;Send&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce code n'est pas la version final, juste l'ensemble des parties logiques et fonctionnelles de la page web.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 2 : Réalisation du programme secondaire sur Arduino 'en cas de problèmes' ==&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis à plusieurs occasions en dehors des heures de projet afin d'avancer sur notre harpe. Nous avons donc décidé que nous devions réaliser un programme sur Arduino nous permettant de réaliser des tests de transmission par la liaison série sans avoir besoin du FPGA. Dans un premier temps, nous avons tenté d'utiliser le port USB comme liaison série. Cependant, il s'est avéré que le Raspberry pi ne pouvait pas lire son port USB, ce qui nous a donc forcé à utiliser les pins de communication série de l'Arduino. &lt;br /&gt;
Nous sommes sur un Arduino Mega 2560, nous avons a notre disposition plusieurs pins de communication série différents. Ils seront utilisés uniquement en transmission. Pour communiquer, nous allons ensuite utiliser le pin Tx1. Nous aboutissons donc au programme suivant:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Setup.PNG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Captprog.PNG]]&lt;br /&gt;
&lt;br /&gt;
La communication série de ce programme nous a causé des problèmes, surtout du fait que l'ordinateur ne recevait pas les informations transmises par l'Arduino. Nous avons donc du effectuer de multiples tests afin de voir où se situait le problème. Nous avons pu déterminer que nous avions un problème au niveau de notre pont diviseur de tension entre l'alimentation de l’Arduino et celle du Raspberry Pi, nous avons alors changé les résistances.&lt;br /&gt;
Nous avons également notamment modifié le programme afin de vérifier que l'information était bien transmise sur le Pin Série de l'Arduino, et que le problème ne venait donc pas de l'Arduino mais bien du Raspberry, qui ne transmet pas correctement l'information à l'ordinateur.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 3 : Assemblage de la boite et mise en place des composants ==&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43748</id>
		<title>Projet IMA3 P5, 2016/2017, TD1</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43748"/>
				<updated>2017-06-12T10:06:18Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : /* Partie informatique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet IMA3-SC 2016/2017 : Synt'Harpe (Sainte) Laser =&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Description du système ===&lt;br /&gt;
&lt;br /&gt;
Pour le projet Système Communicant, nous allons réaliser une harpe laser. Notre but est de créer un instrument de musique similaire à une harpe, où les cordes sont remplacées par des capteurs infra-rouges.&lt;br /&gt;
&lt;br /&gt;
Un son sera émis par l'ordinateur dès que le capteur IR captera une main et le joueur pourra avec son autre main moduler l'amplitude de la note.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on travaillera sur une gamme de son sur 8 bits. Puis, nous implémenterons une banque de sons qui nous permettra de sélectionner l'instrument désiré, d'où l'appellation Synt'Harpe.&lt;br /&gt;
&lt;br /&gt;
L'ordinateur décidera du fonctionnement ou non de la harpe. C'est aussi grâce à lui qu'on pourra choisir la banque de sons voulue.&lt;br /&gt;
&lt;br /&gt;
Toutes les banques de sons seront enregistrées sur le Raspberry.&lt;br /&gt;
Les LEDs signaleront l'emplacement des cordes.&lt;br /&gt;
&lt;br /&gt;
Pour la partie optionnelle, on remplacera les LEDs par des lasers pour un effet visuel de qualité (plus poussé). La fumée permettra de voir les lasers.&lt;br /&gt;
&lt;br /&gt;
=== Le matériel ===&lt;br /&gt;
* Un raspberry pi&lt;br /&gt;
* 8 phototransistors&lt;br /&gt;
* 8 émetteurs lasers&lt;br /&gt;
* Des résistances&lt;br /&gt;
* Une structure&lt;br /&gt;
* Carte d'acquisition de type Arduino au début puis FPGA &lt;br /&gt;
* Un ordinateur&lt;br /&gt;
* Une alimentation&lt;br /&gt;
&lt;br /&gt;
=== Optionnel (visuel) ===&lt;br /&gt;
&lt;br /&gt;
* 8 émetteurs laser&lt;br /&gt;
* Un générateur de fumée&lt;br /&gt;
* Une caméra&lt;br /&gt;
&lt;br /&gt;
== Séance 1 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Le but de cette première séance était de se répartir les tâches, de tester le matériel mit à disposition et de découvrir le fonctionnement du FPGA.&lt;br /&gt;
&lt;br /&gt;
Le principe de fonctionnement de la harpe est le suivant:&lt;br /&gt;
Chaque capteur sera situé en face d'un laser. Les capteurs seront dans la partie haute de la harpe afin de limiter les interférences dues à d'autres sources lumineuses. Chaque laser pointera vers un capteur. &lt;br /&gt;
&lt;br /&gt;
 * Ajout du dessin de la harpe * &lt;br /&gt;
&lt;br /&gt;
Les capteurs enverront tous par défaut la même valeur au FPGA. Quand l'utilisateur passera sa main dans la harpe, un faisceau laser sera coupé. Le capteur n'enverra plus sa valeur seuil au FPGA, il aura donc changé d'état.&lt;br /&gt;
Dès lors que le FPGA détectera un changement d'état, il enverra l'état dans lequel se trouvent les 8 capteurs au Raspberry. &lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé des tests sur les phototransistors et les lasers. Nous avons mis en parallèle un laser et deux capteurs, sans oublier leur résistance de 1.2k Ohms chacune. &lt;br /&gt;
&lt;br /&gt;
Nous avons vu que à luminosité ambiante, quand le laser pointe sur le capteur, celui-ci envoie à l'Arduino une valeur de 950 environ. Ensuite, quand le faisceau laser est coupé, la valeur envoyée par le phototransistor monte à 1020.&lt;br /&gt;
Puis, nous avons réitéré l'expérience en mettant le système dans une boîte. Cette fois, le valeur est passée de 840 quand le capteur est éclairé par le laser à 900 quand le faisceau est coupé.&lt;br /&gt;
Nous en avons déduit que nous allons devoir refaire l'expérience une fois la harpe assemblée.&lt;br /&gt;
&lt;br /&gt;
Les lasers étant très directionnels tout comme les phototransistors, nous n'aurons pas de soucis d'interférences. Un capteur détectera uniquement le laser situé directement en face de lui et non ceux de son voisinage.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Même si il peut paraitre futile d'insérer une partie boitier dans un projet centré sur l'informatique et l'électronique, il s'est avéré que le boitier de notre Harpe nécessitait une attention particulière.&lt;br /&gt;
&lt;br /&gt;
La taille de la harpe à été un sujet de débat, et nous avons réalisé des tests afin de vérifier que des phototransistors trop proches les uns des autres n'allait pas compromettre le bon fonctionnement de la harpe dans son ensemble. En effet, si le phototransistor détectait un autre laser que celui vers lequel il pointe serait extrêmement problématique. Heureusement, il s'est avéré que les phototransistors sont très directionnels, au point que se pose désormais le problème inverse.&lt;br /&gt;
&lt;br /&gt;
Nous allons devoir faire très attention au fait que les lasers soient bien fixés et pointent exactement vers les phototransistors, car dans le cas contraire, ceux-ci ne détectent absolument pas le laser, et tout le principe de fonctionnement s'effondre. La conception et l'assemblage de la boite devront donc être relativement précis, pour éviter ces problèmes.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons dès le départ décidé d'éviter l'utilisation de diodes infra-rouges, pour leur préférer les lasers. Tout d'abord, parce que les diodes ne sont en aucun cas assez puissantes pour être détectées par les phototransistors, ce qui une fois de plus rend notre harpe inutile. Ensuite, parce qu'il nous a semblé que réaliser une harpe 'laser' sans lasers était un concept déconcertant, et enlève beaucoup de l’intérêt de ce projet.&lt;br /&gt;
&lt;br /&gt;
Un premier jet de design avait été réalisé avant cette séance, et au vu des données récoltées pendant celle-ci, nous l'avons modifié pour les prendre en compte, notamment la taille des lasers par rapport aux diodes, et la précision requise. &lt;br /&gt;
&lt;br /&gt;
'insérer photos premiers schémas ici'&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le travail a été séparé en 2 parties, une personne par partie : &lt;br /&gt;
- une première partie sur le serveur même (page web, système de streaming de son depuis la page web)&lt;br /&gt;
- une seconde partie sur la lecture du port série&lt;br /&gt;
&lt;br /&gt;
==== Partie serveur ====&lt;br /&gt;
La première séance a été consacré à deux grands axes : prendre la main à distance sur le raspberry pi et mettre en place le serveur web.&lt;br /&gt;
Afin de pouvoir contrôler et travailler facilement sur le RPi, l'outil vncserver a été installé sur le raspberry, permettant de contrôler via un interface graphique le RPi depuis un ordinateur branché sur le même réseau. Cet utilitaire permettra a l'avenir de travailler directement sur le RPi sans devoir constamment uploader par ssh le travail effectué.&lt;br /&gt;
&lt;br /&gt;
Coté mise en place du serveur web, l'utilitaire de serveur web apache2 a été installé sans soucis, et les pages d'exemples web et javascript fonctionnent. En revanche, l'utilisation du code d'exemple sur les sockets n'est pas utilisable, le paquet proposé n’existe pas et le site du paquet de socket est mort.&lt;br /&gt;
Le reste de la séance a été consacré a des recherches sur les moyens de pouvoir streamer du son, recherches non concluantes. Aucune solution n'a été trouvé sans passer par un service internet hébergé par un tier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Partie lecture port série ====&lt;br /&gt;
&lt;br /&gt;
Cette première séance fut consacrée à la sélection du langage de programmation et à sa prise en main. Il a été décidé d'utiliser Python pour écrire le programme récupérant et traitant les données récupérées à travers le port série. Python étant un langage fort usité, il possède une très large documentation. Ce fut donc facile de trouver la librairie permettant de lire les données envoyées par le port série.&lt;br /&gt;
&lt;br /&gt;
Un doute subsiste encore sur le type de données envoyé par le port série. L'idéal serait de récupérer un tableau de 8 entiers de type binaire correspondant aux états des 8 ports liés aux &amp;quot;cordes&amp;quot; laser, pour pouvoir ensuite traiter ces données facilement.&lt;br /&gt;
&lt;br /&gt;
== Séance 2 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Lors de cette séance, nous avons réalisé le premier circuit sur le FPGA. &lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un circuit simple, qui envoie en permanence l'état des huit phototransistors au port série. Les phototransistors sont alors directement reliés à celui-ci. Nous avons pu tester le bon fonctionnement du système grâce aux diodes du FPGA. Nous avons branché en parallèle sur le circuit les huit diodes, afin de vérifier qu'un signal était bien envoyé en permanence, on a pu les voir s'éteindre lorsqu'on éclairait un laser. &lt;br /&gt;
Ces diodes se sont avérées très utiles, car il n'est pas encore possible d'effectuer les tests sur le port série, car la partie informatique n'est pas encore opérationnelle, on ne peut donc pas lire directement sur le port série pour le moment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi constant ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite réalisé un montage permettant de faire l'envoi seulement sur changement d'état, comme prévu à la séance 1 Nous avons donc réalisé un système de bascules permettant de comparer l'état actuel de chaque diode avec son état précédent, puis de réaliser l'envoi seulement si une différence était observée. Comme précédemment, les diodes sont reliées directement au Port Série, mais cette fois-ci au lieu de brancher le Bit d'envoi du port Série sur un Vcc, soit un '1' logique, nous l'avons relié à la vérification de changement d'état, qui passe à '1' uniquement avec un changement d'état.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi sur changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème qui s'est alors posé était de savoir si on envoyait le signal assez longtemps pour qu'il puisse être lu. En effet on envoie un signal seulement si il y a changement d'état, et cette vérification se fait à chaque incrément d'horloge. Hors, la différence sera donc observée sur un seul incrément d'horloge, par conséquent, on n'envoie de signal que pendant ce seul incrément. Pour l'instant, nous supposons que le port série est capable de stocker les données à envoyer en un seul incrément d'horloge. &lt;br /&gt;
Cependant, si lors des tests, ça ne fonctionne pas, nous prévoyons d'utiliser un compteur pour pouvoir envoyer le signal plus longtemps au Bit d'envoi du port série, et ainsi laisser le temps au port série d'envoyer l'information.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous nous sommes focalisés sur le FPGA, mais nous avons néanmoins terminé la conception du boitier de la harpe, sous la forme de trois 'boites' crénelées, que nous avons ensuite l'intention de découper au FabLab puis d'assembler.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos des boites ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il s'est avéré que réaliser des boites crénelées rendrait tout le boitier beaucoup plus solide, et donc fiable.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le problème de l'impossibilité d'utiliser l'exemple sur les sockets a été résolu, grâce à l'intervention de M. Redon. Le problème était une différence de version de la distribution Linux entre le RPi utilisé et celle utilisé pour l'exemple. En effet, le RPi de travail est sur une distribution Wheezy, alors que la version la plus récente est la Jessie. Les chemins des dépots des sources de la librairie libwebsocket n’existant pas sur Wheezy, on ne pouvait installer la librairie directement en ligne de commande. M. Redon a ajouté le chemin de la librairie dans le gestionnaire de paquet du RPi et on a pu utiliser sans problèmes la librairie. De plus le site du paquet libwebsocket n'était inaccessible que temporairement.&lt;br /&gt;
La séance a été consacré à comprendre le fonctionnement des sockets et comment l'exemple html interagissait avec.&lt;br /&gt;
&lt;br /&gt;
La partie importante du code d'exemple est la suivante : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;static int callback_my(&lt;br /&gt;
  struct libwebsocket_context * this,&lt;br /&gt;
  struct libwebsocket *wsi,enum libwebsocket_callback_reasons reason,&lt;br /&gt;
  void *user,void *in,size_t len)&lt;br /&gt;
 {&lt;br /&gt;
 static char *message=NULL;&lt;br /&gt;
 static int msize=0;&lt;br /&gt;
 switch(reason){&lt;br /&gt;
  case LWS_CALLBACK_ESTABLISHED:&lt;br /&gt;
    printf(&amp;quot;connection established\n&amp;quot;);&lt;br /&gt;
    message=NULL;&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_RECEIVE:&lt;br /&gt;
                // Ici sont traites les messages envoyes par le navigateur&lt;br /&gt;
    printf(&amp;quot;received data: %s\n&amp;quot;,(char *)in);&lt;br /&gt;
    message=malloc(len+LWS_SEND_BUFFER_PRE_PADDING+LWS_SEND_BUFFER_POST_PADDING);&lt;br /&gt;
    if(message==NULL){ perror(&amp;quot;callback_my.malloc&amp;quot;); exit(EXIT_FAILURE); }&lt;br /&gt;
    memcpy(message+LWS_SEND_BUFFER_PRE_PADDING,in,len);&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    msize=len;&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_SERVER_WRITEABLE:&lt;br /&gt;
                // Ici sont envoyes les messages au navigateur&lt;br /&gt;
    if(message!=NULL){&lt;br /&gt;
      char *out=message+LWS_SEND_BUFFER_PRE_PADDING;&lt;br /&gt;
      libwebsocket_write(wsi,(unsigned char *)out,msize,LWS_WRITE_TEXT);&lt;br /&gt;
      free(message);&lt;br /&gt;
      message=NULL;&lt;br /&gt;
      }&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    break;&lt;br /&gt;
  }&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
Il s'agit d'une fonction de callback gérant à la fois la réception et la transmission. On peut remarquer 3 cas du switch : LWS_CALLBACK_ESTABLISHED correspondant à la création d'un lien entre la page web et le serveur websocket à la demande de la page web, LWS_CALLBACK_RECEIVE correspondant aux actions à entreprendre à la réception d'un message provenant du navigateur web, et LWS_CALLBACK_SERVER_WRITEABLE correspondant aux actions afin d'envoyer un message au navigateur.&lt;br /&gt;
&lt;br /&gt;
Coté HTML, on utilise les sockets grâce à ce code suivant :&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;pre&amp;gt;window.WebSocket=(window.WebSocket||window.MozWebSocket);&lt;br /&gt;
 var websocket=new WebSocket('ws://127.0.0.1:9000','myprotocol');&lt;br /&gt;
 websocket.onopen=function(){ $('h1').css('color','green'); };&lt;br /&gt;
 websocket.onerror=function(){ $('h1').css('color','red'); };&lt;br /&gt;
 websocket.onmessage=function(message){&lt;br /&gt;
 console.log(message.data);&lt;br /&gt;
 $('#messages').append($('&amp;lt;p&amp;gt;',{ text: message.data }));&lt;br /&gt;
 };&lt;br /&gt;
 function sendMessage(){&lt;br /&gt;
 websocket.send($('#message').val());&lt;br /&gt;
 $('#message').val('');&lt;br /&gt;
 }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La fonction websocket.onmessage gère le traitement à faire coté client quand le serveur envoie des informations, et la fonction sendMessage permet l'envoie d'information du client vers le serveur.&lt;br /&gt;
&lt;br /&gt;
Pour notre projet, nous avons besoin principalement, dans un premier temps, d'envoyer des informations du serveur vers le client, nous nous sommes donc concentrer à comprendre et modifier les parties du code fourni suivantes : websocket.onmessage coté client et le &amp;quot;case LWS_CALLBACK_SERVER_WRITEABLE:&amp;quot; coté serveur.&lt;br /&gt;
&lt;br /&gt;
Le but des tests était de réussir à faire jouer deux sons différents par le client, avec changement de son imposé par le serveur. HTML5 propose nativement de lire des sons à partir d'une source grâce à une balise audio :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;audio controls=&amp;quot;controls&amp;quot; id=&amp;quot;mySound&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/audio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On récupère l'identifiant de cette balise avec &lt;br /&gt;
&lt;br /&gt;
 var test1 = document.getElementById(&amp;quot;mySound&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
afin de pouvoir l'utiliser de n'importe où dans le programme.&lt;br /&gt;
On définit la source grâce à &lt;br /&gt;
&lt;br /&gt;
 test1.src=&amp;quot;sound.mp3&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
avec &amp;quot;sound.mp3&amp;quot; le chemin d'accès au fichier son par rapport à l'emplacement du fichier html sur le serveur. Ici, le fichier son sound.mp3 est dans le même dossier que la page index.html.&lt;br /&gt;
Enfin, on peut lire le son avec &lt;br /&gt;
&lt;br /&gt;
 test1.play();&lt;br /&gt;
&lt;br /&gt;
Le but du projet étant d'émettre en continue le son généré par la harpe, l'objectif ici est soit de générer un fichier de streaming que l'on lit en continue, soit de lire un fichier différent par son possible et on change la valeur de test1.src en fonction du son à lire, soit on lit toujours la même source, mais que l'on modifie à la volée en fonction du son voulu. La première option a été étudiée jusqu'en fin de séance.&lt;br /&gt;
Nous n'avons pas réussi à comprendre comment générer un fichier de streaming audio simple, de plus toutes les documentations et exemples trouvés ne concernant qu'un streaming simultanée de son et de vidéo à partir d'une caméra et d'un micro, et nous n'avons pas compris comment adapter ces exemples.&lt;br /&gt;
&lt;br /&gt;
== Séance 3 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous avons pu tester l'envoi sur changement d'état, toujours avec les diodes du FPGA.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par ajouter une horloge sur le détecteur de changement d'état, afin d'augmenter le nombre d'incréments d'horloge sur lequel il est à '1', et ce dans le but de rendre le clignotement d'un diode visible à l’œil nu.&lt;br /&gt;
Ensuite, nous avons relié la sortie du détecteur de changement d'état et des phototransistors par un 'ET' logique, que nous avons ensuite relié aux diodes du FPGA.&lt;br /&gt;
De cette façon, si l'on détecte un changement d'état sur un phototransistor, la nouvelle valeur est alors envoyée sur les diodes. Le système a fonctionné (à voir :p ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos du test avec changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite passé le reste de la séance à mettre en commun notre partie avec la partie informatique, en essayant de leur permettre de lire sur le port série du FPGA. Les essais ont pour l'instant été infructueux, mais des progrès ont été faits. &lt;br /&gt;
&lt;br /&gt;
L'objectif étant que le Raspberry Pi puisse lire les informations envoyées par le FPGA, pour ensuite les transmettre au site Web que nous allons réaliser par la suite.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Au vu des difficultés rencontrées lors de la mise en place d'un véritable système de streaming, nous avons décider d'étudier les autres options possibles.&lt;br /&gt;
Notre deuxième solution était de modifier la valeur de test1.src. Mais cela voulait dire effectuer beaucoup de traitement coté client, et si on décidait de rajouter beaucoup de son, ou de générer de nouveaux fichiers son, ce la demandait soit de modifier le HTML à chaque ajout de fonctionnalité, ou de créer une grande quantité de fichier son qui pollueraient le serveur. Nous avons donc décidé qu'il serait plus pratique de toujours écraser la source avec le nouveau son a lire, et de ne jamais changer la valeur de test1.src.&lt;br /&gt;
&lt;br /&gt;
Afin d'effectuer des tests afin de voir si notre idée marchait bien, nous avons utiliser le code C très simple suivant :&lt;br /&gt;
&lt;br /&gt;
  int cpt;&lt;br /&gt;
  for (cpt = 0; cpt &amp;lt; 250000000; cpt++);&lt;br /&gt;
&lt;br /&gt;
    boole = !boole;&lt;br /&gt;
	printf(&amp;quot;changement: %d\n&amp;quot;,boole);&lt;br /&gt;
    if(boole)&lt;br /&gt;
      system(&amp;quot;sudo cp Level-complete-sound-effect.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
      system(&amp;quot;sudo cp Raindrops-noise.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Ce code nous permet de modifier assez fréquemment le fichier source. Les fichiers audio de tests ont été trouvé sur http://www.orangefreesounds.com/ et sont libre de droit.&lt;br /&gt;
&lt;br /&gt;
Dans la page HTML de test nous utilisé les options de la balise source suivante :&lt;br /&gt;
&lt;br /&gt;
 test1.loop = true;&lt;br /&gt;
&lt;br /&gt;
qui permet au son de se jouer en boucle.&lt;br /&gt;
&lt;br /&gt;
Bien que les fichiers soit bien modifiés en local sur le serveur, toujours le même son est joué.&lt;br /&gt;
&lt;br /&gt;
On a donc testé de recharger le son uniquement lorsque le son est modifié, avec un envoi de message du serveur par socket.&lt;br /&gt;
Le serveur est conçu tel que suit : &lt;br /&gt;
  while(1){&lt;br /&gt;
  int cpt;&lt;br /&gt;
  bool boole;&lt;br /&gt;
  boole = 1;&lt;br /&gt;
  for (cpt = 0; cpt &amp;lt; 50000; cpt++);&lt;br /&gt;
&lt;br /&gt;
    boole = !boole;&lt;br /&gt;
&lt;br /&gt;
    if(boole)&lt;br /&gt;
      system(&amp;quot;cp Level-complete-sound-effect.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
      system(&amp;quot;cp Raindrops-noise.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      libwebsocket_write(test,(unsigned char *)out,1,LWS_WRITE_TEXT);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
 libwebsocket_context_destroy(context);&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
On modifie la source, et ensuite on envoi un message, dont le contenu n'est pas important, le message sert juste d'indication au client que la source a changé.&lt;br /&gt;
&lt;br /&gt;
Le code coté client : &lt;br /&gt;
&lt;br /&gt;
 websocket.onmessage=function(message){&lt;br /&gt;
 test1.pause();&lt;br /&gt;
 test1.load();&lt;br /&gt;
 test1.play();&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
A la réception d'un message, on pause le son avec test1.pause() puis on recharge le son afin d'aller chercher la valeur actuelle de la source, puis on relance le son avec test1.play().&lt;br /&gt;
D'après la documentation technique de HTML5, la fonction load() est sensé recharger la source si elle a changé, mais le résultat de ce test n'est pas concluant : le client joue toujours le même son.&lt;br /&gt;
Nous ne comprenons pas pourquoi.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 1 : Réalisation du site Web ==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé ce site web lors de notre temps libre afin de permettre la communication entre le Raspberry Pi et l'ordinateur. En effet, il était inclus dans notre projet de devoir réaliser une communication par internet. Ce site internet va donc remplir cette condition. Sur celui-ci, on pourra trouver une brève description de notre projet, un lien vers le wiki, une image exemple d'un harpe et les boutons Play et Pause qui permettent d'activer et de désactiver la harpe laser.&lt;br /&gt;
&lt;br /&gt;
Après de nombreux tests sur la communication entre le serveur et le client web et le problème de toujours lire le même son, même si la source a été modifié, il s'est avéré que le client lisait toujours le même son quoi qu'il arrive, même si le fichier cible n’existait plus sur le serveur. Comprendre pourquoi a nécessité quelque recherche et la source du problème était la suivante : les navigateurs utilisés, Mozilla Firefox et Google Chrome, mettaient en cache le fichier son à la première lecture, et ne vérifiait plus l'état du fichier sur le serveur, fichier qui donc pouvait être modifié sans que cela n'ai un impact sur le déroulement coté client. Il a fallut trouver un moyen de contourner le cache. N'ayant aucune connaissance sur le domaine, les recherches ont été infructueuses. Suite à une conversation avec M. Rudametkin, nous avons été orienté vers ce lien https://stackoverflow.com/questions/1077041/refresh-image-with-a-new-one-at-the-same-url/1077051#1077051 qui nous a permit de résoudre le problème.&lt;br /&gt;
En utilisant la commande : &lt;br /&gt;
&lt;br /&gt;
 test1.src=&amp;quot;sound.mp3?&amp;quot;+ new Date().getTime();&lt;br /&gt;
&lt;br /&gt;
nous trompons le cache en forçant la revérification de la source sur le serveur. Grâce a cette méthode nous avons enfin réussi à modifier le son joué par le client, et nous avons pu passer à la gestion de la communication série entre le RPi et le FPGA/Arduino.&lt;br /&gt;
&lt;br /&gt;
Le code fonctionnel de la page web est le suivant : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;audio controls=&amp;quot;controls&amp;quot; id=&amp;quot;mySound&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/audio&amp;gt;&lt;br /&gt;
    &amp;lt;script&lt;br /&gt;
        src=&amp;quot;jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.WebSocket=(window.WebSocket||window.MozWebSocket);&lt;br /&gt;
&lt;br /&gt;
var websocket=new WebSocket('ws://10.42.93:9000','myprotocol');&lt;br /&gt;
var test1 = document.getElementById(&amp;quot;mySound&amp;quot;);&lt;br /&gt;
test1.src=&amp;quot;sound.mp3&amp;quot;;&lt;br /&gt;
test1.autoplay = true;&lt;br /&gt;
websocket.onopen=function(){ $('h1').css('color','green'); };&lt;br /&gt;
&lt;br /&gt;
websocket.onerror=function(){ $('h1').css('color','red'); };&lt;br /&gt;
&lt;br /&gt;
websocket.onmessage=function(message){&lt;br /&gt;
test1.pause();&lt;br /&gt;
test1.src=&amp;quot;sound.mp3?&amp;quot;+ new Date().getTime();&lt;br /&gt;
test1.load();&lt;br /&gt;
test1.play();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function sendMessage(){&lt;br /&gt;
websocket.send($('#message').val());&lt;br /&gt;
$('#message').val('');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var son = document.getELementById(&amp;quot;sound&amp;quot;);&lt;br /&gt;
son.loop = true;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt;WebSockets test&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;message&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;button onclick=&amp;quot;sendMessage();&amp;quot;&amp;gt;Send&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce code n'est pas la version final, juste l'ensemble des parties logiques et fonctionnelles de la page web.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 2 : Réalisation du programme secondaire sur Arduino 'en cas de problèmes' ==&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis à plusieurs occasions en dehors des heures de projet afin d'avancer sur notre harpe. Nous avons donc décidé que nous devions réaliser un programme sur Arduino nous permettant de réaliser des tests de transmission par la liaison série sans avoir besoin du FPGA. Dans un premier temps, nous avons tenté d'utiliser le port USB comme liaison série. Cependant, il s'est avéré que le Raspberry pi ne pouvait pas lire son port USB, ce qui nous a donc forcé à utiliser les pins de communication série de l'Arduino. &lt;br /&gt;
Nous sommes sur un Arduino Mega 2560, nous avons a notre disposition plusieurs pins de communication série différents. Ils seront utilisés uniquement en transmission. Pour communiquer, nous allons ensuite utiliser le pin Tx1. Nous aboutissons donc au programme suivant:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Setup.PNG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Captprog.PNG]]&lt;br /&gt;
&lt;br /&gt;
La communication série de ce programme nous a causé des problèmes, surtout du fait que l'ordinateur ne recevait pas les informations transmises par l'Arduino. Nous avons donc du effectuer de multiples tests afin de voir où se situait le problème. Nous avons pu déterminer que nous avions un problème au niveau de notre pont diviseur de tension entre l'alimentation de l’Arduino et celle du Raspberry Pi, nous avons alors changé les résistances.&lt;br /&gt;
Nous avons également notamment modifié le programme afin de vérifier que l'information était bien transmise sur le Pin Série de l'Arduino, et que le problème ne venait donc pas de l'Arduino mais bien du Raspberry, qui ne transmet pas correctement l'information à l'ordinateur.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 3 : Assemblage de la boite et mise en place des composants ==&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43747</id>
		<title>Projet IMA3 P5, 2016/2017, TD1</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43747"/>
				<updated>2017-06-12T10:05:17Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : /* Séance supplémentaire 1 : Réalisation du site Web */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet IMA3-SC 2016/2017 : Synt'Harpe (Sainte) Laser =&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Description du système ===&lt;br /&gt;
&lt;br /&gt;
Pour le projet Système Communicant, nous allons réaliser une harpe laser. Notre but est de créer un instrument de musique similaire à une harpe, où les cordes sont remplacées par des capteurs infra-rouges.&lt;br /&gt;
&lt;br /&gt;
Un son sera émis par l'ordinateur dès que le capteur IR captera une main et le joueur pourra avec son autre main moduler l'amplitude de la note.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on travaillera sur une gamme de son sur 8 bits. Puis, nous implémenterons une banque de sons qui nous permettra de sélectionner l'instrument désiré, d'où l'appellation Synt'Harpe.&lt;br /&gt;
&lt;br /&gt;
L'ordinateur décidera du fonctionnement ou non de la harpe. C'est aussi grâce à lui qu'on pourra choisir la banque de sons voulue.&lt;br /&gt;
&lt;br /&gt;
Toutes les banques de sons seront enregistrées sur le Raspberry.&lt;br /&gt;
Les LEDs signaleront l'emplacement des cordes.&lt;br /&gt;
&lt;br /&gt;
Pour la partie optionnelle, on remplacera les LEDs par des lasers pour un effet visuel de qualité (plus poussé). La fumée permettra de voir les lasers.&lt;br /&gt;
&lt;br /&gt;
=== Le matériel ===&lt;br /&gt;
* Un raspberry pi&lt;br /&gt;
* 8 phototransistors&lt;br /&gt;
* 8 émetteurs lasers&lt;br /&gt;
* Des résistances&lt;br /&gt;
* Une structure&lt;br /&gt;
* Carte d'acquisition de type Arduino au début puis FPGA &lt;br /&gt;
* Un ordinateur&lt;br /&gt;
* Une alimentation&lt;br /&gt;
&lt;br /&gt;
=== Optionnel (visuel) ===&lt;br /&gt;
&lt;br /&gt;
* 8 émetteurs laser&lt;br /&gt;
* Un générateur de fumée&lt;br /&gt;
* Une caméra&lt;br /&gt;
&lt;br /&gt;
== Séance 1 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Le but de cette première séance était de se répartir les tâches, de tester le matériel mit à disposition et de découvrir le fonctionnement du FPGA.&lt;br /&gt;
&lt;br /&gt;
Le principe de fonctionnement de la harpe est le suivant:&lt;br /&gt;
Chaque capteur sera situé en face d'un laser. Les capteurs seront dans la partie haute de la harpe afin de limiter les interférences dues à d'autres sources lumineuses. Chaque laser pointera vers un capteur. &lt;br /&gt;
&lt;br /&gt;
 * Ajout du dessin de la harpe * &lt;br /&gt;
&lt;br /&gt;
Les capteurs enverront tous par défaut la même valeur au FPGA. Quand l'utilisateur passera sa main dans la harpe, un faisceau laser sera coupé. Le capteur n'enverra plus sa valeur seuil au FPGA, il aura donc changé d'état.&lt;br /&gt;
Dès lors que le FPGA détectera un changement d'état, il enverra l'état dans lequel se trouvent les 8 capteurs au Raspberry. &lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé des tests sur les phototransistors et les lasers. Nous avons mis en parallèle un laser et deux capteurs, sans oublier leur résistance de 1.2k Ohms chacune. &lt;br /&gt;
&lt;br /&gt;
Nous avons vu que à luminosité ambiante, quand le laser pointe sur le capteur, celui-ci envoie à l'Arduino une valeur de 950 environ. Ensuite, quand le faisceau laser est coupé, la valeur envoyée par le phototransistor monte à 1020.&lt;br /&gt;
Puis, nous avons réitéré l'expérience en mettant le système dans une boîte. Cette fois, le valeur est passée de 840 quand le capteur est éclairé par le laser à 900 quand le faisceau est coupé.&lt;br /&gt;
Nous en avons déduit que nous allons devoir refaire l'expérience une fois la harpe assemblée.&lt;br /&gt;
&lt;br /&gt;
Les lasers étant très directionnels tout comme les phototransistors, nous n'aurons pas de soucis d'interférences. Un capteur détectera uniquement le laser situé directement en face de lui et non ceux de son voisinage.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Même si il peut paraitre futile d'insérer une partie boitier dans un projet centré sur l'informatique et l'électronique, il s'est avéré que le boitier de notre Harpe nécessitait une attention particulière.&lt;br /&gt;
&lt;br /&gt;
La taille de la harpe à été un sujet de débat, et nous avons réalisé des tests afin de vérifier que des phototransistors trop proches les uns des autres n'allait pas compromettre le bon fonctionnement de la harpe dans son ensemble. En effet, si le phototransistor détectait un autre laser que celui vers lequel il pointe serait extrêmement problématique. Heureusement, il s'est avéré que les phototransistors sont très directionnels, au point que se pose désormais le problème inverse.&lt;br /&gt;
&lt;br /&gt;
Nous allons devoir faire très attention au fait que les lasers soient bien fixés et pointent exactement vers les phototransistors, car dans le cas contraire, ceux-ci ne détectent absolument pas le laser, et tout le principe de fonctionnement s'effondre. La conception et l'assemblage de la boite devront donc être relativement précis, pour éviter ces problèmes.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons dès le départ décidé d'éviter l'utilisation de diodes infra-rouges, pour leur préférer les lasers. Tout d'abord, parce que les diodes ne sont en aucun cas assez puissantes pour être détectées par les phototransistors, ce qui une fois de plus rend notre harpe inutile. Ensuite, parce qu'il nous a semblé que réaliser une harpe 'laser' sans lasers était un concept déconcertant, et enlève beaucoup de l’intérêt de ce projet.&lt;br /&gt;
&lt;br /&gt;
Un premier jet de design avait été réalisé avant cette séance, et au vu des données récoltées pendant celle-ci, nous l'avons modifié pour les prendre en compte, notamment la taille des lasers par rapport aux diodes, et la précision requise. &lt;br /&gt;
&lt;br /&gt;
'insérer photos premiers schémas ici'&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le travail a été séparé en 2 parties, une personne par partie : &lt;br /&gt;
- une première partie sur le serveur même (page web, système de streaming de son depuis la page web)&lt;br /&gt;
- une seconde partie sur la lecture du port série&lt;br /&gt;
&lt;br /&gt;
==== Partie serveur ====&lt;br /&gt;
La première séance a été consacré à deux grands axes : prendre la main à distance sur le raspberry pi et mettre en place le serveur web.&lt;br /&gt;
Afin de pouvoir contrôler et travailler facilement sur le RPi, l'outil vncserver a été installé sur le raspberry, permettant de contrôler via un interface graphique le RPi depuis un ordinateur branché sur le même réseau. Cet utilitaire permettra a l'avenir de travailler directement sur le RPi sans devoir constamment uploader par ssh le travail effectué.&lt;br /&gt;
&lt;br /&gt;
Coté mise en place du serveur web, l'utilitaire de serveur web apache2 a été installé sans soucis, et les pages d'exemples web et javascript fonctionnent. En revanche, l'utilisation du code d'exemple sur les sockets n'est pas utilisable, le paquet proposé n’existe pas et le site du paquet de socket est mort.&lt;br /&gt;
Le reste de la séance a été consacré a des recherches sur les moyens de pouvoir streamer du son, recherches non concluantes. Aucune solution n'a été trouvé sans passer par un service internet hébergé par un tier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Partie lecture port série ====&lt;br /&gt;
&lt;br /&gt;
Cette première séance fut consacrée à la sélection du langage de programmation et à sa prise en main. Il a été décidé d'utiliser Python pour écrire le programme récupérant et traitant les données récupérées à travers le port série. Python étant un langage fort usité, il possède une très large documentation. Ce fut donc facile de trouver la librairie permettant de lire les données envoyées par le port série.&lt;br /&gt;
&lt;br /&gt;
Un doute subsiste encore sur le type de données envoyé par le port série. L'idéal serait de récupérer un tableau de 8 entiers de type binaire correspondant aux états des 8 ports liés aux &amp;quot;cordes&amp;quot; laser, pour pouvoir ensuite traiter ces données facilement.&lt;br /&gt;
&lt;br /&gt;
== Séance 2 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Lors de cette séance, nous avons réalisé le premier circuit sur le FPGA. &lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un circuit simple, qui envoie en permanence l'état des huit phototransistors au port série. Les phototransistors sont alors directement reliés à celui-ci. Nous avons pu tester le bon fonctionnement du système grâce aux diodes du FPGA. Nous avons branché en parallèle sur le circuit les huit diodes, afin de vérifier qu'un signal était bien envoyé en permanence, on a pu les voir s'éteindre lorsqu'on éclairait un laser. &lt;br /&gt;
Ces diodes se sont avérées très utiles, car il n'est pas encore possible d'effectuer les tests sur le port série, car la partie informatique n'est pas encore opérationnelle, on ne peut donc pas lire directement sur le port série pour le moment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi constant ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite réalisé un montage permettant de faire l'envoi seulement sur changement d'état, comme prévu à la séance 1 Nous avons donc réalisé un système de bascules permettant de comparer l'état actuel de chaque diode avec son état précédent, puis de réaliser l'envoi seulement si une différence était observée. Comme précédemment, les diodes sont reliées directement au Port Série, mais cette fois-ci au lieu de brancher le Bit d'envoi du port Série sur un Vcc, soit un '1' logique, nous l'avons relié à la vérification de changement d'état, qui passe à '1' uniquement avec un changement d'état.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi sur changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème qui s'est alors posé était de savoir si on envoyait le signal assez longtemps pour qu'il puisse être lu. En effet on envoie un signal seulement si il y a changement d'état, et cette vérification se fait à chaque incrément d'horloge. Hors, la différence sera donc observée sur un seul incrément d'horloge, par conséquent, on n'envoie de signal que pendant ce seul incrément. Pour l'instant, nous supposons que le port série est capable de stocker les données à envoyer en un seul incrément d'horloge. &lt;br /&gt;
Cependant, si lors des tests, ça ne fonctionne pas, nous prévoyons d'utiliser un compteur pour pouvoir envoyer le signal plus longtemps au Bit d'envoi du port série, et ainsi laisser le temps au port série d'envoyer l'information.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous nous sommes focalisés sur le FPGA, mais nous avons néanmoins terminé la conception du boitier de la harpe, sous la forme de trois 'boites' crénelées, que nous avons ensuite l'intention de découper au FabLab puis d'assembler.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos des boites ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il s'est avéré que réaliser des boites crénelées rendrait tout le boitier beaucoup plus solide, et donc fiable.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le problème de l'impossibilité d'utiliser l'exemple sur les sockets a été résolu, grâce à l'intervention de M. Redon. Le problème était une différence de version de la distribution Linux entre le RPi utilisé et celle utilisé pour l'exemple. En effet, le RPi de travail est sur une distribution Wheezy, alors que la version la plus récente est la Jessie. Les chemins des dépots des sources de la librairie libwebsocket n’existant pas sur Wheezy, on ne pouvait installer la librairie directement en ligne de commande. M. Redon a ajouté le chemin de la librairie dans le gestionnaire de paquet du RPi et on a pu utiliser sans problèmes la librairie. De plus le site du paquet libwebsocket n'était inaccessible que temporairement.&lt;br /&gt;
La séance a été consacré à comprendre le fonctionnement des sockets et comment l'exemple html interagissait avec.&lt;br /&gt;
&lt;br /&gt;
La partie importante du code d'exemple est la suivante : &lt;br /&gt;
&lt;br /&gt;
 static int callback_my(&lt;br /&gt;
  struct libwebsocket_context * this,&lt;br /&gt;
  struct libwebsocket *wsi,enum libwebsocket_callback_reasons reason,&lt;br /&gt;
  void *user,void *in,size_t len)&lt;br /&gt;
 {&lt;br /&gt;
 static char *message=NULL;&lt;br /&gt;
 static int msize=0;&lt;br /&gt;
 switch(reason){&lt;br /&gt;
  case LWS_CALLBACK_ESTABLISHED:&lt;br /&gt;
    printf(&amp;quot;connection established\n&amp;quot;);&lt;br /&gt;
    message=NULL;&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_RECEIVE:&lt;br /&gt;
                // Ici sont traites les messages envoyes par le navigateur&lt;br /&gt;
    printf(&amp;quot;received data: %s\n&amp;quot;,(char *)in);&lt;br /&gt;
    message=malloc(len+LWS_SEND_BUFFER_PRE_PADDING+LWS_SEND_BUFFER_POST_PADDING);&lt;br /&gt;
    if(message==NULL){ perror(&amp;quot;callback_my.malloc&amp;quot;); exit(EXIT_FAILURE); }&lt;br /&gt;
    memcpy(message+LWS_SEND_BUFFER_PRE_PADDING,in,len);&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    msize=len;&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_SERVER_WRITEABLE:&lt;br /&gt;
                // Ici sont envoyes les messages au navigateur&lt;br /&gt;
    if(message!=NULL){&lt;br /&gt;
      char *out=message+LWS_SEND_BUFFER_PRE_PADDING;&lt;br /&gt;
      libwebsocket_write(wsi,(unsigned char *)out,msize,LWS_WRITE_TEXT);&lt;br /&gt;
      free(message);&lt;br /&gt;
      message=NULL;&lt;br /&gt;
      }&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    break;&lt;br /&gt;
  }&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une fonction de callback gérant à la fois la réception et la transmission. On peut remarquer 3 cas du switch : LWS_CALLBACK_ESTABLISHED correspondant à la création d'un lien entre la page web et le serveur websocket à la demande de la page web, LWS_CALLBACK_RECEIVE correspondant aux actions à entreprendre à la réception d'un message provenant du navigateur web, et LWS_CALLBACK_SERVER_WRITEABLE correspondant aux actions afin d'envoyer un message au navigateur.&lt;br /&gt;
&lt;br /&gt;
Coté HTML, on utilise les sockets grâce à ce code suivant :&lt;br /&gt;
 &lt;br /&gt;
 window.WebSocket=(window.WebSocket||window.MozWebSocket);&lt;br /&gt;
 var websocket=new WebSocket('ws://127.0.0.1:9000','myprotocol');&lt;br /&gt;
 websocket.onopen=function(){ $('h1').css('color','green'); };&lt;br /&gt;
 websocket.onerror=function(){ $('h1').css('color','red'); };&lt;br /&gt;
 websocket.onmessage=function(message){&lt;br /&gt;
 console.log(message.data);&lt;br /&gt;
 $('#messages').append($('&amp;lt;p&amp;gt;',{ text: message.data }));&lt;br /&gt;
 };&lt;br /&gt;
 function sendMessage(){&lt;br /&gt;
 websocket.send($('#message').val());&lt;br /&gt;
 $('#message').val('');&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La fonction websocket.onmessage gère le traitement à faire coté client quand le serveur envoie des informations, et la fonction sendMessage permet l'envoie d'information du client vers le serveur.&lt;br /&gt;
&lt;br /&gt;
Pour notre projet, nous avons besoin principalement, dans un premier temps, d'envoyer des informations du serveur vers le client, nous nous sommes donc concentrer à comprendre et modifier les parties du code fourni suivantes : websocket.onmessage coté client et le &amp;quot;case LWS_CALLBACK_SERVER_WRITEABLE:&amp;quot; coté serveur.&lt;br /&gt;
&lt;br /&gt;
Le but des tests était de réussir à faire jouer deux sons différents par le client, avec changement de son imposé par le serveur. HTML5 propose nativement de lire des sons à partir d'une source grâce à une balise audio :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;audio controls=&amp;quot;controls&amp;quot; id=&amp;quot;mySound&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/audio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On récupère l'identifiant de cette balise avec &lt;br /&gt;
&lt;br /&gt;
 var test1 = document.getElementById(&amp;quot;mySound&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
afin de pouvoir l'utiliser de n'importe où dans le programme.&lt;br /&gt;
On définit la source grâce à &lt;br /&gt;
&lt;br /&gt;
 test1.src=&amp;quot;sound.mp3&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
avec &amp;quot;sound.mp3&amp;quot; le chemin d'accès au fichier son par rapport à l'emplacement du fichier html sur le serveur. Ici, le fichier son sound.mp3 est dans le même dossier que la page index.html.&lt;br /&gt;
Enfin, on peut lire le son avec &lt;br /&gt;
&lt;br /&gt;
 test1.play();&lt;br /&gt;
&lt;br /&gt;
Le but du projet étant d'émettre en continue le son généré par la harpe, l'objectif ici est soit de générer un fichier de streaming que l'on lit en continue, soit de lire un fichier différent par son possible et on change la valeur de test1.src en fonction du son à lire, soit on lit toujours la même source, mais que l'on modifie à la volée en fonction du son voulu. La première option a été étudiée jusqu'en fin de séance.&lt;br /&gt;
Nous n'avons pas réussi à comprendre comment générer un fichier de streaming audio simple, de plus toutes les documentations et exemples trouvés ne concernant qu'un streaming simultanée de son et de vidéo à partir d'une caméra et d'un micro, et nous n'avons pas compris comment adapter ces exemples.&lt;br /&gt;
&lt;br /&gt;
== Séance 3 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous avons pu tester l'envoi sur changement d'état, toujours avec les diodes du FPGA.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par ajouter une horloge sur le détecteur de changement d'état, afin d'augmenter le nombre d'incréments d'horloge sur lequel il est à '1', et ce dans le but de rendre le clignotement d'un diode visible à l’œil nu.&lt;br /&gt;
Ensuite, nous avons relié la sortie du détecteur de changement d'état et des phototransistors par un 'ET' logique, que nous avons ensuite relié aux diodes du FPGA.&lt;br /&gt;
De cette façon, si l'on détecte un changement d'état sur un phototransistor, la nouvelle valeur est alors envoyée sur les diodes. Le système a fonctionné (à voir :p ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos du test avec changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite passé le reste de la séance à mettre en commun notre partie avec la partie informatique, en essayant de leur permettre de lire sur le port série du FPGA. Les essais ont pour l'instant été infructueux, mais des progrès ont été faits. &lt;br /&gt;
&lt;br /&gt;
L'objectif étant que le Raspberry Pi puisse lire les informations envoyées par le FPGA, pour ensuite les transmettre au site Web que nous allons réaliser par la suite.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Au vu des difficultés rencontrées lors de la mise en place d'un véritable système de streaming, nous avons décider d'étudier les autres options possibles.&lt;br /&gt;
Notre deuxième solution était de modifier la valeur de test1.src. Mais cela voulait dire effectuer beaucoup de traitement coté client, et si on décidait de rajouter beaucoup de son, ou de générer de nouveaux fichiers son, ce la demandait soit de modifier le HTML à chaque ajout de fonctionnalité, ou de créer une grande quantité de fichier son qui pollueraient le serveur. Nous avons donc décidé qu'il serait plus pratique de toujours écraser la source avec le nouveau son a lire, et de ne jamais changer la valeur de test1.src.&lt;br /&gt;
&lt;br /&gt;
Afin d'effectuer des tests afin de voir si notre idée marchait bien, nous avons utiliser le code C très simple suivant :&lt;br /&gt;
&lt;br /&gt;
  int cpt;&lt;br /&gt;
  for (cpt = 0; cpt &amp;lt; 250000000; cpt++);&lt;br /&gt;
&lt;br /&gt;
    boole = !boole;&lt;br /&gt;
	printf(&amp;quot;changement: %d\n&amp;quot;,boole);&lt;br /&gt;
    if(boole)&lt;br /&gt;
      system(&amp;quot;sudo cp Level-complete-sound-effect.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
      system(&amp;quot;sudo cp Raindrops-noise.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Ce code nous permet de modifier assez fréquemment le fichier source. Les fichiers audio de tests ont été trouvé sur http://www.orangefreesounds.com/ et sont libre de droit.&lt;br /&gt;
&lt;br /&gt;
Dans la page HTML de test nous utilisé les options de la balise source suivante :&lt;br /&gt;
&lt;br /&gt;
 test1.loop = true;&lt;br /&gt;
&lt;br /&gt;
qui permet au son de se jouer en boucle.&lt;br /&gt;
&lt;br /&gt;
Bien que les fichiers soit bien modifiés en local sur le serveur, toujours le même son est joué.&lt;br /&gt;
&lt;br /&gt;
On a donc testé de recharger le son uniquement lorsque le son est modifié, avec un envoi de message du serveur par socket.&lt;br /&gt;
Le serveur est conçu tel que suit : &lt;br /&gt;
  while(1){&lt;br /&gt;
  int cpt;&lt;br /&gt;
  bool boole;&lt;br /&gt;
  boole = 1;&lt;br /&gt;
  for (cpt = 0; cpt &amp;lt; 50000; cpt++);&lt;br /&gt;
&lt;br /&gt;
    boole = !boole;&lt;br /&gt;
&lt;br /&gt;
    if(boole)&lt;br /&gt;
      system(&amp;quot;cp Level-complete-sound-effect.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
      system(&amp;quot;cp Raindrops-noise.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      libwebsocket_write(test,(unsigned char *)out,1,LWS_WRITE_TEXT);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
 libwebsocket_context_destroy(context);&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
On modifie la source, et ensuite on envoi un message, dont le contenu n'est pas important, le message sert juste d'indication au client que la source a changé.&lt;br /&gt;
&lt;br /&gt;
Le code coté client : &lt;br /&gt;
&lt;br /&gt;
 websocket.onmessage=function(message){&lt;br /&gt;
 test1.pause();&lt;br /&gt;
 test1.load();&lt;br /&gt;
 test1.play();&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
A la réception d'un message, on pause le son avec test1.pause() puis on recharge le son afin d'aller chercher la valeur actuelle de la source, puis on relance le son avec test1.play().&lt;br /&gt;
D'après la documentation technique de HTML5, la fonction load() est sensé recharger la source si elle a changé, mais le résultat de ce test n'est pas concluant : le client joue toujours le même son.&lt;br /&gt;
Nous ne comprenons pas pourquoi.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 1 : Réalisation du site Web ==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé ce site web lors de notre temps libre afin de permettre la communication entre le Raspberry Pi et l'ordinateur. En effet, il était inclus dans notre projet de devoir réaliser une communication par internet. Ce site internet va donc remplir cette condition. Sur celui-ci, on pourra trouver une brève description de notre projet, un lien vers le wiki, une image exemple d'un harpe et les boutons Play et Pause qui permettent d'activer et de désactiver la harpe laser.&lt;br /&gt;
&lt;br /&gt;
Après de nombreux tests sur la communication entre le serveur et le client web et le problème de toujours lire le même son, même si la source a été modifié, il s'est avéré que le client lisait toujours le même son quoi qu'il arrive, même si le fichier cible n’existait plus sur le serveur. Comprendre pourquoi a nécessité quelque recherche et la source du problème était la suivante : les navigateurs utilisés, Mozilla Firefox et Google Chrome, mettaient en cache le fichier son à la première lecture, et ne vérifiait plus l'état du fichier sur le serveur, fichier qui donc pouvait être modifié sans que cela n'ai un impact sur le déroulement coté client. Il a fallut trouver un moyen de contourner le cache. N'ayant aucune connaissance sur le domaine, les recherches ont été infructueuses. Suite à une conversation avec M. Rudametkin, nous avons été orienté vers ce lien https://stackoverflow.com/questions/1077041/refresh-image-with-a-new-one-at-the-same-url/1077051#1077051 qui nous a permit de résoudre le problème.&lt;br /&gt;
En utilisant la commande : &lt;br /&gt;
&lt;br /&gt;
 test1.src=&amp;quot;sound.mp3?&amp;quot;+ new Date().getTime();&lt;br /&gt;
&lt;br /&gt;
nous trompons le cache en forçant la revérification de la source sur le serveur. Grâce a cette méthode nous avons enfin réussi à modifier le son joué par le client, et nous avons pu passer à la gestion de la communication série entre le RPi et le FPGA/Arduino.&lt;br /&gt;
&lt;br /&gt;
Le code fonctionnel de la page web est le suivant : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;audio controls=&amp;quot;controls&amp;quot; id=&amp;quot;mySound&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/audio&amp;gt;&lt;br /&gt;
    &amp;lt;script&lt;br /&gt;
        src=&amp;quot;jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.WebSocket=(window.WebSocket||window.MozWebSocket);&lt;br /&gt;
&lt;br /&gt;
var websocket=new WebSocket('ws://10.42.93:9000','myprotocol');&lt;br /&gt;
var test1 = document.getElementById(&amp;quot;mySound&amp;quot;);&lt;br /&gt;
test1.src=&amp;quot;sound.mp3&amp;quot;;&lt;br /&gt;
test1.autoplay = true;&lt;br /&gt;
websocket.onopen=function(){ $('h1').css('color','green'); };&lt;br /&gt;
&lt;br /&gt;
websocket.onerror=function(){ $('h1').css('color','red'); };&lt;br /&gt;
&lt;br /&gt;
websocket.onmessage=function(message){&lt;br /&gt;
test1.pause();&lt;br /&gt;
test1.src=&amp;quot;sound.mp3?&amp;quot;+ new Date().getTime();&lt;br /&gt;
test1.load();&lt;br /&gt;
test1.play();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function sendMessage(){&lt;br /&gt;
websocket.send($('#message').val());&lt;br /&gt;
$('#message').val('');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var son = document.getELementById(&amp;quot;sound&amp;quot;);&lt;br /&gt;
son.loop = true;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt;WebSockets test&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;message&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;button onclick=&amp;quot;sendMessage();&amp;quot;&amp;gt;Send&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce code n'est pas la version final, juste l'ensemble des parties logiques et fonctionnelles de la page web.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 2 : Réalisation du programme secondaire sur Arduino 'en cas de problèmes' ==&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis à plusieurs occasions en dehors des heures de projet afin d'avancer sur notre harpe. Nous avons donc décidé que nous devions réaliser un programme sur Arduino nous permettant de réaliser des tests de transmission par la liaison série sans avoir besoin du FPGA. Dans un premier temps, nous avons tenté d'utiliser le port USB comme liaison série. Cependant, il s'est avéré que le Raspberry pi ne pouvait pas lire son port USB, ce qui nous a donc forcé à utiliser les pins de communication série de l'Arduino. &lt;br /&gt;
Nous sommes sur un Arduino Mega 2560, nous avons a notre disposition plusieurs pins de communication série différents. Ils seront utilisés uniquement en transmission. Pour communiquer, nous allons ensuite utiliser le pin Tx1. Nous aboutissons donc au programme suivant:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Setup.PNG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Captprog.PNG]]&lt;br /&gt;
&lt;br /&gt;
La communication série de ce programme nous a causé des problèmes, surtout du fait que l'ordinateur ne recevait pas les informations transmises par l'Arduino. Nous avons donc du effectuer de multiples tests afin de voir où se situait le problème. Nous avons pu déterminer que nous avions un problème au niveau de notre pont diviseur de tension entre l'alimentation de l’Arduino et celle du Raspberry Pi, nous avons alors changé les résistances.&lt;br /&gt;
Nous avons également notamment modifié le programme afin de vérifier que l'information était bien transmise sur le Pin Série de l'Arduino, et que le problème ne venait donc pas de l'Arduino mais bien du Raspberry, qui ne transmet pas correctement l'information à l'ordinateur.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 3 : Assemblage de la boite et mise en place des composants ==&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43746</id>
		<title>Projet IMA3 P5, 2016/2017, TD1</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43746"/>
				<updated>2017-06-12T10:04:40Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : /* Séance supplémentaire 1 : Réalisation du site Web */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet IMA3-SC 2016/2017 : Synt'Harpe (Sainte) Laser =&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Description du système ===&lt;br /&gt;
&lt;br /&gt;
Pour le projet Système Communicant, nous allons réaliser une harpe laser. Notre but est de créer un instrument de musique similaire à une harpe, où les cordes sont remplacées par des capteurs infra-rouges.&lt;br /&gt;
&lt;br /&gt;
Un son sera émis par l'ordinateur dès que le capteur IR captera une main et le joueur pourra avec son autre main moduler l'amplitude de la note.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on travaillera sur une gamme de son sur 8 bits. Puis, nous implémenterons une banque de sons qui nous permettra de sélectionner l'instrument désiré, d'où l'appellation Synt'Harpe.&lt;br /&gt;
&lt;br /&gt;
L'ordinateur décidera du fonctionnement ou non de la harpe. C'est aussi grâce à lui qu'on pourra choisir la banque de sons voulue.&lt;br /&gt;
&lt;br /&gt;
Toutes les banques de sons seront enregistrées sur le Raspberry.&lt;br /&gt;
Les LEDs signaleront l'emplacement des cordes.&lt;br /&gt;
&lt;br /&gt;
Pour la partie optionnelle, on remplacera les LEDs par des lasers pour un effet visuel de qualité (plus poussé). La fumée permettra de voir les lasers.&lt;br /&gt;
&lt;br /&gt;
=== Le matériel ===&lt;br /&gt;
* Un raspberry pi&lt;br /&gt;
* 8 phototransistors&lt;br /&gt;
* 8 émetteurs lasers&lt;br /&gt;
* Des résistances&lt;br /&gt;
* Une structure&lt;br /&gt;
* Carte d'acquisition de type Arduino au début puis FPGA &lt;br /&gt;
* Un ordinateur&lt;br /&gt;
* Une alimentation&lt;br /&gt;
&lt;br /&gt;
=== Optionnel (visuel) ===&lt;br /&gt;
&lt;br /&gt;
* 8 émetteurs laser&lt;br /&gt;
* Un générateur de fumée&lt;br /&gt;
* Une caméra&lt;br /&gt;
&lt;br /&gt;
== Séance 1 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Le but de cette première séance était de se répartir les tâches, de tester le matériel mit à disposition et de découvrir le fonctionnement du FPGA.&lt;br /&gt;
&lt;br /&gt;
Le principe de fonctionnement de la harpe est le suivant:&lt;br /&gt;
Chaque capteur sera situé en face d'un laser. Les capteurs seront dans la partie haute de la harpe afin de limiter les interférences dues à d'autres sources lumineuses. Chaque laser pointera vers un capteur. &lt;br /&gt;
&lt;br /&gt;
 * Ajout du dessin de la harpe * &lt;br /&gt;
&lt;br /&gt;
Les capteurs enverront tous par défaut la même valeur au FPGA. Quand l'utilisateur passera sa main dans la harpe, un faisceau laser sera coupé. Le capteur n'enverra plus sa valeur seuil au FPGA, il aura donc changé d'état.&lt;br /&gt;
Dès lors que le FPGA détectera un changement d'état, il enverra l'état dans lequel se trouvent les 8 capteurs au Raspberry. &lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé des tests sur les phototransistors et les lasers. Nous avons mis en parallèle un laser et deux capteurs, sans oublier leur résistance de 1.2k Ohms chacune. &lt;br /&gt;
&lt;br /&gt;
Nous avons vu que à luminosité ambiante, quand le laser pointe sur le capteur, celui-ci envoie à l'Arduino une valeur de 950 environ. Ensuite, quand le faisceau laser est coupé, la valeur envoyée par le phototransistor monte à 1020.&lt;br /&gt;
Puis, nous avons réitéré l'expérience en mettant le système dans une boîte. Cette fois, le valeur est passée de 840 quand le capteur est éclairé par le laser à 900 quand le faisceau est coupé.&lt;br /&gt;
Nous en avons déduit que nous allons devoir refaire l'expérience une fois la harpe assemblée.&lt;br /&gt;
&lt;br /&gt;
Les lasers étant très directionnels tout comme les phototransistors, nous n'aurons pas de soucis d'interférences. Un capteur détectera uniquement le laser situé directement en face de lui et non ceux de son voisinage.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Même si il peut paraitre futile d'insérer une partie boitier dans un projet centré sur l'informatique et l'électronique, il s'est avéré que le boitier de notre Harpe nécessitait une attention particulière.&lt;br /&gt;
&lt;br /&gt;
La taille de la harpe à été un sujet de débat, et nous avons réalisé des tests afin de vérifier que des phototransistors trop proches les uns des autres n'allait pas compromettre le bon fonctionnement de la harpe dans son ensemble. En effet, si le phototransistor détectait un autre laser que celui vers lequel il pointe serait extrêmement problématique. Heureusement, il s'est avéré que les phototransistors sont très directionnels, au point que se pose désormais le problème inverse.&lt;br /&gt;
&lt;br /&gt;
Nous allons devoir faire très attention au fait que les lasers soient bien fixés et pointent exactement vers les phototransistors, car dans le cas contraire, ceux-ci ne détectent absolument pas le laser, et tout le principe de fonctionnement s'effondre. La conception et l'assemblage de la boite devront donc être relativement précis, pour éviter ces problèmes.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons dès le départ décidé d'éviter l'utilisation de diodes infra-rouges, pour leur préférer les lasers. Tout d'abord, parce que les diodes ne sont en aucun cas assez puissantes pour être détectées par les phototransistors, ce qui une fois de plus rend notre harpe inutile. Ensuite, parce qu'il nous a semblé que réaliser une harpe 'laser' sans lasers était un concept déconcertant, et enlève beaucoup de l’intérêt de ce projet.&lt;br /&gt;
&lt;br /&gt;
Un premier jet de design avait été réalisé avant cette séance, et au vu des données récoltées pendant celle-ci, nous l'avons modifié pour les prendre en compte, notamment la taille des lasers par rapport aux diodes, et la précision requise. &lt;br /&gt;
&lt;br /&gt;
'insérer photos premiers schémas ici'&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le travail a été séparé en 2 parties, une personne par partie : &lt;br /&gt;
- une première partie sur le serveur même (page web, système de streaming de son depuis la page web)&lt;br /&gt;
- une seconde partie sur la lecture du port série&lt;br /&gt;
&lt;br /&gt;
==== Partie serveur ====&lt;br /&gt;
La première séance a été consacré à deux grands axes : prendre la main à distance sur le raspberry pi et mettre en place le serveur web.&lt;br /&gt;
Afin de pouvoir contrôler et travailler facilement sur le RPi, l'outil vncserver a été installé sur le raspberry, permettant de contrôler via un interface graphique le RPi depuis un ordinateur branché sur le même réseau. Cet utilitaire permettra a l'avenir de travailler directement sur le RPi sans devoir constamment uploader par ssh le travail effectué.&lt;br /&gt;
&lt;br /&gt;
Coté mise en place du serveur web, l'utilitaire de serveur web apache2 a été installé sans soucis, et les pages d'exemples web et javascript fonctionnent. En revanche, l'utilisation du code d'exemple sur les sockets n'est pas utilisable, le paquet proposé n’existe pas et le site du paquet de socket est mort.&lt;br /&gt;
Le reste de la séance a été consacré a des recherches sur les moyens de pouvoir streamer du son, recherches non concluantes. Aucune solution n'a été trouvé sans passer par un service internet hébergé par un tier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Partie lecture port série ====&lt;br /&gt;
&lt;br /&gt;
Cette première séance fut consacrée à la sélection du langage de programmation et à sa prise en main. Il a été décidé d'utiliser Python pour écrire le programme récupérant et traitant les données récupérées à travers le port série. Python étant un langage fort usité, il possède une très large documentation. Ce fut donc facile de trouver la librairie permettant de lire les données envoyées par le port série.&lt;br /&gt;
&lt;br /&gt;
Un doute subsiste encore sur le type de données envoyé par le port série. L'idéal serait de récupérer un tableau de 8 entiers de type binaire correspondant aux états des 8 ports liés aux &amp;quot;cordes&amp;quot; laser, pour pouvoir ensuite traiter ces données facilement.&lt;br /&gt;
&lt;br /&gt;
== Séance 2 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Lors de cette séance, nous avons réalisé le premier circuit sur le FPGA. &lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un circuit simple, qui envoie en permanence l'état des huit phototransistors au port série. Les phototransistors sont alors directement reliés à celui-ci. Nous avons pu tester le bon fonctionnement du système grâce aux diodes du FPGA. Nous avons branché en parallèle sur le circuit les huit diodes, afin de vérifier qu'un signal était bien envoyé en permanence, on a pu les voir s'éteindre lorsqu'on éclairait un laser. &lt;br /&gt;
Ces diodes se sont avérées très utiles, car il n'est pas encore possible d'effectuer les tests sur le port série, car la partie informatique n'est pas encore opérationnelle, on ne peut donc pas lire directement sur le port série pour le moment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi constant ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite réalisé un montage permettant de faire l'envoi seulement sur changement d'état, comme prévu à la séance 1 Nous avons donc réalisé un système de bascules permettant de comparer l'état actuel de chaque diode avec son état précédent, puis de réaliser l'envoi seulement si une différence était observée. Comme précédemment, les diodes sont reliées directement au Port Série, mais cette fois-ci au lieu de brancher le Bit d'envoi du port Série sur un Vcc, soit un '1' logique, nous l'avons relié à la vérification de changement d'état, qui passe à '1' uniquement avec un changement d'état.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi sur changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème qui s'est alors posé était de savoir si on envoyait le signal assez longtemps pour qu'il puisse être lu. En effet on envoie un signal seulement si il y a changement d'état, et cette vérification se fait à chaque incrément d'horloge. Hors, la différence sera donc observée sur un seul incrément d'horloge, par conséquent, on n'envoie de signal que pendant ce seul incrément. Pour l'instant, nous supposons que le port série est capable de stocker les données à envoyer en un seul incrément d'horloge. &lt;br /&gt;
Cependant, si lors des tests, ça ne fonctionne pas, nous prévoyons d'utiliser un compteur pour pouvoir envoyer le signal plus longtemps au Bit d'envoi du port série, et ainsi laisser le temps au port série d'envoyer l'information.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous nous sommes focalisés sur le FPGA, mais nous avons néanmoins terminé la conception du boitier de la harpe, sous la forme de trois 'boites' crénelées, que nous avons ensuite l'intention de découper au FabLab puis d'assembler.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos des boites ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il s'est avéré que réaliser des boites crénelées rendrait tout le boitier beaucoup plus solide, et donc fiable.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le problème de l'impossibilité d'utiliser l'exemple sur les sockets a été résolu, grâce à l'intervention de M. Redon. Le problème était une différence de version de la distribution Linux entre le RPi utilisé et celle utilisé pour l'exemple. En effet, le RPi de travail est sur une distribution Wheezy, alors que la version la plus récente est la Jessie. Les chemins des dépots des sources de la librairie libwebsocket n’existant pas sur Wheezy, on ne pouvait installer la librairie directement en ligne de commande. M. Redon a ajouté le chemin de la librairie dans le gestionnaire de paquet du RPi et on a pu utiliser sans problèmes la librairie. De plus le site du paquet libwebsocket n'était inaccessible que temporairement.&lt;br /&gt;
La séance a été consacré à comprendre le fonctionnement des sockets et comment l'exemple html interagissait avec.&lt;br /&gt;
&lt;br /&gt;
La partie importante du code d'exemple est la suivante : &lt;br /&gt;
&lt;br /&gt;
 static int callback_my(&lt;br /&gt;
  struct libwebsocket_context * this,&lt;br /&gt;
  struct libwebsocket *wsi,enum libwebsocket_callback_reasons reason,&lt;br /&gt;
  void *user,void *in,size_t len)&lt;br /&gt;
 {&lt;br /&gt;
 static char *message=NULL;&lt;br /&gt;
 static int msize=0;&lt;br /&gt;
 switch(reason){&lt;br /&gt;
  case LWS_CALLBACK_ESTABLISHED:&lt;br /&gt;
    printf(&amp;quot;connection established\n&amp;quot;);&lt;br /&gt;
    message=NULL;&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_RECEIVE:&lt;br /&gt;
                // Ici sont traites les messages envoyes par le navigateur&lt;br /&gt;
    printf(&amp;quot;received data: %s\n&amp;quot;,(char *)in);&lt;br /&gt;
    message=malloc(len+LWS_SEND_BUFFER_PRE_PADDING+LWS_SEND_BUFFER_POST_PADDING);&lt;br /&gt;
    if(message==NULL){ perror(&amp;quot;callback_my.malloc&amp;quot;); exit(EXIT_FAILURE); }&lt;br /&gt;
    memcpy(message+LWS_SEND_BUFFER_PRE_PADDING,in,len);&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    msize=len;&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_SERVER_WRITEABLE:&lt;br /&gt;
                // Ici sont envoyes les messages au navigateur&lt;br /&gt;
    if(message!=NULL){&lt;br /&gt;
      char *out=message+LWS_SEND_BUFFER_PRE_PADDING;&lt;br /&gt;
      libwebsocket_write(wsi,(unsigned char *)out,msize,LWS_WRITE_TEXT);&lt;br /&gt;
      free(message);&lt;br /&gt;
      message=NULL;&lt;br /&gt;
      }&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    break;&lt;br /&gt;
  }&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une fonction de callback gérant à la fois la réception et la transmission. On peut remarquer 3 cas du switch : LWS_CALLBACK_ESTABLISHED correspondant à la création d'un lien entre la page web et le serveur websocket à la demande de la page web, LWS_CALLBACK_RECEIVE correspondant aux actions à entreprendre à la réception d'un message provenant du navigateur web, et LWS_CALLBACK_SERVER_WRITEABLE correspondant aux actions afin d'envoyer un message au navigateur.&lt;br /&gt;
&lt;br /&gt;
Coté HTML, on utilise les sockets grâce à ce code suivant :&lt;br /&gt;
 &lt;br /&gt;
 window.WebSocket=(window.WebSocket||window.MozWebSocket);&lt;br /&gt;
 var websocket=new WebSocket('ws://127.0.0.1:9000','myprotocol');&lt;br /&gt;
 websocket.onopen=function(){ $('h1').css('color','green'); };&lt;br /&gt;
 websocket.onerror=function(){ $('h1').css('color','red'); };&lt;br /&gt;
 websocket.onmessage=function(message){&lt;br /&gt;
 console.log(message.data);&lt;br /&gt;
 $('#messages').append($('&amp;lt;p&amp;gt;',{ text: message.data }));&lt;br /&gt;
 };&lt;br /&gt;
 function sendMessage(){&lt;br /&gt;
 websocket.send($('#message').val());&lt;br /&gt;
 $('#message').val('');&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La fonction websocket.onmessage gère le traitement à faire coté client quand le serveur envoie des informations, et la fonction sendMessage permet l'envoie d'information du client vers le serveur.&lt;br /&gt;
&lt;br /&gt;
Pour notre projet, nous avons besoin principalement, dans un premier temps, d'envoyer des informations du serveur vers le client, nous nous sommes donc concentrer à comprendre et modifier les parties du code fourni suivantes : websocket.onmessage coté client et le &amp;quot;case LWS_CALLBACK_SERVER_WRITEABLE:&amp;quot; coté serveur.&lt;br /&gt;
&lt;br /&gt;
Le but des tests était de réussir à faire jouer deux sons différents par le client, avec changement de son imposé par le serveur. HTML5 propose nativement de lire des sons à partir d'une source grâce à une balise audio :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;audio controls=&amp;quot;controls&amp;quot; id=&amp;quot;mySound&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/audio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On récupère l'identifiant de cette balise avec &lt;br /&gt;
&lt;br /&gt;
 var test1 = document.getElementById(&amp;quot;mySound&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
afin de pouvoir l'utiliser de n'importe où dans le programme.&lt;br /&gt;
On définit la source grâce à &lt;br /&gt;
&lt;br /&gt;
 test1.src=&amp;quot;sound.mp3&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
avec &amp;quot;sound.mp3&amp;quot; le chemin d'accès au fichier son par rapport à l'emplacement du fichier html sur le serveur. Ici, le fichier son sound.mp3 est dans le même dossier que la page index.html.&lt;br /&gt;
Enfin, on peut lire le son avec &lt;br /&gt;
&lt;br /&gt;
 test1.play();&lt;br /&gt;
&lt;br /&gt;
Le but du projet étant d'émettre en continue le son généré par la harpe, l'objectif ici est soit de générer un fichier de streaming que l'on lit en continue, soit de lire un fichier différent par son possible et on change la valeur de test1.src en fonction du son à lire, soit on lit toujours la même source, mais que l'on modifie à la volée en fonction du son voulu. La première option a été étudiée jusqu'en fin de séance.&lt;br /&gt;
Nous n'avons pas réussi à comprendre comment générer un fichier de streaming audio simple, de plus toutes les documentations et exemples trouvés ne concernant qu'un streaming simultanée de son et de vidéo à partir d'une caméra et d'un micro, et nous n'avons pas compris comment adapter ces exemples.&lt;br /&gt;
&lt;br /&gt;
== Séance 3 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous avons pu tester l'envoi sur changement d'état, toujours avec les diodes du FPGA.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par ajouter une horloge sur le détecteur de changement d'état, afin d'augmenter le nombre d'incréments d'horloge sur lequel il est à '1', et ce dans le but de rendre le clignotement d'un diode visible à l’œil nu.&lt;br /&gt;
Ensuite, nous avons relié la sortie du détecteur de changement d'état et des phototransistors par un 'ET' logique, que nous avons ensuite relié aux diodes du FPGA.&lt;br /&gt;
De cette façon, si l'on détecte un changement d'état sur un phototransistor, la nouvelle valeur est alors envoyée sur les diodes. Le système a fonctionné (à voir :p ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos du test avec changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite passé le reste de la séance à mettre en commun notre partie avec la partie informatique, en essayant de leur permettre de lire sur le port série du FPGA. Les essais ont pour l'instant été infructueux, mais des progrès ont été faits. &lt;br /&gt;
&lt;br /&gt;
L'objectif étant que le Raspberry Pi puisse lire les informations envoyées par le FPGA, pour ensuite les transmettre au site Web que nous allons réaliser par la suite.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Au vu des difficultés rencontrées lors de la mise en place d'un véritable système de streaming, nous avons décider d'étudier les autres options possibles.&lt;br /&gt;
Notre deuxième solution était de modifier la valeur de test1.src. Mais cela voulait dire effectuer beaucoup de traitement coté client, et si on décidait de rajouter beaucoup de son, ou de générer de nouveaux fichiers son, ce la demandait soit de modifier le HTML à chaque ajout de fonctionnalité, ou de créer une grande quantité de fichier son qui pollueraient le serveur. Nous avons donc décidé qu'il serait plus pratique de toujours écraser la source avec le nouveau son a lire, et de ne jamais changer la valeur de test1.src.&lt;br /&gt;
&lt;br /&gt;
Afin d'effectuer des tests afin de voir si notre idée marchait bien, nous avons utiliser le code C très simple suivant :&lt;br /&gt;
&lt;br /&gt;
  int cpt;&lt;br /&gt;
  for (cpt = 0; cpt &amp;lt; 250000000; cpt++);&lt;br /&gt;
&lt;br /&gt;
    boole = !boole;&lt;br /&gt;
	printf(&amp;quot;changement: %d\n&amp;quot;,boole);&lt;br /&gt;
    if(boole)&lt;br /&gt;
      system(&amp;quot;sudo cp Level-complete-sound-effect.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
      system(&amp;quot;sudo cp Raindrops-noise.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Ce code nous permet de modifier assez fréquemment le fichier source. Les fichiers audio de tests ont été trouvé sur http://www.orangefreesounds.com/ et sont libre de droit.&lt;br /&gt;
&lt;br /&gt;
Dans la page HTML de test nous utilisé les options de la balise source suivante :&lt;br /&gt;
&lt;br /&gt;
 test1.loop = true;&lt;br /&gt;
&lt;br /&gt;
qui permet au son de se jouer en boucle.&lt;br /&gt;
&lt;br /&gt;
Bien que les fichiers soit bien modifiés en local sur le serveur, toujours le même son est joué.&lt;br /&gt;
&lt;br /&gt;
On a donc testé de recharger le son uniquement lorsque le son est modifié, avec un envoi de message du serveur par socket.&lt;br /&gt;
Le serveur est conçu tel que suit : &lt;br /&gt;
  while(1){&lt;br /&gt;
  int cpt;&lt;br /&gt;
  bool boole;&lt;br /&gt;
  boole = 1;&lt;br /&gt;
  for (cpt = 0; cpt &amp;lt; 50000; cpt++);&lt;br /&gt;
&lt;br /&gt;
    boole = !boole;&lt;br /&gt;
&lt;br /&gt;
    if(boole)&lt;br /&gt;
      system(&amp;quot;cp Level-complete-sound-effect.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
      system(&amp;quot;cp Raindrops-noise.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      libwebsocket_write(test,(unsigned char *)out,1,LWS_WRITE_TEXT);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
 libwebsocket_context_destroy(context);&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
On modifie la source, et ensuite on envoi un message, dont le contenu n'est pas important, le message sert juste d'indication au client que la source a changé.&lt;br /&gt;
&lt;br /&gt;
Le code coté client : &lt;br /&gt;
&lt;br /&gt;
 websocket.onmessage=function(message){&lt;br /&gt;
 test1.pause();&lt;br /&gt;
 test1.load();&lt;br /&gt;
 test1.play();&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
A la réception d'un message, on pause le son avec test1.pause() puis on recharge le son afin d'aller chercher la valeur actuelle de la source, puis on relance le son avec test1.play().&lt;br /&gt;
D'après la documentation technique de HTML5, la fonction load() est sensé recharger la source si elle a changé, mais le résultat de ce test n'est pas concluant : le client joue toujours le même son.&lt;br /&gt;
Nous ne comprenons pas pourquoi.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 1 : Réalisation du site Web ==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé ce site web lors de notre temps libre afin de permettre la communication entre le Raspberry Pi et l'ordinateur. En effet, il était inclus dans notre projet de devoir réaliser une communication par internet. Ce site internet va donc remplir cette condition. Sur celui-ci, on pourra trouver une brève description de notre projet, un lien vers le wiki, une image exemple d'un harpe et les boutons Play et Pause qui permettent d'activer et de désactiver la harpe laser.&lt;br /&gt;
&lt;br /&gt;
Après de nombreux tests sur la communication entre le serveur et le client web et le problème de toujours lire le même son, même si la source a été modifié, il s'est avéré que le client lisait toujours le même son quoi qu'il arrive, même si le fichier cible n’existait plus sur le serveur. Comprendre pourquoi a nécessité quelque recherche et la source du problème était la suivante : les navigateurs utilisés, Mozilla Firefox et Google Chrome, mettaient en cache le fichier son à la première lecture, et ne vérifiait plus l'état du fichier sur le serveur, fichier qui donc pouvait être modifié sans que cela n'ai un impact sur le déroulement coté client. Il a fallut trouver un moyen de contourner le cache. N'ayant aucune connaissance sur le domaine, les recherches ont été infructueuses. Suite à une conversation avec M. Rudametkin, nous avons été orienté vers ce lien https://stackoverflow.com/questions/1077041/refresh-image-with-a-new-one-at-the-same-url/1077051#1077051 qui nous a permit de résoudre le problème.&lt;br /&gt;
En utilisant la commande : &lt;br /&gt;
&lt;br /&gt;
 test1.src=&amp;quot;sound.mp3?&amp;quot;+ new Date().getTime();&lt;br /&gt;
&lt;br /&gt;
nous trompons le cache en forçant la revérification de la source sur le serveur. Grâce a cette méthode nous avons enfin réussi à modifier le son joué par le client, et nous avons pu passer à la gestion de la communication série entre le RPi et le FPGA/Arduino.&lt;br /&gt;
&lt;br /&gt;
Le code fonctionnel de la page web est le suivant : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;audio controls=&amp;quot;controls&amp;quot; id=&amp;quot;mySound&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/audio&amp;gt;&lt;br /&gt;
&amp;lt;script&lt;br /&gt;
src=&amp;quot;jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.WebSocket=(window.WebSocket||window.MozWebSocket);&lt;br /&gt;
var websocket=new WebSocket('ws://10.42.93:9000','myprotocol');&lt;br /&gt;
var test1 = document.getElementById(&amp;quot;mySound&amp;quot;);&lt;br /&gt;
test1.src=&amp;quot;sound.mp3&amp;quot;;&lt;br /&gt;
test1.autoplay = true;&lt;br /&gt;
websocket.onopen=function(){ $('h1').css('color','green'); };&lt;br /&gt;
websocket.onerror=function(){ $('h1').css('color','red'); };&lt;br /&gt;
websocket.onmessage=function(message){&lt;br /&gt;
test1.pause();&lt;br /&gt;
test1.src=&amp;quot;sound.mp3?&amp;quot;+ new Date().getTime();&lt;br /&gt;
test1.load();&lt;br /&gt;
test1.play();&lt;br /&gt;
};&lt;br /&gt;
var son = document.getELementById(&amp;quot;sound&amp;quot;);&lt;br /&gt;
son.loop = true;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;h1&amp;gt;WebSockets test&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;message&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;button onclick=&amp;quot;sendMessage();&amp;quot;&amp;gt;Send&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce code n'est pas la version final, juste l'ensemble des parties logiques et fonctionnelles de la page web.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 2 : Réalisation du programme secondaire sur Arduino 'en cas de problèmes' ==&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis à plusieurs occasions en dehors des heures de projet afin d'avancer sur notre harpe. Nous avons donc décidé que nous devions réaliser un programme sur Arduino nous permettant de réaliser des tests de transmission par la liaison série sans avoir besoin du FPGA. Dans un premier temps, nous avons tenté d'utiliser le port USB comme liaison série. Cependant, il s'est avéré que le Raspberry pi ne pouvait pas lire son port USB, ce qui nous a donc forcé à utiliser les pins de communication série de l'Arduino. &lt;br /&gt;
Nous sommes sur un Arduino Mega 2560, nous avons a notre disposition plusieurs pins de communication série différents. Ils seront utilisés uniquement en transmission. Pour communiquer, nous allons ensuite utiliser le pin Tx1. Nous aboutissons donc au programme suivant:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Setup.PNG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Captprog.PNG]]&lt;br /&gt;
&lt;br /&gt;
La communication série de ce programme nous a causé des problèmes, surtout du fait que l'ordinateur ne recevait pas les informations transmises par l'Arduino. Nous avons donc du effectuer de multiples tests afin de voir où se situait le problème. Nous avons pu déterminer que nous avions un problème au niveau de notre pont diviseur de tension entre l'alimentation de l’Arduino et celle du Raspberry Pi, nous avons alors changé les résistances.&lt;br /&gt;
Nous avons également notamment modifié le programme afin de vérifier que l'information était bien transmise sur le Pin Série de l'Arduino, et que le problème ne venait donc pas de l'Arduino mais bien du Raspberry, qui ne transmet pas correctement l'information à l'ordinateur.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 3 : Assemblage de la boite et mise en place des composants ==&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43745</id>
		<title>Projet IMA3 P5, 2016/2017, TD1</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43745"/>
				<updated>2017-06-12T10:03:00Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : /* Séance supplémentaire 1 : Réalisation du site Web */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet IMA3-SC 2016/2017 : Synt'Harpe (Sainte) Laser =&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Description du système ===&lt;br /&gt;
&lt;br /&gt;
Pour le projet Système Communicant, nous allons réaliser une harpe laser. Notre but est de créer un instrument de musique similaire à une harpe, où les cordes sont remplacées par des capteurs infra-rouges.&lt;br /&gt;
&lt;br /&gt;
Un son sera émis par l'ordinateur dès que le capteur IR captera une main et le joueur pourra avec son autre main moduler l'amplitude de la note.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on travaillera sur une gamme de son sur 8 bits. Puis, nous implémenterons une banque de sons qui nous permettra de sélectionner l'instrument désiré, d'où l'appellation Synt'Harpe.&lt;br /&gt;
&lt;br /&gt;
L'ordinateur décidera du fonctionnement ou non de la harpe. C'est aussi grâce à lui qu'on pourra choisir la banque de sons voulue.&lt;br /&gt;
&lt;br /&gt;
Toutes les banques de sons seront enregistrées sur le Raspberry.&lt;br /&gt;
Les LEDs signaleront l'emplacement des cordes.&lt;br /&gt;
&lt;br /&gt;
Pour la partie optionnelle, on remplacera les LEDs par des lasers pour un effet visuel de qualité (plus poussé). La fumée permettra de voir les lasers.&lt;br /&gt;
&lt;br /&gt;
=== Le matériel ===&lt;br /&gt;
* Un raspberry pi&lt;br /&gt;
* 8 phototransistors&lt;br /&gt;
* 8 émetteurs lasers&lt;br /&gt;
* Des résistances&lt;br /&gt;
* Une structure&lt;br /&gt;
* Carte d'acquisition de type Arduino au début puis FPGA &lt;br /&gt;
* Un ordinateur&lt;br /&gt;
* Une alimentation&lt;br /&gt;
&lt;br /&gt;
=== Optionnel (visuel) ===&lt;br /&gt;
&lt;br /&gt;
* 8 émetteurs laser&lt;br /&gt;
* Un générateur de fumée&lt;br /&gt;
* Une caméra&lt;br /&gt;
&lt;br /&gt;
== Séance 1 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Le but de cette première séance était de se répartir les tâches, de tester le matériel mit à disposition et de découvrir le fonctionnement du FPGA.&lt;br /&gt;
&lt;br /&gt;
Le principe de fonctionnement de la harpe est le suivant:&lt;br /&gt;
Chaque capteur sera situé en face d'un laser. Les capteurs seront dans la partie haute de la harpe afin de limiter les interférences dues à d'autres sources lumineuses. Chaque laser pointera vers un capteur. &lt;br /&gt;
&lt;br /&gt;
 * Ajout du dessin de la harpe * &lt;br /&gt;
&lt;br /&gt;
Les capteurs enverront tous par défaut la même valeur au FPGA. Quand l'utilisateur passera sa main dans la harpe, un faisceau laser sera coupé. Le capteur n'enverra plus sa valeur seuil au FPGA, il aura donc changé d'état.&lt;br /&gt;
Dès lors que le FPGA détectera un changement d'état, il enverra l'état dans lequel se trouvent les 8 capteurs au Raspberry. &lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé des tests sur les phototransistors et les lasers. Nous avons mis en parallèle un laser et deux capteurs, sans oublier leur résistance de 1.2k Ohms chacune. &lt;br /&gt;
&lt;br /&gt;
Nous avons vu que à luminosité ambiante, quand le laser pointe sur le capteur, celui-ci envoie à l'Arduino une valeur de 950 environ. Ensuite, quand le faisceau laser est coupé, la valeur envoyée par le phototransistor monte à 1020.&lt;br /&gt;
Puis, nous avons réitéré l'expérience en mettant le système dans une boîte. Cette fois, le valeur est passée de 840 quand le capteur est éclairé par le laser à 900 quand le faisceau est coupé.&lt;br /&gt;
Nous en avons déduit que nous allons devoir refaire l'expérience une fois la harpe assemblée.&lt;br /&gt;
&lt;br /&gt;
Les lasers étant très directionnels tout comme les phototransistors, nous n'aurons pas de soucis d'interférences. Un capteur détectera uniquement le laser situé directement en face de lui et non ceux de son voisinage.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Même si il peut paraitre futile d'insérer une partie boitier dans un projet centré sur l'informatique et l'électronique, il s'est avéré que le boitier de notre Harpe nécessitait une attention particulière.&lt;br /&gt;
&lt;br /&gt;
La taille de la harpe à été un sujet de débat, et nous avons réalisé des tests afin de vérifier que des phototransistors trop proches les uns des autres n'allait pas compromettre le bon fonctionnement de la harpe dans son ensemble. En effet, si le phototransistor détectait un autre laser que celui vers lequel il pointe serait extrêmement problématique. Heureusement, il s'est avéré que les phototransistors sont très directionnels, au point que se pose désormais le problème inverse.&lt;br /&gt;
&lt;br /&gt;
Nous allons devoir faire très attention au fait que les lasers soient bien fixés et pointent exactement vers les phototransistors, car dans le cas contraire, ceux-ci ne détectent absolument pas le laser, et tout le principe de fonctionnement s'effondre. La conception et l'assemblage de la boite devront donc être relativement précis, pour éviter ces problèmes.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons dès le départ décidé d'éviter l'utilisation de diodes infra-rouges, pour leur préférer les lasers. Tout d'abord, parce que les diodes ne sont en aucun cas assez puissantes pour être détectées par les phototransistors, ce qui une fois de plus rend notre harpe inutile. Ensuite, parce qu'il nous a semblé que réaliser une harpe 'laser' sans lasers était un concept déconcertant, et enlève beaucoup de l’intérêt de ce projet.&lt;br /&gt;
&lt;br /&gt;
Un premier jet de design avait été réalisé avant cette séance, et au vu des données récoltées pendant celle-ci, nous l'avons modifié pour les prendre en compte, notamment la taille des lasers par rapport aux diodes, et la précision requise. &lt;br /&gt;
&lt;br /&gt;
'insérer photos premiers schémas ici'&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le travail a été séparé en 2 parties, une personne par partie : &lt;br /&gt;
- une première partie sur le serveur même (page web, système de streaming de son depuis la page web)&lt;br /&gt;
- une seconde partie sur la lecture du port série&lt;br /&gt;
&lt;br /&gt;
==== Partie serveur ====&lt;br /&gt;
La première séance a été consacré à deux grands axes : prendre la main à distance sur le raspberry pi et mettre en place le serveur web.&lt;br /&gt;
Afin de pouvoir contrôler et travailler facilement sur le RPi, l'outil vncserver a été installé sur le raspberry, permettant de contrôler via un interface graphique le RPi depuis un ordinateur branché sur le même réseau. Cet utilitaire permettra a l'avenir de travailler directement sur le RPi sans devoir constamment uploader par ssh le travail effectué.&lt;br /&gt;
&lt;br /&gt;
Coté mise en place du serveur web, l'utilitaire de serveur web apache2 a été installé sans soucis, et les pages d'exemples web et javascript fonctionnent. En revanche, l'utilisation du code d'exemple sur les sockets n'est pas utilisable, le paquet proposé n’existe pas et le site du paquet de socket est mort.&lt;br /&gt;
Le reste de la séance a été consacré a des recherches sur les moyens de pouvoir streamer du son, recherches non concluantes. Aucune solution n'a été trouvé sans passer par un service internet hébergé par un tier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Partie lecture port série ====&lt;br /&gt;
&lt;br /&gt;
Cette première séance fut consacrée à la sélection du langage de programmation et à sa prise en main. Il a été décidé d'utiliser Python pour écrire le programme récupérant et traitant les données récupérées à travers le port série. Python étant un langage fort usité, il possède une très large documentation. Ce fut donc facile de trouver la librairie permettant de lire les données envoyées par le port série.&lt;br /&gt;
&lt;br /&gt;
Un doute subsiste encore sur le type de données envoyé par le port série. L'idéal serait de récupérer un tableau de 8 entiers de type binaire correspondant aux états des 8 ports liés aux &amp;quot;cordes&amp;quot; laser, pour pouvoir ensuite traiter ces données facilement.&lt;br /&gt;
&lt;br /&gt;
== Séance 2 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Lors de cette séance, nous avons réalisé le premier circuit sur le FPGA. &lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un circuit simple, qui envoie en permanence l'état des huit phototransistors au port série. Les phototransistors sont alors directement reliés à celui-ci. Nous avons pu tester le bon fonctionnement du système grâce aux diodes du FPGA. Nous avons branché en parallèle sur le circuit les huit diodes, afin de vérifier qu'un signal était bien envoyé en permanence, on a pu les voir s'éteindre lorsqu'on éclairait un laser. &lt;br /&gt;
Ces diodes se sont avérées très utiles, car il n'est pas encore possible d'effectuer les tests sur le port série, car la partie informatique n'est pas encore opérationnelle, on ne peut donc pas lire directement sur le port série pour le moment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi constant ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite réalisé un montage permettant de faire l'envoi seulement sur changement d'état, comme prévu à la séance 1 Nous avons donc réalisé un système de bascules permettant de comparer l'état actuel de chaque diode avec son état précédent, puis de réaliser l'envoi seulement si une différence était observée. Comme précédemment, les diodes sont reliées directement au Port Série, mais cette fois-ci au lieu de brancher le Bit d'envoi du port Série sur un Vcc, soit un '1' logique, nous l'avons relié à la vérification de changement d'état, qui passe à '1' uniquement avec un changement d'état.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi sur changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème qui s'est alors posé était de savoir si on envoyait le signal assez longtemps pour qu'il puisse être lu. En effet on envoie un signal seulement si il y a changement d'état, et cette vérification se fait à chaque incrément d'horloge. Hors, la différence sera donc observée sur un seul incrément d'horloge, par conséquent, on n'envoie de signal que pendant ce seul incrément. Pour l'instant, nous supposons que le port série est capable de stocker les données à envoyer en un seul incrément d'horloge. &lt;br /&gt;
Cependant, si lors des tests, ça ne fonctionne pas, nous prévoyons d'utiliser un compteur pour pouvoir envoyer le signal plus longtemps au Bit d'envoi du port série, et ainsi laisser le temps au port série d'envoyer l'information.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous nous sommes focalisés sur le FPGA, mais nous avons néanmoins terminé la conception du boitier de la harpe, sous la forme de trois 'boites' crénelées, que nous avons ensuite l'intention de découper au FabLab puis d'assembler.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos des boites ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il s'est avéré que réaliser des boites crénelées rendrait tout le boitier beaucoup plus solide, et donc fiable.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le problème de l'impossibilité d'utiliser l'exemple sur les sockets a été résolu, grâce à l'intervention de M. Redon. Le problème était une différence de version de la distribution Linux entre le RPi utilisé et celle utilisé pour l'exemple. En effet, le RPi de travail est sur une distribution Wheezy, alors que la version la plus récente est la Jessie. Les chemins des dépots des sources de la librairie libwebsocket n’existant pas sur Wheezy, on ne pouvait installer la librairie directement en ligne de commande. M. Redon a ajouté le chemin de la librairie dans le gestionnaire de paquet du RPi et on a pu utiliser sans problèmes la librairie. De plus le site du paquet libwebsocket n'était inaccessible que temporairement.&lt;br /&gt;
La séance a été consacré à comprendre le fonctionnement des sockets et comment l'exemple html interagissait avec.&lt;br /&gt;
&lt;br /&gt;
La partie importante du code d'exemple est la suivante : &lt;br /&gt;
&lt;br /&gt;
 static int callback_my(&lt;br /&gt;
  struct libwebsocket_context * this,&lt;br /&gt;
  struct libwebsocket *wsi,enum libwebsocket_callback_reasons reason,&lt;br /&gt;
  void *user,void *in,size_t len)&lt;br /&gt;
 {&lt;br /&gt;
 static char *message=NULL;&lt;br /&gt;
 static int msize=0;&lt;br /&gt;
 switch(reason){&lt;br /&gt;
  case LWS_CALLBACK_ESTABLISHED:&lt;br /&gt;
    printf(&amp;quot;connection established\n&amp;quot;);&lt;br /&gt;
    message=NULL;&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_RECEIVE:&lt;br /&gt;
                // Ici sont traites les messages envoyes par le navigateur&lt;br /&gt;
    printf(&amp;quot;received data: %s\n&amp;quot;,(char *)in);&lt;br /&gt;
    message=malloc(len+LWS_SEND_BUFFER_PRE_PADDING+LWS_SEND_BUFFER_POST_PADDING);&lt;br /&gt;
    if(message==NULL){ perror(&amp;quot;callback_my.malloc&amp;quot;); exit(EXIT_FAILURE); }&lt;br /&gt;
    memcpy(message+LWS_SEND_BUFFER_PRE_PADDING,in,len);&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    msize=len;&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_SERVER_WRITEABLE:&lt;br /&gt;
                // Ici sont envoyes les messages au navigateur&lt;br /&gt;
    if(message!=NULL){&lt;br /&gt;
      char *out=message+LWS_SEND_BUFFER_PRE_PADDING;&lt;br /&gt;
      libwebsocket_write(wsi,(unsigned char *)out,msize,LWS_WRITE_TEXT);&lt;br /&gt;
      free(message);&lt;br /&gt;
      message=NULL;&lt;br /&gt;
      }&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    break;&lt;br /&gt;
  }&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une fonction de callback gérant à la fois la réception et la transmission. On peut remarquer 3 cas du switch : LWS_CALLBACK_ESTABLISHED correspondant à la création d'un lien entre la page web et le serveur websocket à la demande de la page web, LWS_CALLBACK_RECEIVE correspondant aux actions à entreprendre à la réception d'un message provenant du navigateur web, et LWS_CALLBACK_SERVER_WRITEABLE correspondant aux actions afin d'envoyer un message au navigateur.&lt;br /&gt;
&lt;br /&gt;
Coté HTML, on utilise les sockets grâce à ce code suivant :&lt;br /&gt;
 &lt;br /&gt;
 window.WebSocket=(window.WebSocket||window.MozWebSocket);&lt;br /&gt;
 var websocket=new WebSocket('ws://127.0.0.1:9000','myprotocol');&lt;br /&gt;
 websocket.onopen=function(){ $('h1').css('color','green'); };&lt;br /&gt;
 websocket.onerror=function(){ $('h1').css('color','red'); };&lt;br /&gt;
 websocket.onmessage=function(message){&lt;br /&gt;
 console.log(message.data);&lt;br /&gt;
 $('#messages').append($('&amp;lt;p&amp;gt;',{ text: message.data }));&lt;br /&gt;
 };&lt;br /&gt;
 function sendMessage(){&lt;br /&gt;
 websocket.send($('#message').val());&lt;br /&gt;
 $('#message').val('');&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La fonction websocket.onmessage gère le traitement à faire coté client quand le serveur envoie des informations, et la fonction sendMessage permet l'envoie d'information du client vers le serveur.&lt;br /&gt;
&lt;br /&gt;
Pour notre projet, nous avons besoin principalement, dans un premier temps, d'envoyer des informations du serveur vers le client, nous nous sommes donc concentrer à comprendre et modifier les parties du code fourni suivantes : websocket.onmessage coté client et le &amp;quot;case LWS_CALLBACK_SERVER_WRITEABLE:&amp;quot; coté serveur.&lt;br /&gt;
&lt;br /&gt;
Le but des tests était de réussir à faire jouer deux sons différents par le client, avec changement de son imposé par le serveur. HTML5 propose nativement de lire des sons à partir d'une source grâce à une balise audio :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;audio controls=&amp;quot;controls&amp;quot; id=&amp;quot;mySound&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/audio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On récupère l'identifiant de cette balise avec &lt;br /&gt;
&lt;br /&gt;
 var test1 = document.getElementById(&amp;quot;mySound&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
afin de pouvoir l'utiliser de n'importe où dans le programme.&lt;br /&gt;
On définit la source grâce à &lt;br /&gt;
&lt;br /&gt;
 test1.src=&amp;quot;sound.mp3&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
avec &amp;quot;sound.mp3&amp;quot; le chemin d'accès au fichier son par rapport à l'emplacement du fichier html sur le serveur. Ici, le fichier son sound.mp3 est dans le même dossier que la page index.html.&lt;br /&gt;
Enfin, on peut lire le son avec &lt;br /&gt;
&lt;br /&gt;
 test1.play();&lt;br /&gt;
&lt;br /&gt;
Le but du projet étant d'émettre en continue le son généré par la harpe, l'objectif ici est soit de générer un fichier de streaming que l'on lit en continue, soit de lire un fichier différent par son possible et on change la valeur de test1.src en fonction du son à lire, soit on lit toujours la même source, mais que l'on modifie à la volée en fonction du son voulu. La première option a été étudiée jusqu'en fin de séance.&lt;br /&gt;
Nous n'avons pas réussi à comprendre comment générer un fichier de streaming audio simple, de plus toutes les documentations et exemples trouvés ne concernant qu'un streaming simultanée de son et de vidéo à partir d'une caméra et d'un micro, et nous n'avons pas compris comment adapter ces exemples.&lt;br /&gt;
&lt;br /&gt;
== Séance 3 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous avons pu tester l'envoi sur changement d'état, toujours avec les diodes du FPGA.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par ajouter une horloge sur le détecteur de changement d'état, afin d'augmenter le nombre d'incréments d'horloge sur lequel il est à '1', et ce dans le but de rendre le clignotement d'un diode visible à l’œil nu.&lt;br /&gt;
Ensuite, nous avons relié la sortie du détecteur de changement d'état et des phototransistors par un 'ET' logique, que nous avons ensuite relié aux diodes du FPGA.&lt;br /&gt;
De cette façon, si l'on détecte un changement d'état sur un phototransistor, la nouvelle valeur est alors envoyée sur les diodes. Le système a fonctionné (à voir :p ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos du test avec changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite passé le reste de la séance à mettre en commun notre partie avec la partie informatique, en essayant de leur permettre de lire sur le port série du FPGA. Les essais ont pour l'instant été infructueux, mais des progrès ont été faits. &lt;br /&gt;
&lt;br /&gt;
L'objectif étant que le Raspberry Pi puisse lire les informations envoyées par le FPGA, pour ensuite les transmettre au site Web que nous allons réaliser par la suite.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Au vu des difficultés rencontrées lors de la mise en place d'un véritable système de streaming, nous avons décider d'étudier les autres options possibles.&lt;br /&gt;
Notre deuxième solution était de modifier la valeur de test1.src. Mais cela voulait dire effectuer beaucoup de traitement coté client, et si on décidait de rajouter beaucoup de son, ou de générer de nouveaux fichiers son, ce la demandait soit de modifier le HTML à chaque ajout de fonctionnalité, ou de créer une grande quantité de fichier son qui pollueraient le serveur. Nous avons donc décidé qu'il serait plus pratique de toujours écraser la source avec le nouveau son a lire, et de ne jamais changer la valeur de test1.src.&lt;br /&gt;
&lt;br /&gt;
Afin d'effectuer des tests afin de voir si notre idée marchait bien, nous avons utiliser le code C très simple suivant :&lt;br /&gt;
&lt;br /&gt;
  int cpt;&lt;br /&gt;
  for (cpt = 0; cpt &amp;lt; 250000000; cpt++);&lt;br /&gt;
&lt;br /&gt;
    boole = !boole;&lt;br /&gt;
	printf(&amp;quot;changement: %d\n&amp;quot;,boole);&lt;br /&gt;
    if(boole)&lt;br /&gt;
      system(&amp;quot;sudo cp Level-complete-sound-effect.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
      system(&amp;quot;sudo cp Raindrops-noise.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Ce code nous permet de modifier assez fréquemment le fichier source. Les fichiers audio de tests ont été trouvé sur http://www.orangefreesounds.com/ et sont libre de droit.&lt;br /&gt;
&lt;br /&gt;
Dans la page HTML de test nous utilisé les options de la balise source suivante :&lt;br /&gt;
&lt;br /&gt;
 test1.loop = true;&lt;br /&gt;
&lt;br /&gt;
qui permet au son de se jouer en boucle.&lt;br /&gt;
&lt;br /&gt;
Bien que les fichiers soit bien modifiés en local sur le serveur, toujours le même son est joué.&lt;br /&gt;
&lt;br /&gt;
On a donc testé de recharger le son uniquement lorsque le son est modifié, avec un envoi de message du serveur par socket.&lt;br /&gt;
Le serveur est conçu tel que suit : &lt;br /&gt;
  while(1){&lt;br /&gt;
  int cpt;&lt;br /&gt;
  bool boole;&lt;br /&gt;
  boole = 1;&lt;br /&gt;
  for (cpt = 0; cpt &amp;lt; 50000; cpt++);&lt;br /&gt;
&lt;br /&gt;
    boole = !boole;&lt;br /&gt;
&lt;br /&gt;
    if(boole)&lt;br /&gt;
      system(&amp;quot;cp Level-complete-sound-effect.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
      system(&amp;quot;cp Raindrops-noise.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      libwebsocket_write(test,(unsigned char *)out,1,LWS_WRITE_TEXT);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
 libwebsocket_context_destroy(context);&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
On modifie la source, et ensuite on envoi un message, dont le contenu n'est pas important, le message sert juste d'indication au client que la source a changé.&lt;br /&gt;
&lt;br /&gt;
Le code coté client : &lt;br /&gt;
&lt;br /&gt;
 websocket.onmessage=function(message){&lt;br /&gt;
 test1.pause();&lt;br /&gt;
 test1.load();&lt;br /&gt;
 test1.play();&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
A la réception d'un message, on pause le son avec test1.pause() puis on recharge le son afin d'aller chercher la valeur actuelle de la source, puis on relance le son avec test1.play().&lt;br /&gt;
D'après la documentation technique de HTML5, la fonction load() est sensé recharger la source si elle a changé, mais le résultat de ce test n'est pas concluant : le client joue toujours le même son.&lt;br /&gt;
Nous ne comprenons pas pourquoi.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 1 : Réalisation du site Web ==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé ce site web lors de notre temps libre afin de permettre la communication entre le Raspberry Pi et l'ordinateur. En effet, il était inclus dans notre projet de devoir réaliser une communication par internet. Ce site internet va donc remplir cette condition. Sur celui-ci, on pourra trouver une brève description de notre projet, un lien vers le wiki, une image exemple d'un harpe et les boutons Play et Pause qui permettent d'activer et de désactiver la harpe laser.&lt;br /&gt;
&lt;br /&gt;
Après de nombreux tests sur la communication entre le serveur et le client web et le problème de toujours lire le même son, même si la source a été modifié, il s'est avéré que le client lisait toujours le même son quoi qu'il arrive, même si le fichier cible n’existait plus sur le serveur. Comprendre pourquoi a nécessité quelque recherche et la source du problème était la suivante : les navigateurs utilisés, Mozilla Firefox et Google Chrome, mettaient en cache le fichier son à la première lecture, et ne vérifiait plus l'état du fichier sur le serveur, fichier qui donc pouvait être modifié sans que cela n'ai un impact sur le déroulement coté client. Il a fallut trouver un moyen de contourner le cache. N'ayant aucune connaissance sur le domaine, les recherches ont été infructueuses. Suite à une conversation avec M. Rudametkin, nous avons été orienté vers ce lien https://stackoverflow.com/questions/1077041/refresh-image-with-a-new-one-at-the-same-url/1077051#1077051 qui nous a permit de résoudre le problème.&lt;br /&gt;
En utilisant la commande : &lt;br /&gt;
&lt;br /&gt;
 test1.src=&amp;quot;sound.mp3?&amp;quot;+ new Date().getTime();&lt;br /&gt;
&lt;br /&gt;
nous trompons le cache en forçant la revérification de la source sur le serveur. Grâce a cette méthode nous avons enfin réussi à modifier le son joué par le client, et nous avons pu passer à la gestion de la communication série entre le RPi et le FPGA/Arduino.&lt;br /&gt;
&lt;br /&gt;
Le code fonctionnel de la page web est le suivant : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;audio controls=&amp;quot;controls&amp;quot; id=&amp;quot;mySound&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/audio&amp;gt;&lt;br /&gt;
&amp;lt;script&lt;br /&gt;
src=&amp;quot;jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.WebSocket=(window.WebSocket||window.MozWebSocket);&lt;br /&gt;
var websocket=new WebSocket('ws://10.42.93:9000','myprotocol');&lt;br /&gt;
var test1 = document.getElementById(&amp;quot;mySound&amp;quot;);&lt;br /&gt;
test1.src=&amp;quot;sound.mp3&amp;quot;;&lt;br /&gt;
test1.autoplay = true;&lt;br /&gt;
websocket.onopen=function(){ $('h1').css('color','green'); };&lt;br /&gt;
websocket.onerror=function(){ $('h1').css('color','red'); };&lt;br /&gt;
websocket.onmessage=function(message){&lt;br /&gt;
test1.pause();&lt;br /&gt;
test1.src=&amp;quot;sound.mp3?&amp;quot;+ new Date().getTime();&lt;br /&gt;
test1.load();&lt;br /&gt;
test1.play();&lt;br /&gt;
};&lt;br /&gt;
var son = document.getELementById(&amp;quot;sound&amp;quot;);&lt;br /&gt;
son.loop = true;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;h1&amp;gt;WebSockets test&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;message&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;button onclick=&amp;quot;sendMessage();&amp;quot;&amp;gt;Send&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce code n'est pas la version final, juste l'ensemble des parties logiques et fonctionnelles de la page web.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 2 : Réalisation du programme secondaire sur Arduino 'en cas de problèmes' ==&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis à plusieurs occasions en dehors des heures de projet afin d'avancer sur notre harpe. Nous avons donc décidé que nous devions réaliser un programme sur Arduino nous permettant de réaliser des tests de transmission par la liaison série sans avoir besoin du FPGA. Dans un premier temps, nous avons tenté d'utiliser le port USB comme liaison série. Cependant, il s'est avéré que le Raspberry pi ne pouvait pas lire son port USB, ce qui nous a donc forcé à utiliser les pins de communication série de l'Arduino. &lt;br /&gt;
Nous sommes sur un Arduino Mega 2560, nous avons a notre disposition plusieurs pins de communication série différents. Ils seront utilisés uniquement en transmission. Pour communiquer, nous allons ensuite utiliser le pin Tx1. Nous aboutissons donc au programme suivant:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Setup.PNG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Captprog.PNG]]&lt;br /&gt;
&lt;br /&gt;
La communication série de ce programme nous a causé des problèmes, surtout du fait que l'ordinateur ne recevait pas les informations transmises par l'Arduino. Nous avons donc du effectuer de multiples tests afin de voir où se situait le problème. Nous avons pu déterminer que nous avions un problème au niveau de notre pont diviseur de tension entre l'alimentation de l’Arduino et celle du Raspberry Pi, nous avons alors changé les résistances.&lt;br /&gt;
Nous avons également notamment modifié le programme afin de vérifier que l'information était bien transmise sur le Pin Série de l'Arduino, et que le problème ne venait donc pas de l'Arduino mais bien du Raspberry, qui ne transmet pas correctement l'information à l'ordinateur.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 3 : Assemblage de la boite et mise en place des composants ==&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43743</id>
		<title>Projet IMA3 P5, 2016/2017, TD1</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43743"/>
				<updated>2017-06-12T10:00:32Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : /* Séance supplémentaire 1 : Réalisation du site Web */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet IMA3-SC 2016/2017 : Synt'Harpe (Sainte) Laser =&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Description du système ===&lt;br /&gt;
&lt;br /&gt;
Pour le projet Système Communicant, nous allons réaliser une harpe laser. Notre but est de créer un instrument de musique similaire à une harpe, où les cordes sont remplacées par des capteurs infra-rouges.&lt;br /&gt;
&lt;br /&gt;
Un son sera émis par l'ordinateur dès que le capteur IR captera une main et le joueur pourra avec son autre main moduler l'amplitude de la note.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on travaillera sur une gamme de son sur 8 bits. Puis, nous implémenterons une banque de sons qui nous permettra de sélectionner l'instrument désiré, d'où l'appellation Synt'Harpe.&lt;br /&gt;
&lt;br /&gt;
L'ordinateur décidera du fonctionnement ou non de la harpe. C'est aussi grâce à lui qu'on pourra choisir la banque de sons voulue.&lt;br /&gt;
&lt;br /&gt;
Toutes les banques de sons seront enregistrées sur le Raspberry.&lt;br /&gt;
Les LEDs signaleront l'emplacement des cordes.&lt;br /&gt;
&lt;br /&gt;
Pour la partie optionnelle, on remplacera les LEDs par des lasers pour un effet visuel de qualité (plus poussé). La fumée permettra de voir les lasers.&lt;br /&gt;
&lt;br /&gt;
=== Le matériel ===&lt;br /&gt;
* Un raspberry pi&lt;br /&gt;
* 8 phototransistors&lt;br /&gt;
* 8 émetteurs lasers&lt;br /&gt;
* Des résistances&lt;br /&gt;
* Une structure&lt;br /&gt;
* Carte d'acquisition de type Arduino au début puis FPGA &lt;br /&gt;
* Un ordinateur&lt;br /&gt;
* Une alimentation&lt;br /&gt;
&lt;br /&gt;
=== Optionnel (visuel) ===&lt;br /&gt;
&lt;br /&gt;
* 8 émetteurs laser&lt;br /&gt;
* Un générateur de fumée&lt;br /&gt;
* Une caméra&lt;br /&gt;
&lt;br /&gt;
== Séance 1 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Le but de cette première séance était de se répartir les tâches, de tester le matériel mit à disposition et de découvrir le fonctionnement du FPGA.&lt;br /&gt;
&lt;br /&gt;
Le principe de fonctionnement de la harpe est le suivant:&lt;br /&gt;
Chaque capteur sera situé en face d'un laser. Les capteurs seront dans la partie haute de la harpe afin de limiter les interférences dues à d'autres sources lumineuses. Chaque laser pointera vers un capteur. &lt;br /&gt;
&lt;br /&gt;
 * Ajout du dessin de la harpe * &lt;br /&gt;
&lt;br /&gt;
Les capteurs enverront tous par défaut la même valeur au FPGA. Quand l'utilisateur passera sa main dans la harpe, un faisceau laser sera coupé. Le capteur n'enverra plus sa valeur seuil au FPGA, il aura donc changé d'état.&lt;br /&gt;
Dès lors que le FPGA détectera un changement d'état, il enverra l'état dans lequel se trouvent les 8 capteurs au Raspberry. &lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé des tests sur les phototransistors et les lasers. Nous avons mis en parallèle un laser et deux capteurs, sans oublier leur résistance de 1.2k Ohms chacune. &lt;br /&gt;
&lt;br /&gt;
Nous avons vu que à luminosité ambiante, quand le laser pointe sur le capteur, celui-ci envoie à l'Arduino une valeur de 950 environ. Ensuite, quand le faisceau laser est coupé, la valeur envoyée par le phototransistor monte à 1020.&lt;br /&gt;
Puis, nous avons réitéré l'expérience en mettant le système dans une boîte. Cette fois, le valeur est passée de 840 quand le capteur est éclairé par le laser à 900 quand le faisceau est coupé.&lt;br /&gt;
Nous en avons déduit que nous allons devoir refaire l'expérience une fois la harpe assemblée.&lt;br /&gt;
&lt;br /&gt;
Les lasers étant très directionnels tout comme les phototransistors, nous n'aurons pas de soucis d'interférences. Un capteur détectera uniquement le laser situé directement en face de lui et non ceux de son voisinage.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Même si il peut paraitre futile d'insérer une partie boitier dans un projet centré sur l'informatique et l'électronique, il s'est avéré que le boitier de notre Harpe nécessitait une attention particulière.&lt;br /&gt;
&lt;br /&gt;
La taille de la harpe à été un sujet de débat, et nous avons réalisé des tests afin de vérifier que des phototransistors trop proches les uns des autres n'allait pas compromettre le bon fonctionnement de la harpe dans son ensemble. En effet, si le phototransistor détectait un autre laser que celui vers lequel il pointe serait extrêmement problématique. Heureusement, il s'est avéré que les phototransistors sont très directionnels, au point que se pose désormais le problème inverse.&lt;br /&gt;
&lt;br /&gt;
Nous allons devoir faire très attention au fait que les lasers soient bien fixés et pointent exactement vers les phototransistors, car dans le cas contraire, ceux-ci ne détectent absolument pas le laser, et tout le principe de fonctionnement s'effondre. La conception et l'assemblage de la boite devront donc être relativement précis, pour éviter ces problèmes.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons dès le départ décidé d'éviter l'utilisation de diodes infra-rouges, pour leur préférer les lasers. Tout d'abord, parce que les diodes ne sont en aucun cas assez puissantes pour être détectées par les phototransistors, ce qui une fois de plus rend notre harpe inutile. Ensuite, parce qu'il nous a semblé que réaliser une harpe 'laser' sans lasers était un concept déconcertant, et enlève beaucoup de l’intérêt de ce projet.&lt;br /&gt;
&lt;br /&gt;
Un premier jet de design avait été réalisé avant cette séance, et au vu des données récoltées pendant celle-ci, nous l'avons modifié pour les prendre en compte, notamment la taille des lasers par rapport aux diodes, et la précision requise. &lt;br /&gt;
&lt;br /&gt;
'insérer photos premiers schémas ici'&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le travail a été séparé en 2 parties, une personne par partie : &lt;br /&gt;
- une première partie sur le serveur même (page web, système de streaming de son depuis la page web)&lt;br /&gt;
- une seconde partie sur la lecture du port série&lt;br /&gt;
&lt;br /&gt;
==== Partie serveur ====&lt;br /&gt;
La première séance a été consacré à deux grands axes : prendre la main à distance sur le raspberry pi et mettre en place le serveur web.&lt;br /&gt;
Afin de pouvoir contrôler et travailler facilement sur le RPi, l'outil vncserver a été installé sur le raspberry, permettant de contrôler via un interface graphique le RPi depuis un ordinateur branché sur le même réseau. Cet utilitaire permettra a l'avenir de travailler directement sur le RPi sans devoir constamment uploader par ssh le travail effectué.&lt;br /&gt;
&lt;br /&gt;
Coté mise en place du serveur web, l'utilitaire de serveur web apache2 a été installé sans soucis, et les pages d'exemples web et javascript fonctionnent. En revanche, l'utilisation du code d'exemple sur les sockets n'est pas utilisable, le paquet proposé n’existe pas et le site du paquet de socket est mort.&lt;br /&gt;
Le reste de la séance a été consacré a des recherches sur les moyens de pouvoir streamer du son, recherches non concluantes. Aucune solution n'a été trouvé sans passer par un service internet hébergé par un tier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Partie lecture port série ====&lt;br /&gt;
&lt;br /&gt;
Cette première séance fut consacrée à la sélection du langage de programmation et à sa prise en main. Il a été décidé d'utiliser Python pour écrire le programme récupérant et traitant les données récupérées à travers le port série. Python étant un langage fort usité, il possède une très large documentation. Ce fut donc facile de trouver la librairie permettant de lire les données envoyées par le port série.&lt;br /&gt;
&lt;br /&gt;
Un doute subsiste encore sur le type de données envoyé par le port série. L'idéal serait de récupérer un tableau de 8 entiers de type binaire correspondant aux états des 8 ports liés aux &amp;quot;cordes&amp;quot; laser, pour pouvoir ensuite traiter ces données facilement.&lt;br /&gt;
&lt;br /&gt;
== Séance 2 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Lors de cette séance, nous avons réalisé le premier circuit sur le FPGA. &lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un circuit simple, qui envoie en permanence l'état des huit phototransistors au port série. Les phototransistors sont alors directement reliés à celui-ci. Nous avons pu tester le bon fonctionnement du système grâce aux diodes du FPGA. Nous avons branché en parallèle sur le circuit les huit diodes, afin de vérifier qu'un signal était bien envoyé en permanence, on a pu les voir s'éteindre lorsqu'on éclairait un laser. &lt;br /&gt;
Ces diodes se sont avérées très utiles, car il n'est pas encore possible d'effectuer les tests sur le port série, car la partie informatique n'est pas encore opérationnelle, on ne peut donc pas lire directement sur le port série pour le moment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi constant ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite réalisé un montage permettant de faire l'envoi seulement sur changement d'état, comme prévu à la séance 1 Nous avons donc réalisé un système de bascules permettant de comparer l'état actuel de chaque diode avec son état précédent, puis de réaliser l'envoi seulement si une différence était observée. Comme précédemment, les diodes sont reliées directement au Port Série, mais cette fois-ci au lieu de brancher le Bit d'envoi du port Série sur un Vcc, soit un '1' logique, nous l'avons relié à la vérification de changement d'état, qui passe à '1' uniquement avec un changement d'état.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi sur changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème qui s'est alors posé était de savoir si on envoyait le signal assez longtemps pour qu'il puisse être lu. En effet on envoie un signal seulement si il y a changement d'état, et cette vérification se fait à chaque incrément d'horloge. Hors, la différence sera donc observée sur un seul incrément d'horloge, par conséquent, on n'envoie de signal que pendant ce seul incrément. Pour l'instant, nous supposons que le port série est capable de stocker les données à envoyer en un seul incrément d'horloge. &lt;br /&gt;
Cependant, si lors des tests, ça ne fonctionne pas, nous prévoyons d'utiliser un compteur pour pouvoir envoyer le signal plus longtemps au Bit d'envoi du port série, et ainsi laisser le temps au port série d'envoyer l'information.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous nous sommes focalisés sur le FPGA, mais nous avons néanmoins terminé la conception du boitier de la harpe, sous la forme de trois 'boites' crénelées, que nous avons ensuite l'intention de découper au FabLab puis d'assembler.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos des boites ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il s'est avéré que réaliser des boites crénelées rendrait tout le boitier beaucoup plus solide, et donc fiable.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le problème de l'impossibilité d'utiliser l'exemple sur les sockets a été résolu, grâce à l'intervention de M. Redon. Le problème était une différence de version de la distribution Linux entre le RPi utilisé et celle utilisé pour l'exemple. En effet, le RPi de travail est sur une distribution Wheezy, alors que la version la plus récente est la Jessie. Les chemins des dépots des sources de la librairie libwebsocket n’existant pas sur Wheezy, on ne pouvait installer la librairie directement en ligne de commande. M. Redon a ajouté le chemin de la librairie dans le gestionnaire de paquet du RPi et on a pu utiliser sans problèmes la librairie. De plus le site du paquet libwebsocket n'était inaccessible que temporairement.&lt;br /&gt;
La séance a été consacré à comprendre le fonctionnement des sockets et comment l'exemple html interagissait avec.&lt;br /&gt;
&lt;br /&gt;
La partie importante du code d'exemple est la suivante : &lt;br /&gt;
&lt;br /&gt;
 static int callback_my(&lt;br /&gt;
  struct libwebsocket_context * this,&lt;br /&gt;
  struct libwebsocket *wsi,enum libwebsocket_callback_reasons reason,&lt;br /&gt;
  void *user,void *in,size_t len)&lt;br /&gt;
 {&lt;br /&gt;
 static char *message=NULL;&lt;br /&gt;
 static int msize=0;&lt;br /&gt;
 switch(reason){&lt;br /&gt;
  case LWS_CALLBACK_ESTABLISHED:&lt;br /&gt;
    printf(&amp;quot;connection established\n&amp;quot;);&lt;br /&gt;
    message=NULL;&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_RECEIVE:&lt;br /&gt;
                // Ici sont traites les messages envoyes par le navigateur&lt;br /&gt;
    printf(&amp;quot;received data: %s\n&amp;quot;,(char *)in);&lt;br /&gt;
    message=malloc(len+LWS_SEND_BUFFER_PRE_PADDING+LWS_SEND_BUFFER_POST_PADDING);&lt;br /&gt;
    if(message==NULL){ perror(&amp;quot;callback_my.malloc&amp;quot;); exit(EXIT_FAILURE); }&lt;br /&gt;
    memcpy(message+LWS_SEND_BUFFER_PRE_PADDING,in,len);&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    msize=len;&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_SERVER_WRITEABLE:&lt;br /&gt;
                // Ici sont envoyes les messages au navigateur&lt;br /&gt;
    if(message!=NULL){&lt;br /&gt;
      char *out=message+LWS_SEND_BUFFER_PRE_PADDING;&lt;br /&gt;
      libwebsocket_write(wsi,(unsigned char *)out,msize,LWS_WRITE_TEXT);&lt;br /&gt;
      free(message);&lt;br /&gt;
      message=NULL;&lt;br /&gt;
      }&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    break;&lt;br /&gt;
  }&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une fonction de callback gérant à la fois la réception et la transmission. On peut remarquer 3 cas du switch : LWS_CALLBACK_ESTABLISHED correspondant à la création d'un lien entre la page web et le serveur websocket à la demande de la page web, LWS_CALLBACK_RECEIVE correspondant aux actions à entreprendre à la réception d'un message provenant du navigateur web, et LWS_CALLBACK_SERVER_WRITEABLE correspondant aux actions afin d'envoyer un message au navigateur.&lt;br /&gt;
&lt;br /&gt;
Coté HTML, on utilise les sockets grâce à ce code suivant :&lt;br /&gt;
 &lt;br /&gt;
 window.WebSocket=(window.WebSocket||window.MozWebSocket);&lt;br /&gt;
 var websocket=new WebSocket('ws://127.0.0.1:9000','myprotocol');&lt;br /&gt;
 websocket.onopen=function(){ $('h1').css('color','green'); };&lt;br /&gt;
 websocket.onerror=function(){ $('h1').css('color','red'); };&lt;br /&gt;
 websocket.onmessage=function(message){&lt;br /&gt;
 console.log(message.data);&lt;br /&gt;
 $('#messages').append($('&amp;lt;p&amp;gt;',{ text: message.data }));&lt;br /&gt;
 };&lt;br /&gt;
 function sendMessage(){&lt;br /&gt;
 websocket.send($('#message').val());&lt;br /&gt;
 $('#message').val('');&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La fonction websocket.onmessage gère le traitement à faire coté client quand le serveur envoie des informations, et la fonction sendMessage permet l'envoie d'information du client vers le serveur.&lt;br /&gt;
&lt;br /&gt;
Pour notre projet, nous avons besoin principalement, dans un premier temps, d'envoyer des informations du serveur vers le client, nous nous sommes donc concentrer à comprendre et modifier les parties du code fourni suivantes : websocket.onmessage coté client et le &amp;quot;case LWS_CALLBACK_SERVER_WRITEABLE:&amp;quot; coté serveur.&lt;br /&gt;
&lt;br /&gt;
Le but des tests était de réussir à faire jouer deux sons différents par le client, avec changement de son imposé par le serveur. HTML5 propose nativement de lire des sons à partir d'une source grâce à une balise audio :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;audio controls=&amp;quot;controls&amp;quot; id=&amp;quot;mySound&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/audio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On récupère l'identifiant de cette balise avec &lt;br /&gt;
&lt;br /&gt;
 var test1 = document.getElementById(&amp;quot;mySound&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
afin de pouvoir l'utiliser de n'importe où dans le programme.&lt;br /&gt;
On définit la source grâce à &lt;br /&gt;
&lt;br /&gt;
 test1.src=&amp;quot;sound.mp3&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
avec &amp;quot;sound.mp3&amp;quot; le chemin d'accès au fichier son par rapport à l'emplacement du fichier html sur le serveur. Ici, le fichier son sound.mp3 est dans le même dossier que la page index.html.&lt;br /&gt;
Enfin, on peut lire le son avec &lt;br /&gt;
&lt;br /&gt;
 test1.play();&lt;br /&gt;
&lt;br /&gt;
Le but du projet étant d'émettre en continue le son généré par la harpe, l'objectif ici est soit de générer un fichier de streaming que l'on lit en continue, soit de lire un fichier différent par son possible et on change la valeur de test1.src en fonction du son à lire, soit on lit toujours la même source, mais que l'on modifie à la volée en fonction du son voulu. La première option a été étudiée jusqu'en fin de séance.&lt;br /&gt;
Nous n'avons pas réussi à comprendre comment générer un fichier de streaming audio simple, de plus toutes les documentations et exemples trouvés ne concernant qu'un streaming simultanée de son et de vidéo à partir d'une caméra et d'un micro, et nous n'avons pas compris comment adapter ces exemples.&lt;br /&gt;
&lt;br /&gt;
== Séance 3 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous avons pu tester l'envoi sur changement d'état, toujours avec les diodes du FPGA.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par ajouter une horloge sur le détecteur de changement d'état, afin d'augmenter le nombre d'incréments d'horloge sur lequel il est à '1', et ce dans le but de rendre le clignotement d'un diode visible à l’œil nu.&lt;br /&gt;
Ensuite, nous avons relié la sortie du détecteur de changement d'état et des phototransistors par un 'ET' logique, que nous avons ensuite relié aux diodes du FPGA.&lt;br /&gt;
De cette façon, si l'on détecte un changement d'état sur un phototransistor, la nouvelle valeur est alors envoyée sur les diodes. Le système a fonctionné (à voir :p ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos du test avec changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite passé le reste de la séance à mettre en commun notre partie avec la partie informatique, en essayant de leur permettre de lire sur le port série du FPGA. Les essais ont pour l'instant été infructueux, mais des progrès ont été faits. &lt;br /&gt;
&lt;br /&gt;
L'objectif étant que le Raspberry Pi puisse lire les informations envoyées par le FPGA, pour ensuite les transmettre au site Web que nous allons réaliser par la suite.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Au vu des difficultés rencontrées lors de la mise en place d'un véritable système de streaming, nous avons décider d'étudier les autres options possibles.&lt;br /&gt;
Notre deuxième solution était de modifier la valeur de test1.src. Mais cela voulait dire effectuer beaucoup de traitement coté client, et si on décidait de rajouter beaucoup de son, ou de générer de nouveaux fichiers son, ce la demandait soit de modifier le HTML à chaque ajout de fonctionnalité, ou de créer une grande quantité de fichier son qui pollueraient le serveur. Nous avons donc décidé qu'il serait plus pratique de toujours écraser la source avec le nouveau son a lire, et de ne jamais changer la valeur de test1.src.&lt;br /&gt;
&lt;br /&gt;
Afin d'effectuer des tests afin de voir si notre idée marchait bien, nous avons utiliser le code C très simple suivant :&lt;br /&gt;
&lt;br /&gt;
  int cpt;&lt;br /&gt;
  for (cpt = 0; cpt &amp;lt; 250000000; cpt++);&lt;br /&gt;
&lt;br /&gt;
    boole = !boole;&lt;br /&gt;
	printf(&amp;quot;changement: %d\n&amp;quot;,boole);&lt;br /&gt;
    if(boole)&lt;br /&gt;
      system(&amp;quot;sudo cp Level-complete-sound-effect.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
      system(&amp;quot;sudo cp Raindrops-noise.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Ce code nous permet de modifier assez fréquemment le fichier source. Les fichiers audio de tests ont été trouvé sur http://www.orangefreesounds.com/ et sont libre de droit.&lt;br /&gt;
&lt;br /&gt;
Dans la page HTML de test nous utilisé les options de la balise source suivante :&lt;br /&gt;
&lt;br /&gt;
 test1.loop = true;&lt;br /&gt;
&lt;br /&gt;
qui permet au son de se jouer en boucle.&lt;br /&gt;
&lt;br /&gt;
Bien que les fichiers soit bien modifiés en local sur le serveur, toujours le même son est joué.&lt;br /&gt;
&lt;br /&gt;
On a donc testé de recharger le son uniquement lorsque le son est modifié, avec un envoi de message du serveur par socket.&lt;br /&gt;
Le serveur est conçu tel que suit : &lt;br /&gt;
  while(1){&lt;br /&gt;
  int cpt;&lt;br /&gt;
  bool boole;&lt;br /&gt;
  boole = 1;&lt;br /&gt;
  for (cpt = 0; cpt &amp;lt; 50000; cpt++);&lt;br /&gt;
&lt;br /&gt;
    boole = !boole;&lt;br /&gt;
&lt;br /&gt;
    if(boole)&lt;br /&gt;
      system(&amp;quot;cp Level-complete-sound-effect.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
      system(&amp;quot;cp Raindrops-noise.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      libwebsocket_write(test,(unsigned char *)out,1,LWS_WRITE_TEXT);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
 libwebsocket_context_destroy(context);&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
On modifie la source, et ensuite on envoi un message, dont le contenu n'est pas important, le message sert juste d'indication au client que la source a changé.&lt;br /&gt;
&lt;br /&gt;
Le code coté client : &lt;br /&gt;
&lt;br /&gt;
 websocket.onmessage=function(message){&lt;br /&gt;
 test1.pause();&lt;br /&gt;
 test1.load();&lt;br /&gt;
 test1.play();&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
A la réception d'un message, on pause le son avec test1.pause() puis on recharge le son afin d'aller chercher la valeur actuelle de la source, puis on relance le son avec test1.play().&lt;br /&gt;
D'après la documentation technique de HTML5, la fonction load() est sensé recharger la source si elle a changé, mais le résultat de ce test n'est pas concluant : le client joue toujours le même son.&lt;br /&gt;
Nous ne comprenons pas pourquoi.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 1 : Réalisation du site Web ==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé ce site web lors de notre temps libre afin de permettre la communication entre le Raspberry Pi et l'ordinateur. En effet, il était inclus dans notre projet de devoir réaliser une communication par internet. Ce site internet va donc remplir cette condition. Sur celui-ci, on pourra trouver une brève description de notre projet, un lien vers le wiki, une image exemple d'un harpe et les boutons Play et Pause qui permettent d'activer et de désactiver la harpe laser.&lt;br /&gt;
&lt;br /&gt;
Après de nombreux tests sur la communication entre le serveur et le client web et le problème de toujours lire le même son, même si la source a été modifié, il s'est avéré que le client lisait toujours le même son quoi qu'il arrive, même si le fichier cible n’existait plus sur le serveur. Comprendre pourquoi a nécessité quelque recherche et la source du problème était la suivante : les navigateurs utilisés, Mozilla Firefox et Google Chrome, mettaient en cache le fichier son à la première lecture, et ne vérifiait plus l'état du fichier sur le serveur, fichier qui donc pouvait être modifié sans que cela n'ai un impact sur le déroulement coté client. Il a fallut trouver un moyen de contourner le cache. N'ayant aucune connaissance sur le domaine, les recherches ont été infructueuses. Suite à une conversation avec M. Rudametkin, nous avons été orienté vers ce lien https://stackoverflow.com/questions/1077041/refresh-image-with-a-new-one-at-the-same-url/1077051#1077051 qui nous a permit de résoudre le problème.&lt;br /&gt;
En utilisant la commande : &lt;br /&gt;
&lt;br /&gt;
 test1.src=&amp;quot;sound.mp3?&amp;quot;+ new Date().getTime();&lt;br /&gt;
&lt;br /&gt;
nous trompons le cache en forçant la revérification de la source sur le serveur. Grâce a cette méthode nous avons enfin réussi à modifier le son joué par le client, et nous avons pu passer à la gestion de la communication série entre le RPi et le FPGA/Arduino.&lt;br /&gt;
&lt;br /&gt;
Le code fonctionnel de la page web est le suivant : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
 &amp;lt;html&amp;gt;&lt;br /&gt;
   &amp;lt;head&amp;gt;&lt;br /&gt;
     &amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;audio controls=&amp;quot;controls&amp;quot; id=&amp;quot;mySound&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;/audio&amp;gt;&lt;br /&gt;
     &amp;lt;script&lt;br /&gt;
         src=&amp;quot;jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
     &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
 window.WebSocket=(window.WebSocket||window.MozWebSocket);&lt;br /&gt;
&lt;br /&gt;
 var websocket=new WebSocket('ws://10.42.93:9000','myprotocol');&lt;br /&gt;
 var test1 = document.getElementById(&amp;quot;mySound&amp;quot;);&lt;br /&gt;
 test1.src=&amp;quot;sound.mp3&amp;quot;;&lt;br /&gt;
 test1.autoplay = true;&lt;br /&gt;
 websocket.onopen=function(){ $('h1').css('color','green'); };&lt;br /&gt;
&lt;br /&gt;
websocket.onerror=function(){ $('h1').css('color','red'); };&lt;br /&gt;
&lt;br /&gt;
websocket.onmessage=function(message){&lt;br /&gt;
test1.pause();&lt;br /&gt;
test1.src=&amp;quot;sound.mp3?&amp;quot;+ new Date().getTime();&lt;br /&gt;
test1.load();&lt;br /&gt;
test1.play();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
var son = document.getELementById(&amp;quot;sound&amp;quot;);&lt;br /&gt;
son.loop = true;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt;WebSockets test&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;message&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;button onclick=&amp;quot;sendMessage();&amp;quot;&amp;gt;Send&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce code n'est pas la version final, juste l'ensemble des parties logiques et fonctionnelles de la page web.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 2 : Réalisation du programme secondaire sur Arduino 'en cas de problèmes' ==&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis à plusieurs occasions en dehors des heures de projet afin d'avancer sur notre harpe. Nous avons donc décidé que nous devions réaliser un programme sur Arduino nous permettant de réaliser des tests de transmission par la liaison série sans avoir besoin du FPGA. Dans un premier temps, nous avons tenté d'utiliser le port USB comme liaison série. Cependant, il s'est avéré que le Raspberry pi ne pouvait pas lire son port USB, ce qui nous a donc forcé à utiliser les pins de communication série de l'Arduino. &lt;br /&gt;
Nous sommes sur un Arduino Mega 2560, nous avons a notre disposition plusieurs pins de communication série différents. Ils seront utilisés uniquement en transmission. Pour communiquer, nous allons ensuite utiliser le pin Tx1. Nous aboutissons donc au programme suivant:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Setup.PNG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Captprog.PNG]]&lt;br /&gt;
&lt;br /&gt;
La communication série de ce programme nous a causé des problèmes, surtout du fait que l'ordinateur ne recevait pas les informations transmises par l'Arduino. Nous avons donc du effectuer de multiples tests afin de voir où se situait le problème. Nous avons pu déterminer que nous avions un problème au niveau de notre pont diviseur de tension entre l'alimentation de l’Arduino et celle du Raspberry Pi, nous avons alors changé les résistances.&lt;br /&gt;
Nous avons également notamment modifié le programme afin de vérifier que l'information était bien transmise sur le Pin Série de l'Arduino, et que le problème ne venait donc pas de l'Arduino mais bien du Raspberry, qui ne transmet pas correctement l'information à l'ordinateur.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 3 : Assemblage de la boite et mise en place des composants ==&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43741</id>
		<title>Projet IMA3 P5, 2016/2017, TD1</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43741"/>
				<updated>2017-06-12T09:40:01Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : /* Partie informatique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet IMA3-SC 2016/2017 : Synt'Harpe (Sainte) Laser =&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Description du système ===&lt;br /&gt;
&lt;br /&gt;
Pour le projet Système Communicant, nous allons réaliser une harpe laser. Notre but est de créer un instrument de musique similaire à une harpe, où les cordes sont remplacées par des capteurs infra-rouges.&lt;br /&gt;
&lt;br /&gt;
Un son sera émis par l'ordinateur dès que le capteur IR captera une main et le joueur pourra avec son autre main moduler l'amplitude de la note.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on travaillera sur une gamme de son sur 8 bits. Puis, nous implémenterons une banque de sons qui nous permettra de sélectionner l'instrument désiré, d'où l'appellation Synt'Harpe.&lt;br /&gt;
&lt;br /&gt;
L'ordinateur décidera du fonctionnement ou non de la harpe. C'est aussi grâce à lui qu'on pourra choisir la banque de sons voulue.&lt;br /&gt;
&lt;br /&gt;
Toutes les banques de sons seront enregistrées sur le Raspberry.&lt;br /&gt;
Les LEDs signaleront l'emplacement des cordes.&lt;br /&gt;
&lt;br /&gt;
Pour la partie optionnelle, on remplacera les LEDs par des lasers pour un effet visuel de qualité (plus poussé). La fumée permettra de voir les lasers.&lt;br /&gt;
&lt;br /&gt;
=== Le matériel ===&lt;br /&gt;
* Un raspberry pi&lt;br /&gt;
* 8 phototransistors&lt;br /&gt;
* 8 émetteurs lasers&lt;br /&gt;
* Des résistances&lt;br /&gt;
* Une structure&lt;br /&gt;
* Carte d'acquisition de type Arduino au début puis FPGA &lt;br /&gt;
* Un ordinateur&lt;br /&gt;
* Une alimentation&lt;br /&gt;
&lt;br /&gt;
=== Optionnel (visuel) ===&lt;br /&gt;
&lt;br /&gt;
* 8 émetteurs laser&lt;br /&gt;
* Un générateur de fumée&lt;br /&gt;
* Une caméra&lt;br /&gt;
&lt;br /&gt;
== Séance 1 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Le but de cette première séance était de se répartir les tâches, de tester le matériel mit à disposition et de découvrir le fonctionnement du FPGA.&lt;br /&gt;
&lt;br /&gt;
Le principe de fonctionnement de la harpe est le suivant:&lt;br /&gt;
Chaque capteur sera situé en face d'un laser. Les capteurs seront dans la partie haute de la harpe afin de limiter les interférences dues à d'autres sources lumineuses. Chaque laser pointera vers un capteur. &lt;br /&gt;
&lt;br /&gt;
 * Ajout du dessin de la harpe * &lt;br /&gt;
&lt;br /&gt;
Les capteurs enverront tous par défaut la même valeur au FPGA. Quand l'utilisateur passera sa main dans la harpe, un faisceau laser sera coupé. Le capteur n'enverra plus sa valeur seuil au FPGA, il aura donc changé d'état.&lt;br /&gt;
Dès lors que le FPGA détectera un changement d'état, il enverra l'état dans lequel se trouvent les 8 capteurs au Raspberry. &lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé des tests sur les phototransistors et les lasers. Nous avons mis en parallèle un laser et deux capteurs, sans oublier leur résistance de 1.2k Ohms chacune. &lt;br /&gt;
&lt;br /&gt;
Nous avons vu que à luminosité ambiante, quand le laser pointe sur le capteur, celui-ci envoie à l'Arduino une valeur de 950 environ. Ensuite, quand le faisceau laser est coupé, la valeur envoyée par le phototransistor monte à 1020.&lt;br /&gt;
Puis, nous avons réitéré l'expérience en mettant le système dans une boîte. Cette fois, le valeur est passée de 840 quand le capteur est éclairé par le laser à 900 quand le faisceau est coupé.&lt;br /&gt;
Nous en avons déduit que nous allons devoir refaire l'expérience une fois la harpe assemblée.&lt;br /&gt;
&lt;br /&gt;
Les lasers étant très directionnels tout comme les phototransistors, nous n'aurons pas de soucis d'interférences. Un capteur détectera uniquement le laser situé directement en face de lui et non ceux de son voisinage.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Même si il peut paraitre futile d'insérer une partie boitier dans un projet centré sur l'informatique et l'électronique, il s'est avéré que le boitier de notre Harpe nécessitait une attention particulière.&lt;br /&gt;
&lt;br /&gt;
La taille de la harpe à été un sujet de débat, et nous avons réalisé des tests afin de vérifier que des phototransistors trop proches les uns des autres n'allait pas compromettre le bon fonctionnement de la harpe dans son ensemble. En effet, si le phototransistor détectait un autre laser que celui vers lequel il pointe serait extrêmement problématique. Heureusement, il s'est avéré que les phototransistors sont très directionnels, au point que se pose désormais le problème inverse.&lt;br /&gt;
&lt;br /&gt;
Nous allons devoir faire très attention au fait que les lasers soient bien fixés et pointent exactement vers les phototransistors, car dans le cas contraire, ceux-ci ne détectent absolument pas le laser, et tout le principe de fonctionnement s'effondre. La conception et l'assemblage de la boite devront donc être relativement précis, pour éviter ces problèmes.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons dès le départ décidé d'éviter l'utilisation de diodes infra-rouges, pour leur préférer les lasers. Tout d'abord, parce que les diodes ne sont en aucun cas assez puissantes pour être détectées par les phototransistors, ce qui une fois de plus rend notre harpe inutile. Ensuite, parce qu'il nous a semblé que réaliser une harpe 'laser' sans lasers était un concept déconcertant, et enlève beaucoup de l’intérêt de ce projet.&lt;br /&gt;
&lt;br /&gt;
Un premier jet de design avait été réalisé avant cette séance, et au vu des données récoltées pendant celle-ci, nous l'avons modifié pour les prendre en compte, notamment la taille des lasers par rapport aux diodes, et la précision requise. &lt;br /&gt;
&lt;br /&gt;
'insérer photos premiers schémas ici'&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le travail a été séparé en 2 parties, une personne par partie : &lt;br /&gt;
- une première partie sur le serveur même (page web, système de streaming de son depuis la page web)&lt;br /&gt;
- une seconde partie sur la lecture du port série&lt;br /&gt;
&lt;br /&gt;
==== Partie serveur ====&lt;br /&gt;
La première séance a été consacré à deux grands axes : prendre la main à distance sur le raspberry pi et mettre en place le serveur web.&lt;br /&gt;
Afin de pouvoir contrôler et travailler facilement sur le RPi, l'outil vncserver a été installé sur le raspberry, permettant de contrôler via un interface graphique le RPi depuis un ordinateur branché sur le même réseau. Cet utilitaire permettra a l'avenir de travailler directement sur le RPi sans devoir constamment uploader par ssh le travail effectué.&lt;br /&gt;
&lt;br /&gt;
Coté mise en place du serveur web, l'utilitaire de serveur web apache2 a été installé sans soucis, et les pages d'exemples web et javascript fonctionnent. En revanche, l'utilisation du code d'exemple sur les sockets n'est pas utilisable, le paquet proposé n’existe pas et le site du paquet de socket est mort.&lt;br /&gt;
Le reste de la séance a été consacré a des recherches sur les moyens de pouvoir streamer du son, recherches non concluantes. Aucune solution n'a été trouvé sans passer par un service internet hébergé par un tier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Partie lecture port série ====&lt;br /&gt;
&lt;br /&gt;
Cette première séance fut consacrée à la sélection du langage de programmation et à sa prise en main. Il a été décidé d'utiliser Python pour écrire le programme récupérant et traitant les données récupérées à travers le port série. Python étant un langage fort usité, il possède une très large documentation. Ce fut donc facile de trouver la librairie permettant de lire les données envoyées par le port série.&lt;br /&gt;
&lt;br /&gt;
Un doute subsiste encore sur le type de données envoyé par le port série. L'idéal serait de récupérer un tableau de 8 entiers de type binaire correspondant aux états des 8 ports liés aux &amp;quot;cordes&amp;quot; laser, pour pouvoir ensuite traiter ces données facilement.&lt;br /&gt;
&lt;br /&gt;
== Séance 2 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Lors de cette séance, nous avons réalisé le premier circuit sur le FPGA. &lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un circuit simple, qui envoie en permanence l'état des huit phototransistors au port série. Les phototransistors sont alors directement reliés à celui-ci. Nous avons pu tester le bon fonctionnement du système grâce aux diodes du FPGA. Nous avons branché en parallèle sur le circuit les huit diodes, afin de vérifier qu'un signal était bien envoyé en permanence, on a pu les voir s'éteindre lorsqu'on éclairait un laser. &lt;br /&gt;
Ces diodes se sont avérées très utiles, car il n'est pas encore possible d'effectuer les tests sur le port série, car la partie informatique n'est pas encore opérationnelle, on ne peut donc pas lire directement sur le port série pour le moment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi constant ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite réalisé un montage permettant de faire l'envoi seulement sur changement d'état, comme prévu à la séance 1 Nous avons donc réalisé un système de bascules permettant de comparer l'état actuel de chaque diode avec son état précédent, puis de réaliser l'envoi seulement si une différence était observée. Comme précédemment, les diodes sont reliées directement au Port Série, mais cette fois-ci au lieu de brancher le Bit d'envoi du port Série sur un Vcc, soit un '1' logique, nous l'avons relié à la vérification de changement d'état, qui passe à '1' uniquement avec un changement d'état.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi sur changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème qui s'est alors posé était de savoir si on envoyait le signal assez longtemps pour qu'il puisse être lu. En effet on envoie un signal seulement si il y a changement d'état, et cette vérification se fait à chaque incrément d'horloge. Hors, la différence sera donc observée sur un seul incrément d'horloge, par conséquent, on n'envoie de signal que pendant ce seul incrément. Pour l'instant, nous supposons que le port série est capable de stocker les données à envoyer en un seul incrément d'horloge. &lt;br /&gt;
Cependant, si lors des tests, ça ne fonctionne pas, nous prévoyons d'utiliser un compteur pour pouvoir envoyer le signal plus longtemps au Bit d'envoi du port série, et ainsi laisser le temps au port série d'envoyer l'information.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous nous sommes focalisés sur le FPGA, mais nous avons néanmoins terminé la conception du boitier de la harpe, sous la forme de trois 'boites' crénelées, que nous avons ensuite l'intention de découper au FabLab puis d'assembler.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos des boites ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il s'est avéré que réaliser des boites crénelées rendrait tout le boitier beaucoup plus solide, et donc fiable.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le problème de l'impossibilité d'utiliser l'exemple sur les sockets a été résolu, grâce à l'intervention de M. Redon. Le problème était une différence de version de la distribution Linux entre le RPi utilisé et celle utilisé pour l'exemple. En effet, le RPi de travail est sur une distribution Wheezy, alors que la version la plus récente est la Jessie. Les chemins des dépots des sources de la librairie libwebsocket n’existant pas sur Wheezy, on ne pouvait installer la librairie directement en ligne de commande. M. Redon a ajouté le chemin de la librairie dans le gestionnaire de paquet du RPi et on a pu utiliser sans problèmes la librairie. De plus le site du paquet libwebsocket n'était inaccessible que temporairement.&lt;br /&gt;
La séance a été consacré à comprendre le fonctionnement des sockets et comment l'exemple html interagissait avec.&lt;br /&gt;
&lt;br /&gt;
La partie importante du code d'exemple est la suivante : &lt;br /&gt;
&lt;br /&gt;
 static int callback_my(&lt;br /&gt;
  struct libwebsocket_context * this,&lt;br /&gt;
  struct libwebsocket *wsi,enum libwebsocket_callback_reasons reason,&lt;br /&gt;
  void *user,void *in,size_t len)&lt;br /&gt;
 {&lt;br /&gt;
 static char *message=NULL;&lt;br /&gt;
 static int msize=0;&lt;br /&gt;
 switch(reason){&lt;br /&gt;
  case LWS_CALLBACK_ESTABLISHED:&lt;br /&gt;
    printf(&amp;quot;connection established\n&amp;quot;);&lt;br /&gt;
    message=NULL;&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_RECEIVE:&lt;br /&gt;
                // Ici sont traites les messages envoyes par le navigateur&lt;br /&gt;
    printf(&amp;quot;received data: %s\n&amp;quot;,(char *)in);&lt;br /&gt;
    message=malloc(len+LWS_SEND_BUFFER_PRE_PADDING+LWS_SEND_BUFFER_POST_PADDING);&lt;br /&gt;
    if(message==NULL){ perror(&amp;quot;callback_my.malloc&amp;quot;); exit(EXIT_FAILURE); }&lt;br /&gt;
    memcpy(message+LWS_SEND_BUFFER_PRE_PADDING,in,len);&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    msize=len;&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_SERVER_WRITEABLE:&lt;br /&gt;
                // Ici sont envoyes les messages au navigateur&lt;br /&gt;
    if(message!=NULL){&lt;br /&gt;
      char *out=message+LWS_SEND_BUFFER_PRE_PADDING;&lt;br /&gt;
      libwebsocket_write(wsi,(unsigned char *)out,msize,LWS_WRITE_TEXT);&lt;br /&gt;
      free(message);&lt;br /&gt;
      message=NULL;&lt;br /&gt;
      }&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    break;&lt;br /&gt;
  }&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une fonction de callback gérant à la fois la réception et la transmission. On peut remarquer 3 cas du switch : LWS_CALLBACK_ESTABLISHED correspondant à la création d'un lien entre la page web et le serveur websocket à la demande de la page web, LWS_CALLBACK_RECEIVE correspondant aux actions à entreprendre à la réception d'un message provenant du navigateur web, et LWS_CALLBACK_SERVER_WRITEABLE correspondant aux actions afin d'envoyer un message au navigateur.&lt;br /&gt;
&lt;br /&gt;
Coté HTML, on utilise les sockets grâce à ce code suivant :&lt;br /&gt;
 &lt;br /&gt;
 window.WebSocket=(window.WebSocket||window.MozWebSocket);&lt;br /&gt;
 var websocket=new WebSocket('ws://127.0.0.1:9000','myprotocol');&lt;br /&gt;
 websocket.onopen=function(){ $('h1').css('color','green'); };&lt;br /&gt;
 websocket.onerror=function(){ $('h1').css('color','red'); };&lt;br /&gt;
 websocket.onmessage=function(message){&lt;br /&gt;
 console.log(message.data);&lt;br /&gt;
 $('#messages').append($('&amp;lt;p&amp;gt;',{ text: message.data }));&lt;br /&gt;
 };&lt;br /&gt;
 function sendMessage(){&lt;br /&gt;
 websocket.send($('#message').val());&lt;br /&gt;
 $('#message').val('');&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La fonction websocket.onmessage gère le traitement à faire coté client quand le serveur envoie des informations, et la fonction sendMessage permet l'envoie d'information du client vers le serveur.&lt;br /&gt;
&lt;br /&gt;
Pour notre projet, nous avons besoin principalement, dans un premier temps, d'envoyer des informations du serveur vers le client, nous nous sommes donc concentrer à comprendre et modifier les parties du code fourni suivantes : websocket.onmessage coté client et le &amp;quot;case LWS_CALLBACK_SERVER_WRITEABLE:&amp;quot; coté serveur.&lt;br /&gt;
&lt;br /&gt;
Le but des tests était de réussir à faire jouer deux sons différents par le client, avec changement de son imposé par le serveur. HTML5 propose nativement de lire des sons à partir d'une source grâce à une balise audio :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;audio controls=&amp;quot;controls&amp;quot; id=&amp;quot;mySound&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/audio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On récupère l'identifiant de cette balise avec &lt;br /&gt;
&lt;br /&gt;
 var test1 = document.getElementById(&amp;quot;mySound&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
afin de pouvoir l'utiliser de n'importe où dans le programme.&lt;br /&gt;
On définit la source grâce à &lt;br /&gt;
&lt;br /&gt;
 test1.src=&amp;quot;sound.mp3&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
avec &amp;quot;sound.mp3&amp;quot; le chemin d'accès au fichier son par rapport à l'emplacement du fichier html sur le serveur. Ici, le fichier son sound.mp3 est dans le même dossier que la page index.html.&lt;br /&gt;
Enfin, on peut lire le son avec &lt;br /&gt;
&lt;br /&gt;
 test1.play();&lt;br /&gt;
&lt;br /&gt;
Le but du projet étant d'émettre en continue le son généré par la harpe, l'objectif ici est soit de générer un fichier de streaming que l'on lit en continue, soit de lire un fichier différent par son possible et on change la valeur de test1.src en fonction du son à lire, soit on lit toujours la même source, mais que l'on modifie à la volée en fonction du son voulu. La première option a été étudiée jusqu'en fin de séance.&lt;br /&gt;
Nous n'avons pas réussi à comprendre comment générer un fichier de streaming audio simple, de plus toutes les documentations et exemples trouvés ne concernant qu'un streaming simultanée de son et de vidéo à partir d'une caméra et d'un micro, et nous n'avons pas compris comment adapter ces exemples.&lt;br /&gt;
&lt;br /&gt;
== Séance 3 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous avons pu tester l'envoi sur changement d'état, toujours avec les diodes du FPGA.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par ajouter une horloge sur le détecteur de changement d'état, afin d'augmenter le nombre d'incréments d'horloge sur lequel il est à '1', et ce dans le but de rendre le clignotement d'un diode visible à l’œil nu.&lt;br /&gt;
Ensuite, nous avons relié la sortie du détecteur de changement d'état et des phototransistors par un 'ET' logique, que nous avons ensuite relié aux diodes du FPGA.&lt;br /&gt;
De cette façon, si l'on détecte un changement d'état sur un phototransistor, la nouvelle valeur est alors envoyée sur les diodes. Le système a fonctionné (à voir :p ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos du test avec changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite passé le reste de la séance à mettre en commun notre partie avec la partie informatique, en essayant de leur permettre de lire sur le port série du FPGA. Les essais ont pour l'instant été infructueux, mais des progrès ont été faits. &lt;br /&gt;
&lt;br /&gt;
L'objectif étant que le Raspberry Pi puisse lire les informations envoyées par le FPGA, pour ensuite les transmettre au site Web que nous allons réaliser par la suite.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Au vu des difficultés rencontrées lors de la mise en place d'un véritable système de streaming, nous avons décider d'étudier les autres options possibles.&lt;br /&gt;
Notre deuxième solution était de modifier la valeur de test1.src. Mais cela voulait dire effectuer beaucoup de traitement coté client, et si on décidait de rajouter beaucoup de son, ou de générer de nouveaux fichiers son, ce la demandait soit de modifier le HTML à chaque ajout de fonctionnalité, ou de créer une grande quantité de fichier son qui pollueraient le serveur. Nous avons donc décidé qu'il serait plus pratique de toujours écraser la source avec le nouveau son a lire, et de ne jamais changer la valeur de test1.src.&lt;br /&gt;
&lt;br /&gt;
Afin d'effectuer des tests afin de voir si notre idée marchait bien, nous avons utiliser le code C très simple suivant :&lt;br /&gt;
&lt;br /&gt;
  int cpt;&lt;br /&gt;
  for (cpt = 0; cpt &amp;lt; 250000000; cpt++);&lt;br /&gt;
&lt;br /&gt;
    boole = !boole;&lt;br /&gt;
	printf(&amp;quot;changement: %d\n&amp;quot;,boole);&lt;br /&gt;
    if(boole)&lt;br /&gt;
      system(&amp;quot;sudo cp Level-complete-sound-effect.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
      system(&amp;quot;sudo cp Raindrops-noise.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Ce code nous permet de modifier assez fréquemment le fichier source. Les fichiers audio de tests ont été trouvé sur http://www.orangefreesounds.com/ et sont libre de droit.&lt;br /&gt;
&lt;br /&gt;
Dans la page HTML de test nous utilisé les options de la balise source suivante :&lt;br /&gt;
&lt;br /&gt;
 test1.loop = true;&lt;br /&gt;
&lt;br /&gt;
qui permet au son de se jouer en boucle.&lt;br /&gt;
&lt;br /&gt;
Bien que les fichiers soit bien modifiés en local sur le serveur, toujours le même son est joué.&lt;br /&gt;
&lt;br /&gt;
On a donc testé de recharger le son uniquement lorsque le son est modifié, avec un envoi de message du serveur par socket.&lt;br /&gt;
Le serveur est conçu tel que suit : &lt;br /&gt;
  while(1){&lt;br /&gt;
  int cpt;&lt;br /&gt;
  bool boole;&lt;br /&gt;
  boole = 1;&lt;br /&gt;
  for (cpt = 0; cpt &amp;lt; 50000; cpt++);&lt;br /&gt;
&lt;br /&gt;
    boole = !boole;&lt;br /&gt;
&lt;br /&gt;
    if(boole)&lt;br /&gt;
      system(&amp;quot;cp Level-complete-sound-effect.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
      system(&amp;quot;cp Raindrops-noise.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      libwebsocket_write(test,(unsigned char *)out,1,LWS_WRITE_TEXT);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
 libwebsocket_context_destroy(context);&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
On modifie la source, et ensuite on envoi un message, dont le contenu n'est pas important, le message sert juste d'indication au client que la source a changé.&lt;br /&gt;
&lt;br /&gt;
Le code coté client : &lt;br /&gt;
&lt;br /&gt;
 websocket.onmessage=function(message){&lt;br /&gt;
 test1.pause();&lt;br /&gt;
 test1.load();&lt;br /&gt;
 test1.play();&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
A la réception d'un message, on pause le son avec test1.pause() puis on recharge le son afin d'aller chercher la valeur actuelle de la source, puis on relance le son avec test1.play().&lt;br /&gt;
D'après la documentation technique de HTML5, la fonction load() est sensé recharger la source si elle a changé, mais le résultat de ce test n'est pas concluant : le client joue toujours le même son.&lt;br /&gt;
Nous ne comprenons pas pourquoi.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 1 : Réalisation du site Web ==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé ce site web lors de notre temps libre afin de permettre la communication entre le Raspberry Pi et l'ordinateur. En effet, il était inclus dans notre projet de devoir réaliser une communication par internet. Ce site internet va donc remplir cette condition. Sur celui-ci, on pourra trouver une brève description de notre projet, un lien vers le wiki, une image exemple d'un harpe et les boutons Play et Pause qui permettent d'activer et de désactiver la harpe laser.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 2 : Réalisation du programme secondaire sur Arduino 'en cas de problèmes' ==&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis à plusieurs occasions en dehors des heures de projet afin d'avancer sur notre harpe. Nous avons donc décidé que nous devions réaliser un programme sur Arduino nous permettant de réaliser des tests de transmission par la liaison série sans avoir besoin du FPGA. Dans un premier temps, nous avons tenté d'utiliser le port USB comme liaison série. Cependant, il s'est avéré que le Raspberry pi ne pouvait pas lire son port USB, ce qui nous a donc forcé à utiliser les pins de communication série de l'Arduino. &lt;br /&gt;
Nous sommes sur un Arduino Mega 2560, nous avons a notre disposition plusieurs pins de communication série différents. Ils seront utilisés uniquement en transmission. Pour communiquer, nous allons ensuite utiliser le pin Tx1. Nous aboutissons donc au programme suivant:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Setup.PNG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Captprog.PNG]]&lt;br /&gt;
&lt;br /&gt;
La communication série de ce programme nous a causé des problèmes, surtout du fait que l'ordinateur ne recevait pas les informations transmises par l'Arduino. Nous avons donc du effectuer de multiples tests afin de voir où se situait le problème. Nous avons pu déterminer que nous avions un problème au niveau de notre pont diviseur de tension entre l'alimentation de l’Arduino et celle du Raspberry Pi, nous avons alors changé les résistances.&lt;br /&gt;
Nous avons également notamment modifié le programme afin de vérifier que l'information était bien transmise sur le Pin Série de l'Arduino, et que le problème ne venait donc pas de l'Arduino mais bien du Raspberry, qui ne transmet pas correctement l'information à l'ordinateur.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 3 : Assemblage de la boite et mise en place des composants ==&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43737</id>
		<title>Projet IMA3 P5, 2016/2017, TD1</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43737"/>
				<updated>2017-06-12T09:14:59Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : /* Partie informatique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet IMA3-SC 2016/2017 : Synt'Harpe (Sainte) Laser =&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Description du système ===&lt;br /&gt;
&lt;br /&gt;
Pour le projet Système Communicant, nous allons réaliser une harpe laser. Notre but est de créer un instrument de musique similaire à une harpe, où les cordes sont remplacées par des capteurs infra-rouges.&lt;br /&gt;
&lt;br /&gt;
Un son sera émis par l'ordinateur dès que le capteur IR captera une main et le joueur pourra avec son autre main moduler l'amplitude de la note.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on travaillera sur une gamme de son sur 8 bits. Puis, nous implémenterons une banque de sons qui nous permettra de sélectionner l'instrument désiré, d'où l'appellation Synt'Harpe.&lt;br /&gt;
&lt;br /&gt;
L'ordinateur décidera du fonctionnement ou non de la harpe. C'est aussi grâce à lui qu'on pourra choisir la banque de sons voulue.&lt;br /&gt;
&lt;br /&gt;
Toutes les banques de sons seront enregistrées sur le Raspberry.&lt;br /&gt;
Les LEDs signaleront l'emplacement des cordes.&lt;br /&gt;
&lt;br /&gt;
Pour la partie optionnelle, on remplacera les LEDs par des lasers pour un effet visuel de qualité (plus poussé). La fumée permettra de voir les lasers.&lt;br /&gt;
&lt;br /&gt;
=== Le matériel ===&lt;br /&gt;
* Un raspberry pi&lt;br /&gt;
* 8 phototransistors&lt;br /&gt;
* 8 émetteurs lasers&lt;br /&gt;
* Des résistances&lt;br /&gt;
* Une structure&lt;br /&gt;
* Carte d'acquisition de type Arduino au début puis FPGA &lt;br /&gt;
* Un ordinateur&lt;br /&gt;
* Une alimentation&lt;br /&gt;
&lt;br /&gt;
=== Optionnel (visuel) ===&lt;br /&gt;
&lt;br /&gt;
* 8 émetteurs laser&lt;br /&gt;
* Un générateur de fumée&lt;br /&gt;
* Une caméra&lt;br /&gt;
&lt;br /&gt;
== Séance 1 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Le but de cette première séance était de se répartir les tâches, de tester le matériel mit à disposition et de découvrir le fonctionnement du FPGA.&lt;br /&gt;
&lt;br /&gt;
Le principe de fonctionnement de la harpe est le suivant:&lt;br /&gt;
Chaque capteur sera situé en face d'un laser. Les capteurs seront dans la partie haute de la harpe afin de limiter les interférences dues à d'autres sources lumineuses. Chaque laser pointera vers un capteur. &lt;br /&gt;
&lt;br /&gt;
 * Ajout du dessin de la harpe * &lt;br /&gt;
&lt;br /&gt;
Les capteurs enverront tous par défaut la même valeur au FPGA. Quand l'utilisateur passera sa main dans la harpe, un faisceau laser sera coupé. Le capteur n'enverra plus sa valeur seuil au FPGA, il aura donc changé d'état.&lt;br /&gt;
Dès lors que le FPGA détectera un changement d'état, il enverra l'état dans lequel se trouvent les 8 capteurs au Raspberry. &lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé des tests sur les phototransistors et les lasers. Nous avons mis en parallèle un laser et deux capteurs, sans oublier leur résistance de 1.2k Ohms chacune. &lt;br /&gt;
&lt;br /&gt;
Nous avons vu que à luminosité ambiante, quand le laser pointe sur le capteur, celui-ci envoie à l'Arduino une valeur de 950 environ. Ensuite, quand le faisceau laser est coupé, la valeur envoyée par le phototransistor monte à 1020.&lt;br /&gt;
Puis, nous avons réitéré l'expérience en mettant le système dans une boîte. Cette fois, le valeur est passée de 840 quand le capteur est éclairé par le laser à 900 quand le faisceau est coupé.&lt;br /&gt;
Nous en avons déduit que nous allons devoir refaire l'expérience une fois la harpe assemblée.&lt;br /&gt;
&lt;br /&gt;
Les lasers étant très directionnels tout comme les phototransistors, nous n'aurons pas de soucis d'interférences. Un capteur détectera uniquement le laser situé directement en face de lui et non ceux de son voisinage.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Même si il peut paraitre futile d'insérer une partie boitier dans un projet centré sur l'informatique et l'électronique, il s'est avéré que le boitier de notre Harpe nécessitait une attention particulière.&lt;br /&gt;
&lt;br /&gt;
La taille de la harpe à été un sujet de débat, et nous avons réalisé des tests afin de vérifier que des phototransistors trop proches les uns des autres n'allait pas compromettre le bon fonctionnement de la harpe dans son ensemble. En effet, si le phototransistor détectait un autre laser que celui vers lequel il pointe serait extrêmement problématique. Heureusement, il s'est avéré que les phototransistors sont très directionnels, au point que se pose désormais le problème inverse.&lt;br /&gt;
&lt;br /&gt;
Nous allons devoir faire très attention au fait que les lasers soient bien fixés et pointent exactement vers les phototransistors, car dans le cas contraire, ceux-ci ne détectent absolument pas le laser, et tout le principe de fonctionnement s'effondre. La conception et l'assemblage de la boite devront donc être relativement précis, pour éviter ces problèmes.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons dès le départ décidé d'éviter l'utilisation de diodes infra-rouges, pour leur préférer les lasers. Tout d'abord, parce que les diodes ne sont en aucun cas assez puissantes pour être détectées par les phototransistors, ce qui une fois de plus rend notre harpe inutile. Ensuite, parce qu'il nous a semblé que réaliser une harpe 'laser' sans lasers était un concept déconcertant, et enlève beaucoup de l’intérêt de ce projet.&lt;br /&gt;
&lt;br /&gt;
Un premier jet de design avait été réalisé avant cette séance, et au vu des données récoltées pendant celle-ci, nous l'avons modifié pour les prendre en compte, notamment la taille des lasers par rapport aux diodes, et la précision requise. &lt;br /&gt;
&lt;br /&gt;
'insérer photos premiers schémas ici'&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le travail a été séparé en 2 parties, une personne par partie : &lt;br /&gt;
- une première partie sur le serveur même (page web, système de streaming de son depuis la page web)&lt;br /&gt;
- une seconde partie sur la lecture du port série&lt;br /&gt;
&lt;br /&gt;
==== Partie serveur ====&lt;br /&gt;
La première séance a été consacré à deux grands axes : prendre la main à distance sur le raspberry pi et mettre en place le serveur web.&lt;br /&gt;
Afin de pouvoir contrôler et travailler facilement sur le RPi, l'outil vncserver a été installé sur le raspberry, permettant de contrôler via un interface graphique le RPi depuis un ordinateur branché sur le même réseau. Cet utilitaire permettra a l'avenir de travailler directement sur le RPi sans devoir constamment uploader par ssh le travail effectué.&lt;br /&gt;
&lt;br /&gt;
Coté mise en place du serveur web, l'utilitaire de serveur web apache2 a été installé sans soucis, et les pages d'exemples web et javascript fonctionnent. En revanche, l'utilisation du code d'exemple sur les sockets n'est pas utilisable, le paquet proposé n’existe pas et le site du paquet de socket est mort.&lt;br /&gt;
Le reste de la séance a été consacré a des recherches sur les moyens de pouvoir streamer du son, recherches non concluantes. Aucune solution n'a été trouvé sans passer par un service internet hébergé par un tier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Partie lecture port série ====&lt;br /&gt;
&lt;br /&gt;
Cette première séance fut consacrée à la sélection du langage de programmation et à sa prise en main. Il a été décidé d'utiliser Python pour écrire le programme récupérant et traitant les données récupérées à travers le port série. Python étant un langage fort usité, il possède une très large documentation. Ce fut donc facile de trouver la librairie permettant de lire les données envoyées par le port série.&lt;br /&gt;
&lt;br /&gt;
Un doute subsiste encore sur le type de données envoyé par le port série. L'idéal serait de récupérer un tableau de 8 entiers de type binaire correspondant aux états des 8 ports liés aux &amp;quot;cordes&amp;quot; laser, pour pouvoir ensuite traiter ces données facilement.&lt;br /&gt;
&lt;br /&gt;
== Séance 2 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Lors de cette séance, nous avons réalisé le premier circuit sur le FPGA. &lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un circuit simple, qui envoie en permanence l'état des huit phototransistors au port série. Les phototransistors sont alors directement reliés à celui-ci. Nous avons pu tester le bon fonctionnement du système grâce aux diodes du FPGA. Nous avons branché en parallèle sur le circuit les huit diodes, afin de vérifier qu'un signal était bien envoyé en permanence, on a pu les voir s'éteindre lorsqu'on éclairait un laser. &lt;br /&gt;
Ces diodes se sont avérées très utiles, car il n'est pas encore possible d'effectuer les tests sur le port série, car la partie informatique n'est pas encore opérationnelle, on ne peut donc pas lire directement sur le port série pour le moment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi constant ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite réalisé un montage permettant de faire l'envoi seulement sur changement d'état, comme prévu à la séance 1 Nous avons donc réalisé un système de bascules permettant de comparer l'état actuel de chaque diode avec son état précédent, puis de réaliser l'envoi seulement si une différence était observée. Comme précédemment, les diodes sont reliées directement au Port Série, mais cette fois-ci au lieu de brancher le Bit d'envoi du port Série sur un Vcc, soit un '1' logique, nous l'avons relié à la vérification de changement d'état, qui passe à '1' uniquement avec un changement d'état.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi sur changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème qui s'est alors posé était de savoir si on envoyait le signal assez longtemps pour qu'il puisse être lu. En effet on envoie un signal seulement si il y a changement d'état, et cette vérification se fait à chaque incrément d'horloge. Hors, la différence sera donc observée sur un seul incrément d'horloge, par conséquent, on n'envoie de signal que pendant ce seul incrément. Pour l'instant, nous supposons que le port série est capable de stocker les données à envoyer en un seul incrément d'horloge. &lt;br /&gt;
Cependant, si lors des tests, ça ne fonctionne pas, nous prévoyons d'utiliser un compteur pour pouvoir envoyer le signal plus longtemps au Bit d'envoi du port série, et ainsi laisser le temps au port série d'envoyer l'information.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous nous sommes focalisés sur le FPGA, mais nous avons néanmoins terminé la conception du boitier de la harpe, sous la forme de trois 'boites' crénelées, que nous avons ensuite l'intention de découper au FabLab puis d'assembler.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos des boites ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il s'est avéré que réaliser des boites crénelées rendrait tout le boitier beaucoup plus solide, et donc fiable.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le problème de l'impossibilité d'utiliser l'exemple sur les sockets a été résolu, grâce à l'intervention de M. Redon. Le problème était une différence de version de la distribution Linux entre le RPi utilisé et celle utilisé pour l'exemple. En effet, le RPi de travail est sur une distribution Wheezy, alors que la version la plus récente est la Jessie. Les chemins des dépots des sources de la librairie libwebsocket n’existant pas sur Wheezy, on ne pouvait installer la librairie directement en ligne de commande. M. Redon a ajouté le chemin de la librairie dans le gestionnaire de paquet du RPi et on a pu utiliser sans problèmes la librairie. De plus le site du paquet libwebsocket n'était inaccessible que temporairement.&lt;br /&gt;
La séance a été consacré à comprendre le fonctionnement des sockets et comment l'exemple html interagissait avec.&lt;br /&gt;
&lt;br /&gt;
La partie importante du code d'exemple est la suivante : &lt;br /&gt;
&lt;br /&gt;
 static int callback_my(&lt;br /&gt;
  struct libwebsocket_context * this,&lt;br /&gt;
  struct libwebsocket *wsi,enum libwebsocket_callback_reasons reason,&lt;br /&gt;
  void *user,void *in,size_t len)&lt;br /&gt;
 {&lt;br /&gt;
 static char *message=NULL;&lt;br /&gt;
 static int msize=0;&lt;br /&gt;
 switch(reason){&lt;br /&gt;
  case LWS_CALLBACK_ESTABLISHED:&lt;br /&gt;
    printf(&amp;quot;connection established\n&amp;quot;);&lt;br /&gt;
    message=NULL;&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_RECEIVE:&lt;br /&gt;
                // Ici sont traites les messages envoyes par le navigateur&lt;br /&gt;
    printf(&amp;quot;received data: %s\n&amp;quot;,(char *)in);&lt;br /&gt;
    message=malloc(len+LWS_SEND_BUFFER_PRE_PADDING+LWS_SEND_BUFFER_POST_PADDING);&lt;br /&gt;
    if(message==NULL){ perror(&amp;quot;callback_my.malloc&amp;quot;); exit(EXIT_FAILURE); }&lt;br /&gt;
    memcpy(message+LWS_SEND_BUFFER_PRE_PADDING,in,len);&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    msize=len;&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_SERVER_WRITEABLE:&lt;br /&gt;
                // Ici sont envoyes les messages au navigateur&lt;br /&gt;
    if(message!=NULL){&lt;br /&gt;
      char *out=message+LWS_SEND_BUFFER_PRE_PADDING;&lt;br /&gt;
      libwebsocket_write(wsi,(unsigned char *)out,msize,LWS_WRITE_TEXT);&lt;br /&gt;
      free(message);&lt;br /&gt;
      message=NULL;&lt;br /&gt;
      }&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    break;&lt;br /&gt;
  }&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une fonction de callback gérant à la fois la réception et la transmission. On peut remarquer 3 cas du switch : LWS_CALLBACK_ESTABLISHED correspondant à la création d'un lien entre la page web et le serveur websocket à la demande de la page web, LWS_CALLBACK_RECEIVE correspondant aux actions à entreprendre à la réception d'un message provenant du navigateur web, et LWS_CALLBACK_SERVER_WRITEABLE correspondant aux actions afin d'envoyer un message au navigateur.&lt;br /&gt;
&lt;br /&gt;
Coté HTML, on utilise les sockets grâce à ce code suivant :&lt;br /&gt;
 &lt;br /&gt;
 window.WebSocket=(window.WebSocket||window.MozWebSocket);&lt;br /&gt;
 var websocket=new WebSocket('ws://127.0.0.1:9000','myprotocol');&lt;br /&gt;
 websocket.onopen=function(){ $('h1').css('color','green'); };&lt;br /&gt;
 websocket.onerror=function(){ $('h1').css('color','red'); };&lt;br /&gt;
 websocket.onmessage=function(message){&lt;br /&gt;
 console.log(message.data);&lt;br /&gt;
 $('#messages').append($('&amp;lt;p&amp;gt;',{ text: message.data }));&lt;br /&gt;
 };&lt;br /&gt;
 function sendMessage(){&lt;br /&gt;
 websocket.send($('#message').val());&lt;br /&gt;
 $('#message').val('');&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La fonction websocket.onmessage gère le traitement à faire coté client quand le serveur envoie des informations, et la fonction sendMessage permet l'envoie d'information du client vers le serveur.&lt;br /&gt;
&lt;br /&gt;
Pour notre projet, nous avons besoin principalement, dans un premier temps, d'envoyer des informations du serveur vers le client, nous nous sommes donc concentrer à comprendre et modifier les parties du code fourni suivantes : websocket.onmessage coté client et le &amp;quot;case LWS_CALLBACK_SERVER_WRITEABLE:&amp;quot; coté serveur.&lt;br /&gt;
&lt;br /&gt;
Le but des tests était de réussir à faire jouer deux sons différents par le client, avec changement de son imposé par le serveur. HTML5 propose nativement de lire des sons à partir d'une source grâce à une balise audio :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;audio controls=&amp;quot;controls&amp;quot; id=&amp;quot;mySound&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/audio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On récupère l'identifiant de cette balise avec &lt;br /&gt;
&lt;br /&gt;
 var test1 = document.getElementById(&amp;quot;mySound&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
afin de pouvoir l'utiliser de n'importe où dans le programme.&lt;br /&gt;
On définit la source grâce à &lt;br /&gt;
&lt;br /&gt;
 test1.src=&amp;quot;sound.mp3&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
avec &amp;quot;sound.mp3&amp;quot; le chemin d'accès au fichier son par rapport à l'emplacement du fichier html sur le serveur. Ici, le fichier son sound.mp3 est dans le même dossier que la page index.html.&lt;br /&gt;
Enfin, on peut lire le son avec &lt;br /&gt;
&lt;br /&gt;
 test1.play();&lt;br /&gt;
&lt;br /&gt;
Le but du projet étant d'émettre en continue le son généré par la harpe, l'objectif ici est soit de générer un fichier de streaming que l'on lit en continue, soit de lire un fichier différent par son possible et on change la valeur de test1.src en fonction du son à lire, soit on lit toujours la même source, mais que l'on modifie à la volée en fonction du son voulu. La première option a été étudiée jusqu'en fin de séance.&lt;br /&gt;
Nous n'avons pas réussi à comprendre comment générer un fichier de streaming audio simple, de plus toutes les documentations et exemples trouvés ne concernant qu'un streaming simultanée de son et de vidéo à partir d'une caméra et d'un micro, et nous n'avons pas compris comment adapter ces exemples.&lt;br /&gt;
&lt;br /&gt;
== Séance 3 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous avons pu tester l'envoi sur changement d'état, toujours avec les diodes du FPGA.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par ajouter une horloge sur le détecteur de changement d'état, afin d'augmenter le nombre d'incréments d'horloge sur lequel il est à '1', et ce dans le but de rendre le clignotement d'un diode visible à l’œil nu.&lt;br /&gt;
Ensuite, nous avons relié la sortie du détecteur de changement d'état et des phototransistors par un 'ET' logique, que nous avons ensuite relié aux diodes du FPGA.&lt;br /&gt;
De cette façon, si l'on détecte un changement d'état sur un phototransistor, la nouvelle valeur est alors envoyée sur les diodes. Le système a fonctionné (à voir :p ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos du test avec changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite passé le reste de la séance à mettre en commun notre partie avec la partie informatique, en essayant de leur permettre de lire sur le port série du FPGA. Les essais ont pour l'instant été infructueux, mais des progrès ont été faits. &lt;br /&gt;
&lt;br /&gt;
L'objectif étant que le Raspberry Pi puisse lire les informations envoyées par le FPGA, pour ensuite les transmettre au site Web que nous allons réaliser par la suite.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Au vu des difficultés rencontrées lors de la mise en place d'un véritable système de streaming, nous avons décider d'étudier les autres options possibles.&amp;lt;/br&amp;gt;&lt;br /&gt;
Notre deuxième solution était de modifier la valeur de test1.src et d'avoir&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 1 : Réalisation du site Web ==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé ce site web lors de notre temps libre afin de permettre la communication entre le Raspberry Pi et l'ordinateur. En effet, il était inclus dans notre projet de devoir réaliser une communication par internet. Ce site internet va donc remplir cette condition. Sur celui-ci, on pourra trouver une brève description de notre projet, un lien vers le wiki, une image exemple d'un harpe et les boutons Play et Pause qui permettent d'activer et de désactiver la harpe laser.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 2 : Réalisation du programme secondaire sur Arduino 'en cas de problèmes' ==&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis à plusieurs occasions en dehors des heures de projet afin d'avancer sur notre harpe. Nous avons donc décidé que nous devions réaliser un programme sur Arduino nous permettant de réaliser des tests de transmission par la liaison série sans avoir besoin du FPGA. Dans un premier temps, nous avons tenté d'utiliser le port USB comme liaison série. Cependant, il s'est avéré que le Raspberry pi ne pouvait pas lire son port USB, ce qui nous a donc forcé à utiliser les pins de communication série de l'Arduino. &lt;br /&gt;
Nous sommes sur un Arduino Mega 2560, nous avons a notre disposition plusieurs pins de communication série différents. Ils seront utilisés uniquement en transmission. Pour communiquer, nous allons ensuite utiliser le pin Tx1. Nous aboutissons donc au programme suivant:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Setup.PNG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Captprog.PNG]]&lt;br /&gt;
&lt;br /&gt;
La communication série de ce programme nous a causé des problèmes, surtout du fait que l'ordinateur ne recevait pas les informations transmises par l'Arduino. Nous avons donc du effectuer de multiples tests afin de voir où se situait le problème. Nous avons pu déterminer que nous avions un problème au niveau de notre pont diviseur de tension entre l'alimentation de l’Arduino et celle du Raspberry Pi, nous avons alors changé les résistances.&lt;br /&gt;
Nous avons également notamment modifié le programme afin de vérifier que l'information était bien transmise sur le Pin Série de l'Arduino, et que le problème ne venait donc pas de l'Arduino mais bien du Raspberry, qui ne transmet pas correctement l'information à l'ordinateur.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 3 : Assemblage de la boite et mise en place des composants ==&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43735</id>
		<title>Projet IMA3 P5, 2016/2017, TD1</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43735"/>
				<updated>2017-06-12T09:13:32Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : /* Partie informatique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet IMA3-SC 2016/2017 : Synt'Harpe (Sainte) Laser =&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Description du système ===&lt;br /&gt;
&lt;br /&gt;
Pour le projet Système Communicant, nous allons réaliser une harpe laser. Notre but est de créer un instrument de musique similaire à une harpe, où les cordes sont remplacées par des capteurs infra-rouges.&lt;br /&gt;
&lt;br /&gt;
Un son sera émis par l'ordinateur dès que le capteur IR captera une main et le joueur pourra avec son autre main moduler l'amplitude de la note.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on travaillera sur une gamme de son sur 8 bits. Puis, nous implémenterons une banque de sons qui nous permettra de sélectionner l'instrument désiré, d'où l'appellation Synt'Harpe.&lt;br /&gt;
&lt;br /&gt;
L'ordinateur décidera du fonctionnement ou non de la harpe. C'est aussi grâce à lui qu'on pourra choisir la banque de sons voulue.&lt;br /&gt;
&lt;br /&gt;
Toutes les banques de sons seront enregistrées sur le Raspberry.&lt;br /&gt;
Les LEDs signaleront l'emplacement des cordes.&lt;br /&gt;
&lt;br /&gt;
Pour la partie optionnelle, on remplacera les LEDs par des lasers pour un effet visuel de qualité (plus poussé). La fumée permettra de voir les lasers.&lt;br /&gt;
&lt;br /&gt;
=== Le matériel ===&lt;br /&gt;
* Un raspberry pi&lt;br /&gt;
* 8 phototransistors&lt;br /&gt;
* 8 émetteurs lasers&lt;br /&gt;
* Des résistances&lt;br /&gt;
* Une structure&lt;br /&gt;
* Carte d'acquisition de type Arduino au début puis FPGA &lt;br /&gt;
* Un ordinateur&lt;br /&gt;
* Une alimentation&lt;br /&gt;
&lt;br /&gt;
=== Optionnel (visuel) ===&lt;br /&gt;
&lt;br /&gt;
* 8 émetteurs laser&lt;br /&gt;
* Un générateur de fumée&lt;br /&gt;
* Une caméra&lt;br /&gt;
&lt;br /&gt;
== Séance 1 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Le but de cette première séance était de se répartir les tâches, de tester le matériel mit à disposition et de découvrir le fonctionnement du FPGA.&lt;br /&gt;
&lt;br /&gt;
Le principe de fonctionnement de la harpe est le suivant:&lt;br /&gt;
Chaque capteur sera situé en face d'un laser. Les capteurs seront dans la partie haute de la harpe afin de limiter les interférences dues à d'autres sources lumineuses. Chaque laser pointera vers un capteur. &lt;br /&gt;
&lt;br /&gt;
 * Ajout du dessin de la harpe * &lt;br /&gt;
&lt;br /&gt;
Les capteurs enverront tous par défaut la même valeur au FPGA. Quand l'utilisateur passera sa main dans la harpe, un faisceau laser sera coupé. Le capteur n'enverra plus sa valeur seuil au FPGA, il aura donc changé d'état.&lt;br /&gt;
Dès lors que le FPGA détectera un changement d'état, il enverra l'état dans lequel se trouvent les 8 capteurs au Raspberry. &lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé des tests sur les phototransistors et les lasers. Nous avons mis en parallèle un laser et deux capteurs, sans oublier leur résistance de 1.2k Ohms chacune. &lt;br /&gt;
&lt;br /&gt;
Nous avons vu que à luminosité ambiante, quand le laser pointe sur le capteur, celui-ci envoie à l'Arduino une valeur de 950 environ. Ensuite, quand le faisceau laser est coupé, la valeur envoyée par le phototransistor monte à 1020.&lt;br /&gt;
Puis, nous avons réitéré l'expérience en mettant le système dans une boîte. Cette fois, le valeur est passée de 840 quand le capteur est éclairé par le laser à 900 quand le faisceau est coupé.&lt;br /&gt;
Nous en avons déduit que nous allons devoir refaire l'expérience une fois la harpe assemblée.&lt;br /&gt;
&lt;br /&gt;
Les lasers étant très directionnels tout comme les phototransistors, nous n'aurons pas de soucis d'interférences. Un capteur détectera uniquement le laser situé directement en face de lui et non ceux de son voisinage.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Même si il peut paraitre futile d'insérer une partie boitier dans un projet centré sur l'informatique et l'électronique, il s'est avéré que le boitier de notre Harpe nécessitait une attention particulière.&lt;br /&gt;
&lt;br /&gt;
La taille de la harpe à été un sujet de débat, et nous avons réalisé des tests afin de vérifier que des phototransistors trop proches les uns des autres n'allait pas compromettre le bon fonctionnement de la harpe dans son ensemble. En effet, si le phototransistor détectait un autre laser que celui vers lequel il pointe serait extrêmement problématique. Heureusement, il s'est avéré que les phototransistors sont très directionnels, au point que se pose désormais le problème inverse.&lt;br /&gt;
&lt;br /&gt;
Nous allons devoir faire très attention au fait que les lasers soient bien fixés et pointent exactement vers les phototransistors, car dans le cas contraire, ceux-ci ne détectent absolument pas le laser, et tout le principe de fonctionnement s'effondre. La conception et l'assemblage de la boite devront donc être relativement précis, pour éviter ces problèmes.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons dès le départ décidé d'éviter l'utilisation de diodes infra-rouges, pour leur préférer les lasers. Tout d'abord, parce que les diodes ne sont en aucun cas assez puissantes pour être détectées par les phototransistors, ce qui une fois de plus rend notre harpe inutile. Ensuite, parce qu'il nous a semblé que réaliser une harpe 'laser' sans lasers était un concept déconcertant, et enlève beaucoup de l’intérêt de ce projet.&lt;br /&gt;
&lt;br /&gt;
Un premier jet de design avait été réalisé avant cette séance, et au vu des données récoltées pendant celle-ci, nous l'avons modifié pour les prendre en compte, notamment la taille des lasers par rapport aux diodes, et la précision requise. &lt;br /&gt;
&lt;br /&gt;
'insérer photos premiers schémas ici'&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le travail a été séparé en 2 parties, une personne par partie : &lt;br /&gt;
- une première partie sur le serveur même (page web, système de streaming de son depuis la page web)&lt;br /&gt;
- une seconde partie sur la lecture du port série&lt;br /&gt;
&lt;br /&gt;
==== Partie serveur ====&lt;br /&gt;
La première séance a été consacré à deux grands axes : prendre la main à distance sur le raspberry pi et mettre en place le serveur web.&lt;br /&gt;
Afin de pouvoir contrôler et travailler facilement sur le RPi, l'outil vncserver a été installé sur le raspberry, permettant de contrôler via un interface graphique le RPi depuis un ordinateur branché sur le même réseau. Cet utilitaire permettra a l'avenir de travailler directement sur le RPi sans devoir constamment uploader par ssh le travail effectué.&lt;br /&gt;
&lt;br /&gt;
Coté mise en place du serveur web, l'utilitaire de serveur web apache2 a été installé sans soucis, et les pages d'exemples web et javascript fonctionnent. En revanche, l'utilisation du code d'exemple sur les sockets n'est pas utilisable, le paquet proposé n’existe pas et le site du paquet de socket est mort.&lt;br /&gt;
Le reste de la séance a été consacré a des recherches sur les moyens de pouvoir streamer du son, recherches non concluantes. Aucune solution n'a été trouvé sans passer par un service internet hébergé par un tier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Partie lecture port série ====&lt;br /&gt;
&lt;br /&gt;
Cette première séance fut consacrée à la sélection du langage de programmation et à sa prise en main. Il a été décidé d'utiliser Python pour écrire le programme récupérant et traitant les données récupérées à travers le port série. Python étant un langage fort usité, il possède une très large documentation. Ce fut donc facile de trouver la librairie permettant de lire les données envoyées par le port série.&lt;br /&gt;
&lt;br /&gt;
Un doute subsiste encore sur le type de données envoyé par le port série. L'idéal serait de récupérer un tableau de 8 entiers de type binaire correspondant aux états des 8 ports liés aux &amp;quot;cordes&amp;quot; laser, pour pouvoir ensuite traiter ces données facilement.&lt;br /&gt;
&lt;br /&gt;
== Séance 2 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Lors de cette séance, nous avons réalisé le premier circuit sur le FPGA. &lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un circuit simple, qui envoie en permanence l'état des huit phototransistors au port série. Les phototransistors sont alors directement reliés à celui-ci. Nous avons pu tester le bon fonctionnement du système grâce aux diodes du FPGA. Nous avons branché en parallèle sur le circuit les huit diodes, afin de vérifier qu'un signal était bien envoyé en permanence, on a pu les voir s'éteindre lorsqu'on éclairait un laser. &lt;br /&gt;
Ces diodes se sont avérées très utiles, car il n'est pas encore possible d'effectuer les tests sur le port série, car la partie informatique n'est pas encore opérationnelle, on ne peut donc pas lire directement sur le port série pour le moment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi constant ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite réalisé un montage permettant de faire l'envoi seulement sur changement d'état, comme prévu à la séance 1 Nous avons donc réalisé un système de bascules permettant de comparer l'état actuel de chaque diode avec son état précédent, puis de réaliser l'envoi seulement si une différence était observée. Comme précédemment, les diodes sont reliées directement au Port Série, mais cette fois-ci au lieu de brancher le Bit d'envoi du port Série sur un Vcc, soit un '1' logique, nous l'avons relié à la vérification de changement d'état, qui passe à '1' uniquement avec un changement d'état.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi sur changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème qui s'est alors posé était de savoir si on envoyait le signal assez longtemps pour qu'il puisse être lu. En effet on envoie un signal seulement si il y a changement d'état, et cette vérification se fait à chaque incrément d'horloge. Hors, la différence sera donc observée sur un seul incrément d'horloge, par conséquent, on n'envoie de signal que pendant ce seul incrément. Pour l'instant, nous supposons que le port série est capable de stocker les données à envoyer en un seul incrément d'horloge. &lt;br /&gt;
Cependant, si lors des tests, ça ne fonctionne pas, nous prévoyons d'utiliser un compteur pour pouvoir envoyer le signal plus longtemps au Bit d'envoi du port série, et ainsi laisser le temps au port série d'envoyer l'information.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous nous sommes focalisés sur le FPGA, mais nous avons néanmoins terminé la conception du boitier de la harpe, sous la forme de trois 'boites' crénelées, que nous avons ensuite l'intention de découper au FabLab puis d'assembler.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos des boites ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il s'est avéré que réaliser des boites crénelées rendrait tout le boitier beaucoup plus solide, et donc fiable.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le problème de l'impossibilité d'utiliser l'exemple sur les sockets a été résolu, grâce à l'intervention de M. Redon. Le problème était une différence de version de la distribution Linux entre le RPi utilisé et celle utilisé pour l'exemple. En effet, le RPi de travail est sur une distribution Wheezy, alors que la version la plus récente est la Jessie. Les chemins des dépots des sources de la librairie libwebsocket n’existant pas sur Wheezy, on ne pouvait installer la librairie directement en ligne de commande. M. Redon a ajouté le chemin de la librairie dans le gestionnaire de paquet du RPi et on a pu utiliser sans problèmes la librairie. De plus le site du paquet libwebsocket n'était inaccessible que temporairement.&lt;br /&gt;
La séance a été consacré à comprendre le fonctionnement des sockets et comment l'exemple html interagissait avec.&lt;br /&gt;
&lt;br /&gt;
La partie importante du code d'exemple est la suivante : &lt;br /&gt;
&lt;br /&gt;
 static int callback_my(&lt;br /&gt;
  struct libwebsocket_context * this,&lt;br /&gt;
  struct libwebsocket *wsi,enum libwebsocket_callback_reasons reason,&lt;br /&gt;
  void *user,void *in,size_t len)&lt;br /&gt;
 {&lt;br /&gt;
 static char *message=NULL;&lt;br /&gt;
 static int msize=0;&lt;br /&gt;
 switch(reason){&lt;br /&gt;
  case LWS_CALLBACK_ESTABLISHED:&lt;br /&gt;
    printf(&amp;quot;connection established\n&amp;quot;);&lt;br /&gt;
    message=NULL;&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_RECEIVE:&lt;br /&gt;
                // Ici sont traites les messages envoyes par le navigateur&lt;br /&gt;
    printf(&amp;quot;received data: %s\n&amp;quot;,(char *)in);&lt;br /&gt;
    message=malloc(len+LWS_SEND_BUFFER_PRE_PADDING+LWS_SEND_BUFFER_POST_PADDING);&lt;br /&gt;
    if(message==NULL){ perror(&amp;quot;callback_my.malloc&amp;quot;); exit(EXIT_FAILURE); }&lt;br /&gt;
    memcpy(message+LWS_SEND_BUFFER_PRE_PADDING,in,len);&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    msize=len;&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_SERVER_WRITEABLE:&lt;br /&gt;
                // Ici sont envoyes les messages au navigateur&lt;br /&gt;
    if(message!=NULL){&lt;br /&gt;
      char *out=message+LWS_SEND_BUFFER_PRE_PADDING;&lt;br /&gt;
      libwebsocket_write(wsi,(unsigned char *)out,msize,LWS_WRITE_TEXT);&lt;br /&gt;
      free(message);&lt;br /&gt;
      message=NULL;&lt;br /&gt;
      }&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    break;&lt;br /&gt;
  }&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une fonction de callback gérant à la fois la réception et la transmission. On peut remarquer 3 cas du switch : LWS_CALLBACK_ESTABLISHED correspondant à la création d'un lien entre la page web et le serveur websocket à la demande de la page web, LWS_CALLBACK_RECEIVE correspondant aux actions à entreprendre à la réception d'un message provenant du navigateur web, et LWS_CALLBACK_SERVER_WRITEABLE correspondant aux actions afin d'envoyer un message au navigateur.&lt;br /&gt;
&lt;br /&gt;
Coté HTML, on utilise les sockets grâce à ce code suivant :&lt;br /&gt;
 &lt;br /&gt;
 window.WebSocket=(window.WebSocket||window.MozWebSocket);&lt;br /&gt;
 var websocket=new WebSocket('ws://127.0.0.1:9000','myprotocol');&lt;br /&gt;
 websocket.onopen=function(){ $('h1').css('color','green'); };&lt;br /&gt;
 websocket.onerror=function(){ $('h1').css('color','red'); };&lt;br /&gt;
 websocket.onmessage=function(message){&lt;br /&gt;
 console.log(message.data);&lt;br /&gt;
 $('#messages').append($('&amp;lt;p&amp;gt;',{ text: message.data }));&lt;br /&gt;
 };&lt;br /&gt;
 function sendMessage(){&lt;br /&gt;
 websocket.send($('#message').val());&lt;br /&gt;
 $('#message').val('');&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La fonction websocket.onmessage gère le traitement à faire coté client quand le serveur envoie des informations, et la fonction sendMessage permet l'envoie d'information du client vers le serveur.&lt;br /&gt;
&lt;br /&gt;
Pour notre projet, nous avons besoin principalement, dans un premier temps, d'envoyer des informations du serveur vers le client, nous nous sommes donc concentrer à comprendre et modifier les parties du code fourni suivantes : websocket.onmessage coté client et le &amp;quot;case LWS_CALLBACK_SERVER_WRITEABLE:&amp;quot; coté serveur.&lt;br /&gt;
&lt;br /&gt;
Le but des tests était de réussir à faire jouer deux sons différents par le client, avec changement de son imposé par le serveur. HTML5 propose nativement de lire des sons à partir d'une source grâce à une balise audio :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;audio controls=&amp;quot;controls&amp;quot; id=&amp;quot;mySound&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/audio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On récupère l'identifiant de cette balise avec &lt;br /&gt;
&lt;br /&gt;
 var test1 = document.getElementById(&amp;quot;mySound&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
afin de pouvoir l'utiliser de n'importe où dans le programme.&lt;br /&gt;
On définit la source grâce à &lt;br /&gt;
&lt;br /&gt;
 test1.src=&amp;quot;sound.mp3&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
avec &amp;quot;sound.mp3&amp;quot; le chemin d'accès au fichier son par rapport à l'emplacement du fichier html sur le serveur. Ici, le fichier son sound.mp3 est dans le même dossier que la page index.html.&lt;br /&gt;
Enfin, on peut lire le son avec &lt;br /&gt;
&lt;br /&gt;
 test1.play();&lt;br /&gt;
&lt;br /&gt;
Le but du projet étant d'émettre en continue le son généré par la harpe, l'objectif ici est soit de générer un fichier de streaming que l'on lit en continue, soit de lire un fichier différent par son possible et on change la valeur de test1.src en fonction du son à lire, soit on lit toujours la même source, mais que l'on modifie à la volée en fonction du son voulu. La première option a été étudiée jusqu'en fin de séance.&lt;br /&gt;
Nous n'avons pas réussi à comprendre comment générer un fichier de streaming audio simple, de plus toutes les documentations et exemples trouvés ne concernant qu'un streaming simultanée de son et de vidéo à partir d'une caméra et d'un micro, et nous n'avons pas compris comment adapter ces exemples.&lt;br /&gt;
&lt;br /&gt;
== Séance 3 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous avons pu tester l'envoi sur changement d'état, toujours avec les diodes du FPGA.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par ajouter une horloge sur le détecteur de changement d'état, afin d'augmenter le nombre d'incréments d'horloge sur lequel il est à '1', et ce dans le but de rendre le clignotement d'un diode visible à l’œil nu.&lt;br /&gt;
Ensuite, nous avons relié la sortie du détecteur de changement d'état et des phototransistors par un 'ET' logique, que nous avons ensuite relié aux diodes du FPGA.&lt;br /&gt;
De cette façon, si l'on détecte un changement d'état sur un phototransistor, la nouvelle valeur est alors envoyée sur les diodes. Le système a fonctionné (à voir :p ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos du test avec changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite passé le reste de la séance à mettre en commun notre partie avec la partie informatique, en essayant de leur permettre de lire sur le port série du FPGA. Les essais ont pour l'instant été infructueux, mais des progrès ont été faits. &lt;br /&gt;
&lt;br /&gt;
L'objectif étant que le Raspberry Pi puisse lire les informations envoyées par le FPGA, pour ensuite les transmettre au site Web que nous allons réaliser par la suite.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Au vu des difficultés rencontrées lors de la mise en place d'un véritable système de streaming, nous avons décider d'étudier les autres options possibles.&lt;br /&gt;
Notre deuxième solution était&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 1 : Réalisation du site Web ==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé ce site web lors de notre temps libre afin de permettre la communication entre le Raspberry Pi et l'ordinateur. En effet, il était inclus dans notre projet de devoir réaliser une communication par internet. Ce site internet va donc remplir cette condition. Sur celui-ci, on pourra trouver une brève description de notre projet, un lien vers le wiki, une image exemple d'un harpe et les boutons Play et Pause qui permettent d'activer et de désactiver la harpe laser.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 2 : Réalisation du programme secondaire sur Arduino 'en cas de problèmes' ==&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis à plusieurs occasions en dehors des heures de projet afin d'avancer sur notre harpe. Nous avons donc décidé que nous devions réaliser un programme sur Arduino nous permettant de réaliser des tests de transmission par la liaison série sans avoir besoin du FPGA. Dans un premier temps, nous avons tenté d'utiliser le port USB comme liaison série. Cependant, il s'est avéré que le Raspberry pi ne pouvait pas lire son port USB, ce qui nous a donc forcé à utiliser les pins de communication série de l'Arduino. &lt;br /&gt;
Nous sommes sur un Arduino Mega 2560, nous avons a notre disposition plusieurs pins de communication série différents. Ils seront utilisés uniquement en transmission. Pour communiquer, nous allons ensuite utiliser le pin Tx1. Nous aboutissons donc au programme suivant:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Setup.PNG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Captprog.PNG]]&lt;br /&gt;
&lt;br /&gt;
La communication série de ce programme nous a causé des problèmes, surtout du fait que l'ordinateur ne recevait pas les informations transmises par l'Arduino. Nous avons donc du effectuer de multiples tests afin de voir où se situait le problème. Nous avons pu déterminer que nous avions un problème au niveau de notre pont diviseur de tension entre l'alimentation de l’Arduino et celle du Raspberry Pi, nous avons alors changé les résistances.&lt;br /&gt;
Nous avons également notamment modifié le programme afin de vérifier que l'information était bien transmise sur le Pin Série de l'Arduino, et que le problème ne venait donc pas de l'Arduino mais bien du Raspberry, qui ne transmet pas correctement l'information à l'ordinateur.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 3 : Assemblage de la boite et mise en place des composants ==&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43734</id>
		<title>Projet IMA3 P5, 2016/2017, TD1</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43734"/>
				<updated>2017-06-12T09:12:28Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : /* Partie informatique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet IMA3-SC 2016/2017 : Synt'Harpe (Sainte) Laser =&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Description du système ===&lt;br /&gt;
&lt;br /&gt;
Pour le projet Système Communicant, nous allons réaliser une harpe laser. Notre but est de créer un instrument de musique similaire à une harpe, où les cordes sont remplacées par des capteurs infra-rouges.&lt;br /&gt;
&lt;br /&gt;
Un son sera émis par l'ordinateur dès que le capteur IR captera une main et le joueur pourra avec son autre main moduler l'amplitude de la note.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on travaillera sur une gamme de son sur 8 bits. Puis, nous implémenterons une banque de sons qui nous permettra de sélectionner l'instrument désiré, d'où l'appellation Synt'Harpe.&lt;br /&gt;
&lt;br /&gt;
L'ordinateur décidera du fonctionnement ou non de la harpe. C'est aussi grâce à lui qu'on pourra choisir la banque de sons voulue.&lt;br /&gt;
&lt;br /&gt;
Toutes les banques de sons seront enregistrées sur le Raspberry.&lt;br /&gt;
Les LEDs signaleront l'emplacement des cordes.&lt;br /&gt;
&lt;br /&gt;
Pour la partie optionnelle, on remplacera les LEDs par des lasers pour un effet visuel de qualité (plus poussé). La fumée permettra de voir les lasers.&lt;br /&gt;
&lt;br /&gt;
=== Le matériel ===&lt;br /&gt;
* Un raspberry pi&lt;br /&gt;
* 8 phototransistors&lt;br /&gt;
* 8 émetteurs lasers&lt;br /&gt;
* Des résistances&lt;br /&gt;
* Une structure&lt;br /&gt;
* Carte d'acquisition de type Arduino au début puis FPGA &lt;br /&gt;
* Un ordinateur&lt;br /&gt;
* Une alimentation&lt;br /&gt;
&lt;br /&gt;
=== Optionnel (visuel) ===&lt;br /&gt;
&lt;br /&gt;
* 8 émetteurs laser&lt;br /&gt;
* Un générateur de fumée&lt;br /&gt;
* Une caméra&lt;br /&gt;
&lt;br /&gt;
== Séance 1 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Le but de cette première séance était de se répartir les tâches, de tester le matériel mit à disposition et de découvrir le fonctionnement du FPGA.&lt;br /&gt;
&lt;br /&gt;
Le principe de fonctionnement de la harpe est le suivant:&lt;br /&gt;
Chaque capteur sera situé en face d'un laser. Les capteurs seront dans la partie haute de la harpe afin de limiter les interférences dues à d'autres sources lumineuses. Chaque laser pointera vers un capteur. &lt;br /&gt;
&lt;br /&gt;
 * Ajout du dessin de la harpe * &lt;br /&gt;
&lt;br /&gt;
Les capteurs enverront tous par défaut la même valeur au FPGA. Quand l'utilisateur passera sa main dans la harpe, un faisceau laser sera coupé. Le capteur n'enverra plus sa valeur seuil au FPGA, il aura donc changé d'état.&lt;br /&gt;
Dès lors que le FPGA détectera un changement d'état, il enverra l'état dans lequel se trouvent les 8 capteurs au Raspberry. &lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé des tests sur les phototransistors et les lasers. Nous avons mis en parallèle un laser et deux capteurs, sans oublier leur résistance de 1.2k Ohms chacune. &lt;br /&gt;
&lt;br /&gt;
Nous avons vu que à luminosité ambiante, quand le laser pointe sur le capteur, celui-ci envoie à l'Arduino une valeur de 950 environ. Ensuite, quand le faisceau laser est coupé, la valeur envoyée par le phototransistor monte à 1020.&lt;br /&gt;
Puis, nous avons réitéré l'expérience en mettant le système dans une boîte. Cette fois, le valeur est passée de 840 quand le capteur est éclairé par le laser à 900 quand le faisceau est coupé.&lt;br /&gt;
Nous en avons déduit que nous allons devoir refaire l'expérience une fois la harpe assemblée.&lt;br /&gt;
&lt;br /&gt;
Les lasers étant très directionnels tout comme les phototransistors, nous n'aurons pas de soucis d'interférences. Un capteur détectera uniquement le laser situé directement en face de lui et non ceux de son voisinage.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Même si il peut paraitre futile d'insérer une partie boitier dans un projet centré sur l'informatique et l'électronique, il s'est avéré que le boitier de notre Harpe nécessitait une attention particulière.&lt;br /&gt;
&lt;br /&gt;
La taille de la harpe à été un sujet de débat, et nous avons réalisé des tests afin de vérifier que des phototransistors trop proches les uns des autres n'allait pas compromettre le bon fonctionnement de la harpe dans son ensemble. En effet, si le phototransistor détectait un autre laser que celui vers lequel il pointe serait extrêmement problématique. Heureusement, il s'est avéré que les phototransistors sont très directionnels, au point que se pose désormais le problème inverse.&lt;br /&gt;
&lt;br /&gt;
Nous allons devoir faire très attention au fait que les lasers soient bien fixés et pointent exactement vers les phototransistors, car dans le cas contraire, ceux-ci ne détectent absolument pas le laser, et tout le principe de fonctionnement s'effondre. La conception et l'assemblage de la boite devront donc être relativement précis, pour éviter ces problèmes.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons dès le départ décidé d'éviter l'utilisation de diodes infra-rouges, pour leur préférer les lasers. Tout d'abord, parce que les diodes ne sont en aucun cas assez puissantes pour être détectées par les phototransistors, ce qui une fois de plus rend notre harpe inutile. Ensuite, parce qu'il nous a semblé que réaliser une harpe 'laser' sans lasers était un concept déconcertant, et enlève beaucoup de l’intérêt de ce projet.&lt;br /&gt;
&lt;br /&gt;
Un premier jet de design avait été réalisé avant cette séance, et au vu des données récoltées pendant celle-ci, nous l'avons modifié pour les prendre en compte, notamment la taille des lasers par rapport aux diodes, et la précision requise. &lt;br /&gt;
&lt;br /&gt;
'insérer photos premiers schémas ici'&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le travail a été séparé en 2 parties, une personne par partie : &lt;br /&gt;
- une première partie sur le serveur même (page web, système de streaming de son depuis la page web)&lt;br /&gt;
- une seconde partie sur la lecture du port série&lt;br /&gt;
&lt;br /&gt;
==== Partie serveur ====&lt;br /&gt;
La première séance a été consacré à deux grands axes : prendre la main à distance sur le raspberry pi et mettre en place le serveur web.&lt;br /&gt;
Afin de pouvoir contrôler et travailler facilement sur le RPi, l'outil vncserver a été installé sur le raspberry, permettant de contrôler via un interface graphique le RPi depuis un ordinateur branché sur le même réseau. Cet utilitaire permettra a l'avenir de travailler directement sur le RPi sans devoir constamment uploader par ssh le travail effectué.&lt;br /&gt;
&lt;br /&gt;
Coté mise en place du serveur web, l'utilitaire de serveur web apache2 a été installé sans soucis, et les pages d'exemples web et javascript fonctionnent. En revanche, l'utilisation du code d'exemple sur les sockets n'est pas utilisable, le paquet proposé n’existe pas et le site du paquet de socket est mort.&lt;br /&gt;
Le reste de la séance a été consacré a des recherches sur les moyens de pouvoir streamer du son, recherches non concluantes. Aucune solution n'a été trouvé sans passer par un service internet hébergé par un tier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Partie lecture port série ====&lt;br /&gt;
&lt;br /&gt;
Cette première séance fut consacrée à la sélection du langage de programmation et à sa prise en main. Il a été décidé d'utiliser Python pour écrire le programme récupérant et traitant les données récupérées à travers le port série. Python étant un langage fort usité, il possède une très large documentation. Ce fut donc facile de trouver la librairie permettant de lire les données envoyées par le port série.&lt;br /&gt;
&lt;br /&gt;
Un doute subsiste encore sur le type de données envoyé par le port série. L'idéal serait de récupérer un tableau de 8 entiers de type binaire correspondant aux états des 8 ports liés aux &amp;quot;cordes&amp;quot; laser, pour pouvoir ensuite traiter ces données facilement.&lt;br /&gt;
&lt;br /&gt;
== Séance 2 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Lors de cette séance, nous avons réalisé le premier circuit sur le FPGA. &lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un circuit simple, qui envoie en permanence l'état des huit phototransistors au port série. Les phototransistors sont alors directement reliés à celui-ci. Nous avons pu tester le bon fonctionnement du système grâce aux diodes du FPGA. Nous avons branché en parallèle sur le circuit les huit diodes, afin de vérifier qu'un signal était bien envoyé en permanence, on a pu les voir s'éteindre lorsqu'on éclairait un laser. &lt;br /&gt;
Ces diodes se sont avérées très utiles, car il n'est pas encore possible d'effectuer les tests sur le port série, car la partie informatique n'est pas encore opérationnelle, on ne peut donc pas lire directement sur le port série pour le moment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi constant ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite réalisé un montage permettant de faire l'envoi seulement sur changement d'état, comme prévu à la séance 1 Nous avons donc réalisé un système de bascules permettant de comparer l'état actuel de chaque diode avec son état précédent, puis de réaliser l'envoi seulement si une différence était observée. Comme précédemment, les diodes sont reliées directement au Port Série, mais cette fois-ci au lieu de brancher le Bit d'envoi du port Série sur un Vcc, soit un '1' logique, nous l'avons relié à la vérification de changement d'état, qui passe à '1' uniquement avec un changement d'état.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi sur changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème qui s'est alors posé était de savoir si on envoyait le signal assez longtemps pour qu'il puisse être lu. En effet on envoie un signal seulement si il y a changement d'état, et cette vérification se fait à chaque incrément d'horloge. Hors, la différence sera donc observée sur un seul incrément d'horloge, par conséquent, on n'envoie de signal que pendant ce seul incrément. Pour l'instant, nous supposons que le port série est capable de stocker les données à envoyer en un seul incrément d'horloge. &lt;br /&gt;
Cependant, si lors des tests, ça ne fonctionne pas, nous prévoyons d'utiliser un compteur pour pouvoir envoyer le signal plus longtemps au Bit d'envoi du port série, et ainsi laisser le temps au port série d'envoyer l'information.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous nous sommes focalisés sur le FPGA, mais nous avons néanmoins terminé la conception du boitier de la harpe, sous la forme de trois 'boites' crénelées, que nous avons ensuite l'intention de découper au FabLab puis d'assembler.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos des boites ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il s'est avéré que réaliser des boites crénelées rendrait tout le boitier beaucoup plus solide, et donc fiable.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le problème de l'impossibilité d'utiliser l'exemple sur les sockets a été résolu, grâce à l'intervention de M. Redon. Le problème était une différence de version de la distribution Linux entre le RPi utilisé et celle utilisé pour l'exemple. En effet, le RPi de travail est sur une distribution Wheezy, alors que la version la plus récente est la Jessie. Les chemins des dépots des sources de la librairie libwebsocket n’existant pas sur Wheezy, on ne pouvait installer la librairie directement en ligne de commande. M. Redon a ajouté le chemin de la librairie dans le gestionnaire de paquet du RPi et on a pu utiliser sans problèmes la librairie. De plus le site du paquet libwebsocket n'était inaccessible que temporairement.&lt;br /&gt;
La séance a été consacré à comprendre le fonctionnement des sockets et comment l'exemple html interagissait avec.&lt;br /&gt;
&lt;br /&gt;
La partie importante du code d'exemple est la suivante : &lt;br /&gt;
&lt;br /&gt;
 static int callback_my(&lt;br /&gt;
  struct libwebsocket_context * this,&lt;br /&gt;
  struct libwebsocket *wsi,enum libwebsocket_callback_reasons reason,&lt;br /&gt;
  void *user,void *in,size_t len)&lt;br /&gt;
 {&lt;br /&gt;
 static char *message=NULL;&lt;br /&gt;
 static int msize=0;&lt;br /&gt;
 switch(reason){&lt;br /&gt;
  case LWS_CALLBACK_ESTABLISHED:&lt;br /&gt;
    printf(&amp;quot;connection established\n&amp;quot;);&lt;br /&gt;
    message=NULL;&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_RECEIVE:&lt;br /&gt;
                // Ici sont traites les messages envoyes par le navigateur&lt;br /&gt;
    printf(&amp;quot;received data: %s\n&amp;quot;,(char *)in);&lt;br /&gt;
    message=malloc(len+LWS_SEND_BUFFER_PRE_PADDING+LWS_SEND_BUFFER_POST_PADDING);&lt;br /&gt;
    if(message==NULL){ perror(&amp;quot;callback_my.malloc&amp;quot;); exit(EXIT_FAILURE); }&lt;br /&gt;
    memcpy(message+LWS_SEND_BUFFER_PRE_PADDING,in,len);&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    msize=len;&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_SERVER_WRITEABLE:&lt;br /&gt;
                // Ici sont envoyes les messages au navigateur&lt;br /&gt;
    if(message!=NULL){&lt;br /&gt;
      char *out=message+LWS_SEND_BUFFER_PRE_PADDING;&lt;br /&gt;
      libwebsocket_write(wsi,(unsigned char *)out,msize,LWS_WRITE_TEXT);&lt;br /&gt;
      free(message);&lt;br /&gt;
      message=NULL;&lt;br /&gt;
      }&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    break;&lt;br /&gt;
  }&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une fonction de callback gérant à la fois la réception et la transmission. On peut remarquer 3 cas du switch : LWS_CALLBACK_ESTABLISHED correspondant à la création d'un lien entre la page web et le serveur websocket à la demande de la page web, LWS_CALLBACK_RECEIVE correspondant aux actions à entreprendre à la réception d'un message provenant du navigateur web, et LWS_CALLBACK_SERVER_WRITEABLE correspondant aux actions afin d'envoyer un message au navigateur.&lt;br /&gt;
&lt;br /&gt;
Coté HTML, on utilise les sockets grâce à ce code suivant :&lt;br /&gt;
 &lt;br /&gt;
 window.WebSocket=(window.WebSocket||window.MozWebSocket);&lt;br /&gt;
 var websocket=new WebSocket('ws://127.0.0.1:9000','myprotocol');&lt;br /&gt;
 websocket.onopen=function(){ $('h1').css('color','green'); };&lt;br /&gt;
 websocket.onerror=function(){ $('h1').css('color','red'); };&lt;br /&gt;
 websocket.onmessage=function(message){&lt;br /&gt;
 console.log(message.data);&lt;br /&gt;
 &amp;amp;#36('#messages').append(&amp;amp;#36('&amp;lt;p&amp;gt;',{ text: message.data }));&lt;br /&gt;
 };&lt;br /&gt;
 function sendMessage(){&lt;br /&gt;
 websocket.send(&amp;amp;#36('#message').val());&lt;br /&gt;
 &amp;amp;#36('#message').val('');&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La fonction websocket.onmessage gère le traitement à faire coté client quand le serveur envoie des informations, et la fonction sendMessage permet l'envoie d'information du client vers le serveur.&lt;br /&gt;
&lt;br /&gt;
Pour notre projet, nous avons besoin principalement, dans un premier temps, d'envoyer des informations du serveur vers le client, nous nous sommes donc concentrer à comprendre et modifier les parties du code fourni suivantes : websocket.onmessage coté client et le &amp;quot;case LWS_CALLBACK_SERVER_WRITEABLE:&amp;quot; coté serveur.&lt;br /&gt;
&lt;br /&gt;
Le but des tests était de réussir à faire jouer deux sons différents par le client, avec changement de son imposé par le serveur. HTML5 propose nativement de lire des sons à partir d'une source grâce à une balise audio :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;audio controls=&amp;quot;controls&amp;quot; id=&amp;quot;mySound&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/audio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On récupère l'identifiant de cette balise avec &lt;br /&gt;
&lt;br /&gt;
 var test1 = document.getElementById(&amp;quot;mySound&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
afin de pouvoir l'utiliser de n'importe où dans le programme.&lt;br /&gt;
On définit la source grâce à &lt;br /&gt;
&lt;br /&gt;
 test1.src=&amp;quot;sound.mp3&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
avec &amp;quot;sound.mp3&amp;quot; le chemin d'accès au fichier son par rapport à l'emplacement du fichier html sur le serveur. Ici, le fichier son sound.mp3 est dans le même dossier que la page index.html.&lt;br /&gt;
Enfin, on peut lire le son avec &lt;br /&gt;
&lt;br /&gt;
 test1.play();&lt;br /&gt;
&lt;br /&gt;
Le but du projet étant d'émettre en continue le son généré par la harpe, l'objectif ici est soit de générer un fichier de streaming que l'on lit en continue, soit de lire un fichier différent par son possible et on change la valeur de test1.src en fonction du son à lire, soit on lit toujours la même source, mais que l'on modifie à la volée en fonction du son voulu. La première option a été étudiée jusqu'en fin de séance.&lt;br /&gt;
Nous n'avons pas réussi à comprendre comment générer un fichier de streaming audio simple, de plus toutes les documentations et exemples trouvés ne concernant qu'un streaming simultanée de son et de vidéo à partir d'une caméra et d'un micro, et nous n'avons pas compris comment adapter ces exemples.&lt;br /&gt;
&lt;br /&gt;
== Séance 3 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous avons pu tester l'envoi sur changement d'état, toujours avec les diodes du FPGA.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par ajouter une horloge sur le détecteur de changement d'état, afin d'augmenter le nombre d'incréments d'horloge sur lequel il est à '1', et ce dans le but de rendre le clignotement d'un diode visible à l’œil nu.&lt;br /&gt;
Ensuite, nous avons relié la sortie du détecteur de changement d'état et des phototransistors par un 'ET' logique, que nous avons ensuite relié aux diodes du FPGA.&lt;br /&gt;
De cette façon, si l'on détecte un changement d'état sur un phototransistor, la nouvelle valeur est alors envoyée sur les diodes. Le système a fonctionné (à voir :p ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos du test avec changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite passé le reste de la séance à mettre en commun notre partie avec la partie informatique, en essayant de leur permettre de lire sur le port série du FPGA. Les essais ont pour l'instant été infructueux, mais des progrès ont été faits. &lt;br /&gt;
&lt;br /&gt;
L'objectif étant que le Raspberry Pi puisse lire les informations envoyées par le FPGA, pour ensuite les transmettre au site Web que nous allons réaliser par la suite.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Au vu des difficultés rencontrées lors de la mise en place d'un véritable système de streaming, nous avons décider d'étudier les autres options possibles.&lt;br /&gt;
Notre deuxième solution était&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 1 : Réalisation du site Web ==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé ce site web lors de notre temps libre afin de permettre la communication entre le Raspberry Pi et l'ordinateur. En effet, il était inclus dans notre projet de devoir réaliser une communication par internet. Ce site internet va donc remplir cette condition. Sur celui-ci, on pourra trouver une brève description de notre projet, un lien vers le wiki, une image exemple d'un harpe et les boutons Play et Pause qui permettent d'activer et de désactiver la harpe laser.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 2 : Réalisation du programme secondaire sur Arduino 'en cas de problèmes' ==&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis à plusieurs occasions en dehors des heures de projet afin d'avancer sur notre harpe. Nous avons donc décidé que nous devions réaliser un programme sur Arduino nous permettant de réaliser des tests de transmission par la liaison série sans avoir besoin du FPGA. Dans un premier temps, nous avons tenté d'utiliser le port USB comme liaison série. Cependant, il s'est avéré que le Raspberry pi ne pouvait pas lire son port USB, ce qui nous a donc forcé à utiliser les pins de communication série de l'Arduino. &lt;br /&gt;
Nous sommes sur un Arduino Mega 2560, nous avons a notre disposition plusieurs pins de communication série différents. Ils seront utilisés uniquement en transmission. Pour communiquer, nous allons ensuite utiliser le pin Tx1. Nous aboutissons donc au programme suivant:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Setup.PNG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Captprog.PNG]]&lt;br /&gt;
&lt;br /&gt;
La communication série de ce programme nous a causé des problèmes, surtout du fait que l'ordinateur ne recevait pas les informations transmises par l'Arduino. Nous avons donc du effectuer de multiples tests afin de voir où se situait le problème. Nous avons pu déterminer que nous avions un problème au niveau de notre pont diviseur de tension entre l'alimentation de l’Arduino et celle du Raspberry Pi, nous avons alors changé les résistances.&lt;br /&gt;
Nous avons également notamment modifié le programme afin de vérifier que l'information était bien transmise sur le Pin Série de l'Arduino, et que le problème ne venait donc pas de l'Arduino mais bien du Raspberry, qui ne transmet pas correctement l'information à l'ordinateur.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 3 : Assemblage de la boite et mise en place des composants ==&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43732</id>
		<title>Projet IMA3 P5, 2016/2017, TD1</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43732"/>
				<updated>2017-06-12T09:10:36Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : /* Partie informatique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet IMA3-SC 2016/2017 : Synt'Harpe (Sainte) Laser =&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Description du système ===&lt;br /&gt;
&lt;br /&gt;
Pour le projet Système Communicant, nous allons réaliser une harpe laser. Notre but est de créer un instrument de musique similaire à une harpe, où les cordes sont remplacées par des capteurs infra-rouges.&lt;br /&gt;
&lt;br /&gt;
Un son sera émis par l'ordinateur dès que le capteur IR captera une main et le joueur pourra avec son autre main moduler l'amplitude de la note.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on travaillera sur une gamme de son sur 8 bits. Puis, nous implémenterons une banque de sons qui nous permettra de sélectionner l'instrument désiré, d'où l'appellation Synt'Harpe.&lt;br /&gt;
&lt;br /&gt;
L'ordinateur décidera du fonctionnement ou non de la harpe. C'est aussi grâce à lui qu'on pourra choisir la banque de sons voulue.&lt;br /&gt;
&lt;br /&gt;
Toutes les banques de sons seront enregistrées sur le Raspberry.&lt;br /&gt;
Les LEDs signaleront l'emplacement des cordes.&lt;br /&gt;
&lt;br /&gt;
Pour la partie optionnelle, on remplacera les LEDs par des lasers pour un effet visuel de qualité (plus poussé). La fumée permettra de voir les lasers.&lt;br /&gt;
&lt;br /&gt;
=== Le matériel ===&lt;br /&gt;
* Un raspberry pi&lt;br /&gt;
* 8 phototransistors&lt;br /&gt;
* 8 émetteurs lasers&lt;br /&gt;
* Des résistances&lt;br /&gt;
* Une structure&lt;br /&gt;
* Carte d'acquisition de type Arduino au début puis FPGA &lt;br /&gt;
* Un ordinateur&lt;br /&gt;
* Une alimentation&lt;br /&gt;
&lt;br /&gt;
=== Optionnel (visuel) ===&lt;br /&gt;
&lt;br /&gt;
* 8 émetteurs laser&lt;br /&gt;
* Un générateur de fumée&lt;br /&gt;
* Une caméra&lt;br /&gt;
&lt;br /&gt;
== Séance 1 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Le but de cette première séance était de se répartir les tâches, de tester le matériel mit à disposition et de découvrir le fonctionnement du FPGA.&lt;br /&gt;
&lt;br /&gt;
Le principe de fonctionnement de la harpe est le suivant:&lt;br /&gt;
Chaque capteur sera situé en face d'un laser. Les capteurs seront dans la partie haute de la harpe afin de limiter les interférences dues à d'autres sources lumineuses. Chaque laser pointera vers un capteur. &lt;br /&gt;
&lt;br /&gt;
 * Ajout du dessin de la harpe * &lt;br /&gt;
&lt;br /&gt;
Les capteurs enverront tous par défaut la même valeur au FPGA. Quand l'utilisateur passera sa main dans la harpe, un faisceau laser sera coupé. Le capteur n'enverra plus sa valeur seuil au FPGA, il aura donc changé d'état.&lt;br /&gt;
Dès lors que le FPGA détectera un changement d'état, il enverra l'état dans lequel se trouvent les 8 capteurs au Raspberry. &lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé des tests sur les phototransistors et les lasers. Nous avons mis en parallèle un laser et deux capteurs, sans oublier leur résistance de 1.2k Ohms chacune. &lt;br /&gt;
&lt;br /&gt;
Nous avons vu que à luminosité ambiante, quand le laser pointe sur le capteur, celui-ci envoie à l'Arduino une valeur de 950 environ. Ensuite, quand le faisceau laser est coupé, la valeur envoyée par le phototransistor monte à 1020.&lt;br /&gt;
Puis, nous avons réitéré l'expérience en mettant le système dans une boîte. Cette fois, le valeur est passée de 840 quand le capteur est éclairé par le laser à 900 quand le faisceau est coupé.&lt;br /&gt;
Nous en avons déduit que nous allons devoir refaire l'expérience une fois la harpe assemblée.&lt;br /&gt;
&lt;br /&gt;
Les lasers étant très directionnels tout comme les phototransistors, nous n'aurons pas de soucis d'interférences. Un capteur détectera uniquement le laser situé directement en face de lui et non ceux de son voisinage.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Même si il peut paraitre futile d'insérer une partie boitier dans un projet centré sur l'informatique et l'électronique, il s'est avéré que le boitier de notre Harpe nécessitait une attention particulière.&lt;br /&gt;
&lt;br /&gt;
La taille de la harpe à été un sujet de débat, et nous avons réalisé des tests afin de vérifier que des phototransistors trop proches les uns des autres n'allait pas compromettre le bon fonctionnement de la harpe dans son ensemble. En effet, si le phototransistor détectait un autre laser que celui vers lequel il pointe serait extrêmement problématique. Heureusement, il s'est avéré que les phototransistors sont très directionnels, au point que se pose désormais le problème inverse.&lt;br /&gt;
&lt;br /&gt;
Nous allons devoir faire très attention au fait que les lasers soient bien fixés et pointent exactement vers les phototransistors, car dans le cas contraire, ceux-ci ne détectent absolument pas le laser, et tout le principe de fonctionnement s'effondre. La conception et l'assemblage de la boite devront donc être relativement précis, pour éviter ces problèmes.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons dès le départ décidé d'éviter l'utilisation de diodes infra-rouges, pour leur préférer les lasers. Tout d'abord, parce que les diodes ne sont en aucun cas assez puissantes pour être détectées par les phototransistors, ce qui une fois de plus rend notre harpe inutile. Ensuite, parce qu'il nous a semblé que réaliser une harpe 'laser' sans lasers était un concept déconcertant, et enlève beaucoup de l’intérêt de ce projet.&lt;br /&gt;
&lt;br /&gt;
Un premier jet de design avait été réalisé avant cette séance, et au vu des données récoltées pendant celle-ci, nous l'avons modifié pour les prendre en compte, notamment la taille des lasers par rapport aux diodes, et la précision requise. &lt;br /&gt;
&lt;br /&gt;
'insérer photos premiers schémas ici'&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le travail a été séparé en 2 parties, une personne par partie : &lt;br /&gt;
- une première partie sur le serveur même (page web, système de streaming de son depuis la page web)&lt;br /&gt;
- une seconde partie sur la lecture du port série&lt;br /&gt;
&lt;br /&gt;
==== Partie serveur ====&lt;br /&gt;
La première séance a été consacré à deux grands axes : prendre la main à distance sur le raspberry pi et mettre en place le serveur web.&lt;br /&gt;
Afin de pouvoir contrôler et travailler facilement sur le RPi, l'outil vncserver a été installé sur le raspberry, permettant de contrôler via un interface graphique le RPi depuis un ordinateur branché sur le même réseau. Cet utilitaire permettra a l'avenir de travailler directement sur le RPi sans devoir constamment uploader par ssh le travail effectué.&lt;br /&gt;
&lt;br /&gt;
Coté mise en place du serveur web, l'utilitaire de serveur web apache2 a été installé sans soucis, et les pages d'exemples web et javascript fonctionnent. En revanche, l'utilisation du code d'exemple sur les sockets n'est pas utilisable, le paquet proposé n’existe pas et le site du paquet de socket est mort.&lt;br /&gt;
Le reste de la séance a été consacré a des recherches sur les moyens de pouvoir streamer du son, recherches non concluantes. Aucune solution n'a été trouvé sans passer par un service internet hébergé par un tier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Partie lecture port série ====&lt;br /&gt;
&lt;br /&gt;
Cette première séance fut consacrée à la sélection du langage de programmation et à sa prise en main. Il a été décidé d'utiliser Python pour écrire le programme récupérant et traitant les données récupérées à travers le port série. Python étant un langage fort usité, il possède une très large documentation. Ce fut donc facile de trouver la librairie permettant de lire les données envoyées par le port série.&lt;br /&gt;
&lt;br /&gt;
Un doute subsiste encore sur le type de données envoyé par le port série. L'idéal serait de récupérer un tableau de 8 entiers de type binaire correspondant aux états des 8 ports liés aux &amp;quot;cordes&amp;quot; laser, pour pouvoir ensuite traiter ces données facilement.&lt;br /&gt;
&lt;br /&gt;
== Séance 2 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Lors de cette séance, nous avons réalisé le premier circuit sur le FPGA. &lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un circuit simple, qui envoie en permanence l'état des huit phototransistors au port série. Les phototransistors sont alors directement reliés à celui-ci. Nous avons pu tester le bon fonctionnement du système grâce aux diodes du FPGA. Nous avons branché en parallèle sur le circuit les huit diodes, afin de vérifier qu'un signal était bien envoyé en permanence, on a pu les voir s'éteindre lorsqu'on éclairait un laser. &lt;br /&gt;
Ces diodes se sont avérées très utiles, car il n'est pas encore possible d'effectuer les tests sur le port série, car la partie informatique n'est pas encore opérationnelle, on ne peut donc pas lire directement sur le port série pour le moment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi constant ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite réalisé un montage permettant de faire l'envoi seulement sur changement d'état, comme prévu à la séance 1 Nous avons donc réalisé un système de bascules permettant de comparer l'état actuel de chaque diode avec son état précédent, puis de réaliser l'envoi seulement si une différence était observée. Comme précédemment, les diodes sont reliées directement au Port Série, mais cette fois-ci au lieu de brancher le Bit d'envoi du port Série sur un Vcc, soit un '1' logique, nous l'avons relié à la vérification de changement d'état, qui passe à '1' uniquement avec un changement d'état.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi sur changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème qui s'est alors posé était de savoir si on envoyait le signal assez longtemps pour qu'il puisse être lu. En effet on envoie un signal seulement si il y a changement d'état, et cette vérification se fait à chaque incrément d'horloge. Hors, la différence sera donc observée sur un seul incrément d'horloge, par conséquent, on n'envoie de signal que pendant ce seul incrément. Pour l'instant, nous supposons que le port série est capable de stocker les données à envoyer en un seul incrément d'horloge. &lt;br /&gt;
Cependant, si lors des tests, ça ne fonctionne pas, nous prévoyons d'utiliser un compteur pour pouvoir envoyer le signal plus longtemps au Bit d'envoi du port série, et ainsi laisser le temps au port série d'envoyer l'information.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous nous sommes focalisés sur le FPGA, mais nous avons néanmoins terminé la conception du boitier de la harpe, sous la forme de trois 'boites' crénelées, que nous avons ensuite l'intention de découper au FabLab puis d'assembler.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos des boites ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il s'est avéré que réaliser des boites crénelées rendrait tout le boitier beaucoup plus solide, et donc fiable.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le problème de l'impossibilité d'utiliser l'exemple sur les sockets a été résolu, grâce à l'intervention de M. Redon. Le problème était une différence de version de la distribution Linux entre le RPi utilisé et celle utilisé pour l'exemple. En effet, le RPi de travail est sur une distribution Wheezy, alors que la version la plus récente est la Jessie. Les chemins des dépots des sources de la librairie libwebsocket n’existant pas sur Wheezy, on ne pouvait installer la librairie directement en ligne de commande. M. Redon a ajouté le chemin de la librairie dans le gestionnaire de paquet du RPi et on a pu utiliser sans problèmes la librairie. De plus le site du paquet libwebsocket n'était inaccessible que temporairement.&lt;br /&gt;
La séance a été consacré à comprendre le fonctionnement des sockets et comment l'exemple html interagissait avec.&lt;br /&gt;
&lt;br /&gt;
La partie importante du code d'exemple est la suivante : &lt;br /&gt;
&lt;br /&gt;
 static int callback_my(&lt;br /&gt;
  struct libwebsocket_context * this,&lt;br /&gt;
  struct libwebsocket *wsi,enum libwebsocket_callback_reasons reason,&lt;br /&gt;
  void *user,void *in,size_t len)&lt;br /&gt;
 {&lt;br /&gt;
 static char *message=NULL;&lt;br /&gt;
 static int msize=0;&lt;br /&gt;
 switch(reason){&lt;br /&gt;
  case LWS_CALLBACK_ESTABLISHED:&lt;br /&gt;
    printf(&amp;quot;connection established\n&amp;quot;);&lt;br /&gt;
    message=NULL;&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_RECEIVE:&lt;br /&gt;
                // Ici sont traites les messages envoyes par le navigateur&lt;br /&gt;
    printf(&amp;quot;received data: %s\n&amp;quot;,(char *)in);&lt;br /&gt;
    message=malloc(len+LWS_SEND_BUFFER_PRE_PADDING+LWS_SEND_BUFFER_POST_PADDING);&lt;br /&gt;
    if(message==NULL){ perror(&amp;quot;callback_my.malloc&amp;quot;); exit(EXIT_FAILURE); }&lt;br /&gt;
    memcpy(message+LWS_SEND_BUFFER_PRE_PADDING,in,len);&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    msize=len;&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_SERVER_WRITEABLE:&lt;br /&gt;
                // Ici sont envoyes les messages au navigateur&lt;br /&gt;
    if(message!=NULL){&lt;br /&gt;
      char *out=message+LWS_SEND_BUFFER_PRE_PADDING;&lt;br /&gt;
      libwebsocket_write(wsi,(unsigned char *)out,msize,LWS_WRITE_TEXT);&lt;br /&gt;
      free(message);&lt;br /&gt;
      message=NULL;&lt;br /&gt;
      }&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    break;&lt;br /&gt;
  }&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une fonction de callback gérant à la fois la réception et la transmission. On peut remarquer 3 cas du switch : LWS_CALLBACK_ESTABLISHED correspondant à la création d'un lien entre la page web et le serveur websocket à la demande de la page web, LWS_CALLBACK_RECEIVE correspondant aux actions à entreprendre à la réception d'un message provenant du navigateur web, et LWS_CALLBACK_SERVER_WRITEABLE correspondant aux actions afin d'envoyer un message au navigateur.&lt;br /&gt;
&lt;br /&gt;
Coté HTML, on utilise les sockets grâce à ce code suivant :&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;blockquote&amp;gt;window.WebSocket=(window.WebSocket||window.MozWebSocket);&lt;br /&gt;
 var websocket=new WebSocket('ws://127.0.0.1:9000','myprotocol');&lt;br /&gt;
 websocket.onopen=function(){ $('h1').css('color','green'); };&lt;br /&gt;
 websocket.onerror=function(){ $('h1').css('color','red'); };&lt;br /&gt;
 websocket.onmessage=function(message){&lt;br /&gt;
 console.log(message.data);&lt;br /&gt;
 $('#messages').append($('&amp;lt;p&amp;gt;',{ text: message.data }));&lt;br /&gt;
 };&lt;br /&gt;
 function sendMessage(){&lt;br /&gt;
 websocket.send($('#message').val());&lt;br /&gt;
 $('#message').val('');&lt;br /&gt;
 }&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La fonction websocket.onmessage gère le traitement à faire coté client quand le serveur envoie des informations, et la fonction sendMessage permet l'envoie d'information du client vers le serveur.&lt;br /&gt;
&lt;br /&gt;
Pour notre projet, nous avons besoin principalement, dans un premier temps, d'envoyer des informations du serveur vers le client, nous nous sommes donc concentrer à comprendre et modifier les parties du code fourni suivantes : websocket.onmessage coté client et le &amp;quot;case LWS_CALLBACK_SERVER_WRITEABLE:&amp;quot; coté serveur.&lt;br /&gt;
&lt;br /&gt;
Le but des tests était de réussir à faire jouer deux sons différents par le client, avec changement de son imposé par le serveur. HTML5 propose nativement de lire des sons à partir d'une source grâce à une balise audio :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;audio controls=&amp;quot;controls&amp;quot; id=&amp;quot;mySound&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/audio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On récupère l'identifiant de cette balise avec &lt;br /&gt;
&lt;br /&gt;
 var test1 = document.getElementById(&amp;quot;mySound&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
afin de pouvoir l'utiliser de n'importe où dans le programme.&lt;br /&gt;
On définit la source grâce à &lt;br /&gt;
&lt;br /&gt;
 test1.src=&amp;quot;sound.mp3&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
avec &amp;quot;sound.mp3&amp;quot; le chemin d'accès au fichier son par rapport à l'emplacement du fichier html sur le serveur. Ici, le fichier son sound.mp3 est dans le même dossier que la page index.html.&lt;br /&gt;
Enfin, on peut lire le son avec &lt;br /&gt;
&lt;br /&gt;
 test1.play();&lt;br /&gt;
&lt;br /&gt;
Le but du projet étant d'émettre en continue le son généré par la harpe, l'objectif ici est soit de générer un fichier de streaming que l'on lit en continue, soit de lire un fichier différent par son possible et on change la valeur de test1.src en fonction du son à lire, soit on lit toujours la même source, mais que l'on modifie à la volée en fonction du son voulu. La première option a été étudiée jusqu'en fin de séance.&lt;br /&gt;
Nous n'avons pas réussi à comprendre comment générer un fichier de streaming audio simple, de plus toutes les documentations et exemples trouvés ne concernant qu'un streaming simultanée de son et de vidéo à partir d'une caméra et d'un micro, et nous n'avons pas compris comment adapter ces exemples.&lt;br /&gt;
&lt;br /&gt;
== Séance 3 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous avons pu tester l'envoi sur changement d'état, toujours avec les diodes du FPGA.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par ajouter une horloge sur le détecteur de changement d'état, afin d'augmenter le nombre d'incréments d'horloge sur lequel il est à '1', et ce dans le but de rendre le clignotement d'un diode visible à l’œil nu.&lt;br /&gt;
Ensuite, nous avons relié la sortie du détecteur de changement d'état et des phototransistors par un 'ET' logique, que nous avons ensuite relié aux diodes du FPGA.&lt;br /&gt;
De cette façon, si l'on détecte un changement d'état sur un phototransistor, la nouvelle valeur est alors envoyée sur les diodes. Le système a fonctionné (à voir :p ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos du test avec changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite passé le reste de la séance à mettre en commun notre partie avec la partie informatique, en essayant de leur permettre de lire sur le port série du FPGA. Les essais ont pour l'instant été infructueux, mais des progrès ont été faits. &lt;br /&gt;
&lt;br /&gt;
L'objectif étant que le Raspberry Pi puisse lire les informations envoyées par le FPGA, pour ensuite les transmettre au site Web que nous allons réaliser par la suite.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Au vu des difficultés rencontrées lors de la mise en place d'un véritable système de streaming, nous avons décider d'étudier les autres options possibles.&lt;br /&gt;
Notre deuxième solution était&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 1 : Réalisation du site Web ==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé ce site web lors de notre temps libre afin de permettre la communication entre le Raspberry Pi et l'ordinateur. En effet, il était inclus dans notre projet de devoir réaliser une communication par internet. Ce site internet va donc remplir cette condition. Sur celui-ci, on pourra trouver une brève description de notre projet, un lien vers le wiki, une image exemple d'un harpe et les boutons Play et Pause qui permettent d'activer et de désactiver la harpe laser.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 2 : Réalisation du programme secondaire sur Arduino 'en cas de problèmes' ==&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis à plusieurs occasions en dehors des heures de projet afin d'avancer sur notre harpe. Nous avons donc décidé que nous devions réaliser un programme sur Arduino nous permettant de réaliser des tests de transmission par la liaison série sans avoir besoin du FPGA. Dans un premier temps, nous avons tenté d'utiliser le port USB comme liaison série. Cependant, il s'est avéré que le Raspberry pi ne pouvait pas lire son port USB, ce qui nous a donc forcé à utiliser les pins de communication série de l'Arduino. &lt;br /&gt;
Nous sommes sur un Arduino Mega 2560, nous avons a notre disposition plusieurs pins de communication série différents. Ils seront utilisés uniquement en transmission. Pour communiquer, nous allons ensuite utiliser le pin Tx1. Nous aboutissons donc au programme suivant:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Setup.PNG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Captprog.PNG]]&lt;br /&gt;
&lt;br /&gt;
La communication série de ce programme nous a causé des problèmes, surtout du fait que l'ordinateur ne recevait pas les informations transmises par l'Arduino. Nous avons donc du effectuer de multiples tests afin de voir où se situait le problème. Nous avons pu déterminer que nous avions un problème au niveau de notre pont diviseur de tension entre l'alimentation de l’Arduino et celle du Raspberry Pi, nous avons alors changé les résistances.&lt;br /&gt;
Nous avons également notamment modifié le programme afin de vérifier que l'information était bien transmise sur le Pin Série de l'Arduino, et que le problème ne venait donc pas de l'Arduino mais bien du Raspberry, qui ne transmet pas correctement l'information à l'ordinateur.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 3 : Assemblage de la boite et mise en place des composants ==&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43728</id>
		<title>Projet IMA3 P5, 2016/2017, TD1</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43728"/>
				<updated>2017-06-12T09:09:23Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : /* Partie informatique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet IMA3-SC 2016/2017 : Synt'Harpe (Sainte) Laser =&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Description du système ===&lt;br /&gt;
&lt;br /&gt;
Pour le projet Système Communicant, nous allons réaliser une harpe laser. Notre but est de créer un instrument de musique similaire à une harpe, où les cordes sont remplacées par des capteurs infra-rouges.&lt;br /&gt;
&lt;br /&gt;
Un son sera émis par l'ordinateur dès que le capteur IR captera une main et le joueur pourra avec son autre main moduler l'amplitude de la note.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on travaillera sur une gamme de son sur 8 bits. Puis, nous implémenterons une banque de sons qui nous permettra de sélectionner l'instrument désiré, d'où l'appellation Synt'Harpe.&lt;br /&gt;
&lt;br /&gt;
L'ordinateur décidera du fonctionnement ou non de la harpe. C'est aussi grâce à lui qu'on pourra choisir la banque de sons voulue.&lt;br /&gt;
&lt;br /&gt;
Toutes les banques de sons seront enregistrées sur le Raspberry.&lt;br /&gt;
Les LEDs signaleront l'emplacement des cordes.&lt;br /&gt;
&lt;br /&gt;
Pour la partie optionnelle, on remplacera les LEDs par des lasers pour un effet visuel de qualité (plus poussé). La fumée permettra de voir les lasers.&lt;br /&gt;
&lt;br /&gt;
=== Le matériel ===&lt;br /&gt;
* Un raspberry pi&lt;br /&gt;
* 8 phototransistors&lt;br /&gt;
* 8 émetteurs lasers&lt;br /&gt;
* Des résistances&lt;br /&gt;
* Une structure&lt;br /&gt;
* Carte d'acquisition de type Arduino au début puis FPGA &lt;br /&gt;
* Un ordinateur&lt;br /&gt;
* Une alimentation&lt;br /&gt;
&lt;br /&gt;
=== Optionnel (visuel) ===&lt;br /&gt;
&lt;br /&gt;
* 8 émetteurs laser&lt;br /&gt;
* Un générateur de fumée&lt;br /&gt;
* Une caméra&lt;br /&gt;
&lt;br /&gt;
== Séance 1 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Le but de cette première séance était de se répartir les tâches, de tester le matériel mit à disposition et de découvrir le fonctionnement du FPGA.&lt;br /&gt;
&lt;br /&gt;
Le principe de fonctionnement de la harpe est le suivant:&lt;br /&gt;
Chaque capteur sera situé en face d'un laser. Les capteurs seront dans la partie haute de la harpe afin de limiter les interférences dues à d'autres sources lumineuses. Chaque laser pointera vers un capteur. &lt;br /&gt;
&lt;br /&gt;
 * Ajout du dessin de la harpe * &lt;br /&gt;
&lt;br /&gt;
Les capteurs enverront tous par défaut la même valeur au FPGA. Quand l'utilisateur passera sa main dans la harpe, un faisceau laser sera coupé. Le capteur n'enverra plus sa valeur seuil au FPGA, il aura donc changé d'état.&lt;br /&gt;
Dès lors que le FPGA détectera un changement d'état, il enverra l'état dans lequel se trouvent les 8 capteurs au Raspberry. &lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé des tests sur les phototransistors et les lasers. Nous avons mis en parallèle un laser et deux capteurs, sans oublier leur résistance de 1.2k Ohms chacune. &lt;br /&gt;
&lt;br /&gt;
Nous avons vu que à luminosité ambiante, quand le laser pointe sur le capteur, celui-ci envoie à l'Arduino une valeur de 950 environ. Ensuite, quand le faisceau laser est coupé, la valeur envoyée par le phototransistor monte à 1020.&lt;br /&gt;
Puis, nous avons réitéré l'expérience en mettant le système dans une boîte. Cette fois, le valeur est passée de 840 quand le capteur est éclairé par le laser à 900 quand le faisceau est coupé.&lt;br /&gt;
Nous en avons déduit que nous allons devoir refaire l'expérience une fois la harpe assemblée.&lt;br /&gt;
&lt;br /&gt;
Les lasers étant très directionnels tout comme les phototransistors, nous n'aurons pas de soucis d'interférences. Un capteur détectera uniquement le laser situé directement en face de lui et non ceux de son voisinage.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Même si il peut paraitre futile d'insérer une partie boitier dans un projet centré sur l'informatique et l'électronique, il s'est avéré que le boitier de notre Harpe nécessitait une attention particulière.&lt;br /&gt;
&lt;br /&gt;
La taille de la harpe à été un sujet de débat, et nous avons réalisé des tests afin de vérifier que des phototransistors trop proches les uns des autres n'allait pas compromettre le bon fonctionnement de la harpe dans son ensemble. En effet, si le phototransistor détectait un autre laser que celui vers lequel il pointe serait extrêmement problématique. Heureusement, il s'est avéré que les phototransistors sont très directionnels, au point que se pose désormais le problème inverse.&lt;br /&gt;
&lt;br /&gt;
Nous allons devoir faire très attention au fait que les lasers soient bien fixés et pointent exactement vers les phototransistors, car dans le cas contraire, ceux-ci ne détectent absolument pas le laser, et tout le principe de fonctionnement s'effondre. La conception et l'assemblage de la boite devront donc être relativement précis, pour éviter ces problèmes.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons dès le départ décidé d'éviter l'utilisation de diodes infra-rouges, pour leur préférer les lasers. Tout d'abord, parce que les diodes ne sont en aucun cas assez puissantes pour être détectées par les phototransistors, ce qui une fois de plus rend notre harpe inutile. Ensuite, parce qu'il nous a semblé que réaliser une harpe 'laser' sans lasers était un concept déconcertant, et enlève beaucoup de l’intérêt de ce projet.&lt;br /&gt;
&lt;br /&gt;
Un premier jet de design avait été réalisé avant cette séance, et au vu des données récoltées pendant celle-ci, nous l'avons modifié pour les prendre en compte, notamment la taille des lasers par rapport aux diodes, et la précision requise. &lt;br /&gt;
&lt;br /&gt;
'insérer photos premiers schémas ici'&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le travail a été séparé en 2 parties, une personne par partie : &lt;br /&gt;
- une première partie sur le serveur même (page web, système de streaming de son depuis la page web)&lt;br /&gt;
- une seconde partie sur la lecture du port série&lt;br /&gt;
&lt;br /&gt;
==== Partie serveur ====&lt;br /&gt;
La première séance a été consacré à deux grands axes : prendre la main à distance sur le raspberry pi et mettre en place le serveur web.&lt;br /&gt;
Afin de pouvoir contrôler et travailler facilement sur le RPi, l'outil vncserver a été installé sur le raspberry, permettant de contrôler via un interface graphique le RPi depuis un ordinateur branché sur le même réseau. Cet utilitaire permettra a l'avenir de travailler directement sur le RPi sans devoir constamment uploader par ssh le travail effectué.&lt;br /&gt;
&lt;br /&gt;
Coté mise en place du serveur web, l'utilitaire de serveur web apache2 a été installé sans soucis, et les pages d'exemples web et javascript fonctionnent. En revanche, l'utilisation du code d'exemple sur les sockets n'est pas utilisable, le paquet proposé n’existe pas et le site du paquet de socket est mort.&lt;br /&gt;
Le reste de la séance a été consacré a des recherches sur les moyens de pouvoir streamer du son, recherches non concluantes. Aucune solution n'a été trouvé sans passer par un service internet hébergé par un tier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Partie lecture port série ====&lt;br /&gt;
&lt;br /&gt;
Cette première séance fut consacrée à la sélection du langage de programmation et à sa prise en main. Il a été décidé d'utiliser Python pour écrire le programme récupérant et traitant les données récupérées à travers le port série. Python étant un langage fort usité, il possède une très large documentation. Ce fut donc facile de trouver la librairie permettant de lire les données envoyées par le port série.&lt;br /&gt;
&lt;br /&gt;
Un doute subsiste encore sur le type de données envoyé par le port série. L'idéal serait de récupérer un tableau de 8 entiers de type binaire correspondant aux états des 8 ports liés aux &amp;quot;cordes&amp;quot; laser, pour pouvoir ensuite traiter ces données facilement.&lt;br /&gt;
&lt;br /&gt;
== Séance 2 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Lors de cette séance, nous avons réalisé le premier circuit sur le FPGA. &lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un circuit simple, qui envoie en permanence l'état des huit phototransistors au port série. Les phototransistors sont alors directement reliés à celui-ci. Nous avons pu tester le bon fonctionnement du système grâce aux diodes du FPGA. Nous avons branché en parallèle sur le circuit les huit diodes, afin de vérifier qu'un signal était bien envoyé en permanence, on a pu les voir s'éteindre lorsqu'on éclairait un laser. &lt;br /&gt;
Ces diodes se sont avérées très utiles, car il n'est pas encore possible d'effectuer les tests sur le port série, car la partie informatique n'est pas encore opérationnelle, on ne peut donc pas lire directement sur le port série pour le moment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi constant ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite réalisé un montage permettant de faire l'envoi seulement sur changement d'état, comme prévu à la séance 1 Nous avons donc réalisé un système de bascules permettant de comparer l'état actuel de chaque diode avec son état précédent, puis de réaliser l'envoi seulement si une différence était observée. Comme précédemment, les diodes sont reliées directement au Port Série, mais cette fois-ci au lieu de brancher le Bit d'envoi du port Série sur un Vcc, soit un '1' logique, nous l'avons relié à la vérification de changement d'état, qui passe à '1' uniquement avec un changement d'état.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi sur changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème qui s'est alors posé était de savoir si on envoyait le signal assez longtemps pour qu'il puisse être lu. En effet on envoie un signal seulement si il y a changement d'état, et cette vérification se fait à chaque incrément d'horloge. Hors, la différence sera donc observée sur un seul incrément d'horloge, par conséquent, on n'envoie de signal que pendant ce seul incrément. Pour l'instant, nous supposons que le port série est capable de stocker les données à envoyer en un seul incrément d'horloge. &lt;br /&gt;
Cependant, si lors des tests, ça ne fonctionne pas, nous prévoyons d'utiliser un compteur pour pouvoir envoyer le signal plus longtemps au Bit d'envoi du port série, et ainsi laisser le temps au port série d'envoyer l'information.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous nous sommes focalisés sur le FPGA, mais nous avons néanmoins terminé la conception du boitier de la harpe, sous la forme de trois 'boites' crénelées, que nous avons ensuite l'intention de découper au FabLab puis d'assembler.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos des boites ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il s'est avéré que réaliser des boites crénelées rendrait tout le boitier beaucoup plus solide, et donc fiable.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le problème de l'impossibilité d'utiliser l'exemple sur les sockets a été résolu, grâce à l'intervention de M. Redon. Le problème était une différence de version de la distribution Linux entre le RPi utilisé et celle utilisé pour l'exemple. En effet, le RPi de travail est sur une distribution Wheezy, alors que la version la plus récente est la Jessie. Les chemins des dépots des sources de la librairie libwebsocket n’existant pas sur Wheezy, on ne pouvait installer la librairie directement en ligne de commande. M. Redon a ajouté le chemin de la librairie dans le gestionnaire de paquet du RPi et on a pu utiliser sans problèmes la librairie. De plus le site du paquet libwebsocket n'était inaccessible que temporairement.&lt;br /&gt;
La séance a été consacré à comprendre le fonctionnement des sockets et comment l'exemple html interagissait avec.&lt;br /&gt;
&lt;br /&gt;
La partie importante du code d'exemple est la suivante : &lt;br /&gt;
&lt;br /&gt;
 static int callback_my(&lt;br /&gt;
  struct libwebsocket_context * this,&lt;br /&gt;
  struct libwebsocket *wsi,enum libwebsocket_callback_reasons reason,&lt;br /&gt;
  void *user,void *in,size_t len)&lt;br /&gt;
 {&lt;br /&gt;
 static char *message=NULL;&lt;br /&gt;
 static int msize=0;&lt;br /&gt;
 switch(reason){&lt;br /&gt;
  case LWS_CALLBACK_ESTABLISHED:&lt;br /&gt;
    printf(&amp;quot;connection established\n&amp;quot;);&lt;br /&gt;
    message=NULL;&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_RECEIVE:&lt;br /&gt;
                // Ici sont traites les messages envoyes par le navigateur&lt;br /&gt;
    printf(&amp;quot;received data: %s\n&amp;quot;,(char *)in);&lt;br /&gt;
    message=malloc(len+LWS_SEND_BUFFER_PRE_PADDING+LWS_SEND_BUFFER_POST_PADDING);&lt;br /&gt;
    if(message==NULL){ perror(&amp;quot;callback_my.malloc&amp;quot;); exit(EXIT_FAILURE); }&lt;br /&gt;
    memcpy(message+LWS_SEND_BUFFER_PRE_PADDING,in,len);&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    msize=len;&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_SERVER_WRITEABLE:&lt;br /&gt;
                // Ici sont envoyes les messages au navigateur&lt;br /&gt;
    if(message!=NULL){&lt;br /&gt;
      char *out=message+LWS_SEND_BUFFER_PRE_PADDING;&lt;br /&gt;
      libwebsocket_write(wsi,(unsigned char *)out,msize,LWS_WRITE_TEXT);&lt;br /&gt;
      free(message);&lt;br /&gt;
      message=NULL;&lt;br /&gt;
      }&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    break;&lt;br /&gt;
  }&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une fonction de callback gérant à la fois la réception et la transmission. On peut remarquer 3 cas du switch : LWS_CALLBACK_ESTABLISHED correspondant à la création d'un lien entre la page web et le serveur websocket à la demande de la page web, LWS_CALLBACK_RECEIVE correspondant aux actions à entreprendre à la réception d'un message provenant du navigateur web, et LWS_CALLBACK_SERVER_WRITEABLE correspondant aux actions afin d'envoyer un message au navigateur.&lt;br /&gt;
&lt;br /&gt;
Coté HTML, on utilise les sockets grâce à ce code suivant :&lt;br /&gt;
 &lt;br /&gt;
 window.WebSocket=(window.WebSocket||window.MozWebSocket);&lt;br /&gt;
 var websocket=new WebSocket('ws://127.0.0.1:9000','myprotocol');&lt;br /&gt;
 websocket.onopen=function(){ $('h1').css('color','green'); };&lt;br /&gt;
 websocket.onerror=function(){ $('h1').css('color','red'); };&lt;br /&gt;
 websocket.onmessage=function(message){&lt;br /&gt;
 console.log(message.data);&lt;br /&gt;
 $('#messages').append($('&amp;lt;p&amp;gt;',{ text: message.data }));&lt;br /&gt;
 };&lt;br /&gt;
 function sendMessage(){&lt;br /&gt;
 websocket.send($('#message').val());&lt;br /&gt;
 $('#message').val('');&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La fonction websocket.onmessage gère le traitement à faire coté client quand le serveur envoie des informations, et la fonction sendMessage permet l'envoie d'information du client vers le serveur.&lt;br /&gt;
&lt;br /&gt;
Pour notre projet, nous avons besoin principalement, dans un premier temps, d'envoyer des informations du serveur vers le client, nous nous sommes donc concentrer à comprendre et modifier les parties du code fourni suivantes : websocket.onmessage coté client et le &amp;quot;case LWS_CALLBACK_SERVER_WRITEABLE:&amp;quot; coté serveur.&lt;br /&gt;
&lt;br /&gt;
Le but des tests était de réussir à faire jouer deux sons différents par le client, avec changement de son imposé par le serveur. HTML5 propose nativement de lire des sons à partir d'une source grâce à une balise audio :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;audio controls=&amp;quot;controls&amp;quot; id=&amp;quot;mySound&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/audio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On récupère l'identifiant de cette balise avec &lt;br /&gt;
&lt;br /&gt;
 var test1 = document.getElementById(&amp;quot;mySound&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
afin de pouvoir l'utiliser de n'importe où dans le programme.&lt;br /&gt;
On définit la source grâce à &lt;br /&gt;
&lt;br /&gt;
 test1.src=&amp;quot;sound.mp3&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
avec &amp;quot;sound.mp3&amp;quot; le chemin d'accès au fichier son par rapport à l'emplacement du fichier html sur le serveur. Ici, le fichier son sound.mp3 est dans le même dossier que la page index.html.&lt;br /&gt;
Enfin, on peut lire le son avec &lt;br /&gt;
&lt;br /&gt;
 test1.play();&lt;br /&gt;
&lt;br /&gt;
Le but du projet étant d'émettre en continue le son généré par la harpe, l'objectif ici est soit de générer un fichier de streaming que l'on lit en continue, soit de lire un fichier différent par son possible et on change la valeur de test1.src en fonction du son à lire, soit on lit toujours la même source, mais que l'on modifie à la volée en fonction du son voulu. La première option a été étudiée jusqu'en fin de séance.&lt;br /&gt;
Nous n'avons pas réussi à comprendre comment générer un fichier de streaming audio simple, de plus toutes les documentations et exemples trouvés ne concernant qu'un streaming simultanée de son et de vidéo à partir d'une caméra et d'un micro, et nous n'avons pas compris comment adapter ces exemples.&lt;br /&gt;
&lt;br /&gt;
== Séance 3 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous avons pu tester l'envoi sur changement d'état, toujours avec les diodes du FPGA.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par ajouter une horloge sur le détecteur de changement d'état, afin d'augmenter le nombre d'incréments d'horloge sur lequel il est à '1', et ce dans le but de rendre le clignotement d'un diode visible à l’œil nu.&lt;br /&gt;
Ensuite, nous avons relié la sortie du détecteur de changement d'état et des phototransistors par un 'ET' logique, que nous avons ensuite relié aux diodes du FPGA.&lt;br /&gt;
De cette façon, si l'on détecte un changement d'état sur un phototransistor, la nouvelle valeur est alors envoyée sur les diodes. Le système a fonctionné (à voir :p ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos du test avec changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite passé le reste de la séance à mettre en commun notre partie avec la partie informatique, en essayant de leur permettre de lire sur le port série du FPGA. Les essais ont pour l'instant été infructueux, mais des progrès ont été faits. &lt;br /&gt;
&lt;br /&gt;
L'objectif étant que le Raspberry Pi puisse lire les informations envoyées par le FPGA, pour ensuite les transmettre au site Web que nous allons réaliser par la suite.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Au vu des difficultés rencontrées lors de la mise en place d'un véritable système de streaming, nous avons décider d'étudier les autres options possibles.&lt;br /&gt;
Notre deuxième solution était&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 1 : Réalisation du site Web ==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé ce site web lors de notre temps libre afin de permettre la communication entre le Raspberry Pi et l'ordinateur. En effet, il était inclus dans notre projet de devoir réaliser une communication par internet. Ce site internet va donc remplir cette condition. Sur celui-ci, on pourra trouver une brève description de notre projet, un lien vers le wiki, une image exemple d'un harpe et les boutons Play et Pause qui permettent d'activer et de désactiver la harpe laser.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 2 : Réalisation du programme secondaire sur Arduino 'en cas de problèmes' ==&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis à plusieurs occasions en dehors des heures de projet afin d'avancer sur notre harpe. Nous avons donc décidé que nous devions réaliser un programme sur Arduino nous permettant de réaliser des tests de transmission par la liaison série sans avoir besoin du FPGA. Dans un premier temps, nous avons tenté d'utiliser le port USB comme liaison série. Cependant, il s'est avéré que le Raspberry pi ne pouvait pas lire son port USB, ce qui nous a donc forcé à utiliser les pins de communication série de l'Arduino. &lt;br /&gt;
Nous sommes sur un Arduino Mega 2560, nous avons a notre disposition plusieurs pins de communication série différents. Ils seront utilisés uniquement en transmission. Pour communiquer, nous allons ensuite utiliser le pin Tx1. Nous aboutissons donc au programme suivant:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Setup.PNG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Captprog.PNG]]&lt;br /&gt;
&lt;br /&gt;
La communication série de ce programme nous a causé des problèmes, surtout du fait que l'ordinateur ne recevait pas les informations transmises par l'Arduino. Nous avons donc du effectuer de multiples tests afin de voir où se situait le problème. Nous avons pu déterminer que nous avions un problème au niveau de notre pont diviseur de tension entre l'alimentation de l’Arduino et celle du Raspberry Pi, nous avons alors changé les résistances.&lt;br /&gt;
Nous avons également notamment modifié le programme afin de vérifier que l'information était bien transmise sur le Pin Série de l'Arduino, et que le problème ne venait donc pas de l'Arduino mais bien du Raspberry, qui ne transmet pas correctement l'information à l'ordinateur.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 3 : Assemblage de la boite et mise en place des composants ==&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43726</id>
		<title>Projet IMA3 P5, 2016/2017, TD1</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43726"/>
				<updated>2017-06-12T08:53:48Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : /* Partie informatique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet IMA3-SC 2016/2017 : Synt'Harpe (Sainte) Laser =&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Description du système ===&lt;br /&gt;
&lt;br /&gt;
Pour le projet Système Communicant, nous allons réaliser une harpe laser. Notre but est de créer un instrument de musique similaire à une harpe, où les cordes sont remplacées par des capteurs infra-rouges.&lt;br /&gt;
&lt;br /&gt;
Un son sera émis par l'ordinateur dès que le capteur IR captera une main et le joueur pourra avec son autre main moduler l'amplitude de la note.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on travaillera sur une gamme de son sur 8 bits. Puis, nous implémenterons une banque de sons qui nous permettra de sélectionner l'instrument désiré, d'où l'appellation Synt'Harpe.&lt;br /&gt;
&lt;br /&gt;
L'ordinateur décidera du fonctionnement ou non de la harpe. C'est aussi grâce à lui qu'on pourra choisir la banque de sons voulue.&lt;br /&gt;
&lt;br /&gt;
Toutes les banques de sons seront enregistrées sur le Raspberry.&lt;br /&gt;
Les LEDs signaleront l'emplacement des cordes.&lt;br /&gt;
&lt;br /&gt;
Pour la partie optionnelle, on remplacera les LEDs par des lasers pour un effet visuel de qualité (plus poussé). La fumée permettra de voir les lasers.&lt;br /&gt;
&lt;br /&gt;
=== Le matériel ===&lt;br /&gt;
* Un raspberry pi&lt;br /&gt;
* 8 phototransistors&lt;br /&gt;
* 8 émetteurs lasers&lt;br /&gt;
* Des résistances&lt;br /&gt;
* Une structure&lt;br /&gt;
* Carte d'acquisition de type Arduino au début puis FPGA &lt;br /&gt;
* Un ordinateur&lt;br /&gt;
* Une alimentation&lt;br /&gt;
&lt;br /&gt;
=== Optionnel (visuel) ===&lt;br /&gt;
&lt;br /&gt;
* 8 émetteurs laser&lt;br /&gt;
* Un générateur de fumée&lt;br /&gt;
* Une caméra&lt;br /&gt;
&lt;br /&gt;
== Séance 1 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Le but de cette première séance était de se répartir les tâches, de tester le matériel mit à disposition et de découvrir le fonctionnement du FPGA.&lt;br /&gt;
&lt;br /&gt;
Le principe de fonctionnement de la harpe est le suivant:&lt;br /&gt;
Chaque capteur sera situé en face d'un laser. Les capteurs seront dans la partie haute de la harpe afin de limiter les interférences dues à d'autres sources lumineuses. Chaque laser pointera vers un capteur. &lt;br /&gt;
&lt;br /&gt;
 * Ajout du dessin de la harpe * &lt;br /&gt;
&lt;br /&gt;
Les capteurs enverront tous par défaut la même valeur au FPGA. Quand l'utilisateur passera sa main dans la harpe, un faisceau laser sera coupé. Le capteur n'enverra plus sa valeur seuil au FPGA, il aura donc changé d'état.&lt;br /&gt;
Dès lors que le FPGA détectera un changement d'état, il enverra l'état dans lequel se trouvent les 8 capteurs au Raspberry. &lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé des tests sur les phototransistors et les lasers. Nous avons mis en parallèle un laser et deux capteurs, sans oublier leur résistance de 1.2k Ohms chacune. &lt;br /&gt;
&lt;br /&gt;
Nous avons vu que à luminosité ambiante, quand le laser pointe sur le capteur, celui-ci envoie à l'Arduino une valeur de 950 environ. Ensuite, quand le faisceau laser est coupé, la valeur envoyée par le phototransistor monte à 1020.&lt;br /&gt;
Puis, nous avons réitéré l'expérience en mettant le système dans une boîte. Cette fois, le valeur est passée de 840 quand le capteur est éclairé par le laser à 900 quand le faisceau est coupé.&lt;br /&gt;
Nous en avons déduit que nous allons devoir refaire l'expérience une fois la harpe assemblée.&lt;br /&gt;
&lt;br /&gt;
Les lasers étant très directionnels tout comme les phototransistors, nous n'aurons pas de soucis d'interférences. Un capteur détectera uniquement le laser situé directement en face de lui et non ceux de son voisinage.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Même si il peut paraitre futile d'insérer une partie boitier dans un projet centré sur l'informatique et l'électronique, il s'est avéré que le boitier de notre Harpe nécessitait une attention particulière.&lt;br /&gt;
&lt;br /&gt;
La taille de la harpe à été un sujet de débat, et nous avons réalisé des tests afin de vérifier que des phototransistors trop proches les uns des autres n'allait pas compromettre le bon fonctionnement de la harpe dans son ensemble. En effet, si le phototransistor détectait un autre laser que celui vers lequel il pointe serait extrêmement problématique. Heureusement, il s'est avéré que les phototransistors sont très directionnels, au point que se pose désormais le problème inverse.&lt;br /&gt;
&lt;br /&gt;
Nous allons devoir faire très attention au fait que les lasers soient bien fixés et pointent exactement vers les phototransistors, car dans le cas contraire, ceux-ci ne détectent absolument pas le laser, et tout le principe de fonctionnement s'effondre. La conception et l'assemblage de la boite devront donc être relativement précis, pour éviter ces problèmes.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons dès le départ décidé d'éviter l'utilisation de diodes infra-rouges, pour leur préférer les lasers. Tout d'abord, parce que les diodes ne sont en aucun cas assez puissantes pour être détectées par les phototransistors, ce qui une fois de plus rend notre harpe inutile. Ensuite, parce qu'il nous a semblé que réaliser une harpe 'laser' sans lasers était un concept déconcertant, et enlève beaucoup de l’intérêt de ce projet.&lt;br /&gt;
&lt;br /&gt;
Un premier jet de design avait été réalisé avant cette séance, et au vu des données récoltées pendant celle-ci, nous l'avons modifié pour les prendre en compte, notamment la taille des lasers par rapport aux diodes, et la précision requise. &lt;br /&gt;
&lt;br /&gt;
'insérer photos premiers schémas ici'&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le travail a été séparé en 2 parties, une personne par partie : &lt;br /&gt;
- une première partie sur le serveur même (page web, système de streaming de son depuis la page web)&lt;br /&gt;
- une seconde partie sur la lecture du port série&lt;br /&gt;
&lt;br /&gt;
==== Partie serveur ====&lt;br /&gt;
La première séance a été consacré à deux grands axes : prendre la main à distance sur le raspberry pi et mettre en place le serveur web.&lt;br /&gt;
Afin de pouvoir contrôler et travailler facilement sur le RPi, l'outil vncserver a été installé sur le raspberry, permettant de contrôler via un interface graphique le RPi depuis un ordinateur branché sur le même réseau. Cet utilitaire permettra a l'avenir de travailler directement sur le RPi sans devoir constamment uploader par ssh le travail effectué.&lt;br /&gt;
&lt;br /&gt;
Coté mise en place du serveur web, l'utilitaire de serveur web apache2 a été installé sans soucis, et les pages d'exemples web et javascript fonctionnent. En revanche, l'utilisation du code d'exemple sur les sockets n'est pas utilisable, le paquet proposé n’existe pas et le site du paquet de socket est mort.&lt;br /&gt;
Le reste de la séance a été consacré a des recherches sur les moyens de pouvoir streamer du son, recherches non concluantes. Aucune solution n'a été trouvé sans passer par un service internet hébergé par un tier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Partie lecture port série ====&lt;br /&gt;
&lt;br /&gt;
Cette première séance fut consacrée à la sélection du langage de programmation et à sa prise en main. Il a été décidé d'utiliser Python pour écrire le programme récupérant et traitant les données récupérées à travers le port série. Python étant un langage fort usité, il possède une très large documentation. Ce fut donc facile de trouver la librairie permettant de lire les données envoyées par le port série.&lt;br /&gt;
&lt;br /&gt;
Un doute subsiste encore sur le type de données envoyé par le port série. L'idéal serait de récupérer un tableau de 8 entiers de type binaire correspondant aux états des 8 ports liés aux &amp;quot;cordes&amp;quot; laser, pour pouvoir ensuite traiter ces données facilement.&lt;br /&gt;
&lt;br /&gt;
== Séance 2 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Lors de cette séance, nous avons réalisé le premier circuit sur le FPGA. &lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un circuit simple, qui envoie en permanence l'état des huit phototransistors au port série. Les phototransistors sont alors directement reliés à celui-ci. Nous avons pu tester le bon fonctionnement du système grâce aux diodes du FPGA. Nous avons branché en parallèle sur le circuit les huit diodes, afin de vérifier qu'un signal était bien envoyé en permanence, on a pu les voir s'éteindre lorsqu'on éclairait un laser. &lt;br /&gt;
Ces diodes se sont avérées très utiles, car il n'est pas encore possible d'effectuer les tests sur le port série, car la partie informatique n'est pas encore opérationnelle, on ne peut donc pas lire directement sur le port série pour le moment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi constant ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite réalisé un montage permettant de faire l'envoi seulement sur changement d'état, comme prévu à la séance 1 Nous avons donc réalisé un système de bascules permettant de comparer l'état actuel de chaque diode avec son état précédent, puis de réaliser l'envoi seulement si une différence était observée. Comme précédemment, les diodes sont reliées directement au Port Série, mais cette fois-ci au lieu de brancher le Bit d'envoi du port Série sur un Vcc, soit un '1' logique, nous l'avons relié à la vérification de changement d'état, qui passe à '1' uniquement avec un changement d'état.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi sur changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème qui s'est alors posé était de savoir si on envoyait le signal assez longtemps pour qu'il puisse être lu. En effet on envoie un signal seulement si il y a changement d'état, et cette vérification se fait à chaque incrément d'horloge. Hors, la différence sera donc observée sur un seul incrément d'horloge, par conséquent, on n'envoie de signal que pendant ce seul incrément. Pour l'instant, nous supposons que le port série est capable de stocker les données à envoyer en un seul incrément d'horloge. &lt;br /&gt;
Cependant, si lors des tests, ça ne fonctionne pas, nous prévoyons d'utiliser un compteur pour pouvoir envoyer le signal plus longtemps au Bit d'envoi du port série, et ainsi laisser le temps au port série d'envoyer l'information.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous nous sommes focalisés sur le FPGA, mais nous avons néanmoins terminé la conception du boitier de la harpe, sous la forme de trois 'boites' crénelées, que nous avons ensuite l'intention de découper au FabLab puis d'assembler.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos des boites ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il s'est avéré que réaliser des boites crénelées rendrait tout le boitier beaucoup plus solide, et donc fiable.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le problème de l'impossibilité d'utiliser l'exemple sur les sockets a été résolu, grâce à l'intervention de M. Redon. Le problème était une différence de version de la distribution Linux entre le RPi utilisé et celle utilisé pour l'exemple. En effet, le RPi de travail est sur une distribution Wheezy, alors que la version la plus récente est la Jessie. Les chemins des dépots des sources de la librairie libwebsocket n’existant pas sur Wheezy, on ne pouvait installer la librairie directement en ligne de commande. M. Redon a ajouté le chemin de la librairie dans le gestionnaire de paquet du RPi et on a pu utiliser sans problèmes la librairie. De plus le site du paquet libwebsocket n'était inaccessible que temporairement.&lt;br /&gt;
La séance a été consacré à comprendre le fonctionnement des sockets et comment l'exemple html interagissait avec.&lt;br /&gt;
&lt;br /&gt;
La partie importante du code d'exemple est la suivante : &lt;br /&gt;
&lt;br /&gt;
 static int callback_my(&lt;br /&gt;
  struct libwebsocket_context * this,&lt;br /&gt;
  struct libwebsocket *wsi,enum libwebsocket_callback_reasons reason,&lt;br /&gt;
  void *user,void *in,size_t len)&lt;br /&gt;
 {&lt;br /&gt;
 static char *message=NULL;&lt;br /&gt;
 static int msize=0;&lt;br /&gt;
 switch(reason){&lt;br /&gt;
  case LWS_CALLBACK_ESTABLISHED:&lt;br /&gt;
    printf(&amp;quot;connection established\n&amp;quot;);&lt;br /&gt;
    message=NULL;&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_RECEIVE:&lt;br /&gt;
                // Ici sont traites les messages envoyes par le navigateur&lt;br /&gt;
    printf(&amp;quot;received data: %s\n&amp;quot;,(char *)in);&lt;br /&gt;
    message=malloc(len+LWS_SEND_BUFFER_PRE_PADDING+LWS_SEND_BUFFER_POST_PADDING);&lt;br /&gt;
    if(message==NULL){ perror(&amp;quot;callback_my.malloc&amp;quot;); exit(EXIT_FAILURE); }&lt;br /&gt;
    memcpy(message+LWS_SEND_BUFFER_PRE_PADDING,in,len);&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    msize=len;&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_SERVER_WRITEABLE:&lt;br /&gt;
                // Ici sont envoyes les messages au navigateur&lt;br /&gt;
    if(message!=NULL){&lt;br /&gt;
      char *out=message+LWS_SEND_BUFFER_PRE_PADDING;&lt;br /&gt;
      libwebsocket_write(wsi,(unsigned char *)out,msize,LWS_WRITE_TEXT);&lt;br /&gt;
      free(message);&lt;br /&gt;
      message=NULL;&lt;br /&gt;
      }&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    break;&lt;br /&gt;
  }&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une fonction de callback gérant à la fois la réception et la transmission. On peut remarquer 3 cas du switch : LWS_CALLBACK_ESTABLISHED correspondant à la création d'un lien entre la page web et le serveur websocket à la demande de la page web, LWS_CALLBACK_RECEIVE correspondant aux actions à entreprendre à la réception d'un message provenant du navigateur web, et LWS_CALLBACK_SERVER_WRITEABLE correspondant aux actions afin d'envoyer un message au navigateur.&lt;br /&gt;
&lt;br /&gt;
Coté HTML, on utilise les sockets grâce à ce code suivant :&lt;br /&gt;
 &lt;br /&gt;
 window.WebSocket=(window.WebSocket||window.MozWebSocket);&lt;br /&gt;
 var websocket=new WebSocket('ws://127.0.0.1:9000','myprotocol');&lt;br /&gt;
 websocket.onopen=function(){ $('h1').css('color','green'); };&lt;br /&gt;
 websocket.onerror=function(){ $('h1').css('color','red'); };&lt;br /&gt;
 websocket.onmessage=function(message){&lt;br /&gt;
 console.log(message.data);&lt;br /&gt;
 $('#messages').append($('&amp;lt;p&amp;gt;',{ text: message.data }));&lt;br /&gt;
 };&lt;br /&gt;
 function sendMessage(){&lt;br /&gt;
 websocket.send($('#message').val());&lt;br /&gt;
 $('#message').val('');&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La fonction websocket.onmessage gère le traitement à faire coté client quand le serveur envoie des informations, et la fonction sendMessage permet l'envoie d'information du client vers le serveur.&lt;br /&gt;
&lt;br /&gt;
Pour notre projet, nous avons besoin principalement, dans un premier temps, d'envoyer des informations du serveur vers le client, nous nous sommes donc concentrer à comprendre et modifier les parties du code fourni suivantes : websocket.onmessage coté client et le &amp;quot;case LWS_CALLBACK_SERVER_WRITEABLE:&amp;quot; coté serveur.&lt;br /&gt;
&lt;br /&gt;
Le but des tests était de réussir à faire jouer deux sons différents par le client, avec changement de son imposé par le serveur. HTML5 propose nativement de lire des sons à partir d'une source grâce à une balise audio :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;audio controls=&amp;quot;controls&amp;quot; id=&amp;quot;mySound&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/audio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On récupère l'identifiant de cette balise avec &lt;br /&gt;
&lt;br /&gt;
 var test1 = document.getElementById(&amp;quot;mySound&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
afin de pouvoir l'utiliser de n'importe où dans le programme.&lt;br /&gt;
On définit la source grâce à &lt;br /&gt;
&lt;br /&gt;
 test1.src=&amp;quot;sound.mp3&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
avec &amp;quot;sound.mp3&amp;quot; le chemin d'accès au fichier son par rapport à l'emplacement du fichier html sur le serveur. Ici, le fichier son sound.mp3 est dans le même dossier que la page index.html.&lt;br /&gt;
Enfin, on peut lire le son avec &lt;br /&gt;
&lt;br /&gt;
 test1.play();&lt;br /&gt;
&lt;br /&gt;
Le but du projet étant d'émettre en continue le son généré par la harpe, l'objectif ici est soit de générer un fichier de streaming que l'on lit en continue, soit de lire un fichier différent par son possible et on change la valeur de test1.src en fonction du son à lire, soit on lit toujours la même source, mais que l'on modifie à la volée en fonction du son voulu. La première option a été étudiée jusqu'en fin de séance.&lt;br /&gt;
Nous n'avons pas réussi à comprendre comment générer un fichier de streaming audio simple, de plus toutes les documentations et exemples trouvés ne concernant qu'un streaming simultanée de son et de vidéo à partir d'une caméra et d'un micro, et nous n'avons pas compris comment adapter ces exemples.&lt;br /&gt;
&lt;br /&gt;
== Séance 3 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous avons pu tester l'envoi sur changement d'état, toujours avec les diodes du FPGA.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par ajouter une horloge sur le détecteur de changement d'état, afin d'augmenter le nombre d'incréments d'horloge sur lequel il est à '1', et ce dans le but de rendre le clignotement d'un diode visible à l’œil nu.&lt;br /&gt;
Ensuite, nous avons relié la sortie du détecteur de changement d'état et des phototransistors par un 'ET' logique, que nous avons ensuite relié aux diodes du FPGA.&lt;br /&gt;
De cette façon, si l'on détecte un changement d'état sur un phototransistor, la nouvelle valeur est alors envoyée sur les diodes. Le système a fonctionné (à voir :p ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos du test avec changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite passé le reste de la séance à mettre en commun notre partie avec la partie informatique, en essayant de leur permettre de lire sur le port série du FPGA. Les essais ont pour l'instant été infructueux, mais des progrès ont été faits. &lt;br /&gt;
&lt;br /&gt;
L'objectif étant que le Raspberry Pi puisse lire les informations envoyées par le FPGA, pour ensuite les transmettre au site Web que nous allons réaliser par la suite.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 1 : Réalisation du site Web ==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé ce site web lors de notre temps libre afin de permettre la communication entre le Raspberry Pi et l'ordinateur. En effet, il était inclus dans notre projet de devoir réaliser une communication par internet. Ce site internet va donc remplir cette condition. Sur celui-ci, on pourra trouver une brève description de notre projet, un lien vers le wiki, une image exemple d'un harpe et les boutons Play et Pause qui permettent d'activer et de désactiver la harpe laser.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 2 : Réalisation du programme secondaire sur Arduino 'en cas de problèmes' ==&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis à plusieurs occasions en dehors des heures de projet afin d'avancer sur notre harpe. Nous avons donc décidé que nous devions réaliser un programme sur Arduino nous permettant de réaliser des tests de transmission par la liaison série sans avoir besoin du FPGA. Dans un premier temps, nous avons tenté d'utiliser le port USB comme liaison série. Cependant, il s'est avéré que le Raspberry pi ne pouvait pas lire son port USB, ce qui nous a donc forcé à utiliser les pins de communication série de l'Arduino. &lt;br /&gt;
Nous sommes sur un Arduino Mega 2560, nous avons a notre disposition plusieurs pins de communication série différents. Ils seront utilisés uniquement en transmission. Pour communiquer, nous allons ensuite utiliser le pin Tx1. Nous aboutissons donc au programme suivant:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Setup.PNG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Captprog.PNG]]&lt;br /&gt;
&lt;br /&gt;
La communication série de ce programme nous a causé des problèmes, surtout du fait que l'ordinateur ne recevait pas les informations transmises par l'Arduino. Nous avons donc du effectuer de multiples tests afin de voir où se situait le problème. Nous avons pu déterminer que nous avions un problème au niveau de notre pont diviseur de tension entre l'alimentation de l’Arduino et celle du Raspberry Pi, nous avons alors changé les résistances.&lt;br /&gt;
Nous avons également notamment modifié le programme afin de vérifier que l'information était bien transmise sur le Pin Série de l'Arduino, et que le problème ne venait donc pas de l'Arduino mais bien du Raspberry, qui ne transmet pas correctement l'information à l'ordinateur.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 3 : Assemblage de la boite et mise en place des composants ==&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43725</id>
		<title>Projet IMA3 P5, 2016/2017, TD1</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43725"/>
				<updated>2017-06-12T08:51:51Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : /* Partie informatique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet IMA3-SC 2016/2017 : Synt'Harpe (Sainte) Laser =&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Description du système ===&lt;br /&gt;
&lt;br /&gt;
Pour le projet Système Communicant, nous allons réaliser une harpe laser. Notre but est de créer un instrument de musique similaire à une harpe, où les cordes sont remplacées par des capteurs infra-rouges.&lt;br /&gt;
&lt;br /&gt;
Un son sera émis par l'ordinateur dès que le capteur IR captera une main et le joueur pourra avec son autre main moduler l'amplitude de la note.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on travaillera sur une gamme de son sur 8 bits. Puis, nous implémenterons une banque de sons qui nous permettra de sélectionner l'instrument désiré, d'où l'appellation Synt'Harpe.&lt;br /&gt;
&lt;br /&gt;
L'ordinateur décidera du fonctionnement ou non de la harpe. C'est aussi grâce à lui qu'on pourra choisir la banque de sons voulue.&lt;br /&gt;
&lt;br /&gt;
Toutes les banques de sons seront enregistrées sur le Raspberry.&lt;br /&gt;
Les LEDs signaleront l'emplacement des cordes.&lt;br /&gt;
&lt;br /&gt;
Pour la partie optionnelle, on remplacera les LEDs par des lasers pour un effet visuel de qualité (plus poussé). La fumée permettra de voir les lasers.&lt;br /&gt;
&lt;br /&gt;
=== Le matériel ===&lt;br /&gt;
* Un raspberry pi&lt;br /&gt;
* 8 phototransistors&lt;br /&gt;
* 8 émetteurs lasers&lt;br /&gt;
* Des résistances&lt;br /&gt;
* Une structure&lt;br /&gt;
* Carte d'acquisition de type Arduino au début puis FPGA &lt;br /&gt;
* Un ordinateur&lt;br /&gt;
* Une alimentation&lt;br /&gt;
&lt;br /&gt;
=== Optionnel (visuel) ===&lt;br /&gt;
&lt;br /&gt;
* 8 émetteurs laser&lt;br /&gt;
* Un générateur de fumée&lt;br /&gt;
* Une caméra&lt;br /&gt;
&lt;br /&gt;
== Séance 1 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Le but de cette première séance était de se répartir les tâches, de tester le matériel mit à disposition et de découvrir le fonctionnement du FPGA.&lt;br /&gt;
&lt;br /&gt;
Le principe de fonctionnement de la harpe est le suivant:&lt;br /&gt;
Chaque capteur sera situé en face d'un laser. Les capteurs seront dans la partie haute de la harpe afin de limiter les interférences dues à d'autres sources lumineuses. Chaque laser pointera vers un capteur. &lt;br /&gt;
&lt;br /&gt;
 * Ajout du dessin de la harpe * &lt;br /&gt;
&lt;br /&gt;
Les capteurs enverront tous par défaut la même valeur au FPGA. Quand l'utilisateur passera sa main dans la harpe, un faisceau laser sera coupé. Le capteur n'enverra plus sa valeur seuil au FPGA, il aura donc changé d'état.&lt;br /&gt;
Dès lors que le FPGA détectera un changement d'état, il enverra l'état dans lequel se trouvent les 8 capteurs au Raspberry. &lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé des tests sur les phototransistors et les lasers. Nous avons mis en parallèle un laser et deux capteurs, sans oublier leur résistance de 1.2k Ohms chacune. &lt;br /&gt;
&lt;br /&gt;
Nous avons vu que à luminosité ambiante, quand le laser pointe sur le capteur, celui-ci envoie à l'Arduino une valeur de 950 environ. Ensuite, quand le faisceau laser est coupé, la valeur envoyée par le phototransistor monte à 1020.&lt;br /&gt;
Puis, nous avons réitéré l'expérience en mettant le système dans une boîte. Cette fois, le valeur est passée de 840 quand le capteur est éclairé par le laser à 900 quand le faisceau est coupé.&lt;br /&gt;
Nous en avons déduit que nous allons devoir refaire l'expérience une fois la harpe assemblée.&lt;br /&gt;
&lt;br /&gt;
Les lasers étant très directionnels tout comme les phototransistors, nous n'aurons pas de soucis d'interférences. Un capteur détectera uniquement le laser situé directement en face de lui et non ceux de son voisinage.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Même si il peut paraitre futile d'insérer une partie boitier dans un projet centré sur l'informatique et l'électronique, il s'est avéré que le boitier de notre Harpe nécessitait une attention particulière.&lt;br /&gt;
&lt;br /&gt;
La taille de la harpe à été un sujet de débat, et nous avons réalisé des tests afin de vérifier que des phototransistors trop proches les uns des autres n'allait pas compromettre le bon fonctionnement de la harpe dans son ensemble. En effet, si le phototransistor détectait un autre laser que celui vers lequel il pointe serait extrêmement problématique. Heureusement, il s'est avéré que les phototransistors sont très directionnels, au point que se pose désormais le problème inverse.&lt;br /&gt;
&lt;br /&gt;
Nous allons devoir faire très attention au fait que les lasers soient bien fixés et pointent exactement vers les phototransistors, car dans le cas contraire, ceux-ci ne détectent absolument pas le laser, et tout le principe de fonctionnement s'effondre. La conception et l'assemblage de la boite devront donc être relativement précis, pour éviter ces problèmes.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons dès le départ décidé d'éviter l'utilisation de diodes infra-rouges, pour leur préférer les lasers. Tout d'abord, parce que les diodes ne sont en aucun cas assez puissantes pour être détectées par les phototransistors, ce qui une fois de plus rend notre harpe inutile. Ensuite, parce qu'il nous a semblé que réaliser une harpe 'laser' sans lasers était un concept déconcertant, et enlève beaucoup de l’intérêt de ce projet.&lt;br /&gt;
&lt;br /&gt;
Un premier jet de design avait été réalisé avant cette séance, et au vu des données récoltées pendant celle-ci, nous l'avons modifié pour les prendre en compte, notamment la taille des lasers par rapport aux diodes, et la précision requise. &lt;br /&gt;
&lt;br /&gt;
'insérer photos premiers schémas ici'&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le travail a été séparé en 2 parties, une personne par partie : &lt;br /&gt;
- une première partie sur le serveur même (page web, système de streaming de son depuis la page web)&lt;br /&gt;
- une seconde partie sur la lecture du port série&lt;br /&gt;
&lt;br /&gt;
==== Partie serveur ====&lt;br /&gt;
La première séance a été consacré à deux grands axes : prendre la main à distance sur le raspberry pi et mettre en place le serveur web.&lt;br /&gt;
Afin de pouvoir contrôler et travailler facilement sur le RPi, l'outil vncserver a été installé sur le raspberry, permettant de contrôler via un interface graphique le RPi depuis un ordinateur branché sur le même réseau. Cet utilitaire permettra a l'avenir de travailler directement sur le RPi sans devoir constamment uploader par ssh le travail effectué.&lt;br /&gt;
&lt;br /&gt;
Coté mise en place du serveur web, l'utilitaire de serveur web apache2 a été installé sans soucis, et les pages d'exemples web et javascript fonctionnent. En revanche, l'utilisation du code d'exemple sur les sockets n'est pas utilisable, le paquet proposé n’existe pas et le site du paquet de socket est mort.&lt;br /&gt;
Le reste de la séance a été consacré a des recherches sur les moyens de pouvoir streamer du son, recherches non concluantes. Aucune solution n'a été trouvé sans passer par un service internet hébergé par un tier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Partie lecture port série ====&lt;br /&gt;
&lt;br /&gt;
Cette première séance fut consacrée à la sélection du langage de programmation et à sa prise en main. Il a été décidé d'utiliser Python pour écrire le programme récupérant et traitant les données récupérées à travers le port série. Python étant un langage fort usité, il possède une très large documentation. Ce fut donc facile de trouver la librairie permettant de lire les données envoyées par le port série.&lt;br /&gt;
&lt;br /&gt;
Un doute subsiste encore sur le type de données envoyé par le port série. L'idéal serait de récupérer un tableau de 8 entiers de type binaire correspondant aux états des 8 ports liés aux &amp;quot;cordes&amp;quot; laser, pour pouvoir ensuite traiter ces données facilement.&lt;br /&gt;
&lt;br /&gt;
== Séance 2 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Lors de cette séance, nous avons réalisé le premier circuit sur le FPGA. &lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un circuit simple, qui envoie en permanence l'état des huit phototransistors au port série. Les phototransistors sont alors directement reliés à celui-ci. Nous avons pu tester le bon fonctionnement du système grâce aux diodes du FPGA. Nous avons branché en parallèle sur le circuit les huit diodes, afin de vérifier qu'un signal était bien envoyé en permanence, on a pu les voir s'éteindre lorsqu'on éclairait un laser. &lt;br /&gt;
Ces diodes se sont avérées très utiles, car il n'est pas encore possible d'effectuer les tests sur le port série, car la partie informatique n'est pas encore opérationnelle, on ne peut donc pas lire directement sur le port série pour le moment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi constant ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite réalisé un montage permettant de faire l'envoi seulement sur changement d'état, comme prévu à la séance 1 Nous avons donc réalisé un système de bascules permettant de comparer l'état actuel de chaque diode avec son état précédent, puis de réaliser l'envoi seulement si une différence était observée. Comme précédemment, les diodes sont reliées directement au Port Série, mais cette fois-ci au lieu de brancher le Bit d'envoi du port Série sur un Vcc, soit un '1' logique, nous l'avons relié à la vérification de changement d'état, qui passe à '1' uniquement avec un changement d'état.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi sur changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème qui s'est alors posé était de savoir si on envoyait le signal assez longtemps pour qu'il puisse être lu. En effet on envoie un signal seulement si il y a changement d'état, et cette vérification se fait à chaque incrément d'horloge. Hors, la différence sera donc observée sur un seul incrément d'horloge, par conséquent, on n'envoie de signal que pendant ce seul incrément. Pour l'instant, nous supposons que le port série est capable de stocker les données à envoyer en un seul incrément d'horloge. &lt;br /&gt;
Cependant, si lors des tests, ça ne fonctionne pas, nous prévoyons d'utiliser un compteur pour pouvoir envoyer le signal plus longtemps au Bit d'envoi du port série, et ainsi laisser le temps au port série d'envoyer l'information.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous nous sommes focalisés sur le FPGA, mais nous avons néanmoins terminé la conception du boitier de la harpe, sous la forme de trois 'boites' crénelées, que nous avons ensuite l'intention de découper au FabLab puis d'assembler.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos des boites ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il s'est avéré que réaliser des boites crénelées rendrait tout le boitier beaucoup plus solide, et donc fiable.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le problème de l'impossibilité d'utiliser l'exemple sur les sockets a été résolu, grâce à l'intervention de M. Redon. Le problème était une différence de version de la distribution Linux entre le RPi utilisé et celle utilisé pour l'exemple. En effet, le RPi de travail est sur une distribution Wheezy, alors que la version la plus récente est la Jessie. Les chemins des dépots des sources de la librairie libwebsocket n’existant pas sur Wheezy, on ne pouvait installer la librairie directement en ligne de commande. M. Redon a ajouté le chemin de la librairie dans le gestionnaire de paquet du RPi et on a pu utiliser sans problèmes la librairie. De plus le site du paquet libwebsocket n'était inaccessible que temporairement.&lt;br /&gt;
La séance a été consacré à comprendre le fonctionnement des sockets et comment l'exemple html interagissait avec.&lt;br /&gt;
&lt;br /&gt;
La partie importante du code d'exemple est la suivante : &lt;br /&gt;
&lt;br /&gt;
 static int callback_my(&lt;br /&gt;
  struct libwebsocket_context * this,&lt;br /&gt;
  struct libwebsocket *wsi,enum libwebsocket_callback_reasons reason,&lt;br /&gt;
  void *user,void *in,size_t len)&lt;br /&gt;
 {&lt;br /&gt;
 static char *message=NULL;&lt;br /&gt;
 static int msize=0;&lt;br /&gt;
 switch(reason){&lt;br /&gt;
  case LWS_CALLBACK_ESTABLISHED:&lt;br /&gt;
    printf(&amp;quot;connection established\n&amp;quot;);&lt;br /&gt;
    message=NULL;&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_RECEIVE:&lt;br /&gt;
                // Ici sont traites les messages envoyes par le navigateur&lt;br /&gt;
    printf(&amp;quot;received data: %s\n&amp;quot;,(char *)in);&lt;br /&gt;
    message=malloc(len+LWS_SEND_BUFFER_PRE_PADDING+LWS_SEND_BUFFER_POST_PADDING);&lt;br /&gt;
    if(message==NULL){ perror(&amp;quot;callback_my.malloc&amp;quot;); exit(EXIT_FAILURE); }&lt;br /&gt;
    memcpy(message+LWS_SEND_BUFFER_PRE_PADDING,in,len);&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    msize=len;&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_SERVER_WRITEABLE:&lt;br /&gt;
                // Ici sont envoyes les messages au navigateur&lt;br /&gt;
    if(message!=NULL){&lt;br /&gt;
      char *out=message+LWS_SEND_BUFFER_PRE_PADDING;&lt;br /&gt;
      libwebsocket_write(wsi,(unsigned char *)out,msize,LWS_WRITE_TEXT);&lt;br /&gt;
      free(message);&lt;br /&gt;
      message=NULL;&lt;br /&gt;
      }&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    break;&lt;br /&gt;
  }&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une fonction de callback gérant à la fois la réception et la transmission. On peut remarquer 3 cas du switch : LWS_CALLBACK_ESTABLISHED correspondant à la création d'un lien entre la page web et le serveur websocket à la demande de la page web, LWS_CALLBACK_RECEIVE correspondant aux actions à entreprendre à la réception d'un message provenant du navigateur web, et LWS_CALLBACK_SERVER_WRITEABLE correspondant aux actions afin d'envoyer un message au navigateur.&lt;br /&gt;
&lt;br /&gt;
Coté HTML, on utilise les sockets grâce à ce code suivant :&lt;br /&gt;
 &lt;br /&gt;
 window.WebSocket=(window.WebSocket||window.MozWebSocket);&lt;br /&gt;
 var websocket=new WebSocket('ws://127.0.0.1:9000','myprotocol');&lt;br /&gt;
 websocket.onopen=function(){ $('h1').css('color','green'); };&lt;br /&gt;
 websocket.onerror=function(){ $('h1').css('color','red'); };&lt;br /&gt;
 websocket.onmessage=function(message){&lt;br /&gt;
 console.log(message.data);&lt;br /&gt;
 $('#messages').append($('&amp;lt;p&amp;gt;',{ text: message.data }));&lt;br /&gt;
 };&lt;br /&gt;
 function sendMessage(){&lt;br /&gt;
 websocket.send($('#message').val());&lt;br /&gt;
 $('#message').val('');&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La fonction websocket.onmessage gère le traitement à faire coté client quand le serveur envoie des informations, et la fonction sendMessage permet l'envoie d'information du client vers le serveur.&lt;br /&gt;
&lt;br /&gt;
Pour notre projet, nous avons besoin principalement, dans un premier temps, d'envoyer des informations du serveur vers le client, nous nous sommes donc concentrer à comprendre et modifier les parties du code fourni suivantes : websocket.onmessage coté client et le &amp;quot;case LWS_CALLBACK_SERVER_WRITEABLE:&amp;quot; coté serveur.&lt;br /&gt;
&lt;br /&gt;
Le but des tests était de réussir à faire jouer deux sons différents par le client, avec changement de son imposé par le serveur. HTML5 propose nativement de lire des sons à partir d'une source grâce à une balise audio :&lt;br /&gt;
 &amp;lt;audio controls=&amp;quot;controls&amp;quot; id=&amp;quot;mySound&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/audio&amp;gt;&lt;br /&gt;
On récupère l'identifiant de cette balise avec &lt;br /&gt;
 var test1 = document.getElementById(&amp;quot;mySound&amp;quot;);&lt;br /&gt;
afin de pouvoir l'utiliser de n'importe où dans le programme.&lt;br /&gt;
On définit la source grâce à &lt;br /&gt;
 test1.src=&amp;quot;sound.mp3&amp;quot;;&lt;br /&gt;
avec &amp;quot;sound.mp3&amp;quot; le chemin d'accès au fichier son par rapport à l'emplacement du fichier html sur le serveur. Ici, le fichier son sound.mp3 est dans le même dossier que la page index.html.&lt;br /&gt;
Enfin, on peut lire le son avec &lt;br /&gt;
 test1.play();&lt;br /&gt;
&lt;br /&gt;
Le but du projet étant d'émettre en continue le son généré par la harpe, l'objectif ici est soit de générer un fichier de streaming que l'on lit en continue, soit de lire un fichier différent par son possible et on change la valeur de test1.src en fonction du son à lire, soit on lit toujours la même source, mais que l'on modifie à la volée en fonction du son voulu. La première option a été étudiée jusqu'en fin de séance.&lt;br /&gt;
Nous n'avons pas réussi à comprendre comment générer un fichier de streaming audio simple, de plus toutes les documentations et exemples trouvés ne concernant qu'un streaming simultanée de son et de vidéo à partir d'une caméra et d'un micro, et nous n'avons pas compris comment adapter ces exemples.&lt;br /&gt;
&lt;br /&gt;
  int cpt;&lt;br /&gt;
  for (cpt = 0; cpt &amp;lt; 250000000; cpt++);&lt;br /&gt;
&lt;br /&gt;
    boole = !boole;&lt;br /&gt;
	printf(&amp;quot;changement: %d\n&amp;quot;,boole);&lt;br /&gt;
    if(boole)&lt;br /&gt;
      system(&amp;quot;sudo cp Level-complete-sound-effect.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
      system(&amp;quot;sudo cp Raindrops-noise.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Séance 3 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous avons pu tester l'envoi sur changement d'état, toujours avec les diodes du FPGA.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par ajouter une horloge sur le détecteur de changement d'état, afin d'augmenter le nombre d'incréments d'horloge sur lequel il est à '1', et ce dans le but de rendre le clignotement d'un diode visible à l’œil nu.&lt;br /&gt;
Ensuite, nous avons relié la sortie du détecteur de changement d'état et des phototransistors par un 'ET' logique, que nous avons ensuite relié aux diodes du FPGA.&lt;br /&gt;
De cette façon, si l'on détecte un changement d'état sur un phototransistor, la nouvelle valeur est alors envoyée sur les diodes. Le système a fonctionné (à voir :p ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos du test avec changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite passé le reste de la séance à mettre en commun notre partie avec la partie informatique, en essayant de leur permettre de lire sur le port série du FPGA. Les essais ont pour l'instant été infructueux, mais des progrès ont été faits. &lt;br /&gt;
&lt;br /&gt;
L'objectif étant que le Raspberry Pi puisse lire les informations envoyées par le FPGA, pour ensuite les transmettre au site Web que nous allons réaliser par la suite.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 1 : Réalisation du site Web ==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé ce site web lors de notre temps libre afin de permettre la communication entre le Raspberry Pi et l'ordinateur. En effet, il était inclus dans notre projet de devoir réaliser une communication par internet. Ce site internet va donc remplir cette condition. Sur celui-ci, on pourra trouver une brève description de notre projet, un lien vers le wiki, une image exemple d'un harpe et les boutons Play et Pause qui permettent d'activer et de désactiver la harpe laser.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 2 : Réalisation du programme secondaire sur Arduino 'en cas de problèmes' ==&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis à plusieurs occasions en dehors des heures de projet afin d'avancer sur notre harpe. Nous avons donc décidé que nous devions réaliser un programme sur Arduino nous permettant de réaliser des tests de transmission par la liaison série sans avoir besoin du FPGA. Dans un premier temps, nous avons tenté d'utiliser le port USB comme liaison série. Cependant, il s'est avéré que le Raspberry pi ne pouvait pas lire son port USB, ce qui nous a donc forcé à utiliser les pins de communication série de l'Arduino. &lt;br /&gt;
Nous sommes sur un Arduino Mega 2560, nous avons a notre disposition plusieurs pins de communication série différents. Ils seront utilisés uniquement en transmission. Pour communiquer, nous allons ensuite utiliser le pin Tx1. Nous aboutissons donc au programme suivant:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Setup.PNG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Captprog.PNG]]&lt;br /&gt;
&lt;br /&gt;
La communication série de ce programme nous a causé des problèmes, surtout du fait que l'ordinateur ne recevait pas les informations transmises par l'Arduino. Nous avons donc du effectuer de multiples tests afin de voir où se situait le problème. Nous avons pu déterminer que nous avions un problème au niveau de notre pont diviseur de tension entre l'alimentation de l’Arduino et celle du Raspberry Pi, nous avons alors changé les résistances.&lt;br /&gt;
Nous avons également notamment modifié le programme afin de vérifier que l'information était bien transmise sur le Pin Série de l'Arduino, et que le problème ne venait donc pas de l'Arduino mais bien du Raspberry, qui ne transmet pas correctement l'information à l'ordinateur.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 3 : Assemblage de la boite et mise en place des composants ==&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43724</id>
		<title>Projet IMA3 P5, 2016/2017, TD1</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43724"/>
				<updated>2017-06-12T08:45:54Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : /* Partie informatique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet IMA3-SC 2016/2017 : Synt'Harpe (Sainte) Laser =&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Description du système ===&lt;br /&gt;
&lt;br /&gt;
Pour le projet Système Communicant, nous allons réaliser une harpe laser. Notre but est de créer un instrument de musique similaire à une harpe, où les cordes sont remplacées par des capteurs infra-rouges.&lt;br /&gt;
&lt;br /&gt;
Un son sera émis par l'ordinateur dès que le capteur IR captera une main et le joueur pourra avec son autre main moduler l'amplitude de la note.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on travaillera sur une gamme de son sur 8 bits. Puis, nous implémenterons une banque de sons qui nous permettra de sélectionner l'instrument désiré, d'où l'appellation Synt'Harpe.&lt;br /&gt;
&lt;br /&gt;
L'ordinateur décidera du fonctionnement ou non de la harpe. C'est aussi grâce à lui qu'on pourra choisir la banque de sons voulue.&lt;br /&gt;
&lt;br /&gt;
Toutes les banques de sons seront enregistrées sur le Raspberry.&lt;br /&gt;
Les LEDs signaleront l'emplacement des cordes.&lt;br /&gt;
&lt;br /&gt;
Pour la partie optionnelle, on remplacera les LEDs par des lasers pour un effet visuel de qualité (plus poussé). La fumée permettra de voir les lasers.&lt;br /&gt;
&lt;br /&gt;
=== Le matériel ===&lt;br /&gt;
* Un raspberry pi&lt;br /&gt;
* 8 phototransistors&lt;br /&gt;
* 8 émetteurs lasers&lt;br /&gt;
* Des résistances&lt;br /&gt;
* Une structure&lt;br /&gt;
* Carte d'acquisition de type Arduino au début puis FPGA &lt;br /&gt;
* Un ordinateur&lt;br /&gt;
* Une alimentation&lt;br /&gt;
&lt;br /&gt;
=== Optionnel (visuel) ===&lt;br /&gt;
&lt;br /&gt;
* 8 émetteurs laser&lt;br /&gt;
* Un générateur de fumée&lt;br /&gt;
* Une caméra&lt;br /&gt;
&lt;br /&gt;
== Séance 1 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Le but de cette première séance était de se répartir les tâches, de tester le matériel mit à disposition et de découvrir le fonctionnement du FPGA.&lt;br /&gt;
&lt;br /&gt;
Le principe de fonctionnement de la harpe est le suivant:&lt;br /&gt;
Chaque capteur sera situé en face d'un laser. Les capteurs seront dans la partie haute de la harpe afin de limiter les interférences dues à d'autres sources lumineuses. Chaque laser pointera vers un capteur. &lt;br /&gt;
&lt;br /&gt;
 * Ajout du dessin de la harpe * &lt;br /&gt;
&lt;br /&gt;
Les capteurs enverront tous par défaut la même valeur au FPGA. Quand l'utilisateur passera sa main dans la harpe, un faisceau laser sera coupé. Le capteur n'enverra plus sa valeur seuil au FPGA, il aura donc changé d'état.&lt;br /&gt;
Dès lors que le FPGA détectera un changement d'état, il enverra l'état dans lequel se trouvent les 8 capteurs au Raspberry. &lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé des tests sur les phototransistors et les lasers. Nous avons mis en parallèle un laser et deux capteurs, sans oublier leur résistance de 1.2k Ohms chacune. &lt;br /&gt;
&lt;br /&gt;
Nous avons vu que à luminosité ambiante, quand le laser pointe sur le capteur, celui-ci envoie à l'Arduino une valeur de 950 environ. Ensuite, quand le faisceau laser est coupé, la valeur envoyée par le phototransistor monte à 1020.&lt;br /&gt;
Puis, nous avons réitéré l'expérience en mettant le système dans une boîte. Cette fois, le valeur est passée de 840 quand le capteur est éclairé par le laser à 900 quand le faisceau est coupé.&lt;br /&gt;
Nous en avons déduit que nous allons devoir refaire l'expérience une fois la harpe assemblée.&lt;br /&gt;
&lt;br /&gt;
Les lasers étant très directionnels tout comme les phototransistors, nous n'aurons pas de soucis d'interférences. Un capteur détectera uniquement le laser situé directement en face de lui et non ceux de son voisinage.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Même si il peut paraitre futile d'insérer une partie boitier dans un projet centré sur l'informatique et l'électronique, il s'est avéré que le boitier de notre Harpe nécessitait une attention particulière.&lt;br /&gt;
&lt;br /&gt;
La taille de la harpe à été un sujet de débat, et nous avons réalisé des tests afin de vérifier que des phototransistors trop proches les uns des autres n'allait pas compromettre le bon fonctionnement de la harpe dans son ensemble. En effet, si le phototransistor détectait un autre laser que celui vers lequel il pointe serait extrêmement problématique. Heureusement, il s'est avéré que les phototransistors sont très directionnels, au point que se pose désormais le problème inverse.&lt;br /&gt;
&lt;br /&gt;
Nous allons devoir faire très attention au fait que les lasers soient bien fixés et pointent exactement vers les phototransistors, car dans le cas contraire, ceux-ci ne détectent absolument pas le laser, et tout le principe de fonctionnement s'effondre. La conception et l'assemblage de la boite devront donc être relativement précis, pour éviter ces problèmes.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons dès le départ décidé d'éviter l'utilisation de diodes infra-rouges, pour leur préférer les lasers. Tout d'abord, parce que les diodes ne sont en aucun cas assez puissantes pour être détectées par les phototransistors, ce qui une fois de plus rend notre harpe inutile. Ensuite, parce qu'il nous a semblé que réaliser une harpe 'laser' sans lasers était un concept déconcertant, et enlève beaucoup de l’intérêt de ce projet.&lt;br /&gt;
&lt;br /&gt;
Un premier jet de design avait été réalisé avant cette séance, et au vu des données récoltées pendant celle-ci, nous l'avons modifié pour les prendre en compte, notamment la taille des lasers par rapport aux diodes, et la précision requise. &lt;br /&gt;
&lt;br /&gt;
'insérer photos premiers schémas ici'&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le travail a été séparé en 2 parties, une personne par partie : &lt;br /&gt;
- une première partie sur le serveur même (page web, système de streaming de son depuis la page web)&lt;br /&gt;
- une seconde partie sur la lecture du port série&lt;br /&gt;
&lt;br /&gt;
==== Partie serveur ====&lt;br /&gt;
La première séance a été consacré à deux grands axes : prendre la main à distance sur le raspberry pi et mettre en place le serveur web.&lt;br /&gt;
Afin de pouvoir contrôler et travailler facilement sur le RPi, l'outil vncserver a été installé sur le raspberry, permettant de contrôler via un interface graphique le RPi depuis un ordinateur branché sur le même réseau. Cet utilitaire permettra a l'avenir de travailler directement sur le RPi sans devoir constamment uploader par ssh le travail effectué.&lt;br /&gt;
&lt;br /&gt;
Coté mise en place du serveur web, l'utilitaire de serveur web apache2 a été installé sans soucis, et les pages d'exemples web et javascript fonctionnent. En revanche, l'utilisation du code d'exemple sur les sockets n'est pas utilisable, le paquet proposé n’existe pas et le site du paquet de socket est mort.&lt;br /&gt;
Le reste de la séance a été consacré a des recherches sur les moyens de pouvoir streamer du son, recherches non concluantes. Aucune solution n'a été trouvé sans passer par un service internet hébergé par un tier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Partie lecture port série ====&lt;br /&gt;
&lt;br /&gt;
Cette première séance fut consacrée à la sélection du langage de programmation et à sa prise en main. Il a été décidé d'utiliser Python pour écrire le programme récupérant et traitant les données récupérées à travers le port série. Python étant un langage fort usité, il possède une très large documentation. Ce fut donc facile de trouver la librairie permettant de lire les données envoyées par le port série.&lt;br /&gt;
&lt;br /&gt;
Un doute subsiste encore sur le type de données envoyé par le port série. L'idéal serait de récupérer un tableau de 8 entiers de type binaire correspondant aux états des 8 ports liés aux &amp;quot;cordes&amp;quot; laser, pour pouvoir ensuite traiter ces données facilement.&lt;br /&gt;
&lt;br /&gt;
== Séance 2 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Lors de cette séance, nous avons réalisé le premier circuit sur le FPGA. &lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un circuit simple, qui envoie en permanence l'état des huit phototransistors au port série. Les phototransistors sont alors directement reliés à celui-ci. Nous avons pu tester le bon fonctionnement du système grâce aux diodes du FPGA. Nous avons branché en parallèle sur le circuit les huit diodes, afin de vérifier qu'un signal était bien envoyé en permanence, on a pu les voir s'éteindre lorsqu'on éclairait un laser. &lt;br /&gt;
Ces diodes se sont avérées très utiles, car il n'est pas encore possible d'effectuer les tests sur le port série, car la partie informatique n'est pas encore opérationnelle, on ne peut donc pas lire directement sur le port série pour le moment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi constant ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite réalisé un montage permettant de faire l'envoi seulement sur changement d'état, comme prévu à la séance 1 Nous avons donc réalisé un système de bascules permettant de comparer l'état actuel de chaque diode avec son état précédent, puis de réaliser l'envoi seulement si une différence était observée. Comme précédemment, les diodes sont reliées directement au Port Série, mais cette fois-ci au lieu de brancher le Bit d'envoi du port Série sur un Vcc, soit un '1' logique, nous l'avons relié à la vérification de changement d'état, qui passe à '1' uniquement avec un changement d'état.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi sur changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème qui s'est alors posé était de savoir si on envoyait le signal assez longtemps pour qu'il puisse être lu. En effet on envoie un signal seulement si il y a changement d'état, et cette vérification se fait à chaque incrément d'horloge. Hors, la différence sera donc observée sur un seul incrément d'horloge, par conséquent, on n'envoie de signal que pendant ce seul incrément. Pour l'instant, nous supposons que le port série est capable de stocker les données à envoyer en un seul incrément d'horloge. &lt;br /&gt;
Cependant, si lors des tests, ça ne fonctionne pas, nous prévoyons d'utiliser un compteur pour pouvoir envoyer le signal plus longtemps au Bit d'envoi du port série, et ainsi laisser le temps au port série d'envoyer l'information.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous nous sommes focalisés sur le FPGA, mais nous avons néanmoins terminé la conception du boitier de la harpe, sous la forme de trois 'boites' crénelées, que nous avons ensuite l'intention de découper au FabLab puis d'assembler.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos des boites ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il s'est avéré que réaliser des boites crénelées rendrait tout le boitier beaucoup plus solide, et donc fiable.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le problème de l'impossibilité d'utiliser l'exemple sur les sockets a été résolu, grâce à l'intervention de M. Redon. Le problème était une différence de version de la distribution Linux entre le RPi utilisé et celle utilisé pour l'exemple. En effet, le RPi de travail est sur une distribution Wheezy, alors que la version la plus récente est la Jessie. Les chemins des dépots des sources de la librairie libwebsocket n’existant pas sur Wheezy, on ne pouvait installer la librairie directement en ligne de commande. M. Redon a ajouté le chemin de la librairie dans le gestionnaire de paquet du RPi et on a pu utiliser sans problèmes la librairie. De plus le site du paquet libwebsocket n'était inaccessible que temporairement.&lt;br /&gt;
La séance a été consacré à comprendre le fonctionnement des sockets et comment l'exemple html interagissait avec.&lt;br /&gt;
&lt;br /&gt;
La partie importante du code d'exemple est la suivante : &lt;br /&gt;
&lt;br /&gt;
 static int callback_my(&lt;br /&gt;
  struct libwebsocket_context * this,&lt;br /&gt;
  struct libwebsocket *wsi,enum libwebsocket_callback_reasons reason,&lt;br /&gt;
  void *user,void *in,size_t len)&lt;br /&gt;
 {&lt;br /&gt;
 static char *message=NULL;&lt;br /&gt;
 static int msize=0;&lt;br /&gt;
 switch(reason){&lt;br /&gt;
  case LWS_CALLBACK_ESTABLISHED:&lt;br /&gt;
    printf(&amp;quot;connection established\n&amp;quot;);&lt;br /&gt;
    message=NULL;&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_RECEIVE:&lt;br /&gt;
                // Ici sont traites les messages envoyes par le navigateur&lt;br /&gt;
    printf(&amp;quot;received data: %s\n&amp;quot;,(char *)in);&lt;br /&gt;
    message=malloc(len+LWS_SEND_BUFFER_PRE_PADDING+LWS_SEND_BUFFER_POST_PADDING);&lt;br /&gt;
    if(message==NULL){ perror(&amp;quot;callback_my.malloc&amp;quot;); exit(EXIT_FAILURE); }&lt;br /&gt;
    memcpy(message+LWS_SEND_BUFFER_PRE_PADDING,in,len);&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    msize=len;&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_SERVER_WRITEABLE:&lt;br /&gt;
                // Ici sont envoyes les messages au navigateur&lt;br /&gt;
    if(message!=NULL){&lt;br /&gt;
      char *out=message+LWS_SEND_BUFFER_PRE_PADDING;&lt;br /&gt;
      libwebsocket_write(wsi,(unsigned char *)out,msize,LWS_WRITE_TEXT);&lt;br /&gt;
      free(message);&lt;br /&gt;
      message=NULL;&lt;br /&gt;
      }&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    break;&lt;br /&gt;
  }&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une fonction de callback gérant à la fois la réception et la transmission. On peut remarquer 3 cas du switch : LWS_CALLBACK_ESTABLISHED correspondant à la création d'un lien entre la page web et le serveur websocket à la demande de la page web, LWS_CALLBACK_RECEIVE correspondant aux actions à entreprendre à la réception d'un message provenant du navigateur web, et LWS_CALLBACK_SERVER_WRITEABLE correspondant aux actions afin d'envoyer un message au navigateur.&lt;br /&gt;
&lt;br /&gt;
Coté HTML, on utilise les sockets grâce à ce code suivant :&lt;br /&gt;
 &lt;br /&gt;
 window.WebSocket=(window.WebSocket||window.MozWebSocket);&lt;br /&gt;
&lt;br /&gt;
 var websocket=new WebSocket('ws://127.0.0.1:9000','myprotocol');&lt;br /&gt;
&lt;br /&gt;
 websocket.onopen=function(){ $('h1').css('color','green'); };&lt;br /&gt;
&lt;br /&gt;
 websocket.onerror=function(){ $('h1').css('color','red'); };&lt;br /&gt;
&lt;br /&gt;
  websocket.onmessage=function(message){&lt;br /&gt;
  console.log(message.data);&lt;br /&gt;
  $('#messages').append($('&amp;lt;p&amp;gt;',{ text: message.data }));&lt;br /&gt;
  };&lt;br /&gt;
  function sendMessage(){&lt;br /&gt;
  websocket.send($('#message').val());&lt;br /&gt;
  $('#message').val('');&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La fonction websocket.onmessage gère le traitement à faire coté client quand le serveur envoie des informations, et la fonction sendMessage permet l'envoie d'information du client vers le serveur.&lt;br /&gt;
&lt;br /&gt;
Pour notre projet, nous avons besoin principalement, dans un premier temps, d'envoyer des informations du serveur vers le client, nous nous sommes donc concentrer à comprendre et modifier les parties du code fourni suivantes : websocket.onmessage coté client et le &amp;quot;case LWS_CALLBACK_SERVER_WRITEABLE:&amp;quot; coté serveur.&lt;br /&gt;
&lt;br /&gt;
Le but des tests était de réussir à faire jouer deux sons différents par le client, avec changement de son imposé par le serveur. HTML5 propose nativement de lire des sons à partir d'une source grâce à une balise audio :&lt;br /&gt;
 &amp;lt;audio controls=&amp;quot;controls&amp;quot; id=&amp;quot;mySound&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/audio&amp;gt;&lt;br /&gt;
On récupère l'identifiant de cette balise avec &lt;br /&gt;
 var test1 = document.getElementById(&amp;quot;mySound&amp;quot;);&lt;br /&gt;
afin de pouvoir l'utiliser de n'importe où dans le programme.&lt;br /&gt;
On définit la source grâce à &lt;br /&gt;
 test1.src=&amp;quot;sound.mp3&amp;quot;;&lt;br /&gt;
avec &amp;quot;sound.mp3&amp;quot; le chemin d'accès au fichier son par rapport à l'emplacement du fichier html sur le serveur. Ici, le fichier son sound.mp3 est dans le même dossier que la page index.html.&lt;br /&gt;
Enfin, on peut lire le son avec &lt;br /&gt;
 test1.play();&lt;br /&gt;
&lt;br /&gt;
Le but du projet étant d'émettre en continue le son généré par la harpe, l'objectif ici est soit de générer un fichier de streaming que l'on lit en continue, soit de lire un fichier différent par son possible et on change la valeur de test1.src en fonction du son à lire, soit on lit toujours la même source, mais que l'on modifie à la volée en fonction du son voulu. La première option a été étudiée jusqu'en fin de séance.&lt;br /&gt;
Nous n'avons pas réussi à comprendre comment générer un fichier de streaming audio simple, de plus toutes les documentations et exemples trouvés ne concernant qu'un streaming simultanée de son et de vidéo à partir d'une caméra et d'un micro, et nous n'avons pas compris comment adapter ces exemples.&lt;br /&gt;
&lt;br /&gt;
  int cpt;&lt;br /&gt;
  for (cpt = 0; cpt &amp;lt; 250000000; cpt++);&lt;br /&gt;
&lt;br /&gt;
    boole = !boole;&lt;br /&gt;
	printf(&amp;quot;changement: %d\n&amp;quot;,boole);&lt;br /&gt;
    if(boole)&lt;br /&gt;
      system(&amp;quot;sudo cp Level-complete-sound-effect.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
      system(&amp;quot;sudo cp Raindrops-noise.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Séance 3 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous avons pu tester l'envoi sur changement d'état, toujours avec les diodes du FPGA.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par ajouter une horloge sur le détecteur de changement d'état, afin d'augmenter le nombre d'incréments d'horloge sur lequel il est à '1', et ce dans le but de rendre le clignotement d'un diode visible à l’œil nu.&lt;br /&gt;
Ensuite, nous avons relié la sortie du détecteur de changement d'état et des phototransistors par un 'ET' logique, que nous avons ensuite relié aux diodes du FPGA.&lt;br /&gt;
De cette façon, si l'on détecte un changement d'état sur un phototransistor, la nouvelle valeur est alors envoyée sur les diodes. Le système a fonctionné (à voir :p ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos du test avec changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite passé le reste de la séance à mettre en commun notre partie avec la partie informatique, en essayant de leur permettre de lire sur le port série du FPGA. Les essais ont pour l'instant été infructueux, mais des progrès ont été faits. &lt;br /&gt;
&lt;br /&gt;
L'objectif étant que le Raspberry Pi puisse lire les informations envoyées par le FPGA, pour ensuite les transmettre au site Web que nous allons réaliser par la suite.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 1 : Réalisation du site Web ==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé ce site web lors de notre temps libre afin de permettre la communication entre le Raspberry Pi et l'ordinateur. En effet, il était inclus dans notre projet de devoir réaliser une communication par internet. Ce site internet va donc remplir cette condition. Sur celui-ci, on pourra trouver une brève description de notre projet, un lien vers le wiki, une image exemple d'un harpe et les boutons Play et Pause qui permettent d'activer et de désactiver la harpe laser.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 2 : Réalisation du programme secondaire sur Arduino 'en cas de problèmes' ==&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis à plusieurs occasions en dehors des heures de projet afin d'avancer sur notre harpe. Nous avons donc décidé que nous devions réaliser un programme sur Arduino nous permettant de réaliser des tests de transmission par la liaison série sans avoir besoin du FPGA. Dans un premier temps, nous avons tenté d'utiliser le port USB comme liaison série. Cependant, il s'est avéré que le Raspberry pi ne pouvait pas lire son port USB, ce qui nous a donc forcé à utiliser les pins de communication série de l'Arduino. &lt;br /&gt;
Nous sommes sur un Arduino Mega 2560, nous avons a notre disposition plusieurs pins de communication série différents. Ils seront utilisés uniquement en transmission. Pour communiquer, nous allons ensuite utiliser le pin Tx1. Nous aboutissons donc au programme suivant:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Setup.PNG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Captprog.PNG]]&lt;br /&gt;
&lt;br /&gt;
La communication série de ce programme nous a causé des problèmes, surtout du fait que l'ordinateur ne recevait pas les informations transmises par l'Arduino. Nous avons donc du effectuer de multiples tests afin de voir où se situait le problème. Nous avons pu déterminer que nous avions un problème au niveau de notre pont diviseur de tension entre l'alimentation de l’Arduino et celle du Raspberry Pi, nous avons alors changé les résistances.&lt;br /&gt;
Nous avons également notamment modifié le programme afin de vérifier que l'information était bien transmise sur le Pin Série de l'Arduino, et que le problème ne venait donc pas de l'Arduino mais bien du Raspberry, qui ne transmet pas correctement l'information à l'ordinateur.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 3 : Assemblage de la boite et mise en place des composants ==&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43722</id>
		<title>Projet IMA3 P5, 2016/2017, TD1</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43722"/>
				<updated>2017-06-12T08:43:14Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : /* Partie informatique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet IMA3-SC 2016/2017 : Synt'Harpe (Sainte) Laser =&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Description du système ===&lt;br /&gt;
&lt;br /&gt;
Pour le projet Système Communicant, nous allons réaliser une harpe laser. Notre but est de créer un instrument de musique similaire à une harpe, où les cordes sont remplacées par des capteurs infra-rouges.&lt;br /&gt;
&lt;br /&gt;
Un son sera émis par l'ordinateur dès que le capteur IR captera une main et le joueur pourra avec son autre main moduler l'amplitude de la note.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on travaillera sur une gamme de son sur 8 bits. Puis, nous implémenterons une banque de sons qui nous permettra de sélectionner l'instrument désiré, d'où l'appellation Synt'Harpe.&lt;br /&gt;
&lt;br /&gt;
L'ordinateur décidera du fonctionnement ou non de la harpe. C'est aussi grâce à lui qu'on pourra choisir la banque de sons voulue.&lt;br /&gt;
&lt;br /&gt;
Toutes les banques de sons seront enregistrées sur le Raspberry.&lt;br /&gt;
Les LEDs signaleront l'emplacement des cordes.&lt;br /&gt;
&lt;br /&gt;
Pour la partie optionnelle, on remplacera les LEDs par des lasers pour un effet visuel de qualité (plus poussé). La fumée permettra de voir les lasers.&lt;br /&gt;
&lt;br /&gt;
=== Le matériel ===&lt;br /&gt;
* Un raspberry pi&lt;br /&gt;
* 8 phototransistors&lt;br /&gt;
* 8 émetteurs lasers&lt;br /&gt;
* Des résistances&lt;br /&gt;
* Une structure&lt;br /&gt;
* Carte d'acquisition de type Arduino au début puis FPGA &lt;br /&gt;
* Un ordinateur&lt;br /&gt;
* Une alimentation&lt;br /&gt;
&lt;br /&gt;
=== Optionnel (visuel) ===&lt;br /&gt;
&lt;br /&gt;
* 8 émetteurs laser&lt;br /&gt;
* Un générateur de fumée&lt;br /&gt;
* Une caméra&lt;br /&gt;
&lt;br /&gt;
== Séance 1 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Le but de cette première séance était de se répartir les tâches, de tester le matériel mit à disposition et de découvrir le fonctionnement du FPGA.&lt;br /&gt;
&lt;br /&gt;
Le principe de fonctionnement de la harpe est le suivant:&lt;br /&gt;
Chaque capteur sera situé en face d'un laser. Les capteurs seront dans la partie haute de la harpe afin de limiter les interférences dues à d'autres sources lumineuses. Chaque laser pointera vers un capteur. &lt;br /&gt;
&lt;br /&gt;
 * Ajout du dessin de la harpe * &lt;br /&gt;
&lt;br /&gt;
Les capteurs enverront tous par défaut la même valeur au FPGA. Quand l'utilisateur passera sa main dans la harpe, un faisceau laser sera coupé. Le capteur n'enverra plus sa valeur seuil au FPGA, il aura donc changé d'état.&lt;br /&gt;
Dès lors que le FPGA détectera un changement d'état, il enverra l'état dans lequel se trouvent les 8 capteurs au Raspberry. &lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé des tests sur les phototransistors et les lasers. Nous avons mis en parallèle un laser et deux capteurs, sans oublier leur résistance de 1.2k Ohms chacune. &lt;br /&gt;
&lt;br /&gt;
Nous avons vu que à luminosité ambiante, quand le laser pointe sur le capteur, celui-ci envoie à l'Arduino une valeur de 950 environ. Ensuite, quand le faisceau laser est coupé, la valeur envoyée par le phototransistor monte à 1020.&lt;br /&gt;
Puis, nous avons réitéré l'expérience en mettant le système dans une boîte. Cette fois, le valeur est passée de 840 quand le capteur est éclairé par le laser à 900 quand le faisceau est coupé.&lt;br /&gt;
Nous en avons déduit que nous allons devoir refaire l'expérience une fois la harpe assemblée.&lt;br /&gt;
&lt;br /&gt;
Les lasers étant très directionnels tout comme les phototransistors, nous n'aurons pas de soucis d'interférences. Un capteur détectera uniquement le laser situé directement en face de lui et non ceux de son voisinage.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Même si il peut paraitre futile d'insérer une partie boitier dans un projet centré sur l'informatique et l'électronique, il s'est avéré que le boitier de notre Harpe nécessitait une attention particulière.&lt;br /&gt;
&lt;br /&gt;
La taille de la harpe à été un sujet de débat, et nous avons réalisé des tests afin de vérifier que des phototransistors trop proches les uns des autres n'allait pas compromettre le bon fonctionnement de la harpe dans son ensemble. En effet, si le phototransistor détectait un autre laser que celui vers lequel il pointe serait extrêmement problématique. Heureusement, il s'est avéré que les phototransistors sont très directionnels, au point que se pose désormais le problème inverse.&lt;br /&gt;
&lt;br /&gt;
Nous allons devoir faire très attention au fait que les lasers soient bien fixés et pointent exactement vers les phototransistors, car dans le cas contraire, ceux-ci ne détectent absolument pas le laser, et tout le principe de fonctionnement s'effondre. La conception et l'assemblage de la boite devront donc être relativement précis, pour éviter ces problèmes.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons dès le départ décidé d'éviter l'utilisation de diodes infra-rouges, pour leur préférer les lasers. Tout d'abord, parce que les diodes ne sont en aucun cas assez puissantes pour être détectées par les phototransistors, ce qui une fois de plus rend notre harpe inutile. Ensuite, parce qu'il nous a semblé que réaliser une harpe 'laser' sans lasers était un concept déconcertant, et enlève beaucoup de l’intérêt de ce projet.&lt;br /&gt;
&lt;br /&gt;
Un premier jet de design avait été réalisé avant cette séance, et au vu des données récoltées pendant celle-ci, nous l'avons modifié pour les prendre en compte, notamment la taille des lasers par rapport aux diodes, et la précision requise. &lt;br /&gt;
&lt;br /&gt;
'insérer photos premiers schémas ici'&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le travail a été séparé en 2 parties, une personne par partie : &lt;br /&gt;
- une première partie sur le serveur même (page web, système de streaming de son depuis la page web)&lt;br /&gt;
- une seconde partie sur la lecture du port série&lt;br /&gt;
&lt;br /&gt;
==== Partie serveur ====&lt;br /&gt;
La première séance a été consacré à deux grands axes : prendre la main à distance sur le raspberry pi et mettre en place le serveur web.&lt;br /&gt;
Afin de pouvoir contrôler et travailler facilement sur le RPi, l'outil vncserver a été installé sur le raspberry, permettant de contrôler via un interface graphique le RPi depuis un ordinateur branché sur le même réseau. Cet utilitaire permettra a l'avenir de travailler directement sur le RPi sans devoir constamment uploader par ssh le travail effectué.&lt;br /&gt;
&lt;br /&gt;
Coté mise en place du serveur web, l'utilitaire de serveur web apache2 a été installé sans soucis, et les pages d'exemples web et javascript fonctionnent. En revanche, l'utilisation du code d'exemple sur les sockets n'est pas utilisable, le paquet proposé n’existe pas et le site du paquet de socket est mort.&lt;br /&gt;
Le reste de la séance a été consacré a des recherches sur les moyens de pouvoir streamer du son, recherches non concluantes. Aucune solution n'a été trouvé sans passer par un service internet hébergé par un tier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Partie lecture port série ====&lt;br /&gt;
&lt;br /&gt;
Cette première séance fut consacrée à la sélection du langage de programmation et à sa prise en main. Il a été décidé d'utiliser Python pour écrire le programme récupérant et traitant les données récupérées à travers le port série. Python étant un langage fort usité, il possède une très large documentation. Ce fut donc facile de trouver la librairie permettant de lire les données envoyées par le port série.&lt;br /&gt;
&lt;br /&gt;
Un doute subsiste encore sur le type de données envoyé par le port série. L'idéal serait de récupérer un tableau de 8 entiers de type binaire correspondant aux états des 8 ports liés aux &amp;quot;cordes&amp;quot; laser, pour pouvoir ensuite traiter ces données facilement.&lt;br /&gt;
&lt;br /&gt;
== Séance 2 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Lors de cette séance, nous avons réalisé le premier circuit sur le FPGA. &lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un circuit simple, qui envoie en permanence l'état des huit phototransistors au port série. Les phototransistors sont alors directement reliés à celui-ci. Nous avons pu tester le bon fonctionnement du système grâce aux diodes du FPGA. Nous avons branché en parallèle sur le circuit les huit diodes, afin de vérifier qu'un signal était bien envoyé en permanence, on a pu les voir s'éteindre lorsqu'on éclairait un laser. &lt;br /&gt;
Ces diodes se sont avérées très utiles, car il n'est pas encore possible d'effectuer les tests sur le port série, car la partie informatique n'est pas encore opérationnelle, on ne peut donc pas lire directement sur le port série pour le moment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi constant ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite réalisé un montage permettant de faire l'envoi seulement sur changement d'état, comme prévu à la séance 1 Nous avons donc réalisé un système de bascules permettant de comparer l'état actuel de chaque diode avec son état précédent, puis de réaliser l'envoi seulement si une différence était observée. Comme précédemment, les diodes sont reliées directement au Port Série, mais cette fois-ci au lieu de brancher le Bit d'envoi du port Série sur un Vcc, soit un '1' logique, nous l'avons relié à la vérification de changement d'état, qui passe à '1' uniquement avec un changement d'état.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi sur changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème qui s'est alors posé était de savoir si on envoyait le signal assez longtemps pour qu'il puisse être lu. En effet on envoie un signal seulement si il y a changement d'état, et cette vérification se fait à chaque incrément d'horloge. Hors, la différence sera donc observée sur un seul incrément d'horloge, par conséquent, on n'envoie de signal que pendant ce seul incrément. Pour l'instant, nous supposons que le port série est capable de stocker les données à envoyer en un seul incrément d'horloge. &lt;br /&gt;
Cependant, si lors des tests, ça ne fonctionne pas, nous prévoyons d'utiliser un compteur pour pouvoir envoyer le signal plus longtemps au Bit d'envoi du port série, et ainsi laisser le temps au port série d'envoyer l'information.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous nous sommes focalisés sur le FPGA, mais nous avons néanmoins terminé la conception du boitier de la harpe, sous la forme de trois 'boites' crénelées, que nous avons ensuite l'intention de découper au FabLab puis d'assembler.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos des boites ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il s'est avéré que réaliser des boites crénelées rendrait tout le boitier beaucoup plus solide, et donc fiable.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le problème de l'impossibilité d'utiliser l'exemple sur les sockets a été résolu, grâce à l'intervention de M. Redon. Le problème était une différence de version de la distribution Linux entre le RPi utilisé et celle utilisé pour l'exemple. En effet, le RPi de travail est sur une distribution Wheezy, alors que la version la plus récente est la Jessie. Les chemins des dépots des sources de la librairie libwebsocket n’existant pas sur Wheezy, on ne pouvait installer la librairie directement en ligne de commande. M. Redon a ajouté le chemin de la librairie dans le gestionnaire de paquet du RPi et on a pu utiliser sans problèmes la librairie. De plus le site du paquet libwebsocket n'était inaccessible que temporairement.&lt;br /&gt;
La séance a été consacré à comprendre le fonctionnement des sockets et comment l'exemple html interagissait avec.&lt;br /&gt;
&lt;br /&gt;
La partie importante du code d'exemple est la suivante : &lt;br /&gt;
&lt;br /&gt;
 static int callback_my(&lt;br /&gt;
  struct libwebsocket_context * this,&lt;br /&gt;
  struct libwebsocket *wsi,enum libwebsocket_callback_reasons reason,&lt;br /&gt;
  void *user,void *in,size_t len)&lt;br /&gt;
 {&lt;br /&gt;
 static char *message=NULL;&lt;br /&gt;
 static int msize=0;&lt;br /&gt;
 switch(reason){&lt;br /&gt;
  case LWS_CALLBACK_ESTABLISHED:&lt;br /&gt;
    printf(&amp;quot;connection established\n&amp;quot;);&lt;br /&gt;
    message=NULL;&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_RECEIVE:&lt;br /&gt;
                // Ici sont traites les messages envoyes par le navigateur&lt;br /&gt;
    printf(&amp;quot;received data: %s\n&amp;quot;,(char *)in);&lt;br /&gt;
    message=malloc(len+LWS_SEND_BUFFER_PRE_PADDING+LWS_SEND_BUFFER_POST_PADDING);&lt;br /&gt;
    if(message==NULL){ perror(&amp;quot;callback_my.malloc&amp;quot;); exit(EXIT_FAILURE); }&lt;br /&gt;
    memcpy(message+LWS_SEND_BUFFER_PRE_PADDING,in,len);&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    msize=len;&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_SERVER_WRITEABLE:&lt;br /&gt;
                // Ici sont envoyes les messages au navigateur&lt;br /&gt;
    if(message!=NULL){&lt;br /&gt;
      char *out=message+LWS_SEND_BUFFER_PRE_PADDING;&lt;br /&gt;
      libwebsocket_write(wsi,(unsigned char *)out,msize,LWS_WRITE_TEXT);&lt;br /&gt;
      free(message);&lt;br /&gt;
      message=NULL;&lt;br /&gt;
      }&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    break;&lt;br /&gt;
  }&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une fonction de callback gérant à la fois la réception et la transmission. On peut remarquer 3 cas du switch : LWS_CALLBACK_ESTABLISHED correspondant à la création d'un lien entre la page web et le serveur websocket à la demande de la page web, LWS_CALLBACK_RECEIVE correspondant aux actions à entreprendre à la réception d'un message provenant du navigateur web, et LWS_CALLBACK_SERVER_WRITEABLE correspondant aux actions afin d'envoyer un message au navigateur.&lt;br /&gt;
&lt;br /&gt;
Coté HTML, on utilise les sockets grâce à ce code suivant :&lt;br /&gt;
 &lt;br /&gt;
 window.WebSocket=(window.WebSocket||window.MozWebSocket);&lt;br /&gt;
&lt;br /&gt;
 var websocket=new WebSocket('ws://127.0.0.1:9000','myprotocol');&lt;br /&gt;
&lt;br /&gt;
 websocket.onopen=function(){ $('h1').css('color','green'); };&lt;br /&gt;
&lt;br /&gt;
 websocket.onerror=function(){ $('h1').css('color','red'); };&lt;br /&gt;
&lt;br /&gt;
  websocket.onmessage=function(message){&lt;br /&gt;
  console.log(message.data);&lt;br /&gt;
  $('#messages').append($('&amp;lt;p&amp;gt;',{ text: message.data }));&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  function sendMessage(){&lt;br /&gt;
  websocket.send($('#message').val());&lt;br /&gt;
  $('#message').val(''); &lt;br /&gt;
&lt;br /&gt;
La fonction websocket.onmessage gère le traitement à faire coté client quand le serveur envoie des informations, et la fonction sendMessage permet l'envoie d'information du client vers le serveur.&lt;br /&gt;
&lt;br /&gt;
Pour notre projet, nous avons besoin principalement, dans un premier temps, d'envoyer des informations du serveur vers le client, nous nous sommes donc concentrer à comprendre et modifier les parties du code fourni suivantes : websocket.onmessage coté client et le &amp;quot;case LWS_CALLBACK_SERVER_WRITEABLE:&amp;quot; coté serveur.&lt;br /&gt;
&lt;br /&gt;
Le but des tests était de réussir à faire jouer deux sons différents par le client, avec changement de son imposé par le serveur. HTML5 propose nativement de lire des sons à partir d'une source grâce à une balise audio :&lt;br /&gt;
 &amp;lt;audio controls=&amp;quot;controls&amp;quot; id=&amp;quot;mySound&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/audio&amp;gt;&lt;br /&gt;
On récupère l'identifiant de cette balise avec &lt;br /&gt;
 var test1 = document.getElementById(&amp;quot;mySound&amp;quot;);&lt;br /&gt;
afin de pouvoir l'utiliser de n'importe où dans le programme.&lt;br /&gt;
On définit la source grâce à &lt;br /&gt;
 test1.src=&amp;quot;sound.mp3&amp;quot;;&lt;br /&gt;
avec &amp;quot;sound.mp3&amp;quot; le chemin d'accès au fichier son par rapport à l'emplacement du fichier html sur le serveur. Ici, le fichier son sound.mp3 est dans le même dossier que la page index.html.&lt;br /&gt;
Enfin, on peut lire le son avec &lt;br /&gt;
 test1.play();&lt;br /&gt;
&lt;br /&gt;
Le but du projet étant d'émettre en continue le son généré par la harpe, l'objectif ici est soit de générer un fichier de streaming que l'on lit en continue, soit de lire un fichier différent par son possible et on change la valeur de test1.src en fonction du son à lire, soit on lit toujours la même source, mais que l'on modifie à la volée en fonction du son voulu. La première option a été étudiée jusqu'en fin de séance.&lt;br /&gt;
Nous n'avons pas réussi à comprendre comment générer un fichier de streaming audio simple, de plus toutes les documentations et exemples trouvés ne concernant qu'un streaming simultanée de son et de vidéo à partir d'une caméra et d'un micro, et nous n'avons pas compris comment adapter ces exemples.&lt;br /&gt;
&lt;br /&gt;
  int cpt;&lt;br /&gt;
  for (cpt = 0; cpt &amp;lt; 250000000; cpt++);&lt;br /&gt;
&lt;br /&gt;
    boole = !boole;&lt;br /&gt;
	printf(&amp;quot;changement: %d\n&amp;quot;,boole);&lt;br /&gt;
    if(boole)&lt;br /&gt;
      system(&amp;quot;sudo cp Level-complete-sound-effect.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
      system(&amp;quot;sudo cp Raindrops-noise.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Séance 3 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous avons pu tester l'envoi sur changement d'état, toujours avec les diodes du FPGA.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par ajouter une horloge sur le détecteur de changement d'état, afin d'augmenter le nombre d'incréments d'horloge sur lequel il est à '1', et ce dans le but de rendre le clignotement d'un diode visible à l’œil nu.&lt;br /&gt;
Ensuite, nous avons relié la sortie du détecteur de changement d'état et des phototransistors par un 'ET' logique, que nous avons ensuite relié aux diodes du FPGA.&lt;br /&gt;
De cette façon, si l'on détecte un changement d'état sur un phototransistor, la nouvelle valeur est alors envoyée sur les diodes. Le système a fonctionné (à voir :p ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos du test avec changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite passé le reste de la séance à mettre en commun notre partie avec la partie informatique, en essayant de leur permettre de lire sur le port série du FPGA. Les essais ont pour l'instant été infructueux, mais des progrès ont été faits. &lt;br /&gt;
&lt;br /&gt;
L'objectif étant que le Raspberry Pi puisse lire les informations envoyées par le FPGA, pour ensuite les transmettre au site Web que nous allons réaliser par la suite.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 1 : Réalisation du site Web ==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé ce site web lors de notre temps libre afin de permettre la communication entre le Raspberry Pi et l'ordinateur. En effet, il était inclus dans notre projet de devoir réaliser une communication par internet. Ce site internet va donc remplir cette condition. Sur celui-ci, on pourra trouver une brève description de notre projet, un lien vers le wiki, une image exemple d'un harpe et les boutons Play et Pause qui permettent d'activer et de désactiver la harpe laser.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 2 : Réalisation du programme secondaire sur Arduino 'en cas de problèmes' ==&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis à plusieurs occasions en dehors des heures de projet afin d'avancer sur notre harpe. Nous avons donc décidé que nous devions réaliser un programme sur Arduino nous permettant de réaliser des tests de transmission par la liaison série sans avoir besoin du FPGA. Dans un premier temps, nous avons tenté d'utiliser le port USB comme liaison série. Cependant, il s'est avéré que le Raspberry pi ne pouvait pas lire son port USB, ce qui nous a donc forcé à utiliser les pins de communication série de l'Arduino. &lt;br /&gt;
Nous sommes sur un Arduino Mega 2560, nous avons a notre disposition plusieurs pins de communication série différents. Ils seront utilisés uniquement en transmission. Pour communiquer, nous allons ensuite utiliser le pin Tx1. Nous aboutissons donc au programme suivant:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Setup.PNG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Captprog.PNG]]&lt;br /&gt;
&lt;br /&gt;
La communication série de ce programme nous a causé des problèmes, surtout du fait que l'ordinateur ne recevait pas les informations transmises par l'Arduino. Nous avons donc du effectuer de multiples tests afin de voir où se situait le problème. Nous avons pu déterminer que nous avions un problème au niveau de notre pont diviseur de tension entre l'alimentation de l’Arduino et celle du Raspberry Pi, nous avons alors changé les résistances.&lt;br /&gt;
Nous avons également notamment modifié le programme afin de vérifier que l'information était bien transmise sur le Pin Série de l'Arduino, et que le problème ne venait donc pas de l'Arduino mais bien du Raspberry, qui ne transmet pas correctement l'information à l'ordinateur.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 3 : Assemblage de la boite et mise en place des composants ==&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43721</id>
		<title>Projet IMA3 P5, 2016/2017, TD1</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43721"/>
				<updated>2017-06-12T08:40:55Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : /* Partie informatique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet IMA3-SC 2016/2017 : Synt'Harpe (Sainte) Laser =&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Description du système ===&lt;br /&gt;
&lt;br /&gt;
Pour le projet Système Communicant, nous allons réaliser une harpe laser. Notre but est de créer un instrument de musique similaire à une harpe, où les cordes sont remplacées par des capteurs infra-rouges.&lt;br /&gt;
&lt;br /&gt;
Un son sera émis par l'ordinateur dès que le capteur IR captera une main et le joueur pourra avec son autre main moduler l'amplitude de la note.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on travaillera sur une gamme de son sur 8 bits. Puis, nous implémenterons une banque de sons qui nous permettra de sélectionner l'instrument désiré, d'où l'appellation Synt'Harpe.&lt;br /&gt;
&lt;br /&gt;
L'ordinateur décidera du fonctionnement ou non de la harpe. C'est aussi grâce à lui qu'on pourra choisir la banque de sons voulue.&lt;br /&gt;
&lt;br /&gt;
Toutes les banques de sons seront enregistrées sur le Raspberry.&lt;br /&gt;
Les LEDs signaleront l'emplacement des cordes.&lt;br /&gt;
&lt;br /&gt;
Pour la partie optionnelle, on remplacera les LEDs par des lasers pour un effet visuel de qualité (plus poussé). La fumée permettra de voir les lasers.&lt;br /&gt;
&lt;br /&gt;
=== Le matériel ===&lt;br /&gt;
* Un raspberry pi&lt;br /&gt;
* 8 phototransistors&lt;br /&gt;
* 8 émetteurs lasers&lt;br /&gt;
* Des résistances&lt;br /&gt;
* Une structure&lt;br /&gt;
* Carte d'acquisition de type Arduino au début puis FPGA &lt;br /&gt;
* Un ordinateur&lt;br /&gt;
* Une alimentation&lt;br /&gt;
&lt;br /&gt;
=== Optionnel (visuel) ===&lt;br /&gt;
&lt;br /&gt;
* 8 émetteurs laser&lt;br /&gt;
* Un générateur de fumée&lt;br /&gt;
* Une caméra&lt;br /&gt;
&lt;br /&gt;
== Séance 1 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Le but de cette première séance était de se répartir les tâches, de tester le matériel mit à disposition et de découvrir le fonctionnement du FPGA.&lt;br /&gt;
&lt;br /&gt;
Le principe de fonctionnement de la harpe est le suivant:&lt;br /&gt;
Chaque capteur sera situé en face d'un laser. Les capteurs seront dans la partie haute de la harpe afin de limiter les interférences dues à d'autres sources lumineuses. Chaque laser pointera vers un capteur. &lt;br /&gt;
&lt;br /&gt;
 * Ajout du dessin de la harpe * &lt;br /&gt;
&lt;br /&gt;
Les capteurs enverront tous par défaut la même valeur au FPGA. Quand l'utilisateur passera sa main dans la harpe, un faisceau laser sera coupé. Le capteur n'enverra plus sa valeur seuil au FPGA, il aura donc changé d'état.&lt;br /&gt;
Dès lors que le FPGA détectera un changement d'état, il enverra l'état dans lequel se trouvent les 8 capteurs au Raspberry. &lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé des tests sur les phototransistors et les lasers. Nous avons mis en parallèle un laser et deux capteurs, sans oublier leur résistance de 1.2k Ohms chacune. &lt;br /&gt;
&lt;br /&gt;
Nous avons vu que à luminosité ambiante, quand le laser pointe sur le capteur, celui-ci envoie à l'Arduino une valeur de 950 environ. Ensuite, quand le faisceau laser est coupé, la valeur envoyée par le phototransistor monte à 1020.&lt;br /&gt;
Puis, nous avons réitéré l'expérience en mettant le système dans une boîte. Cette fois, le valeur est passée de 840 quand le capteur est éclairé par le laser à 900 quand le faisceau est coupé.&lt;br /&gt;
Nous en avons déduit que nous allons devoir refaire l'expérience une fois la harpe assemblée.&lt;br /&gt;
&lt;br /&gt;
Les lasers étant très directionnels tout comme les phototransistors, nous n'aurons pas de soucis d'interférences. Un capteur détectera uniquement le laser situé directement en face de lui et non ceux de son voisinage.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Même si il peut paraitre futile d'insérer une partie boitier dans un projet centré sur l'informatique et l'électronique, il s'est avéré que le boitier de notre Harpe nécessitait une attention particulière.&lt;br /&gt;
&lt;br /&gt;
La taille de la harpe à été un sujet de débat, et nous avons réalisé des tests afin de vérifier que des phototransistors trop proches les uns des autres n'allait pas compromettre le bon fonctionnement de la harpe dans son ensemble. En effet, si le phototransistor détectait un autre laser que celui vers lequel il pointe serait extrêmement problématique. Heureusement, il s'est avéré que les phototransistors sont très directionnels, au point que se pose désormais le problème inverse.&lt;br /&gt;
&lt;br /&gt;
Nous allons devoir faire très attention au fait que les lasers soient bien fixés et pointent exactement vers les phototransistors, car dans le cas contraire, ceux-ci ne détectent absolument pas le laser, et tout le principe de fonctionnement s'effondre. La conception et l'assemblage de la boite devront donc être relativement précis, pour éviter ces problèmes.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons dès le départ décidé d'éviter l'utilisation de diodes infra-rouges, pour leur préférer les lasers. Tout d'abord, parce que les diodes ne sont en aucun cas assez puissantes pour être détectées par les phototransistors, ce qui une fois de plus rend notre harpe inutile. Ensuite, parce qu'il nous a semblé que réaliser une harpe 'laser' sans lasers était un concept déconcertant, et enlève beaucoup de l’intérêt de ce projet.&lt;br /&gt;
&lt;br /&gt;
Un premier jet de design avait été réalisé avant cette séance, et au vu des données récoltées pendant celle-ci, nous l'avons modifié pour les prendre en compte, notamment la taille des lasers par rapport aux diodes, et la précision requise. &lt;br /&gt;
&lt;br /&gt;
'insérer photos premiers schémas ici'&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le travail a été séparé en 2 parties, une personne par partie : &lt;br /&gt;
- une première partie sur le serveur même (page web, système de streaming de son depuis la page web)&lt;br /&gt;
- une seconde partie sur la lecture du port série&lt;br /&gt;
&lt;br /&gt;
==== Partie serveur ====&lt;br /&gt;
La première séance a été consacré à deux grands axes : prendre la main à distance sur le raspberry pi et mettre en place le serveur web.&lt;br /&gt;
Afin de pouvoir contrôler et travailler facilement sur le RPi, l'outil vncserver a été installé sur le raspberry, permettant de contrôler via un interface graphique le RPi depuis un ordinateur branché sur le même réseau. Cet utilitaire permettra a l'avenir de travailler directement sur le RPi sans devoir constamment uploader par ssh le travail effectué.&lt;br /&gt;
&lt;br /&gt;
Coté mise en place du serveur web, l'utilitaire de serveur web apache2 a été installé sans soucis, et les pages d'exemples web et javascript fonctionnent. En revanche, l'utilisation du code d'exemple sur les sockets n'est pas utilisable, le paquet proposé n’existe pas et le site du paquet de socket est mort.&lt;br /&gt;
Le reste de la séance a été consacré a des recherches sur les moyens de pouvoir streamer du son, recherches non concluantes. Aucune solution n'a été trouvé sans passer par un service internet hébergé par un tier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Partie lecture port série ====&lt;br /&gt;
&lt;br /&gt;
Cette première séance fut consacrée à la sélection du langage de programmation et à sa prise en main. Il a été décidé d'utiliser Python pour écrire le programme récupérant et traitant les données récupérées à travers le port série. Python étant un langage fort usité, il possède une très large documentation. Ce fut donc facile de trouver la librairie permettant de lire les données envoyées par le port série.&lt;br /&gt;
&lt;br /&gt;
Un doute subsiste encore sur le type de données envoyé par le port série. L'idéal serait de récupérer un tableau de 8 entiers de type binaire correspondant aux états des 8 ports liés aux &amp;quot;cordes&amp;quot; laser, pour pouvoir ensuite traiter ces données facilement.&lt;br /&gt;
&lt;br /&gt;
== Séance 2 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Lors de cette séance, nous avons réalisé le premier circuit sur le FPGA. &lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un circuit simple, qui envoie en permanence l'état des huit phototransistors au port série. Les phototransistors sont alors directement reliés à celui-ci. Nous avons pu tester le bon fonctionnement du système grâce aux diodes du FPGA. Nous avons branché en parallèle sur le circuit les huit diodes, afin de vérifier qu'un signal était bien envoyé en permanence, on a pu les voir s'éteindre lorsqu'on éclairait un laser. &lt;br /&gt;
Ces diodes se sont avérées très utiles, car il n'est pas encore possible d'effectuer les tests sur le port série, car la partie informatique n'est pas encore opérationnelle, on ne peut donc pas lire directement sur le port série pour le moment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi constant ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite réalisé un montage permettant de faire l'envoi seulement sur changement d'état, comme prévu à la séance 1 Nous avons donc réalisé un système de bascules permettant de comparer l'état actuel de chaque diode avec son état précédent, puis de réaliser l'envoi seulement si une différence était observée. Comme précédemment, les diodes sont reliées directement au Port Série, mais cette fois-ci au lieu de brancher le Bit d'envoi du port Série sur un Vcc, soit un '1' logique, nous l'avons relié à la vérification de changement d'état, qui passe à '1' uniquement avec un changement d'état.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi sur changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème qui s'est alors posé était de savoir si on envoyait le signal assez longtemps pour qu'il puisse être lu. En effet on envoie un signal seulement si il y a changement d'état, et cette vérification se fait à chaque incrément d'horloge. Hors, la différence sera donc observée sur un seul incrément d'horloge, par conséquent, on n'envoie de signal que pendant ce seul incrément. Pour l'instant, nous supposons que le port série est capable de stocker les données à envoyer en un seul incrément d'horloge. &lt;br /&gt;
Cependant, si lors des tests, ça ne fonctionne pas, nous prévoyons d'utiliser un compteur pour pouvoir envoyer le signal plus longtemps au Bit d'envoi du port série, et ainsi laisser le temps au port série d'envoyer l'information.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous nous sommes focalisés sur le FPGA, mais nous avons néanmoins terminé la conception du boitier de la harpe, sous la forme de trois 'boites' crénelées, que nous avons ensuite l'intention de découper au FabLab puis d'assembler.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos des boites ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il s'est avéré que réaliser des boites crénelées rendrait tout le boitier beaucoup plus solide, et donc fiable.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le problème de l'impossibilité d'utiliser l'exemple sur les sockets a été résolu, grâce à l'intervention de M. Redon. Le problème était une différence de version de la distribution Linux entre le RPi utilisé et celle utilisé pour l'exemple. En effet, le RPi de travail est sur une distribution Wheezy, alors que la version la plus récente est la Jessie. Les chemins des dépots des sources de la librairie libwebsocket n’existant pas sur Wheezy, on ne pouvait installer la librairie directement en ligne de commande. M. Redon a ajouté le chemin de la librairie dans le gestionnaire de paquet du RPi et on a pu utiliser sans problèmes la librairie. De plus le site du paquet libwebsocket n'était inaccessible que temporairement.&lt;br /&gt;
La séance a été consacré à comprendre le fonctionnement des sockets et comment l'exemple html interagissait avec.&lt;br /&gt;
&lt;br /&gt;
La partie importante du code d'exemple est la suivante : &lt;br /&gt;
&lt;br /&gt;
 static int callback_my(&lt;br /&gt;
  struct libwebsocket_context * this,&lt;br /&gt;
  struct libwebsocket *wsi,enum libwebsocket_callback_reasons reason,&lt;br /&gt;
  void *user,void *in,size_t len)&lt;br /&gt;
 {&lt;br /&gt;
 static char *message=NULL;&lt;br /&gt;
 static int msize=0;&lt;br /&gt;
 switch(reason){&lt;br /&gt;
  case LWS_CALLBACK_ESTABLISHED:&lt;br /&gt;
    printf(&amp;quot;connection established\n&amp;quot;);&lt;br /&gt;
    message=NULL;&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_RECEIVE:&lt;br /&gt;
                // Ici sont traites les messages envoyes par le navigateur&lt;br /&gt;
    printf(&amp;quot;received data: %s\n&amp;quot;,(char *)in);&lt;br /&gt;
    message=malloc(len+LWS_SEND_BUFFER_PRE_PADDING+LWS_SEND_BUFFER_POST_PADDING);&lt;br /&gt;
    if(message==NULL){ perror(&amp;quot;callback_my.malloc&amp;quot;); exit(EXIT_FAILURE); }&lt;br /&gt;
    memcpy(message+LWS_SEND_BUFFER_PRE_PADDING,in,len);&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    msize=len;&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_SERVER_WRITEABLE:&lt;br /&gt;
                // Ici sont envoyes les messages au navigateur&lt;br /&gt;
    if(message!=NULL){&lt;br /&gt;
      char *out=message+LWS_SEND_BUFFER_PRE_PADDING;&lt;br /&gt;
      libwebsocket_write(wsi,(unsigned char *)out,msize,LWS_WRITE_TEXT);&lt;br /&gt;
      free(message);&lt;br /&gt;
      message=NULL;&lt;br /&gt;
      }&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    break;&lt;br /&gt;
  }&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une fonction de callback gérant à la fois la réception et la transmission. On peut remarquer 3 cas du switch : LWS_CALLBACK_ESTABLISHED correspondant à la création d'un lien entre la page web et le serveur websocket à la demande de la page web, LWS_CALLBACK_RECEIVE correspondant aux actions à entreprendre à la réception d'un message provenant du navigateur web, et LWS_CALLBACK_SERVER_WRITEABLE correspondant aux actions afin d'envoyer un message au navigateur.&lt;br /&gt;
&lt;br /&gt;
Coté HTML, on utilise les sockets grâce à ce code suivant :&lt;br /&gt;
 &lt;br /&gt;
 window.WebSocket=(window.WebSocket||window.MozWebSocket);&lt;br /&gt;
&lt;br /&gt;
 var websocket=new WebSocket('ws://127.0.0.1:9000','myprotocol');&lt;br /&gt;
&lt;br /&gt;
 websocket.onopen=function(){ $('h1').css('color','green'); };&lt;br /&gt;
&lt;br /&gt;
 websocket.onerror=function(){ $('h1').css('color','red'); };&lt;br /&gt;
&lt;br /&gt;
 websocket.onmessage=function(message){&lt;br /&gt;
 console.log(message.data);&lt;br /&gt;
 $('#messages').append($('&amp;lt;p&amp;gt;',{ text: message.data }));&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 function sendMessage(){&lt;br /&gt;
 websocket.send($('#message').val());&lt;br /&gt;
 $('#message').val(''); &lt;br /&gt;
&lt;br /&gt;
La fonction websocket.onmessage gère le traitement à faire coté client quand le serveur envoie des informations, et la fonction sendMessage permet l'envoie d'information du client vers le serveur.&lt;br /&gt;
&lt;br /&gt;
Pour notre projet, nous avons besoin principalement, dans un premier temps, d'envoyer des informations du serveur vers le client, nous nous sommes donc concentrer à comprendre et modifier les parties du code fourni suivantes : websocket.onmessage coté client et le &amp;quot;case LWS_CALLBACK_SERVER_WRITEABLE:&amp;quot; coté serveur.&lt;br /&gt;
&lt;br /&gt;
Le but des tests était de réussir à faire jouer deux sons différents par le client, avec changement de son imposé par le serveur. HTML5 propose nativement de lire des sons à partir d'une source grâce à une balise audio :&lt;br /&gt;
 &amp;lt;audio controls=&amp;quot;controls&amp;quot; id=&amp;quot;mySound&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/audio&amp;gt;&lt;br /&gt;
On récupère l'identifiant de cette balise avec &lt;br /&gt;
 var test1 = document.getElementById(&amp;quot;mySound&amp;quot;);&lt;br /&gt;
afin de pouvoir l'utiliser de n'importe où dans le programme.&lt;br /&gt;
On définit la source grâce à &lt;br /&gt;
 test1.src=&amp;quot;sound.mp3&amp;quot;;&lt;br /&gt;
avec &amp;quot;sound.mp3&amp;quot; le chemin d'accès au fichier son par rapport à l'emplacement du fichier html sur le serveur. Ici, le fichier son sound.mp3 est dans le même dossier que la page index.html.&lt;br /&gt;
Enfin, on peut lire le son avec &lt;br /&gt;
 test1.play();&lt;br /&gt;
&lt;br /&gt;
Le but du projet étant d'émettre en continue le son généré par la harpe, l'objectif ici est soit de générer un fichier de streaming que l'on lit en continue, soit de lire un fichier différent par son possible et on change la valeur de test1.src en fonction du son à lire, soit on lit toujours la même source, mais que l'on modifie à la volée en fonction du son voulu. La première option a été étudiée jusqu'en fin de séance.&lt;br /&gt;
Nous n'avons pas réussi à comprendre comment générer un fichier de streaming audio simple, de plus toutes les documentations et exemples trouvés ne concernant qu'un streaming simultanée de son et de vidéo à partir d'une caméra et d'un micro, et nous n'avons pas compris comment adapter ces exemples.&lt;br /&gt;
&lt;br /&gt;
  int cpt;&lt;br /&gt;
  for (cpt = 0; cpt &amp;lt; 250000000; cpt++);&lt;br /&gt;
&lt;br /&gt;
    boole = !boole;&lt;br /&gt;
	printf(&amp;quot;changement: %d\n&amp;quot;,boole);&lt;br /&gt;
    if(boole)&lt;br /&gt;
      system(&amp;quot;sudo cp Level-complete-sound-effect.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
      system(&amp;quot;sudo cp Raindrops-noise.mp3 ./sound.mp3&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Séance 3 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous avons pu tester l'envoi sur changement d'état, toujours avec les diodes du FPGA.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par ajouter une horloge sur le détecteur de changement d'état, afin d'augmenter le nombre d'incréments d'horloge sur lequel il est à '1', et ce dans le but de rendre le clignotement d'un diode visible à l’œil nu.&lt;br /&gt;
Ensuite, nous avons relié la sortie du détecteur de changement d'état et des phototransistors par un 'ET' logique, que nous avons ensuite relié aux diodes du FPGA.&lt;br /&gt;
De cette façon, si l'on détecte un changement d'état sur un phototransistor, la nouvelle valeur est alors envoyée sur les diodes. Le système a fonctionné (à voir :p ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos du test avec changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite passé le reste de la séance à mettre en commun notre partie avec la partie informatique, en essayant de leur permettre de lire sur le port série du FPGA. Les essais ont pour l'instant été infructueux, mais des progrès ont été faits. &lt;br /&gt;
&lt;br /&gt;
L'objectif étant que le Raspberry Pi puisse lire les informations envoyées par le FPGA, pour ensuite les transmettre au site Web que nous allons réaliser par la suite.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 1 : Réalisation du site Web ==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé ce site web lors de notre temps libre afin de permettre la communication entre le Raspberry Pi et l'ordinateur. En effet, il était inclus dans notre projet de devoir réaliser une communication par internet. Ce site internet va donc remplir cette condition. Sur celui-ci, on pourra trouver une brève description de notre projet, un lien vers le wiki, une image exemple d'un harpe et les boutons Play et Pause qui permettent d'activer et de désactiver la harpe laser.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 2 : Réalisation du programme secondaire sur Arduino 'en cas de problèmes' ==&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis à plusieurs occasions en dehors des heures de projet afin d'avancer sur notre harpe. Nous avons donc décidé que nous devions réaliser un programme sur Arduino nous permettant de réaliser des tests de transmission par la liaison série sans avoir besoin du FPGA. Dans un premier temps, nous avons tenté d'utiliser le port USB comme liaison série. Cependant, il s'est avéré que le Raspberry pi ne pouvait pas lire son port USB, ce qui nous a donc forcé à utiliser les pins de communication série de l'Arduino. &lt;br /&gt;
Nous sommes sur un Arduino Mega 2560, nous avons a notre disposition plusieurs pins de communication série différents. Ils seront utilisés uniquement en transmission. Pour communiquer, nous allons ensuite utiliser le pin Tx1. Nous aboutissons donc au programme suivant:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Setup.PNG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Captprog.PNG]]&lt;br /&gt;
&lt;br /&gt;
La communication série de ce programme nous a causé des problèmes, surtout du fait que l'ordinateur ne recevait pas les informations transmises par l'Arduino. Nous avons donc du effectuer de multiples tests afin de voir où se situait le problème. Nous avons pu déterminer que nous avions un problème au niveau de notre pont diviseur de tension entre l'alimentation de l’Arduino et celle du Raspberry Pi, nous avons alors changé les résistances.&lt;br /&gt;
Nous avons également notamment modifié le programme afin de vérifier que l'information était bien transmise sur le Pin Série de l'Arduino, et que le problème ne venait donc pas de l'Arduino mais bien du Raspberry, qui ne transmet pas correctement l'information à l'ordinateur.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 3 : Assemblage de la boite et mise en place des composants ==&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43710</id>
		<title>Projet IMA3 P5, 2016/2017, TD1</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43710"/>
				<updated>2017-06-12T08:19:33Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : /* Partie informatique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet IMA3-SC 2016/2017 : Synt'Harpe (Sainte) Laser =&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Description du système ===&lt;br /&gt;
&lt;br /&gt;
Pour le projet Système Communicant, nous allons réaliser une harpe laser. Notre but est de créer un instrument de musique similaire à une harpe, où les cordes sont remplacées par des capteurs infra-rouges.&lt;br /&gt;
&lt;br /&gt;
Un son sera émis par l'ordinateur dès que le capteur IR captera une main et le joueur pourra avec son autre main moduler l'amplitude de la note.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on travaillera sur une gamme de son sur 8 bits. Puis, nous implémenterons une banque de sons qui nous permettra de sélectionner l'instrument désiré, d'où l'appellation Synt'Harpe.&lt;br /&gt;
&lt;br /&gt;
L'ordinateur décidera du fonctionnement ou non de la harpe. C'est aussi grâce à lui qu'on pourra choisir la banque de sons voulue.&lt;br /&gt;
&lt;br /&gt;
Toutes les banques de sons seront enregistrées sur le Raspberry.&lt;br /&gt;
Les LEDs signaleront l'emplacement des cordes.&lt;br /&gt;
&lt;br /&gt;
Pour la partie optionnelle, on remplacera les LEDs par des lasers pour un effet visuel de qualité (plus poussé). La fumée permettra de voir les lasers.&lt;br /&gt;
&lt;br /&gt;
=== Le matériel ===&lt;br /&gt;
* Un raspberry pi&lt;br /&gt;
* 8 phototransistors&lt;br /&gt;
* 8 émetteurs lasers&lt;br /&gt;
* Des résistances&lt;br /&gt;
* Une structure&lt;br /&gt;
* Carte d'acquisition de type Arduino au début puis FPGA &lt;br /&gt;
* Un ordinateur&lt;br /&gt;
* Une alimentation&lt;br /&gt;
&lt;br /&gt;
=== Optionnel (visuel) ===&lt;br /&gt;
&lt;br /&gt;
* 8 émetteurs laser&lt;br /&gt;
* Un générateur de fumée&lt;br /&gt;
* Une caméra&lt;br /&gt;
&lt;br /&gt;
== Séance 1 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Le but de cette première séance était de se répartir les tâches, de tester le matériel mit à disposition et de découvrir le fonctionnement du FPGA.&lt;br /&gt;
&lt;br /&gt;
Le principe de fonctionnement de la harpe est le suivant:&lt;br /&gt;
Chaque capteur sera situé en face d'un laser. Les capteurs seront dans la partie haute de la harpe afin de limiter les interférences dues à d'autres sources lumineuses. Chaque laser pointera vers un capteur. &lt;br /&gt;
&lt;br /&gt;
 * Ajout du dessin de la harpe * &lt;br /&gt;
&lt;br /&gt;
Les capteurs enverront tous par défaut la même valeur au FPGA. Quand l'utilisateur passera sa main dans la harpe, un faisceau laser sera coupé. Le capteur n'enverra plus sa valeur seuil au FPGA, il aura donc changé d'état.&lt;br /&gt;
Dès lors que le FPGA détectera un changement d'état, il enverra l'état dans lequel se trouvent les 8 capteurs au Raspberry. &lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé des tests sur les phototransistors et les lasers. Nous avons mis en parallèle un laser et deux capteurs, sans oublier leur résistance de 1.2k Ohms chacune. &lt;br /&gt;
&lt;br /&gt;
Nous avons vu que à luminosité ambiante, quand le laser pointe sur le capteur, celui-ci envoie à l'Arduino une valeur de 950 environ. Ensuite, quand le faisceau laser est coupé, la valeur envoyée par le phototransistor monte à 1020.&lt;br /&gt;
Puis, nous avons réitéré l'expérience en mettant le système dans une boîte. Cette fois, le valeur est passée de 840 quand le capteur est éclairé par le laser à 900 quand le faisceau est coupé.&lt;br /&gt;
Nous en avons déduit que nous allons devoir refaire l'expérience une fois la harpe assemblée.&lt;br /&gt;
&lt;br /&gt;
Les lasers étant très directionnels tout comme les phototransistors, nous n'aurons pas de soucis d'interférences. Un capteur détectera uniquement le laser situé directement en face de lui et non ceux de son voisinage.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Même si il peut paraitre futile d'insérer une partie boitier dans un projet centré sur l'informatique et l'électronique, il s'est avéré que le boitier de notre Harpe nécessitait une attention particulière.&lt;br /&gt;
&lt;br /&gt;
La taille de la harpe à été un sujet de débat, et nous avons réalisé des tests afin de vérifier que des phototransistors trop proches les uns des autres n'allait pas compromettre le bon fonctionnement de la harpe dans son ensemble. En effet, si le phototransistor détectait un autre laser que celui vers lequel il pointe serait extrêmement problématique. Heureusement, il s'est avéré que les phototransistors sont très directionnels, au point que se pose désormais le problème inverse.&lt;br /&gt;
&lt;br /&gt;
Nous allons devoir faire très attention au fait que les lasers soient bien fixés et pointent exactement vers les phototransistors, car dans le cas contraire, ceux-ci ne détectent absolument pas le laser, et tout le principe de fonctionnement s'effondre. La conception et l'assemblage de la boite devront donc être relativement précis, pour éviter ces problèmes.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons dès le départ décidé d'éviter l'utilisation de diodes infra-rouges, pour leur préférer les lasers. Tout d'abord, parce que les diodes ne sont en aucun cas assez puissantes pour être détectées par les phototransistors, ce qui une fois de plus rend notre harpe inutile. Ensuite, parce qu'il nous a semblé que réaliser une harpe 'laser' sans lasers était un concept déconcertant, et enlève beaucoup de l’intérêt de ce projet.&lt;br /&gt;
&lt;br /&gt;
Un premier jet de design avait été réalisé avant cette séance, et au vu des données récoltées pendant celle-ci, nous l'avons modifié pour les prendre en compte, notamment la taille des lasers par rapport aux diodes, et la précision requise. &lt;br /&gt;
&lt;br /&gt;
'insérer photos premiers schémas ici'&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le travail a été séparé en 2 parties, une personne par partie : &lt;br /&gt;
- une première partie sur le serveur même (page web, système de streaming de son depuis la page web)&lt;br /&gt;
- une seconde partie sur la lecture du port série&lt;br /&gt;
&lt;br /&gt;
==== Partie serveur ====&lt;br /&gt;
La première séance a été consacré à deux grands axes : prendre la main à distance sur le raspberry pi et mettre en place le serveur web.&lt;br /&gt;
Afin de pouvoir contrôler et travailler facilement sur le RPi, l'outil vncserver a été installé sur le raspberry, permettant de contrôler via un interface graphique le RPi depuis un ordinateur branché sur le même réseau. Cet utilitaire permettra a l'avenir de travailler directement sur le RPi sans devoir constamment uploader par ssh le travail effectué.&lt;br /&gt;
&lt;br /&gt;
Coté mise en place du serveur web, l'utilitaire de serveur web apache2 a été installé sans soucis, et les pages d'exemples web et javascript fonctionnent. En revanche, l'utilisation du code d'exemple sur les sockets n'est pas utilisable, le paquet proposé n’existe pas et le site du paquet de socket est mort.&lt;br /&gt;
Le reste de la séance a été consacré a des recherches sur les moyens de pouvoir streamer du son, recherches non concluantes. Aucune solution n'a été trouvé sans passer par un service internet hébergé par un tier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Partie lecture port série ====&lt;br /&gt;
&lt;br /&gt;
Cette première séance fut consacrée à la sélection du langage de programmation et à sa prise en main. Il a été décidé d'utiliser Python pour écrire le programme récupérant et traitant les données récupérées à travers le port série. Python étant un langage fort usité, il possède une très large documentation. Ce fut donc facile de trouver la librairie permettant de lire les données envoyées par le port série.&lt;br /&gt;
&lt;br /&gt;
Un doute subsiste encore sur le type de données envoyé par le port série. L'idéal serait de récupérer un tableau de 8 entiers de type binaire correspondant aux états des 8 ports liés aux &amp;quot;cordes&amp;quot; laser, pour pouvoir ensuite traiter ces données facilement.&lt;br /&gt;
&lt;br /&gt;
== Séance 2 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Lors de cette séance, nous avons réalisé le premier circuit sur le FPGA. &lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un circuit simple, qui envoie en permanence l'état des huit phototransistors au port série. Les phototransistors sont alors directement reliés à celui-ci. Nous avons pu tester le bon fonctionnement du système grâce aux diodes du FPGA. Nous avons branché en parallèle sur le circuit les huit diodes, afin de vérifier qu'un signal était bien envoyé en permanence, on a pu les voir s'éteindre lorsqu'on éclairait un laser. &lt;br /&gt;
Ces diodes se sont avérées très utiles, car il n'est pas encore possible d'effectuer les tests sur le port série, car la partie informatique n'est pas encore opérationnelle, on ne peut donc pas lire directement sur le port série pour le moment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi constant ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite réalisé un montage permettant de faire l'envoi seulement sur changement d'état, comme prévu à la séance 1 Nous avons donc réalisé un système de bascules permettant de comparer l'état actuel de chaque diode avec son état précédent, puis de réaliser l'envoi seulement si une différence était observée. Comme précédemment, les diodes sont reliées directement au Port Série, mais cette fois-ci au lieu de brancher le Bit d'envoi du port Série sur un Vcc, soit un '1' logique, nous l'avons relié à la vérification de changement d'état, qui passe à '1' uniquement avec un changement d'état.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi sur changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème qui s'est alors posé était de savoir si on envoyait le signal assez longtemps pour qu'il puisse être lu. En effet on envoie un signal seulement si il y a changement d'état, et cette vérification se fait à chaque incrément d'horloge. Hors, la différence sera donc observée sur un seul incrément d'horloge, par conséquent, on n'envoie de signal que pendant ce seul incrément. Pour l'instant, nous supposons que le port série est capable de stocker les données à envoyer en un seul incrément d'horloge. &lt;br /&gt;
Cependant, si lors des tests, ça ne fonctionne pas, nous prévoyons d'utiliser un compteur pour pouvoir envoyer le signal plus longtemps au Bit d'envoi du port série, et ainsi laisser le temps au port série d'envoyer l'information.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous nous sommes focalisés sur le FPGA, mais nous avons néanmoins terminé la conception du boitier de la harpe, sous la forme de trois 'boites' crénelées, que nous avons ensuite l'intention de découper au FabLab puis d'assembler.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos des boites ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il s'est avéré que réaliser des boites crénelées rendrait tout le boitier beaucoup plus solide, et donc fiable.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le problème de l'impossibilité d'utiliser l'exemple sur les sockets a été résolu, grâce à l'intervention de M. Redon. Le problème était une différence de version de la distribution Linux entre le RPi utilisé et celle utilisé pour l'exemple. En effet, le RPi de travail est sur une distribution Wheezy, alors que la version la plus récente est la Jessie. Les chemins des dépots des sources de la librairie libwebsocket n’existant pas sur Wheezy, on ne pouvait installer la librairie directement en ligne de commande. M. Redon a ajouté le chemin de la librairie dans le gestionnaire de paquet du RPi et on a pu utiliser sans problèmes la librairie. De plus le site du paquet libwebsocket n'était inaccessible que temporairement.&lt;br /&gt;
La séance a été consacré à comprendre le fonctionnement des sockets et comment l'exemple html interagissait avec.&lt;br /&gt;
&lt;br /&gt;
La partie importante du code d'exemple est la suivante : &lt;br /&gt;
&lt;br /&gt;
*static int callback_my(&lt;br /&gt;
  struct libwebsocket_context * this,&lt;br /&gt;
  struct libwebsocket *wsi,enum libwebsocket_callback_reasons reason,&lt;br /&gt;
  void *user,void *in,size_t len)&lt;br /&gt;
{&lt;br /&gt;
static char *message=NULL;&lt;br /&gt;
static int msize=0;&lt;br /&gt;
switch(reason){&lt;br /&gt;
  case LWS_CALLBACK_ESTABLISHED:&lt;br /&gt;
    printf(&amp;quot;connection established\n&amp;quot;);&lt;br /&gt;
    message=NULL;&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_RECEIVE:&lt;br /&gt;
                // Ici sont traites les messages envoyes par le navigateur&lt;br /&gt;
    printf(&amp;quot;received data: %s\n&amp;quot;,(char *)in);&lt;br /&gt;
    message=malloc(len+LWS_SEND_BUFFER_PRE_PADDING+LWS_SEND_BUFFER_POST_PADDING);&lt;br /&gt;
    if(message==NULL){ perror(&amp;quot;callback_my.malloc&amp;quot;); exit(EXIT_FAILURE); }&lt;br /&gt;
    memcpy(message+LWS_SEND_BUFFER_PRE_PADDING,in,len);&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    msize=len;&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_SERVER_WRITEABLE:&lt;br /&gt;
                // Ici sont envoyes les messages au navigateur&lt;br /&gt;
    if(message!=NULL){&lt;br /&gt;
      char *out=message+LWS_SEND_BUFFER_PRE_PADDING;&lt;br /&gt;
      libwebsocket_write(wsi,(unsigned char *)out,msize,LWS_WRITE_TEXT);&lt;br /&gt;
      free(message);&lt;br /&gt;
      message=NULL;&lt;br /&gt;
      }&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    break;&lt;br /&gt;
  }&lt;br /&gt;
return 0;&lt;br /&gt;
}*&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une fonction de callback gérant à la fois la réception et la transmission. On peut remarquer 3 cas du switch : LWS_CALLBACK_ESTABLISHED correspondant à la création d'un lien entre la page web et le serveur websocket à la demande de la page web, LWS_CALLBACK_RECEIVE correspondant aux actions à entreprendre à la réception d'un message provenant du navigateur web, et LWS_CALLBACK_SERVER_WRITEABLE correspondant aux actions afin d'envoyer un message au navigateur.&lt;br /&gt;
&lt;br /&gt;
Coté HTML, on utilise les sockets grâce à ce code suivant :&lt;br /&gt;
 &lt;br /&gt;
*window.WebSocket=(window.WebSocket||window.MozWebSocket);&lt;br /&gt;
&lt;br /&gt;
var websocket=new WebSocket('ws://127.0.0.1:9000','myprotocol');&lt;br /&gt;
&lt;br /&gt;
websocket.onopen=function(){ $('h1').css('color','green'); };&lt;br /&gt;
&lt;br /&gt;
websocket.onerror=function(){ $('h1').css('color','red'); };&lt;br /&gt;
&lt;br /&gt;
websocket.onmessage=function(message){&lt;br /&gt;
console.log(message.data);&lt;br /&gt;
$('#messages').append($('&amp;lt;p&amp;gt;',{ text: message.data }));&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function sendMessage(){&lt;br /&gt;
websocket.send($('#message').val());&lt;br /&gt;
$('#message').val(''); *&lt;br /&gt;
&lt;br /&gt;
La fonction websocket.onmessage gère le traitement à faire coté client quand le serveur envoie des informations, et la fonction sendMessage permet l'envoie d'information du client vers le serveur.&lt;br /&gt;
&lt;br /&gt;
Pour notre projet, nous avons besoin principalement, dans un premier temps, d'envoyer des informations du serveur vers le client, nous nous sommes donc concentrer à comprendre et modifier les parties du code fourni suivantes : websocket.onmessage coté client et le &amp;quot;case LWS_CALLBACK_SERVER_WRITEABLE:&amp;quot; coté serveur.&lt;br /&gt;
&lt;br /&gt;
Le but des tests était de réussir à faire jouer deux sons différents par le client, avec changement de son imposé par le serveur. HTML5 propose nativement de lire des sons à partir d'une source grâce à une balise audio :&lt;br /&gt;
&amp;lt;audio controls=&amp;quot;controls&amp;quot; id=&amp;quot;mySound&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/audio&amp;gt;&lt;br /&gt;
On récupère l'identifiant de cette balise avec &lt;br /&gt;
var test1 = document.getElementById(&amp;quot;mySound&amp;quot;);&lt;br /&gt;
afin de pouvoir l'utiliser de n'importe où dans le programme.&lt;br /&gt;
On définit la source grâce à &lt;br /&gt;
test1.src=&amp;quot;sound.mp3&amp;quot;;&lt;br /&gt;
avec &amp;quot;sound.mp3&amp;quot; le chemin d'accès au fichier son par rapport à l'emplacement du fichier html sur le seveur. Ici, le fichier son sound.mp3 est dans le même dossier que la page index.html.&lt;br /&gt;
Enfin, on peut lire le son avec &lt;br /&gt;
test1.play();&lt;br /&gt;
&lt;br /&gt;
== Séance 3 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous avons pu tester l'envoi sur changement d'état, toujours avec les diodes du FPGA.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par ajouter une horloge sur le détecteur de changement d'état, afin d'augmenter le nombre d'incréments d'horloge sur lequel il est à '1', et ce dans le but de rendre le clignotement d'un diode visible à l’œil nu.&lt;br /&gt;
Ensuite, nous avons relié la sortie du détecteur de changement d'état et des phototransistors par un 'ET' logique, que nous avons ensuite relié aux diodes du FPGA.&lt;br /&gt;
De cette façon, si l'on détecte un changement d'état sur un phototransistor, la nouvelle valeur est alors envoyée sur les diodes. Le système a fonctionné (à voir :p ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos du test avec changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite passé le reste de la séance à mettre en commun notre partie avec la partie informatique, en essayant de leur permettre de lire sur le port série du FPGA. Les essais ont pour l'instant été infructueux, mais des progrès ont été faits. &lt;br /&gt;
&lt;br /&gt;
L'objectif étant que le Raspberry Pi puisse lire les informations envoyées par le FPGA, pour ensuite les transmettre au site Web que nous allons réaliser par la suite.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 1 : Réalisation du site Web ==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé ce site web lors de notre temps libre afin de permettre la communication entre le Raspberry Pi et l'ordinateur. En effet, il était inclus dans notre projet de devoir réaliser une communication par internet. Ce site internet va donc remplir cette condition. Sur celui-ci, on pourra trouver une brève description de notre projet, un lien vers le wiki, une image exemple d'un harpe et les boutons Play et Pause qui permettent d'activer et de désactiver la harpe laser.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 2 : Réalisation du programme secondaire sur Arduino 'en cas de problèmes' ==&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis à plusieurs occasions en dehors des heures de projet afin d'avancer sur notre harpe. Nous avons donc décidé que nous devions réaliser un programme sur Arduino nous permettant de réaliser des tests de transmission par la liaison série sans avoir besoin du FPGA. Dans un premier temps, nous avons tenté d'utiliser le port USB comme liaison série. Cependant, il s'est avéré que le Raspberry pi ne pouvait pas lire son port USB, ce qui nous a donc forcé à utiliser les pins de communication série de l'Arduino. &lt;br /&gt;
Nous sommes sur un Arduino Mega 2560, nous avons a notre disposition plusieurs pins de communication série différents. Ils seront utilisés uniquement en transmission. Pour communiquer, nous allons ensuite utiliser le pin Tx1. Nous aboutissons donc au programme suivant:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Setup.PNG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Captprog.PNG]]&lt;br /&gt;
&lt;br /&gt;
La communication série de ce programme nous a causé des problèmes, surtout du fait que l'ordinateur ne recevait pas les informations transmises par l'Arduino. Nous avons donc du effectuer de multiples tests afin de voir où se situait le problème. Nous avons pu déterminer que nous avions un problème au niveau de notre pont diviseur de tension entre l'alimentation de l’Arduino et celle du Raspberry Pi, nous avons alors changé les résistances.&lt;br /&gt;
Nous avons également notamment modifié le programme afin de vérifier que l'information était bien transmise sur le Pin Série de l'Arduino, et que le problème ne venait donc pas de l'Arduino mais bien du Raspberry, qui ne transmet pas correctement l'information à l'ordinateur.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 3 : Assemblage de la boite et mise en place des composants ==&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43709</id>
		<title>Projet IMA3 P5, 2016/2017, TD1</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=43709"/>
				<updated>2017-06-12T08:18:06Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet IMA3-SC 2016/2017 : Synt'Harpe (Sainte) Laser =&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Description du système ===&lt;br /&gt;
&lt;br /&gt;
Pour le projet Système Communicant, nous allons réaliser une harpe laser. Notre but est de créer un instrument de musique similaire à une harpe, où les cordes sont remplacées par des capteurs infra-rouges.&lt;br /&gt;
&lt;br /&gt;
Un son sera émis par l'ordinateur dès que le capteur IR captera une main et le joueur pourra avec son autre main moduler l'amplitude de la note.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on travaillera sur une gamme de son sur 8 bits. Puis, nous implémenterons une banque de sons qui nous permettra de sélectionner l'instrument désiré, d'où l'appellation Synt'Harpe.&lt;br /&gt;
&lt;br /&gt;
L'ordinateur décidera du fonctionnement ou non de la harpe. C'est aussi grâce à lui qu'on pourra choisir la banque de sons voulue.&lt;br /&gt;
&lt;br /&gt;
Toutes les banques de sons seront enregistrées sur le Raspberry.&lt;br /&gt;
Les LEDs signaleront l'emplacement des cordes.&lt;br /&gt;
&lt;br /&gt;
Pour la partie optionnelle, on remplacera les LEDs par des lasers pour un effet visuel de qualité (plus poussé). La fumée permettra de voir les lasers.&lt;br /&gt;
&lt;br /&gt;
=== Le matériel ===&lt;br /&gt;
* Un raspberry pi&lt;br /&gt;
* 8 phototransistors&lt;br /&gt;
* 8 émetteurs lasers&lt;br /&gt;
* Des résistances&lt;br /&gt;
* Une structure&lt;br /&gt;
* Carte d'acquisition de type Arduino au début puis FPGA &lt;br /&gt;
* Un ordinateur&lt;br /&gt;
* Une alimentation&lt;br /&gt;
&lt;br /&gt;
=== Optionnel (visuel) ===&lt;br /&gt;
&lt;br /&gt;
* 8 émetteurs laser&lt;br /&gt;
* Un générateur de fumée&lt;br /&gt;
* Une caméra&lt;br /&gt;
&lt;br /&gt;
== Séance 1 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Le but de cette première séance était de se répartir les tâches, de tester le matériel mit à disposition et de découvrir le fonctionnement du FPGA.&lt;br /&gt;
&lt;br /&gt;
Le principe de fonctionnement de la harpe est le suivant:&lt;br /&gt;
Chaque capteur sera situé en face d'un laser. Les capteurs seront dans la partie haute de la harpe afin de limiter les interférences dues à d'autres sources lumineuses. Chaque laser pointera vers un capteur. &lt;br /&gt;
&lt;br /&gt;
 * Ajout du dessin de la harpe * &lt;br /&gt;
&lt;br /&gt;
Les capteurs enverront tous par défaut la même valeur au FPGA. Quand l'utilisateur passera sa main dans la harpe, un faisceau laser sera coupé. Le capteur n'enverra plus sa valeur seuil au FPGA, il aura donc changé d'état.&lt;br /&gt;
Dès lors que le FPGA détectera un changement d'état, il enverra l'état dans lequel se trouvent les 8 capteurs au Raspberry. &lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé des tests sur les phototransistors et les lasers. Nous avons mis en parallèle un laser et deux capteurs, sans oublier leur résistance de 1.2k Ohms chacune. &lt;br /&gt;
&lt;br /&gt;
Nous avons vu que à luminosité ambiante, quand le laser pointe sur le capteur, celui-ci envoie à l'Arduino une valeur de 950 environ. Ensuite, quand le faisceau laser est coupé, la valeur envoyée par le phototransistor monte à 1020.&lt;br /&gt;
Puis, nous avons réitéré l'expérience en mettant le système dans une boîte. Cette fois, le valeur est passée de 840 quand le capteur est éclairé par le laser à 900 quand le faisceau est coupé.&lt;br /&gt;
Nous en avons déduit que nous allons devoir refaire l'expérience une fois la harpe assemblée.&lt;br /&gt;
&lt;br /&gt;
Les lasers étant très directionnels tout comme les phototransistors, nous n'aurons pas de soucis d'interférences. Un capteur détectera uniquement le laser situé directement en face de lui et non ceux de son voisinage.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Même si il peut paraitre futile d'insérer une partie boitier dans un projet centré sur l'informatique et l'électronique, il s'est avéré que le boitier de notre Harpe nécessitait une attention particulière.&lt;br /&gt;
&lt;br /&gt;
La taille de la harpe à été un sujet de débat, et nous avons réalisé des tests afin de vérifier que des phototransistors trop proches les uns des autres n'allait pas compromettre le bon fonctionnement de la harpe dans son ensemble. En effet, si le phototransistor détectait un autre laser que celui vers lequel il pointe serait extrêmement problématique. Heureusement, il s'est avéré que les phototransistors sont très directionnels, au point que se pose désormais le problème inverse.&lt;br /&gt;
&lt;br /&gt;
Nous allons devoir faire très attention au fait que les lasers soient bien fixés et pointent exactement vers les phototransistors, car dans le cas contraire, ceux-ci ne détectent absolument pas le laser, et tout le principe de fonctionnement s'effondre. La conception et l'assemblage de la boite devront donc être relativement précis, pour éviter ces problèmes.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons dès le départ décidé d'éviter l'utilisation de diodes infra-rouges, pour leur préférer les lasers. Tout d'abord, parce que les diodes ne sont en aucun cas assez puissantes pour être détectées par les phototransistors, ce qui une fois de plus rend notre harpe inutile. Ensuite, parce qu'il nous a semblé que réaliser une harpe 'laser' sans lasers était un concept déconcertant, et enlève beaucoup de l’intérêt de ce projet.&lt;br /&gt;
&lt;br /&gt;
Un premier jet de design avait été réalisé avant cette séance, et au vu des données récoltées pendant celle-ci, nous l'avons modifié pour les prendre en compte, notamment la taille des lasers par rapport aux diodes, et la précision requise. &lt;br /&gt;
&lt;br /&gt;
'insérer photos premiers schémas ici'&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le travail a été séparé en 2 parties, une personne par partie : &lt;br /&gt;
- une première partie sur le serveur même (page web, système de streaming de son depuis la page web)&lt;br /&gt;
- une seconde partie sur la lecture du port série&lt;br /&gt;
&lt;br /&gt;
==== Partie serveur ====&lt;br /&gt;
La première séance a été consacré à deux grands axes : prendre la main à distance sur le raspberry pi et mettre en place le serveur web.&lt;br /&gt;
Afin de pouvoir contrôler et travailler facilement sur le RPi, l'outil vncserver a été installé sur le raspberry, permettant de contrôler via un interface graphique le RPi depuis un ordinateur branché sur le même réseau. Cet utilitaire permettra a l'avenir de travailler directement sur le RPi sans devoir constamment uploader par ssh le travail effectué.&lt;br /&gt;
&lt;br /&gt;
Coté mise en place du serveur web, l'utilitaire de serveur web apache2 a été installé sans soucis, et les pages d'exemples web et javascript fonctionnent. En revanche, l'utilisation du code d'exemple sur les sockets n'est pas utilisable, le paquet proposé n’existe pas et le site du paquet de socket est mort.&lt;br /&gt;
Le reste de la séance a été consacré a des recherches sur les moyens de pouvoir streamer du son, recherches non concluantes. Aucune solution n'a été trouvé sans passer par un service internet hébergé par un tier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Partie lecture port série ====&lt;br /&gt;
&lt;br /&gt;
Cette première séance fut consacrée à la sélection du langage de programmation et à sa prise en main. Il a été décidé d'utiliser Python pour écrire le programme récupérant et traitant les données récupérées à travers le port série. Python étant un langage fort usité, il possède une très large documentation. Ce fut donc facile de trouver la librairie permettant de lire les données envoyées par le port série.&lt;br /&gt;
&lt;br /&gt;
Un doute subsiste encore sur le type de données envoyé par le port série. L'idéal serait de récupérer un tableau de 8 entiers de type binaire correspondant aux états des 8 ports liés aux &amp;quot;cordes&amp;quot; laser, pour pouvoir ensuite traiter ces données facilement.&lt;br /&gt;
&lt;br /&gt;
== Séance 2 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Lors de cette séance, nous avons réalisé le premier circuit sur le FPGA. &lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un circuit simple, qui envoie en permanence l'état des huit phototransistors au port série. Les phototransistors sont alors directement reliés à celui-ci. Nous avons pu tester le bon fonctionnement du système grâce aux diodes du FPGA. Nous avons branché en parallèle sur le circuit les huit diodes, afin de vérifier qu'un signal était bien envoyé en permanence, on a pu les voir s'éteindre lorsqu'on éclairait un laser. &lt;br /&gt;
Ces diodes se sont avérées très utiles, car il n'est pas encore possible d'effectuer les tests sur le port série, car la partie informatique n'est pas encore opérationnelle, on ne peut donc pas lire directement sur le port série pour le moment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi constant ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite réalisé un montage permettant de faire l'envoi seulement sur changement d'état, comme prévu à la séance 1 Nous avons donc réalisé un système de bascules permettant de comparer l'état actuel de chaque diode avec son état précédent, puis de réaliser l'envoi seulement si une différence était observée. Comme précédemment, les diodes sont reliées directement au Port Série, mais cette fois-ci au lieu de brancher le Bit d'envoi du port Série sur un Vcc, soit un '1' logique, nous l'avons relié à la vérification de changement d'état, qui passe à '1' uniquement avec un changement d'état.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Insérer montage d'envoi sur changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème qui s'est alors posé était de savoir si on envoyait le signal assez longtemps pour qu'il puisse être lu. En effet on envoie un signal seulement si il y a changement d'état, et cette vérification se fait à chaque incrément d'horloge. Hors, la différence sera donc observée sur un seul incrément d'horloge, par conséquent, on n'envoie de signal que pendant ce seul incrément. Pour l'instant, nous supposons que le port série est capable de stocker les données à envoyer en un seul incrément d'horloge. &lt;br /&gt;
Cependant, si lors des tests, ça ne fonctionne pas, nous prévoyons d'utiliser un compteur pour pouvoir envoyer le signal plus longtemps au Bit d'envoi du port série, et ainsi laisser le temps au port série d'envoyer l'information.&lt;br /&gt;
&lt;br /&gt;
=== Partie boitier ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous nous sommes focalisés sur le FPGA, mais nous avons néanmoins terminé la conception du boitier de la harpe, sous la forme de trois 'boites' crénelées, que nous avons ensuite l'intention de découper au FabLab puis d'assembler.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos des boites ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il s'est avéré que réaliser des boites crénelées rendrait tout le boitier beaucoup plus solide, et donc fiable.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le problème de l'impossibilité d'utiliser l'exemple sur les sockets a été résolu, grâce à l'intervention de M. Redon. Le problème était une différence de version de la distribution Linux entre le RPi utilisé et celle utilisé pour l'exemple. En effet, le RPi de travail est sur une distribution Wheezy, alors que la version la plus récente est la Jessie. Les chemins des dépots des sources de la librairie libwebsocket n’existant pas sur Wheezy, on ne pouvait installer la librairie directement en ligne de commande. M. Redon a ajouté le chemin de la librairie dans le gestionnaire de paquet du RPi et on a pu utiliser sans problèmes la librairie. De plus le site du paquet libwebsocket n'était inaccessible que temporairement.&lt;br /&gt;
La séance a été consacré à comprendre le fonctionnement des sockets et comment l'exemple html interagissait avec.&lt;br /&gt;
&lt;br /&gt;
La partie importante du code d'exemple est la suivante : &lt;br /&gt;
&lt;br /&gt;
static int callback_my(&lt;br /&gt;
  struct libwebsocket_context * this,&lt;br /&gt;
  struct libwebsocket *wsi,enum libwebsocket_callback_reasons reason,&lt;br /&gt;
  void *user,void *in,size_t len)&lt;br /&gt;
{&lt;br /&gt;
static char *message=NULL;&lt;br /&gt;
static int msize=0;&lt;br /&gt;
switch(reason){&lt;br /&gt;
  case LWS_CALLBACK_ESTABLISHED:&lt;br /&gt;
    printf(&amp;quot;connection established\n&amp;quot;);&lt;br /&gt;
    message=NULL;&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_RECEIVE:&lt;br /&gt;
                // Ici sont traites les messages envoyes par le navigateur&lt;br /&gt;
    printf(&amp;quot;received data: %s\n&amp;quot;,(char *)in);&lt;br /&gt;
    message=malloc(len+LWS_SEND_BUFFER_PRE_PADDING+LWS_SEND_BUFFER_POST_PADDING);&lt;br /&gt;
    if(message==NULL){ perror(&amp;quot;callback_my.malloc&amp;quot;); exit(EXIT_FAILURE); }&lt;br /&gt;
    memcpy(message+LWS_SEND_BUFFER_PRE_PADDING,in,len);&lt;br /&gt;
                // Declenchement d'un prochain envoi au navigateur&lt;br /&gt;
    msize=len;&lt;br /&gt;
    libwebsocket_callback_on_writable(this,wsi);&lt;br /&gt;
    break;&lt;br /&gt;
  case LWS_CALLBACK_SERVER_WRITEABLE:&lt;br /&gt;
                // Ici sont envoyes les messages au navigateur&lt;br /&gt;
    if(message!=NULL){&lt;br /&gt;
      char *out=message+LWS_SEND_BUFFER_PRE_PADDING;&lt;br /&gt;
      libwebsocket_write(wsi,(unsigned char *)out,msize,LWS_WRITE_TEXT);&lt;br /&gt;
      free(message);&lt;br /&gt;
      message=NULL;&lt;br /&gt;
      }&lt;br /&gt;
    break;&lt;br /&gt;
  default:&lt;br /&gt;
    break;&lt;br /&gt;
  }&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une fonction de callback gérant à la fois la réception et la transmission. On peut remarquer 3 cas du switch : LWS_CALLBACK_ESTABLISHED correspondant à la création d'un lien entre la page web et le serveur websocket à la demande de la page web, LWS_CALLBACK_RECEIVE correspondant aux actions à entreprendre à la réception d'un message provenant du navigateur web, et LWS_CALLBACK_SERVER_WRITEABLE correspondant aux actions afin d'envoyer un message au navigateur.&lt;br /&gt;
&lt;br /&gt;
Coté HTML, on utilise les sockets grâce à ce code suivant :&lt;br /&gt;
 &lt;br /&gt;
window.WebSocket=(window.WebSocket||window.MozWebSocket);&lt;br /&gt;
&lt;br /&gt;
var websocket=new WebSocket('ws://127.0.0.1:9000','myprotocol');&lt;br /&gt;
&lt;br /&gt;
websocket.onopen=function(){ $('h1').css('color','green'); };&lt;br /&gt;
&lt;br /&gt;
websocket.onerror=function(){ $('h1').css('color','red'); };&lt;br /&gt;
&lt;br /&gt;
websocket.onmessage=function(message){&lt;br /&gt;
console.log(message.data);&lt;br /&gt;
$('#messages').append($('&amp;lt;p&amp;gt;',{ text: message.data }));&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function sendMessage(){&lt;br /&gt;
websocket.send($('#message').val());&lt;br /&gt;
$('#message').val(''); &lt;br /&gt;
&lt;br /&gt;
La fonction websocket.onmessage gère le traitement à faire coté client quand le serveur envoie des informations, et la fonction sendMessage permet l'envoie d'information du client vers le serveur.&lt;br /&gt;
&lt;br /&gt;
Pour notre projet, nous avons besoin principalement, dans un premier temps, d'envoyer des informations du serveur vers le client, nous nous sommes donc concentrer à comprendre et modifier les parties du code fourni suivantes : websocket.onmessage coté client et le &amp;quot;case LWS_CALLBACK_SERVER_WRITEABLE:&amp;quot; coté serveur.&lt;br /&gt;
&lt;br /&gt;
Le but des tests était de réussir à faire jouer deux sons différents par le client, avec changement de son imposé par le serveur. HTML5 propose nativement de lire des sons à partir d'une source grâce à une balise audio :&lt;br /&gt;
&amp;lt;audio controls=&amp;quot;controls&amp;quot; id=&amp;quot;mySound&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/audio&amp;gt;&lt;br /&gt;
On récupère l'identifiant de cette balise avec &lt;br /&gt;
var test1 = document.getElementById(&amp;quot;mySound&amp;quot;);&lt;br /&gt;
afin de pouvoir l'utiliser de n'importe où dans le programme.&lt;br /&gt;
On définit la source grâce à &lt;br /&gt;
test1.src=&amp;quot;sound.mp3&amp;quot;;&lt;br /&gt;
avec &amp;quot;sound.mp3&amp;quot; le chemin d'accès au fichier son par rapport à l'emplacement du fichier html sur le seveur. Ici, le fichier son sound.mp3 est dans le même dossier que la page index.html.&lt;br /&gt;
Enfin, on peut lire le son avec &lt;br /&gt;
test1.play();&lt;br /&gt;
&lt;br /&gt;
== Séance 3 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
&lt;br /&gt;
Pendant cette séance, nous avons pu tester l'envoi sur changement d'état, toujours avec les diodes du FPGA.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par ajouter une horloge sur le détecteur de changement d'état, afin d'augmenter le nombre d'incréments d'horloge sur lequel il est à '1', et ce dans le but de rendre le clignotement d'un diode visible à l’œil nu.&lt;br /&gt;
Ensuite, nous avons relié la sortie du détecteur de changement d'état et des phototransistors par un 'ET' logique, que nous avons ensuite relié aux diodes du FPGA.&lt;br /&gt;
De cette façon, si l'on détecte un changement d'état sur un phototransistor, la nouvelle valeur est alors envoyée sur les diodes. Le système a fonctionné (à voir :p ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'insérer photos du test avec changement d'état ici'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite passé le reste de la séance à mettre en commun notre partie avec la partie informatique, en essayant de leur permettre de lire sur le port série du FPGA. Les essais ont pour l'instant été infructueux, mais des progrès ont été faits. &lt;br /&gt;
&lt;br /&gt;
L'objectif étant que le Raspberry Pi puisse lire les informations envoyées par le FPGA, pour ensuite les transmettre au site Web que nous allons réaliser par la suite.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 1 : Réalisation du site Web ==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé ce site web lors de notre temps libre afin de permettre la communication entre le Raspberry Pi et l'ordinateur. En effet, il était inclus dans notre projet de devoir réaliser une communication par internet. Ce site internet va donc remplir cette condition. Sur celui-ci, on pourra trouver une brève description de notre projet, un lien vers le wiki, une image exemple d'un harpe et les boutons Play et Pause qui permettent d'activer et de désactiver la harpe laser.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 2 : Réalisation du programme secondaire sur Arduino 'en cas de problèmes' ==&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis à plusieurs occasions en dehors des heures de projet afin d'avancer sur notre harpe. Nous avons donc décidé que nous devions réaliser un programme sur Arduino nous permettant de réaliser des tests de transmission par la liaison série sans avoir besoin du FPGA. Dans un premier temps, nous avons tenté d'utiliser le port USB comme liaison série. Cependant, il s'est avéré que le Raspberry pi ne pouvait pas lire son port USB, ce qui nous a donc forcé à utiliser les pins de communication série de l'Arduino. &lt;br /&gt;
Nous sommes sur un Arduino Mega 2560, nous avons a notre disposition plusieurs pins de communication série différents. Ils seront utilisés uniquement en transmission. Pour communiquer, nous allons ensuite utiliser le pin Tx1. Nous aboutissons donc au programme suivant:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Setup.PNG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Captprog.PNG]]&lt;br /&gt;
&lt;br /&gt;
La communication série de ce programme nous a causé des problèmes, surtout du fait que l'ordinateur ne recevait pas les informations transmises par l'Arduino. Nous avons donc du effectuer de multiples tests afin de voir où se situait le problème. Nous avons pu déterminer que nous avions un problème au niveau de notre pont diviseur de tension entre l'alimentation de l’Arduino et celle du Raspberry Pi, nous avons alors changé les résistances.&lt;br /&gt;
Nous avons également notamment modifié le programme afin de vérifier que l'information était bien transmise sur le Pin Série de l'Arduino, et que le problème ne venait donc pas de l'Arduino mais bien du Raspberry, qui ne transmet pas correctement l'information à l'ordinateur.&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 3 : Assemblage de la boite et mise en place des composants ==&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=40819</id>
		<title>Projet IMA3 P5, 2016/2017, TD1</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=40819"/>
				<updated>2017-03-27T17:42:24Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet IMA3-SC 2016/2017 : Synt'Harpe (Sainte) Laser =&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Description du système ===&lt;br /&gt;
&lt;br /&gt;
Pour le projet Système Communicant, nous allons réaliser une harpe laser. Notre but est de créer un instrument de musique similaire à une harpe, où les cordes sont remplacées par des capteurs infra-rouges.&lt;br /&gt;
&lt;br /&gt;
Un son sera émis par l'ordinateur dès que le capteur IR captera une main et le joueur pourra avec son autre main moduler l'amplitude de la note.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on travaillera sur une gamme de son sur 8 bits. Puis, nous implémenterons une banque de sons qui nous permettra de sélectionner l'instrument désiré, d'où l'appellation Synt'Harpe.&lt;br /&gt;
&lt;br /&gt;
L'ordinateur décidera du fonctionnement ou non de la harpe. C'est aussi grâce à lui qu'on pourra choisir la banque de sons voulue.&lt;br /&gt;
&lt;br /&gt;
Toutes les banques de sons seront enregistrées sur le Raspberry.&lt;br /&gt;
Les LEDs signaleront l'emplacement des cordes.&lt;br /&gt;
&lt;br /&gt;
Pour la partie optionnelle, on remplacera les LEDs par des lasers pour un effet visuel de qualité (plus poussé). La fumée permettra de voir les lasers.&lt;br /&gt;
&lt;br /&gt;
=== Le matériel ===&lt;br /&gt;
* Un raspberry pi&lt;br /&gt;
* 8 phototransistors&lt;br /&gt;
* 8 émetteurs lasers&lt;br /&gt;
* Des résistances&lt;br /&gt;
* Une structure&lt;br /&gt;
* Carte d'acquisition de type Arduino au début puis FPGA &lt;br /&gt;
* Un ordinateur&lt;br /&gt;
* Une alimentation&lt;br /&gt;
&lt;br /&gt;
=== Optionnel (visuel) ===&lt;br /&gt;
&lt;br /&gt;
* 8 émetteurs laser&lt;br /&gt;
* Un générateur de fumée&lt;br /&gt;
* Une caméra&lt;br /&gt;
&lt;br /&gt;
== Séance 1 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Le but de cette première séance était de se répartir les tâches, de tester le matériel mit à disposition et de découvrir le fonctionnement du FPGA.&lt;br /&gt;
&lt;br /&gt;
Le principe de fonctionnement de la harpe est le suivant:&lt;br /&gt;
Chaque capteur sera situé en face d'un laser. Les capteurs seront dans la partie haute de la harpe afin de limiter les interférences dues à d'autres sources lumineuses. Chaque laser pointera vers un capteur. &lt;br /&gt;
&lt;br /&gt;
 * Ajout du dessin de la harpe * &lt;br /&gt;
&lt;br /&gt;
Les capteurs enverront tous par défaut la même valeur au FPGA. Quand l'utilisateur passera sa main dans la harpe, un faisceau laser sera coupé. Le capteur n'enverra plus sa valeur seuil au FPGA, il aura donc changé d'état.&lt;br /&gt;
Dès lors que le FPGA détectera un changement d'état, il enverra l'état dans lequel se trouvent les 8 capteurs au Raspberry. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé des tests sur les phototransistors et les lasers. Nous avons mis en parallèle un laser et deux capteurs, sans oublier leur résistance de 1.2k Ohms chacune. &lt;br /&gt;
&lt;br /&gt;
Nous avons vu que à luminosité ambiante, quand le laser pointe sur le capteur, celui-ci envoie à l'Arduino une valeur de 950 environ. Ensuite, quand le faisceau laser est coupé, la valeur envoyée par le phototransistor monte à 1020.&lt;br /&gt;
Puis, nous avons réitéré l'expérience en mettant le système dans une boîte. (schrodinger #blague #amusement #drole #notreparagrapheaetesupprimeunefois). Cette fois, le valeur est passée de 840 quand le capteur est éclairé par le laser à 900 quand le faisceau est coupé.&lt;br /&gt;
Nous en avons déduit que nous allons devoir refaire l'expérience une fois la harpe assemblée.&lt;br /&gt;
&lt;br /&gt;
Les lasers étant très directionnels tout comme les phototransistors, nous n'aurons pas de soucis d'interférences. Un capteur détectera uniquement le laser situé directement en face de lui et non ceux de son voisinage.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le travail a été séparé en 2 parties, une personne par partie : &lt;br /&gt;
- une première partie sur le serveur même (page web, système de streaming de son depuis la page web)&lt;br /&gt;
- une seconde partie sur la lecture du port série&lt;br /&gt;
&lt;br /&gt;
==== Partie serveur ====&lt;br /&gt;
La première séance a été consacré à deux grands axes : prendre la main à distance sur le raspberry pi et mettre en place le serveur web.&lt;br /&gt;
Afin de pouvoir contrôler et travailler facilement sur le RPi, l'outil vncserver a été installé sur le raspberry, permettant de contrôler via un interface graphique le RPi depuis un ordinateur branché sur le même réseau. Cet utilitaire permettra a l'avenir de travailler directement sur le RPi sans devoir constamment uploader par ssh le travail effectué.&lt;br /&gt;
&lt;br /&gt;
Coté mise en place du serveur web, l'utilitaire de serveur web apache2 a été installé sans soucis, et les pages d'exemples web et javascript fonctionnent. En revanche, l'utilisation du code d'exemple sur les sockets n'est pas utilisable, le paquet proposé n’existe pas et le site du paquet de socket est mort.&lt;br /&gt;
Le reste de la séance a été consacré a des recherches sur les moyens de pouvoir streamer du son, recherches non concluantes. Aucune solution n'a été trouvé sans passer par un service internet hébergé par un tier.&lt;br /&gt;
== Séance 2 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
&lt;br /&gt;
== Séance 3 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 1 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=40817</id>
		<title>Projet IMA3 P5, 2016/2017, TD1</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Projet_IMA3_P5,_2016/2017,_TD1&amp;diff=40817"/>
				<updated>2017-03-27T17:34:54Z</updated>
		
		<summary type="html">&lt;p&gt;Bcartier : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet IMA3-SC 2016/2017 : Synt'Harpe (Sainte) Laser =&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Description du système ===&lt;br /&gt;
&lt;br /&gt;
Pour le projet Système Communicant, nous allons réaliser une harpe laser. Notre but est de créer un instrument de musique similaire à une harpe, où les cordes sont remplacées par des capteurs infra-rouges.&lt;br /&gt;
&lt;br /&gt;
Un son sera émis par l'ordinateur dès que le capteur IR captera une main et le joueur pourra avec son autre main moduler l'amplitude de la note.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on travaillera sur une gamme de son sur 8 bits. Puis, nous implémenterons une banque de sons qui nous permettra de sélectionner l'instrument désiré, d'où l'appellation Synt'Harpe.&lt;br /&gt;
&lt;br /&gt;
L'ordinateur décidera du fonctionnement ou non de la harpe. C'est aussi grâce à lui qu'on pourra choisir la banque de sons voulue.&lt;br /&gt;
&lt;br /&gt;
Toutes les banques de sons seront enregistrées sur le Raspberry.&lt;br /&gt;
Les LEDs signaleront l'emplacement des cordes.&lt;br /&gt;
&lt;br /&gt;
Pour la partie optionnelle, on remplacera les LEDs par des lasers pour un effet visuel de qualité (plus poussé). La fumée permettra de voir les lasers.&lt;br /&gt;
&lt;br /&gt;
=== Le matériel ===&lt;br /&gt;
* Un raspberry pi&lt;br /&gt;
* 8 phototransistors&lt;br /&gt;
* 8 émetteurs lasers&lt;br /&gt;
* Des résistances&lt;br /&gt;
* Une structure&lt;br /&gt;
* Carte d'acquisition de type Arduino au début puis FPGA &lt;br /&gt;
* Un ordinateur&lt;br /&gt;
* Une alimentation&lt;br /&gt;
&lt;br /&gt;
=== Optionnel (visuel) ===&lt;br /&gt;
&lt;br /&gt;
* 8 émetteurs laser&lt;br /&gt;
* Un générateur de fumée&lt;br /&gt;
* Une caméra&lt;br /&gt;
&lt;br /&gt;
== Séance 1 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Le but de cette première séance était de se répartir les tâches, de tester le matériel mit à disposition et de découvrir le fonctionnement du FPGA.&lt;br /&gt;
&lt;br /&gt;
Le principe de fonctionnement de la harpe est le suivant:&lt;br /&gt;
Chaque capteur sera situé en face d'un laser. Les capteurs seront dans la partie haute de la harpe afin de limiter les interférences dues à d'autres sources lumineuses. Chaque laser pointera vers un capteur. &lt;br /&gt;
&lt;br /&gt;
 * Ajout du dessin de la harpe * &lt;br /&gt;
&lt;br /&gt;
Les capteurs enverront tous par défaut la même valeur au FPGA. Quand l'utilisateur passera sa main dans la harpe, un faisceau laser sera coupé. Le capteur n'enverra plus sa valeur seuil au FPGA, il aura donc changé d'état.&lt;br /&gt;
Dès lors que le FPGA détectera un changement d'état, il enverra l'état dans lequel se trouvent les 8 capteurs au Raspberry. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé des tests sur les phototransistors et les lasers. Nous avons mis en parallèle un laser et deux capteurs, sans oublier leur résistance de 1.2k Ohms chacune. &lt;br /&gt;
&lt;br /&gt;
Nous avons vu que à luminosité ambiante, quand le laser pointe sur le capteur, celui-ci envoie à l'Arduino une valeur de 950 environ. Ensuite, quand le faisceau laser est coupé, la valeur envoyée par le phototransistor monte à 1020.&lt;br /&gt;
Puis, nous avons réitéré l'expérience en mettant le système dans une boîte. (schrodinger #blague #amusement #drole #notreparagrapheaetesupprimeunefois). Cette fois, le valeur est passée de 840 quand le capteur est éclairé par le laser à 900 quand le faisceau est coupé.&lt;br /&gt;
Nous en avons déduit que nous allons devoir refaire l'expérience une fois la harpe assemblée.&lt;br /&gt;
&lt;br /&gt;
Les lasers étant très directionnels tout comme les phototransistors, nous n'aurons pas de soucis d'interférences. Un capteur détectera uniquement le laser situé directement en face de lui et non ceux de son voisinage.&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
Le travail a été séparé en 2 parties, une personne par partie : &lt;br /&gt;
- une première partie sur le serveur même (page web, système de streaming de son depuis la page web)&lt;br /&gt;
- une seconde partie sur la lecture du port série&lt;br /&gt;
&lt;br /&gt;
==== Partie serveur ====&lt;br /&gt;
La première séance a été consacré à deux grands axes : prendre la main à distance sur le raspberry pi et mettre en place le serveur web.&lt;br /&gt;
Afin de pouvoir contrôler et travailler facilement sur le RPi, l'outil vncserver a été installé sur le raspberry, permettant de contrôler via un interface graphique le RPi depuis un ordinateur branché sur le même réseau. Cet utilitaire permettra a l'avenir de travailler directement sur le RPi sans devoir constamment uploader par ssh le travail effectué.&lt;br /&gt;
&lt;br /&gt;
Coté mise en place du serveur web, l'utilitaire de serveur web apache2 a été installé sans soucis, et les pages d'exemples web et javascript fonctionnent. En revanche, l'utilisation du code d'exemple sur les sockets n'est pas utilisable, le paquet proposé n’existe pas et le site du paquet de socket est mort.&lt;br /&gt;
Le reste de la séance a été consacré a des recherches sur les moyens de pouvoir streamer du son, recherches non concluantes. Aucune solution n'a été trouvé sans passé par un service internet hébergé par un tier.&lt;br /&gt;
== Séance 2 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
&lt;br /&gt;
== Séance 3 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
&lt;br /&gt;
== Séance supplémentaire 1 ==&lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
&lt;br /&gt;
=== Partie informatique ===&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;/div&gt;</summary>
		<author><name>Bcartier</name></author>	</entry>

	</feed>