This commit is contained in:
Nathanaël Restori 2012-11-02 18:43:53 +01:00
parent 556c0467dd
commit a5444cd1d3

View File

@ -95,7 +95,7 @@ Le bus I²C a été développé par Philips en 1982. La première norme (notée
Quelques exemples d'utilisations courantes utilisations\footcite{i2c-wikipedia-en}~: Quelques exemples d'utilisations courantes utilisations\footcite{i2c-wikipedia-en}~:
\begin{itemize} \begin{itemize}
\item lire des données dans de la mémoire \gls{RAM} \item lire des données dans de la mémoire \gls{RAM}
\item contrôler deux convertisseurs de courant direct à continu et vice-versa \item contrôler des convertisseurs de courant direct à continu et vice-versa
\item changer le contraste, la teinte ou la balance des couleurs d'un écran \item changer le contraste, la teinte ou la balance des couleurs d'un écran
\item changer le volume d'haut-parleurs intelligents \item changer le volume d'haut-parleurs intelligents
\item contrôler des écran \gls{OLED} ou \gls{LCD} \item contrôler des écran \gls{OLED} ou \gls{LCD}
@ -142,7 +142,7 @@ L'état logique \enquote{0} ou \enquote{LOW} est l'état \enquote{dominant} tand
\section{Le protocole I²C} \section{Le protocole I²C}
\subsection{L'encodage} \subsection{L'encodage}
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). 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 ces 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 (\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. 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] \begin{figure}[H]
@ -174,7 +174,7 @@ Pour envoyer un STOP, la ligne SDA doit passer de l'état \enquote{LOW} à \enqu
\subsection{La commande RESTART} \subsection{La commande RESTART}
La commande RESTART est un transgression à la règle d'encodage. Elle est utilisé pour signaler le début d'une nouvelle trame sans passer par une condition STOP. La commande RESTART est un transgression à la règle d'encodage. Elle est utilisé pour signaler le début d'une nouvelle trame sans passer par une condition STOP.
Pour envoyer un RESTART, la ligne SDA doit passer de l'état \enquote{LOW} à \enquote{HIGH} pendant que la ligne SCL est à l'état \enquote{HIGH}. En fait, il s'agit que la commande START qui est envoyée entre un START en un STOP. Pour envoyer un RESTART, la ligne SDA doit passer de l'état \enquote{HIGH} à \enquote{LOW} pendant que la ligne SCL est à l'état \enquote{HIGH}. En fait, il s'agit que la commande START qui est envoyée entre un START en un STOP.
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\includegraphics{figures/I2C/I2C_RESTART.eps} \includegraphics{figures/I2C/I2C_RESTART.eps}
@ -195,7 +195,7 @@ Pour envoyer un ACK, le récepteur envoie simplement un bit \enquote{0}. Pour en
\subsection{La pause} \subsection{La pause}
A tout moment, l'esclave peux bloquer la ligne SCL à \enquote{LOW} pour signaler qu'il est occupé. A tout moment, l'esclave peux bloquer la ligne SCL à \enquote{LOW} pour signaler qu'il est occupé.
Pour aire un pause, l'esclave maintient la ligne SCL au niveau \enquote{LOW} tandis que le maître maintient la ligne au niveau \enquote{HIGH}. Le maître va détecter l'écrasement et maintenir la ligne au niveau \enquote{HIGH} jusqu'à ce que l'esclave est libéré la ligne. Pour faire un pause, l'esclave maintient la ligne SCL au niveau \enquote{LOW} tandis que le maître maintient la ligne au niveau \enquote{HIGH}. Le maître va détecter l'écrasement et maintenir la ligne au niveau \enquote{HIGH} jusqu'à ce que l'esclave est libéré la ligne.
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\includegraphics{figures/I2C/I2C_Pause.eps} \includegraphics{figures/I2C/I2C_Pause.eps}
@ -213,7 +213,7 @@ L'octet est composé de deux parties~:
\item le dernier bit est appelé bit R/W (Read/Write)~: \item le dernier bit est appelé bit R/W (Read/Write)~:
\begin{itemize} \begin{itemize}
\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{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. \item si le maître envoie un \enquote{0}, il demande une écriture et il envoie des données à l'esclave.
\end{itemize} \end{itemize}
\end{enumerate} \end{enumerate}
@ -225,7 +225,7 @@ Il y a quelques adresses \enquote{spéciales}\footnote{Les X tout à gauche corr
\item 0000011X~: réservée pour des utilisations futures \item 0000011X~: réservée pour des utilisations futures
\item 00001XXX~: utilisée pour les composants haute-vitesse \item 00001XXX~: utilisée pour les composants haute-vitesse
\item 11111XXX~: réservée pour des utilisations futures \item 11111XXX~: réservée pour des utilisations futures
\item 11110yz0~: utilisée pour l'adressage sur 10 bits \item 11110yzX~: utilisée pour l'adressage sur 10 bits
\end{itemize} \end{itemize}
\subsubsection{L'adressage sur 10 bits} \subsubsection{L'adressage sur 10 bits}
@ -283,7 +283,7 @@ Voici un exemple d'échange complet~:
\end{figure} \end{figure}
\subsection{Le cas de conflit} \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 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 en 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 ont envoyé 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} \chapter{Le matériel}
@ -291,7 +291,7 @@ Si les deux maîtres ont envoyé exactement la même chose, il n'y aura pas de c
Il existe de nombreuse \gls{plate-forme} en robotique~: par exemple, le Boe-Bot de Parallax, utilisé dans les cours facultatifs de robotique de M.~Gardon. J'ai fait le choix d'un Arduino car cette un plate-forme de plus en plus répandue, peu chère (20 € pour une carte programmable) et puissante. On trouve de nombreux exemples de \gls{DIY}\glsadd{DIYg}, elle est programmable en \gls{C++} (donc il est possible d'utiliser des \glspl{bibliotheque}) et c'est du \gls{materiel libre}. Il existe de nombreuse \gls{plate-forme} en robotique~: par exemple, le Boe-Bot de Parallax, utilisé dans les cours facultatifs de robotique de M.~Gardon. J'ai fait le choix d'un Arduino car cette un plate-forme de plus en plus répandue, peu chère (20 € pour une carte programmable) et puissante. On trouve de nombreux exemples de \gls{DIY}\glsadd{DIYg}, elle est programmable en \gls{C++} (donc il est possible d'utiliser des \glspl{bibliotheque}) et c'est du \gls{materiel libre}.
\section{Les capteurs} \section{Les capteurs}
Il a été décidé de faire une station météo. Nous avons donc besoin d'un thermomètre (figure \ref{fig:BMP085}), d'un hygromètre (figure \ref{fig:BMP085} aussi), d'un baromètre (figure \ref{fig:TSL2561}) et d'un capteur de luminosité (figure \ref{fig:DHT22}). J'ai ajouté une horloge (figure \ref{fig:ChronoDot}) qui nous permettra d'avoir l'heure à laquelle les mesures ont été prises. Tous les capteurs ont été commandé sur le site d'Adafruit. L'hygromètre ne se connecte malheureusement pas en I²C, aucun capteur de ce type n'étant disponible. J'ai été décidé de faire une station météo. Nous avons donc besoin d'un thermomètre (figure \ref{fig:BMP085}), d'un hygromètre (figure \ref{fig:BMP085} aussi), d'un baromètre (figure \ref{fig:TSL2561}) et d'un capteur de luminosité (figure \ref{fig:DHT22}). J'ai ajouté une horloge (figure \ref{fig:ChronoDot}) qui nous permettra d'avoir l'heure à laquelle les mesures ont été prises. Tous les capteurs ont été commandés sur le site d'Adafruit. L'hygromètre ne se connecte malheureusement pas en I²C, aucun capteur de ce type n'étant disponible.
\begin{figure}[h] \begin{figure}[h]
\centering \centering
@ -348,7 +348,7 @@ La partie logicielle est coupée en deux programmes~: un enregistreur et un serv
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}. 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}.
\section{L'enregistreur} \section{L'enregistreur}
La fonction \verb|setup()| commence par initialiser la carte SD puis initialise les différents capteurs. Il configure ensuite le capteur de luminosité et finit par vérifier si le fichier DATA.TSV existe, le crée si il n'existe pas et y enregistre les en-tête (un exemple de se fichier est disponible à l'annexe \ref{app:data}). La fonction \verb|setup()| commence par initialiser la carte SD puis initialise les différents capteurs. Il configure ensuite le capteur de luminosité et finit par vérifier si le fichier \enquote{DATA.TSV} existe, le crée si il n'existe pas et y enregistre les en-tête (un exemple de se fichier est disponible à l'annexe \ref{app:data}).
La fonction \verb|loop()| récupère les différentes données des capteurs puis les enregistre. Elle finit en faisant une pause d'un temps définit. La fonction \verb|loop()| récupère les différentes données des capteurs puis les enregistre. Elle finit en faisant une pause d'un temps définit.
@ -397,13 +397,13 @@ Les trois nombre envoyé on été choisis à cause de leur écriture en binaire\
\end{table} \end{table}
\section{Analyse des graphes} \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 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}. Pour pouvoir analyser les graphes facilement, j'ai rajouté le numéro ou le nom des 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} \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). 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 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. 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 \enquote{LOW}. 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] \begin{figure}[H]
\centering \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 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 \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. 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 de 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] \begin{figure}[H]
\centering \centering
@ -447,7 +447,7 @@ Si on veux lire une partie du registre, il faut commencer par envoyer en écritu
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. 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} \chapter{Le cas du frigo}
\section{Les mesures} \section{Les mesures}