Lots of clean up

This commit is contained in:
Nathanaël Restori 2012-11-01 22:01:58 +01:00
parent 44d7252a7e
commit a9f6f5aa36
2 changed files with 76 additions and 70 deletions

View File

@ -39,7 +39,7 @@
\chapter*{Remerciements}
\thispagestyle{empty}
Je tient à remercier M.~Salanon pour ses conseils, son aide et pour m'avoir suivi tout au long de ce TM et M.~Gelsomino pour m'avoir permis de réaliser ce TM.
Je tient à remercier M.~Salanon pour ses conseils, son aide et pour m'avoir suivi tout au long de ce TM et M.~Gelsomino pour m'avoir permis de le réaliser.
Je remercie aussi mes parents et ma sœur pour leur aide et leur relecture.
@ -52,15 +52,15 @@ Image de couverture par \enquote{oomlout}, sous licence \emph{Creative Commons A
\section{Motivations}
J'ai décidé de faire mon travaille de maturité sur ce sujet car je suis passionné de robotique depuis tout petit. J'ai commencé en participant à un atelier de soudures à la Maison Picson\footnote{Établissement servant de cantine proposant aussi des activités à Blonay}. Je suis aussi allé à la première édition du Festival de Robotique à l'EPFL en 2008 et ai participé à deux ateliers (introduction à la programmation de microcontrôleur et soudure d'un robot DIDEL).
Je suis aussi passionné par l'informatique en général, la programmation ainsi que les logiciels libres.
Je suis aussi passionné par l'informatique en général (autant au niveau matériel que logiciel), la programmation ainsi que les logiciels libres.
\section{Présentation du travail}
Pour mon travail, j'ai choisi de travailler avec de la robotique car ce sujet m'intéressait.
J'ai d'abord du trouver un sujet plus précis. Suite à une discussion avec M. Salanon, je me suis tourné vers l'étude d'un bus de données (l'I²C) et la programmation d'une sorte de station météo.
J'ai d'abord dû trouver un sujet plus précis. Suite à une discussion avec M.~Salanon, je me suis tourné vers l'étude d'un bus de données (l'I²C) et la programmation d'une sorte de station météo.
J'ai d'abord du choisir le matériel puis le commander depuis les États-Unis (le choix de matériel disponible en Suisse étant plus limité et pas forcément moins cher).
J'ai ensuite dû étudier le fonctionnement du bus en théorie, puis \enquote{assembler} et programmer la station ainsi que réaliser un programme pour tester le fonctionnement de l'I²C à l'aide d'un oscilloscope.
J'ai d'abord dû choisir le matériel puis le commander depuis les États-Unis (le choix de matériel disponible en Suisse étant plus limité et pas forcément moins cher).
J'ai ensuite étudié le fonctionnement du bus en théorie, puis \enquote{assemblé} et programmé la station et aussi réalisé un programme pour tester le fonctionnement de l'I²C à l'aide d'un oscilloscope.
J'ai fini par réaliser des mesures à l'aide de la station météo dans mon frigo et vérifier le fonctionnement du bus en pratique.
@ -79,7 +79,7 @@ Les sources du logiciels sont soumis à des licences spécifiques garantissant c
Quelques logiciels libres connus sont Firefox, LibreOffice/OpenOffice.org, Linux, Thunderbird et VLC.
Ce \gls{TM} est donc entièrement articulé autour de logiciels et matériels libres : \LaTeX et vim pour l'écriture de ce rapport, Arduino comme plate-forme, CMake et gcc pour la \gls{compilation}, gnuplot pour les graphiques. Tout le code produit est donc placé sous licence MIT.
Ce \gls{TM} est donc entièrement articulé autour de logiciels et matériels libres~: \LaTeX{} et vim pour l'écriture de ce rapport, Arduino comme plate-forme, CMake et gcc pour la \gls{compilation}, gnuplot pour les graphiques. Tout le code produit est donc placé sous licence MIT.
\section{Conventions d'écriture}
Les mots en \textbf{gras} sont des mots expliqués dans le glossaire ou des acronymes.
@ -105,24 +105,24 @@ Quelques exemples d'utilisations courantes utilisations\footcite{i2c-wikipedia-e
\end{itemize}
\section{Les caractéristiques}
L'I²C a plusieurs caractéristiques intéressantes :
L'I²C a plusieurs caractéristiques intéressantes~:
\begin{itemize}
\item il n'utilise que deux lignes (en réalité trois, la masse devant être commune à tous les maîtres et les esclaves)
\item il est multi-maîtres : plusieurs objets peuvent contrôler le bus
\item il est multi-esclaves : plusieurs objets peuvent répondre à un maître
\item c'est un bus série : chaque information est découpée en plusieurs morceaux de taille fixe
\item c'est un bus synchrone : possède une horloge propre (imposée par les maître qui veux parler)
\item c'est un bus bidirectionnel half-duplex : les informations peuvent circuler dans les deux sens mais dans un seul sens à la fois
\item il est multi-maîtres~: plusieurs objets peuvent contrôler le bus
\item il est multi-esclaves~: plusieurs objets peuvent répondre à un maître
\item c'est un bus série~: chaque information est découpée en plusieurs morceaux de taille fixe
\item c'est un bus synchrone~: possède une horloge propre (imposée par le maître qui veux parler)
\item c'est un bus bidirectionnel half-duplex~: les informations peuvent circuler dans les deux sens mais dans un seul sens à la fois
\item il peux communiquer à des vitesses allant de 100 kbit/s à 5 Mbit/s
\end{itemize}
\section{Topologie}
Tout d'abord, plusieurs équipements peuvent être connectés au bus en même temps (qu'ils soient maîtres ou esclaves).
Les équipement sont connectés entre eux à l'aide de deux lignes :
Les équipement sont connectés entre eux à l'aide de deux lignes~:
\begin{itemize}
\item SDA (Serial Data Line) : ligne de données bidirectionnelle,
\item SCL (Serial Clock Line) : ligne d'horloge de synchronisation bidirectionnelle
\item SDA (Serial Data Line)~: ligne de données bidirectionnelle,
\item SCL (Serial Clock Line)~: ligne d'horloge de synchronisation bidirectionnelle
\end{itemize}
Il faut toute fois une troisième ligne pour avoir une masse commune à tous les équipements.
Tous les équipements doivent être alimentés avec le même potentiel (pour avoir la même référence comme niveau haut) mais peuvent être alimentés par différentes sources.
@ -131,7 +131,7 @@ Les échanges ont toujours lieu entre un maître et un esclave et sont toujours
Pour permettre à plusieurs maîtres de pouvoir imposer un niveau haut ou un niveau bas sur les lignes en même temps, des sorties à collecteur ouvert (ou à drain ouvert pour des circuits CMOS) sont utilisées. Deux résistances \enquote{pull-up} tirent les lignes au niveau haut.
L'état logique \enquote{0} ou \enquote{LOW} est l'état \enquote{dominant} tandis que l'état logique \enquote{1} ou \enquote{HIGH} est l'état \enquote{récessif}. Cela veux dire que si un équipement impose l'état \enquote{LOW} et qu'un autre impose l'état \enquote{HIGH} la ligne sera à l'état LOW.
L'état logique \enquote{0} ou \enquote{LOW} est l'état \enquote{dominant} tandis que l'état logique \enquote{1} ou \enquote{HIGH} est l'état \enquote{récessif}. Cela veux dire que si un équipement impose l'état \enquote{LOW} et qu'un autre impose l'état \enquote{HIGH} la ligne sera à l'état \enquote{LOW}.
\begin{figure}[H]
\centering
@ -142,9 +142,9 @@ L'état logique \enquote{0} ou \enquote{LOW} est l'état \enquote{dominant} tand
\section{Le protocole I²C}
\subsection{L'encodage}
Tout d'abord, en informatique, les informations sont envoyée sous forme de 0 et de 1. Un 0 ou un 1 s'appelle un bit. Souvent, les informations sont envoyées sous forme de paquets du 8 bits. On appelle ses 8 bits un octet (ou \emph{byte} en anglais).
Tout d'abord, en informatique, les informations sont envoyée sous forme de \enquote{0} et de \enquote{1}. Un \enquote{0} ou un \enquote{1} s'appelle un bit. Souvent, les informations sont envoyées sous forme de paquets de huit bits. On appelle ses huit bits un octet (ou \emph{byte} en anglais).
Pour transmettre un bit, le maître doit d'abord placer la ligne SCL au niveau \enquote{LOW} puis placer la ligne SDA au niveau voulu (LOW pour transmettre un 1 ou \enquote{HIGH} pour transmettre un 0). Ensuite, il place la ligne SCL au niveau \enquote{HIGH} attend un temps défini par la vitesse et la norme utilisée puis replace la ligne SCL au niveau LOW. Un bit vient d'être transmis. Il recommence pour transmettre le bit suivant. Tant que la ligne SCL est au niveau \enquote{HIGH} la ligne SDA ne doit pas changer d'état.
Pour transmettre un bit, le maître doit d'abord placer la ligne SCL au niveau \enquote{LOW} puis placer la ligne SDA au niveau voulu (\enquote{LOW} pour transmettre un \enquote{0} ou \enquote{HIGH} pour transmettre un \enquote{1}). Ensuite, il place la ligne SCL au niveau \enquote{HIGH} attend un temps défini par la vitesse et la norme utilisée puis replace la ligne SCL au niveau \enquote{LOW}. Un bit vient d'être transmis. Il recommence pour transmettre le bit suivant. Tant que la ligne SCL est au niveau \enquote{HIGH}, la ligne SDA ne doit pas changer d'état.
\begin{figure}[H]
\centering
\includegraphics{figures/I2C/I2C_Encodage.eps}
@ -207,32 +207,32 @@ Pour aire un pause, l'esclave maintient la ligne SCL au niveau \enquote{LOW} tan
Pour savoir à qui un maître veux parler, chaque esclave possède une adresse unique. Celle-ci peut être encodée sur 7 ou 10 bits.
\subsubsection{L'adressage sur 7 bits}
L'octet est composé de deux parties :
L'octet est composé de deux parties~:
\begin{enumerate}
\item les 7 premiers bits correspondent à l'adresse
\item le dernier bit est appelé bit R/W (Read/Write) :
\item les sept premiers bits correspondent à l'adresse
\item le dernier bit est appelé bit R/W (Read/Write)~:
\begin{itemize}
\item si le maître envoie un 1, il demande une lecture et l'esclave lui envoie des données.
\item si le maître envoie un 0, il demande une écriture et le maître lui envoie des données.
\item si le maître envoie un \enquote{1}, il demande une lecture et l'esclave lui envoie des données.
\item si le maître envoie un \enquote{0}, il demande une écriture et le maître lui envoie des données.
\end{itemize}
\end{enumerate}
Il y a quelques adresses \enquote{spéciales}\footnote{Les X tout à gauche correspondent au bit R/W. Les autres X, l'y et le z peuvent être soit un 1, soit un 0} :
Il y a quelques adresses \enquote{spéciales}\footnote{Les X tout à gauche correspondent au bit R/W. Les autres X, l'y et le z peuvent être soit un \enquote{1}, soit un \enquote{0}}~:
\begin{itemize}
\item 00000000 : utilisée pour parler à tous les esclaves (appelé \emph{broadcast} en anglais)
\item 0000001X : utilisée pour accéder aux composants CBUS (ancêtre de lI²C)
\item 0000010X : réservée pour dautres systèmes de bus
\item 0000011X : réservée pour des utilisations futures
\item 00001XXX : utilisée pour les composants haute-vitesse
\item 11111XXX : réservée pour des utilisations futures
\item 11110yz0 : utilisée pour l'adressage sur 10 bits
\item 00000000~: utilisée pour parler à tous les esclaves (appelé \emph{broadcast} en anglais)
\item 0000001X~: utilisée pour accéder aux composants CBUS (ancêtre de lI²C)
\item 0000010X~: réservée pour dautres systèmes de bus
\item 0000011X~: réservée pour des utilisations futures
\item 00001XXX~: utilisée pour les composants haute-vitesse
\item 11111XXX~: réservée pour des utilisations futures
\item 11110yz0~: utilisée pour l'adressage sur 10 bits
\end{itemize}
\subsubsection{L'adressage sur 10 bits}
Cette fois ci, deux octets sont nécessaires :
Cette fois ci, deux octets sont nécessaires~:
\begin{itemize}
\item Le premier est l'octet \enquote{11110yz0}. Les bits y et z sont les bits de poids fort de l'adresse (autrement dit, ceux le plus à gauche). Le bit R/W est toujours à 0.
\item Le deuxième octet contient la suite de l'adresse sur 8 bits. Il n'y a donc pas de bit R/W.
\item Le premier est l'octet \enquote{11110yz0}. Les bits y et z sont les bits de poids fort de l'adresse (autrement dit, ceux le plus à gauche). Le bit R/W est toujours à \enquote{0}.
\item Le deuxième octet contient la suite de l'adresse sur huit bits. Il n'y a donc pas de bit R/W.
\end{itemize}
\begin{figure}[H]
@ -243,7 +243,7 @@ Cette fois ci, deux octets sont nécessaires :
\end{figure}
Plusieurs esclaves peuvent avoir une adresse qui commence par yz. Si c'est le cas, ils répondent tous par un ACK en même temps. Une fois la suite de l'adresse envoyée, un seul esclave répondra par un ACK, l'adresse étant unique.
Si le maître veux demander un lecture, il doit envoyer un RESTART à la fin du deuxième octet de l'adresse puis envoyer l'octet \enquote{11110yz1}. Cette fois ci, le bit R/W est à 1 et l'esclave saura que le maître demande une lecture.
Si le maître veux demander un lecture, il doit envoyer un RESTART à la fin du deuxième octet de l'adresse puis envoyer l'octet \enquote{11110yz1}. Cette fois ci, le bit R/W est à \enquote{1} et l'esclave saura que le maître demande une lecture.
\begin{figure}[H]
\centering
@ -253,20 +253,20 @@ Si le maître veux demander un lecture, il doit envoyer un RESTART à la fin du
\end{figure}
\subsection{Un échange complet}
Tout d'abord, tout les maîtres écoutent en permanence les deux lignes. S'ils détectent un START, ils savent qu'ils doivent attendre un STOP avant de tenter de parler à un esclave. Cette écoute permanente permet aussi de détecter les pauses et les conflits (plusieurs maîtres qui tentent de parler en même temps).
Tout d'abord, tous les maîtres écoutent en permanence les deux lignes. S'ils détectent un START, ils savent qu'ils doivent attendre un STOP avant de tenter de parler à un esclave. Cette écoute permanente permet aussi de détecter les pauses et les conflits (plusieurs maîtres qui tentent de parler en même temps).
Voici un exemple d'échange complet :
Voici un exemple d'échange complet~:
\begin{enumerate}
\item le maître qui veux parler attend que le bus soit libre s'il est occupé
\item le maître envoie la commande START
\item le maître envoie un octet : le sept premiers bits correspondent à l'adresse et le huitième permet de savoir si le maître demande une lecture ou une écriture (ici, une écriture)
\item le maître envoie un octet~: le sept premiers bits correspondent à l'adresse et le huitième permet de savoir si le maître demande une lecture ou une écriture (ici, une écriture)
\item l'esclave envoie un bit d'acquittement (ici, un ACK)
\item l'esclave peux demander une pause
\item le maître envoie un octet qui contient une commande
\item l'esclave envoie un bit d'acquittement (ici, un ACK)
\item l'esclave peux demander une pause
\item le maître envoie la commande RESTART
\item le maître envoie un octet : le sept premiers bits correspondent à l'adresse et le huitième permet de savoir si le maître demande une lecture ou une écriture (ici, une lecture)
\item le maître envoie un octet~: le sept premiers bits correspondent à l'adresse et le huitième permet de savoir si le maître demande une lecture ou une écriture (ici, une lecture)
\item l'esclave envoie un premier octet qui contient le début des données
\item le maître envoie un bit d'acquittement (ici, un ACK)
\item l'esclave peux demander une pause
@ -284,7 +284,7 @@ Voici un exemple d'échange complet :
\subsection{Le cas de conflit}
Si deux maîtres (ou plus) prennent le contrôle du bus en même temps ou presque, les deux START et les lignes SCL vont se superposer et aucun des deux maîtres ne va se rendre compte qu'un autre est en train de parler un même temps. Toute fois, ils écoutent tous les deux en même temps qu'ils écrivent. Tant qu'ils envoient tous les deux un bit \enquote{1} ou \enquote{0} en même temps, il n'y aura pas de conflit entre les deux. Par contre, si l'un envoie un \enquote{1} et l'autre un \enquote{0}, le \enquote{0} va écraser le \enquote{1} et le maître envoyant le \enquote{1} va détecter le conflit. Il va donc arrêter de parler et laisser l'autre continuer. Le conflit peux être détecter lors de l'écriture de l'adresse, du bit R/W ou lors de l'envoi d'un commande.
Si les deux maîtres on envoyer exactement la même chose, il n'y aura pas de conflit et ils liront ou écriront la même chose.
Si les deux maîtres ont envoyé exactement la même chose, il n'y aura pas de conflit et ils liront ou écriront la même chose.
\chapter{Le matériel}
\section{Le choix de la plate-forme}
@ -327,7 +327,7 @@ Il a été décidé de faire une station météo. Nous avons donc besoin d'un th
\end{figure}
\section{Les limitations}
J'ai vite été confronté a quelques limitations : la mémoire de l'Arduino ne peux contenir seulement 32256 octets de code compilé. Il ne peux donc pas contenir en même temps les \glspl{bibliotheque} pour utiliser les capteurs en I²C, utiliser le port RJ45 et utiliser la carte SD. La solution a été de couper le programme en deux : il y a donc un code pour afficher les mesures en direct à travers un navigateur web et un code pour prendre des mesures de manière régulière et les enregistrer.
J'ai vite été confronté a quelques limitations~: la mémoire de l'Arduino ne peux contenir seulement 32256 octets de code compilé. Il ne peux donc pas contenir en même temps les \glspl{bibliotheque} pour utiliser les capteurs en I²C, utiliser le port RJ45 et utiliser la carte SD. La solution a été de couper le programme en deux~: il y a donc un code pour afficher les mesures en direct à travers un navigateur web et un code pour prendre des mesures de manière régulière et les enregistrer.
\begin{figure}[h]
\centering
@ -341,9 +341,9 @@ J'ai vite été confronté a quelques limitations : la mémoire de l'Arduino ne
\section{En général}
Les deux programmes sont composés de deux fonctions principales. La fonction \verb|setup()| qui s'exécute une fois au démarrage du programme et la fonction \verb|loop()| qui est exécutée en boucle. La première sert donc à initialiser et configurer les capteurs et les puces. La deuxième sert à traiter les informations.
Plusieurs \glspl{bibliotheque} sont utilisées. Comme bibliothèques tierces, sont utilisés : \verb|BMP085| pour le capteur de température et de pression, \verb|Chronodot| pour l'horloge, \verb|DHT| pour le capteur d'humidité, \verb|TSL2561| pour le capteur de luminosité et, pour finir, \verb|WebServer| pour servir les pages web. Comme bibliothèques internes (fournie avec l'Arduino), sont utilisés : \verb|Ethernet| pour la puce de contrôle du port RJ45, \verb|SD| ainsi que \verb|SPI| pour la carte SD et \verb|Wire| pour l'I²C.
Plusieurs \glspl{bibliotheque} sont utilisées. Comme bibliothèques tierces, sont utilisés~: \verb|BMP085| pour le capteur de température et de pression, \verb|Chronodot| pour l'horloge, \verb|DHT| pour le capteur d'humidité, \verb|TSL2561| pour le capteur de luminosité et, pour finir, \verb|WebServer| pour servir les pages web. Comme bibliothèques internes (fournie avec l'Arduino), sont utilisés~: \verb|Ethernet| pour la puce de contrôle du port RJ45, \verb|SD| ainsi que \verb|SPI| pour la carte SD et \verb|Wire| pour l'I²C.
La partie logicielle est coupée en deux programmes : un enregistreur et un serveur web. Les sources sont disponibles respectivement à l'annexe \ref{app:logger} et à l'annexe \ref{app:web}.
La partie logicielle est coupée en deux programmes~: un enregistreur et un serveur web. Les sources sont disponibles respectivement à l'annexe \ref{app:logger} et à l'annexe \ref{app:web}.
Un troisième programme sera utilisé pour tester en pratique le protocole I²C à l'aide d'un oscilloscope et vérifier si la théorie correspond à la pratique. Le code source est disponible à l'annexe \ref{app:i2cpractise}.
@ -355,7 +355,7 @@ La fonction \verb|loop()| récupère les différentes données des capteurs puis
\section{Le serveur web}
La fonction \verb|setup()| commence par initialiser la puce de contrôle du port RJ45 et le serveur web et configure ce dernier, puis initialise les différents capteurs. Il configure ensuite le capteur de luminosité. Elle finit par appeler \verb|sendNtpPacket()| qui va interroger un serveur \gls{NTP} pour mettre à jour l'heure de l'horloge.
La fonction \verb|loop()| se contente de demander au serveur de s'occuper des connections entrantes. Ce dernier peux appeler deux fonctions : \verb|defaultCmd()| si la page d'index est demandée ou \verb|sensorsJsonCmd()| si c'est la page \enquote{sensors.json} qui est demandée.
La fonction \verb|loop()| se contente de demander au serveur de s'occuper des connections entrantes. Ce dernier peux appeler deux fonctions~: \verb|defaultCmd()| si la page d'index est demandée ou \verb|sensorsJsonCmd()| si c'est la page \enquote{sensors.json} qui est demandée.
La fonction \verb|defaultCmd()| se contente d'envoyer la page d'index dont le code source est disponible à l'annexe \ref{app:index}.
@ -365,7 +365,7 @@ La fonction \verb|sensorsJsonCmd()| récupère les valeurs des capteurs puis les
Une fois téléchargée par le navigateur web, du JavaScript est exécuté. Ce JavaScript va télécharger la page \enquote{sensors.json} de manière régulière, analyser son contenu puis mettre à jour le tableau qui contient les valeurs.
\section{Tentative de réunion}
J'ai essayé de réunir les deux programmes en un seul en allégeant les \glspl{bibliotheque} concernant la partie web. J'ai essayé de supprimer tous les références au \gls{DHCP}\glsadd{DHCPg} et au \gls{DNS}\glsadd{DNSg}. Cela a permis de faire passer le programme final en dessous des 32256 octets, mais il est apparu de drôles de choses : la programme gelait au bout de quelques secondes et la fonction \verb|setup()| était appelée en boucle.
J'ai essayé de réunir les deux programmes en un seul en allégeant les \glspl{bibliotheque} concernant la partie web. J'ai essayé de supprimer tous les références au \gls{DHCP}\glsadd{DHCPg} et au \gls{DNS}\glsadd{DNSg}. Cela a permis de faire passer le programme final en dessous des 32256 octets, mais il est apparu de drôles de choses~: la programme gelait au bout de quelques secondes et la fonction \verb|setup()| était appelée en boucle.
J'ai aussi cherché s'il était possible de mettre un système d'exploitation sur l'Arduino et qu'il puisse charger les programmes sur la carte SD, mais je n'ai rien trouvé.
@ -376,7 +376,7 @@ La fonction \verb|loop()| va envoyer en boucle le nombre 0, 170 ou 255 à un esc
\chapter{Test de l'I²C en pratique}
\section{Le choix des nombres envoyé}
Les trois nombre envoyé on été choisi pour à cause de leur écriture en binaire\footnote{Voir tableau \ref{dec-bin}}. Ce sont un peu des cas \enquote{extrêmes} qui permettent de bien voir certaines choses sur les graphes de l'oscilloscope.
Les trois nombre envoyé on été choisis à cause de leur écriture en binaire\footnote{Voir tableau \ref{dec-bin}}. Ce sont un peu des cas \enquote{extrêmes} qui permettent de bien voir certaines choses sur les graphes de l'oscilloscope.
\begin{table}[h]
\begin{center}
@ -397,13 +397,13 @@ Les trois nombre envoyé on été choisi pour à cause de leur écriture en bina
\end{table}
\section{Analyse des graphes}
Pour pouvoir lire les graphes facilement, j'ai rajouté le numéro ou le nom de bits sur la ligne d'horloge et la bit envoyé sur la ligne des données ainsi que le START et le STOP. Les originaux sont disponible à l'annexe \ref{app:oscillo}.
Pour pouvoir lire les graphes facilement, j'ai rajouté le numéro ou le nom de bits sur la ligne d'horloge et le bit envoyé sur la ligne de données ainsi que le START et le STOP. Les originaux sont disponible à l'annexe \ref{app:oscillo}.
\subsection{Avec 0}
La figure \ref{fig:oscillo-0} montre l'écriture d'un 0 vue à l'oscilloscope. Le premier canal (en orange) montre la ligne des données (SDA) et le deuxième canal montre la ligne d'horloge (SCL).
On voit que la communication commence par l'envoi d'un START par le maître, suivi des 7 bits de l'adresse (ici, \enquote{1101000}) puis du bit d'écriture (l'avant-dernier 0). L'esclave envoie ensuite le bit d'acquittement (le dernier 0). On remarque ensuite une crête, mais elle ne correspond pas à un RESTART. En effet : cette crête se situe alors que la ligne d'horloge est au niveau bas. Ensuite, on voit l'envoi du 0 (les huit premiers 0) par le maître puis du bit d'acquittement par l'esclave. Le maître termine la communication par un STOP.
On voit que la communication commence par l'envoi d'un START par le maître, suivi des sept bits de l'adresse (ici, \enquote{1101000}) puis du bit d'écriture (l'avant-dernier \enquote{0}). L'esclave envoie ensuite le bit d'acquittement (le dernier \enquote{0}). On remarque ensuite une crête, mais elle ne correspond pas à un RESTART. En effet~: cette crête se situe alors que la ligne d'horloge est au niveau bas. Ensuite, on voit l'envoi du 0 (les huit premiers \enquote{0}) par le maître puis du bit d'acquittement par l'esclave. Le maître termine la communication par un STOP.
\begin{figure}[H]
\centering
@ -416,7 +416,7 @@ On voit que la communication commence par l'envoi d'un START par le maître, sui
La figure \ref{fig:oscillo-255} montre l'écriture d'un 255 vue à l'oscilloscope.
La communication commence de la même manière : envoi du START, de l'adresse, du bit d'écriture et pour finir, le bit d'acquittement. Pour le deuxième octet, on voit l'envoi des huit 1, puis le bit d'acquittement. Mais cette fois ci, ce dernier est positionné à 1. L'esclave envoie donc un NACK (autrement dit, un non-acquittement). Le maître termine la communication avec un STOP. On remarque un creux entre le deuxième octet et le STOP. C'est pour pouvoir effectuer ce dernier. En effet : pour pouvoir effectuer le STOP, la ligne des données doit passer de bas à haut quand la ligne d'horloge est à haut. La crête est toujours présente, mais \enquote{fusionnée} avec les 1 du deuxième octet.
La communication commence de la même manière~: envoi du START, de l'adresse, du bit d'écriture et pour finir, le bit d'acquittement. Pour le deuxième octet, on voit l'envoi des huit \enquote{1}, puis le bit d'acquittement. Mais cette fois ci, ce dernier est positionné à \enquote{1}. L'esclave envoie donc un NACK (autrement dit, un non-acquittement). Le maître termine la communication avec un STOP. On remarque un creux entre le deuxième octet et le STOP. C'est pour pouvoir effectuer ce dernier. En effet~: pour pouvoir effectuer le STOP, la ligne des données doit passer de bas à haut quand la ligne d'horloge est à haut. La crête est toujours présente, mais \enquote{fusionnée} avec les \enquote{1} du deuxième octet.
\begin{figure}[H]
\centering
@ -429,7 +429,7 @@ La communication commence de la même manière : envoi du START, de l'adresse, d
La figure \ref{fig:oscillo-170} montre l'écriture d'un 170 vue à l'oscilloscope.
Encore une fois, la communication commence de la même manière. Pour le deuxième octet, on voit l'envoi de \enquote{10101010}, puis le bit d'acquittement. Mais cette fois ci encore, ce dernier est positionné à 1. L'esclave envoie à nouveau un NACK. Le maître termine la communication avec un STOP.
Encore une fois, la communication commence de la même manière. Pour le deuxième octet, on voit l'envoi de \enquote{10101010}, puis le bit d'acquittement. Mais cette fois ci encore, ce dernier est positionné à \enquote{1}. L'esclave envoie à nouveau un NACK. Le maître termine la communication avec un STOP.
\begin{figure}[H]
\centering
@ -439,32 +439,32 @@ Encore une fois, la communication commence de la même manière. Pour le deuxiè
\end{figure}
\subsection{Explication du NACK}
Pour expliquer les deux dernier NACK, il faut s'intéresser au fonctionnement de l'horloge (pas la ligne mais le périphérique).
Pour expliquer les deux derniers NACK, il faut s'intéresser au fonctionnement de l'horloge\footcite{ds3231} (pas la ligne mais le périphérique).
L'horloge contient un registre qui contient des valeurs qui correspondent à l'heure, la date, la température et d'autres choses. Ici, deux cas sont possible : la lecture et l'écriture.
L'horloge contient un registre qui contient des valeurs qui correspondent à l'heure, la date, la température et à deux alarmes. Ici, deux cas sont possible~: la lecture et l'écriture.
Si on veux lire une partie du registre, il faut commencer par envoyer en écriture la case à partir de laquelle on veux commencer à lire puis un STOP. Ensuite, on envoie une demande de lecture. L'horloge va réponde en envoyant un octet contenant le contenu de la case sélectionnée. Ensuite, on peux soit envoyer un ACK pour recevoir la case suivante, soit envoyer un NACK pour arrêter la lecture.
Si l'on veut écrire, après avoir sélectionner la case, il faut continuer à écrire un octet. Cet octet sera écrit à l'endroit sélectionné. Deux choix s'offrent ensuite : soit écrire encore un octet qui sera placé dans la case suivante, soit envoyer un STOP.
Si l'on veut écrire, après avoir sélectionné la case, il faut continuer à écrire un octet. Cet octet sera écrit à l'endroit sélectionné. Deux choix s'offrent ensuite~: soit écrire encore un octet qui sera placé dans la case suivante, soit envoyer un STOP.
Les nombres envoyés pour mes essais sont donc des sélections de case. L'horloge a donc renvoyé un NACK car la case n° 170 ou 255 n'existe pas et la sélection a donc échouée. Elle a au contraire renvoyé un ACK pour la case n° 0 car celle-ci existe. En effet : en informatique, les tableaux et les registres sont numérotés à partir de 0 et non de 1.
Les nombres envoyés pour mes essais sont donc des sélections de case. L'horloge a donc renvoyé un NACK car la case n° 170 ou 255 n'existe pas et la sélection a donc échouée. Elle a au contraire renvoyé un ACK pour la case n° 0 car celle-ci existe. En effet~: en informatique, les tableaux et les registres sont numérotés à partir de 0 et non de 1.
\chapter{Le cas du frigo}
\section{Les mesures}
Pour réaliser cette expérience, la station météo a été placée dans un sachet plastique contenant du silica gel ainsi qu'une rallonge pour l'hygromètre pour qu'il puisse être exposé à l'humidité du frigo. La station météo a ensuite été placée pendant une heure au frigo. Voici les premières constatations : premièrement, l'humidité ne dépassait jamais 70 \%, deuxièmement, la température ne descendait jamais au dessous de 8° (voir la figure \ref{fig:1}).
Pour réaliser cette expérience, la station météo a été placée dans un sachet plastique contenant du silica gel ainsi qu'une rallonge pour l'hygromètre pour qu'il puisse être exposé à l'humidité du frigo. La station météo a ensuite été placée pendant une heure au frigo. Voici les premières constatations~: premièrement, l'humidité ne dépassait jamais 70~\%, deuxièmement, la température ne descendait jamais au dessous de 8~°C (voir la figure \ref{fig:1}).
Un deuxième essais a donc été réalisé, sans sachet plastique cette fois ci. Le montage a été placé deux heures au frigo. Cette fois ci, la température s'est stabilisée à environ 5° Celsius mais on constate une chute de la puissance après environ une heure. Cela est probablement dû au fait que les piles ne fournissent plus d'énergie à basse température, la puissance raugmentant une fois sortie du frigo (voir la figure \ref{fig:2}).
Un deuxième essais a donc été réalisé, sans sachet plastique cette fois ci. Le montage a été placé deux heures au frigo. Cette fois ci, la température s'est stabilisée à environ 5~°C mais on constate une chute de la puissance après environ une heure. Cela est probablement dû au fait que les piles ne fournissent plus d'énergie à basse température, la puissance raugmentant une fois sortie du frigo (voir la figure \ref{fig:2}).
Un autre essais a ensuite été réalisé. Cette fois-ci, les piles ont été remplacées par un adaptateur qui fournissait du 9 volts. La station météo a été placée dans le frigo, pendant une nuit. Cette fois-ci, l'expérience c'est bien déroulée : il n'y a pas eu de perte de puissance.
Un autre essais a ensuite été réalisé. Cette fois-ci, les piles ont été remplacées par un adaptateur qui fournissait du 9~volts. La station météo a été placée dans le frigo, pendant une nuit. Cette fois-ci, l'expérience c'est bien déroulée~: il n'y a pas eu de perte de puissance.
\section{Les résultats}
Sur la première figure (\ref{fig:graphiques}), on remarque plusieurs choses.
Tout d'abord, la température commence par descendre de manière qui semble exponentielle (ce n'est pas très visible ici mais est clair sur un agrandissement) puis oscille de manière périodique entre 4 °C et 7.5 °C. On voit une légère augmentation de la température vers huit heure du matin.
Tout d'abord, la température commence par descendre de manière qui semble exponentielle (ce n'est pas très visible ici mais est clair sur un agrandissement) puis oscille de manière périodique entre 4~°C et 7.5~°C. On voit une légère augmentation de la température vers huit heure du matin.
La pression a diminué pendant la nuit, mais cela n'est pas lié au frigo.
L'humidité oscille aussi de manière périodique entre environ 40 \% d'humidité et 70 \% d'humidité après deux heures dans le frigo. On voit un grand pique vers huit heure du matin.
L'humidité oscille aussi de manière périodique entre environ 40~\% d'humidité et 70~\% d'humidité après deux heures dans le frigo. On voit un grand pique vers huit heure du matin.
La luminosité est nulle tout au long de l'expérience sauf quand la station a été placée et retirée du frigo. On remarque un pique vers huit heure du matin. La porte a donc été ouverte à cette heure ci.
\begin{figure}[H]
@ -475,27 +475,27 @@ La luminosité est nulle tout au long de l'expérience sauf quand la station a
\end{figure}
\subsection{L'humidité en fonction de la température}
La figure \ref{fig:t-h} représente l'humidité en fonction de la température entre trois heure et quart du matin et sept heure de demi du matin. D'après les cours de M.~Bonnaz, je m'attendais à voir une courbe de pente négative, symétrique à celle-ci. En effet : plus l'air est chaud, plus il peux accueillir de l'humidité donc l'humidité relative devrait diminuer. Mais ça ne fonctionne que si l'on part du principe que l'eau ne se condense que lorsque l'humidité atteint 100 \% (ce qui était fait dans les exercices du cours).
La figure \ref{fig:t-h} représente l'humidité en fonction de la température entre trois heure et quart du matin et sept heure de demi du matin. D'après les cours de M.~Bonnaz, je m'attendais à voir une courbe de pente négative, symétrique à celle-ci. En effet~: plus l'air est chaud, plus il peux accueillir de l'humidité donc l'humidité relative devrait diminuer. Mais ça ne fonctionne que si l'on part du principe que l'eau ne se condense que lorsque l'humidité atteint 100~\% (ce qui était fait dans les exercices du cours).
Mais d'où peux donc venir cette différence ? Faisons un peu de calcul :
Mais d'où peux donc venir cette différence ? Faisons un peu de calcul~:
Par définition de l'humidité absolue\footnote{Une table des symboles est disponible à la page \pageref{ref:symboles}} :
Par définition de l'humidité absolue\footnote{Une table des symboles est disponible à la page \pageref{ref:symboles}}~:
\[H = \frac{m}{V}\]
Or, \(m = M\cdot{}n\) (cours de chimie). Nous avons donc :
Or, \(m = M\cdot{}n\) (cours de chimie). Nous avons donc~:
\[H = \frac{n}{V}\cdot{}M_{eau}\]
Or, \(\frac{n}{V} = \frac{P}{R\cdot{}T}\) (loi des gaz parfaits). Donc :
Or, \(\frac{n}{V} = \frac{P}{R\cdot{}T}\) (loi des gaz parfaits). Donc~:
\[H_{\acute{e}q} = \frac{P_{\acute{e}q}\cdot{}M_{eau}}{R\cdot{}T}\]
Par définition de l'humidité relative:
Par définition de l'humidité relative~:
\[H_r = \frac{H}{H_{\acute{e}q}}\]
En remaniant les formules, on trouve :
En remaniant les formules, on trouve~:
\[m = V\cdot{}H = V\cdot{}H_r\cdot{}H_{\acute{e}q} = V\cdot{}H_r\cdot{}\frac{P_{\acute{e}q}\cdot{}M_{eau}}{R\cdot{}T}\]
\glsadd{H}\glsadd{m}\glsadd{V}\glsadd{M}\glsadd{n}\glsadd{P}\glsadd{R}\glsadd{T}\glsadd{Hr}\glsadd{Heq}\glsadd{Peq}
Sachant que le frigo fait environ 200 litres, qu'à 4 °C l'humidité relative est de 43 \% et que la pression à l'équilibre est de 813 Pa, qu'à 6.6 °C l'humidité relative est de 70 \% et que la pression à l'équilibre est de 975 Pa, on peux calculer la quantité de vapeur dans le frigo à 4 et 6.6 °C.
À 4 °C, le frigo contient environ 0.55 grammes de vapeur et à 6.6 °C, il en contient 1.06 grammes.
Si l'on part du principe que le frigo est étanche, la pente de la courbe peux donc s'expliquer par le fait que 0.51 grammes d'eau s'évaporent et se condensent à chaque cyclique, ce qui est une quantité raisonnable.
Sachant que le frigo fait environ 200~litres, qu'à 4~°C l'humidité relative est de 43~\% et que la pression à l'équilibre\footnote{Information que l'on trouve dans des tables} est de 813~Pa, qu'à 6.6~°C l'humidité relative est de 70~\% et que la pression à l'équilibre est de 975~Pa, on peux calculer la quantité de vapeur dans le frigo à 4 et 6.6~°C.
À~4 °C, le frigo contient environ 0.55~grammes de vapeur et à 6.6~°C, il en contient 1.06~grammes.
Si l'on part du principe que le frigo est étanche, la pente de la courbe peux donc s'expliquer par le fait que 0.51~grammes d'eau s'évaporent et se condensent à chaque cyclique, ce qui est une quantité raisonnable.
\begin{figure}[H]
\centering

View File

@ -96,10 +96,16 @@
keywords = "website"
}
@misc{i2c-wikipedia-en,
author = "Wikipédia",
title = "I²C",
url = "http://en.wikipedia.org/wiki/I²C",
keywords = "website"
}
@misc{ds3231,
author = "Maxim~Integrated",
title = "DS3231",
url = "http://datasheets.maximintegrated.com/en/ds/DS3231.pdf",
keywords = "website"
}