<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Gibus</title>
	<atom:link href="http://chuckoggy.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://chuckoggy.wordpress.com</link>
	<description>Programmation et électronique</description>
	<lastBuildDate>Thu, 14 Jun 2012 22:33:22 +0000</lastBuildDate>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='chuckoggy.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Gibus</title>
		<link>http://chuckoggy.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://chuckoggy.wordpress.com/osd.xml" title="Gibus" />
	<atom:link rel='hub' href='http://chuckoggy.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Lampe Android</title>
		<link>http://chuckoggy.wordpress.com/2011/09/01/lampe-android/</link>
		<comments>http://chuckoggy.wordpress.com/2011/09/01/lampe-android/#comments</comments>
		<pubDate>Thu, 01 Sep 2011 21:57:39 +0000</pubDate>
		<dc:creator>Gibus</dc:creator>
				<category><![CDATA[Programmation]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[foxboard]]></category>
		<category><![CDATA[htc]]></category>
		<category><![CDATA[lamp]]></category>
		<category><![CDATA[leds]]></category>
		<category><![CDATA[living colors]]></category>
		<category><![CDATA[programmation]]></category>
		<category><![CDATA[rgb]]></category>
		<category><![CDATA[smartphone]]></category>
		<category><![CDATA[wildfire]]></category>

		<guid isPermaLink="false">http://chuckoggy.wordpress.com/?p=271</guid>
		<description><![CDATA[Un petit essai d&#8217;application pour Android. Celle-ci permet de piloter la lampe RGB depuis un smartphone. La luminosité est modifiée par un défilement vertical, la saturation par un défilement horizontal et la teinte varie en fonction de l&#8217;orientation du téléphone. &#8230; <a href="http://chuckoggy.wordpress.com/2011/09/01/lampe-android/">Lire la suite <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chuckoggy.wordpress.com&#038;blog=20194618&#038;post=271&#038;subd=chuckoggy&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p style="text-align:justify;">Un petit essai d&rsquo;application pour Android. Celle-ci permet de piloter la <a title="Lampe Web" href="http://chuckoggy.wordpress.com/2011/02/19/lampeweb/" target="_blank">lampe RGB</a> depuis un smartphone.</p>
<span class='embed-youtube' style='text-align:center; display: block;'><iframe class='youtube-player' type='text/html' width='584' height='359' src='http://www.youtube.com/embed/4OU1Uw7fZ2M?version=3&#038;rel=1&#038;fs=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' frameborder='0'></iframe></span>
<p style="text-align:justify;"><span id="more-271"></span>La luminosité est modifiée par un défilement vertical, la saturation par un défilement horizontal et la teinte varie en fonction de l&rsquo;orientation du téléphone. Le téléphone utilisé dans la vidéo est un HTC Wildfire S sous Android 2.3.3. L&rsquo;application fonctionne avec le WiFi ou en réseau mobile (à la condition que la lampe soit accessible depuis une adresse IP publique)</p>
<p style="text-align:justify;">L&rsquo;orientation du téléphone est détectée grâce à la boussole intégrée (capteur de champ magnétique sur 3 axes) Les paramètres de teinte, saturation et luminosité sont convertis en RGB puis envoyés via une liaison TCP vers la carte Fox qui contrôle la lampe.</p>
<p style="text-align:justify;">L&rsquo;application a été développée sous Eclipse en utilisant le <a title="Android SDK" href="http://developer.android.com/sdk/index.html" target="_blank">SDK Android</a>. Je ne suis pas particulièrement amateur du langage Java mais il faut reconnaître que la documentation du SDK de Google est très claire et complète, la prise en main des API et le déploiement d&rsquo;un projet sont très rapides. Le débogage peut prendre place sur un émulateur ou directement sur le téléphone connecté en USB.</p>
<p style="text-align:center;"><em><a href="http://gibusperon.free.fr/colors/Colors.apk" target="_blank">Installer le package Colors.apk</a></em></p>
<p style="text-align:center;"><em></em><em></em><em><a href="http://gibusperon.free.fr/colors/Colors.rar" target="_blank"> Sources de l&rsquo;application Colors</a></em></p>
<div id="attachment_275" class="wp-caption aligncenter" style="width: 594px"><a href="http://chuckoggy.files.wordpress.com/2011/09/android.jpg"><img class="size-full wp-image-275" title="L'application Colors disponible dans l'émulateur" src="http://chuckoggy.files.wordpress.com/2011/09/android.jpg?w=584&#038;h=409" alt="" width="584" height="409" /></a><p class="wp-caption-text">L&#039;application Colors disponible depuis l&#039;émulateur</p></div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chuckoggy.wordpress.com/271/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chuckoggy.wordpress.com/271/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chuckoggy.wordpress.com&#038;blog=20194618&#038;post=271&#038;subd=chuckoggy&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://chuckoggy.wordpress.com/2011/09/01/lampe-android/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0e53af6633dc6dba87d625f5a99f0e78?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">gibusperon</media:title>
		</media:content>

		<media:content url="http://chuckoggy.files.wordpress.com/2011/09/android.jpg" medium="image">
			<media:title type="html">L&#039;application Colors disponible dans l&#039;émulateur</media:title>
		</media:content>
	</item>
		<item>
		<title>Créer des photos pour la Nintendo 3DS</title>
		<link>http://chuckoggy.wordpress.com/2011/08/09/creer-des-photos-pour-la-nintendo-3ds/</link>
		<comments>http://chuckoggy.wordpress.com/2011/08/09/creer-des-photos-pour-la-nintendo-3ds/#comments</comments>
		<pubDate>Tue, 09 Aug 2011 01:36:15 +0000</pubDate>
		<dc:creator>Gibus</dc:creator>
				<category><![CDATA[Programmation]]></category>
		<category><![CDATA[3d]]></category>
		<category><![CDATA[3ds]]></category>
		<category><![CDATA[mpo]]></category>
		<category><![CDATA[nintendo]]></category>
		<category><![CDATA[photo]]></category>
		<category><![CDATA[pil]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[script]]></category>

		<guid isPermaLink="false">http://chuckoggy.wordpress.com/?p=246</guid>
		<description><![CDATA[Voici un petit script en Python qui permet à partir de deux photos d&#8217;obtenir une image 3d lisible sur une console Nintendo 3DS. Il suffit de prendre en photo une scène par deux fois depuis deux points de vue rapprochés: &#8230; <a href="http://chuckoggy.wordpress.com/2011/08/09/creer-des-photos-pour-la-nintendo-3ds/">Lire la suite <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chuckoggy.wordpress.com&#038;blog=20194618&#038;post=246&#038;subd=chuckoggy&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p style="text-align:justify;">Voici un petit script en Python qui permet à partir de deux photos d&rsquo;obtenir une image 3d lisible sur une console Nintendo 3DS.</p>
<p style="text-align:justify;">Il suffit de prendre en photo une scène par deux fois depuis deux points de vue rapprochés:</p>
<p style="text-align:center;"><a href="http://chuckoggy.files.wordpress.com/2011/08/2l.jpg"><img class="size-thumbnail wp-image-247 alignnone" title="Photo de gauche" src="http://chuckoggy.files.wordpress.com/2011/08/2l.jpg?w=150&#038;h=112" alt="" width="150" height="112" /></a> <a href="http://chuckoggy.files.wordpress.com/2011/08/2r.jpg"><img class="size-thumbnail wp-image-248 alignnone" title="Photo de droite" src="http://chuckoggy.files.wordpress.com/2011/08/2r.jpg?w=150&#038;h=112" alt="" width="150" height="112" /></a><br />
<em>Photo de gauche &#8211; photo de droite</em></p>
<p>Puis on lance le script de la manière suivante:</p>
<p><em>jpg2mpo.py photo-de-gauche.jpg photo-de-droite.jpg R3DS4002.mpo</em></p>
<p style="text-align:justify;">Les photos sont redimensionnées en 640 par 480 pixels puis assemblées dans un fichier MPO que l&rsquo;on peut visualiser avec la 3DS.</p>
<p style="text-align:center;"><span id="more-246"></span><strong><em><a title="R3DS4002.MPO" href="http://gibusperon.free.fr/jpg2mpo/R3DS4002.mpo" target="_blank">R3DS4002.MPO</a></em></strong></p>
<p style="text-align:justify;">La console utilise le format <a title="Multi-Picture Format" href="http://en.wikipedia.org/wiki/JPEG#JPEG_Multi-Picture_Format" target="_blank">Multi-Picture File</a> (extension .mpo) pour stocker ses photos stéréographiques. Celui-ci consiste globalement en une concaténation de plusieurs fichiers au format JPEG auxquels on ajoute des entêtes spécifiques.</p>
<p style="text-align:justify;"><a href="http://chuckoggy.files.wordpress.com/2011/08/mp-structure.jpg"><img class="aligncenter size-full wp-image-266" title="MP Structure" src="http://chuckoggy.files.wordpress.com/2011/08/mp-structure.jpg?w=584" alt=""   /></a></p>
<p style="text-align:justify;">Le script ouvre les deux images sources, les redimensionne en conservant le rapport hauteur/largeur d&rsquo;origine puis les réenregistre au format JPEG. Les deux fichiers résultants sont ensuite nettoyés de tout tag TIFF/EXIF puis concaténés avec des entêtes extraites de véritables photos 3DS. Les adresses de chaque image et leurs tailles sont calculées puis mises à jour dans les entêtes Multi-Picture.</p>
<p style="text-align:center;"><strong><em><a title="Script jpg2mpo.py" href="http://gibusperon.free.fr/jpg2mpo/jpg2mpo.py" target="_blank">Script jpg2mpo.py</a></em></strong></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chuckoggy.wordpress.com/246/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chuckoggy.wordpress.com/246/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chuckoggy.wordpress.com&#038;blog=20194618&#038;post=246&#038;subd=chuckoggy&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://chuckoggy.wordpress.com/2011/08/09/creer-des-photos-pour-la-nintendo-3ds/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0e53af6633dc6dba87d625f5a99f0e78?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">gibusperon</media:title>
		</media:content>

		<media:content url="http://chuckoggy.files.wordpress.com/2011/08/2l.jpg?w=150" medium="image">
			<media:title type="html">Photo de gauche</media:title>
		</media:content>

		<media:content url="http://chuckoggy.files.wordpress.com/2011/08/2r.jpg?w=150" medium="image">
			<media:title type="html">Photo de droite</media:title>
		</media:content>

		<media:content url="http://chuckoggy.files.wordpress.com/2011/08/mp-structure.jpg" medium="image">
			<media:title type="html">MP Structure</media:title>
		</media:content>
	</item>
		<item>
		<title>SOS et JavaScript</title>
		<link>http://chuckoggy.wordpress.com/2011/07/04/sos-sous-javascript/</link>
		<comments>http://chuckoggy.wordpress.com/2011/07/04/sos-sous-javascript/#comments</comments>
		<pubDate>Mon, 04 Jul 2011 01:19:51 +0000</pubDate>
		<dc:creator>Gibus</dc:creator>
				<category><![CDATA[Programmation]]></category>
		<category><![CDATA[bellard]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[emulator]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jslinux]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[programmation]]></category>
		<category><![CDATA[sos]]></category>
		<category><![CDATA[x86]]></category>

		<guid isPermaLink="false">http://chuckoggy.wordpress.com/?p=179</guid>
		<description><![CDATA[Présentation Vous connaissez peut-être SOS (Simple Operating System): un OS à but pédagogique créé par David Decotigny et Thomas Petazzoni. La description de son fonctionnement a fait l&#8217;objet d&#8217;une dizaine d&#8217;articles parus dans le magazine Gnu/Linux Magazine France entre 2004 &#8230; <a href="http://chuckoggy.wordpress.com/2011/07/04/sos-sous-javascript/">Lire la suite <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chuckoggy.wordpress.com&#038;blog=20194618&#038;post=179&#038;subd=chuckoggy&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<h2>Présentation</h2>
<p style="text-align:justify;">Vous connaissez peut-être <a title="SOS" href="http://sos.enix.org/fr/PagePrincipale" target="_blank">SOS</a> (Simple Operating System): un OS à but pédagogique créé par David Decotigny et Thomas Petazzoni. La description de son fonctionnement a fait l&rsquo;objet d&rsquo;une dizaine d&rsquo;articles parus dans le magazine <a title="Gnu/Linux Magazine France" href="http://www.gnulinuxmag.com/" target="_blank">Gnu/Linux Magazine France</a> entre 2004 et 2006. Il est composé principalement d&rsquo;un noyau 32 bits multitâche conçu pour fonctionner sur une architecture de type x86 PC.</p>
<p style="text-align:justify;">Or en mai 2011 <a title="Fabrice Bellard" href="http://bellard.org/" target="_blank">Fabrice Bellard</a> (QEMU, FFMPEG&#8230;) présente <a title="JavaScript PC Emulator" href="http://bellard.org/jslinux/" target="_blank">JavaScript PC Emulator</a> qui, comme son nom l&rsquo;indique, est un émulateur x86 codé en JavaScript. Celui-ci permet de faire tourner un système Linux dans son navigateur Web.</p>
<p style="text-align:justify;">Je me suis alors empressé d&rsquo;essayer d&rsquo;exécuter SOS dans cet émulateur. Malgré ma faible expérience en programmation assembleur, j&rsquo;ai tout de même voulu tenter ma chance.</p>
<p style="text-align:center;"><span id="more-179"></span><a href="http://gibusperon.free.fr/sos/jslinux.htm" target="_blank"><img class="aligncenter size-full wp-image-229" title="SOS sous JavaScript" src="http://chuckoggy.files.wordpress.com/2011/07/screenshot.jpg?w=584" alt=""   /></a><a title="SOS dans Javascript" href="http://gibusperon.free.fr/sos/jslinux.htm" target="_blank">http://gibusperon.free.fr/sos/jslinux.htm</a></p>
<p style="text-align:justify;">Le code source original de SOS utilisé comme base est celui paru avec l&rsquo;article 9, premier volet. En effet, l&rsquo;émulateur permet de communiquer avec l&rsquo;OS par l&rsquo;intermédiaire du port série et cette version est la première à intégrer un pilote de terminal série ainsi qu&rsquo;un shell de base. Les versions suivantes apportent surtout le support des périphériques en mode bloc, et n&rsquo;auraient pas d&rsquo;utilité dans ce contexte.</p>
<h2>Chargement en mémoire</h2>
<p style="text-align:justify;">Pour commencer, le script jslinux.js crée une machine virtuelle en instanciant un objet de type PCEmulator. Une méthode permet ensuite de charger des fichiers binaires directement dans la mémoire de la cible. Dans le cas de Linux sont chargés le noyau, un initrd au format ext2 non compressé, un binaire <em>linuxstart.bin</em> qui remplit en partie le rôle de bootloader et une chaine de caractères représentant la ligne de commande de boot.</p>
<p style="text-align:justify;">Par contre, les binaires exécutables ne doivent pas être au même format que s&rsquo;ils étaient chargés avec GRUB. Pour le noyau Linux, il faut utiliser un dump mémoire du fichier vmlinux (la version non compressée sans routines de setup). Il faut donc modifier le Makefile de SOS pour générer non plus un exécutable au format ELF compressé mais un dump de celui-ci obtenu avec <em>objcopy -O binary sos.elf sos.bin</em></p>
<p style="text-align:justify;">De plus, Linux et SOS ne sont pas situés au même emplacement en mémoire: 0&#215;100000 pour Linux et 0&#215;200000 pour SOS. Plutôt que de modifier le script de liaison <em>support/sos.lds</em>, il est plus simple de modifier l&rsquo;adresse de chargement dans le script jslinux.js.</p>
<h2>Le bootloader</h2>
<p style="text-align:justify;">La section <a title="Technical Notes" href="http://bellard.org/jslinux/tech.html" target="_blank">Technical Notes</a> du site de JSLinux fournit le code source du bootloader.</p>
<p style="text-align:justify;">Dans le cas de SOS, pas besoin d&rsquo;initrd ou de ligne de commande. Par contre le binaire linuxstart.bin reste nécessaire: il constitue le point d&rsquo;entrée de la machine virtuelle. Par rapport à un bootloader classique, son code est simplifié du fait que les exécutables ont déjà été chargés en mémoire et que l&rsquo;émulateur démarre directement en mode protégé 32 bits (en effet le mode réel 16 bits n&rsquo;est pas du tout implémenté dans JavaScript PC Emulator). Il effectue les opérations suivantes:</p>
<ul style="text-align:justify;">
<li>Mettre en place une pile temporaire dans la mémoire basse (0&#215;1000-0&#215;3000)</li>
<li>Initialiser une structure en mémoire basse (contenant entre autre la taille de la mémoire haute, l&rsquo;adresse et la taille de l&rsquo;initrd, la ligne de commande) qui sera transmise au noyau (adresse dans le registre SI)</li>
<li>Mettre en place la segmentation en chargeant une GDT basique</li>
<li>Sauter au point d&rsquo;entrée du noyau</li>
</ul>
<p style="text-align:justify;">Seulement, contrairement à Linux qui utilise une structure de données qui lui est propre, SOS se base sur le standard <a title="Multiboot" href="http://www.gnu.org/software/grub/manual/multiboot/multiboot.html" target="_blank">Multiboot</a> pour récupérer les informations en provenance du bootloader. Le code de linuxstart.bin est modifié pour initialiser une structure de type multiboot_info et y renseigner la taille de la mémoire haute (la quantité de mémoire totale en ko à laquelle on soustrait 1Mo de mémoire basse). L&rsquo;adresse de cette structure est passée à SOS par le registre EBX tandis que EAX contient une constante particulière qui indique un chargement multiboot.</p>
<p style="text-align:justify;">Dernier détail: pour Linux, linuxstart.bin effectue un saut absolu vers l&rsquo;adresse de chargement du noyau. Le point d&rsquo;entrée de SOS lui est situé 4ko plus loin: le code est préfixé d&rsquo;une entête multiboot destinée au bootloader (inutilisée dans notre cas) et aligné sur la page mémoire suivante.</p>
<h2>Première exécution</h2>
<p style="text-align:justify;">A ce stade, le lancement de SOS dans l&rsquo;émulateur provoque le blocage du navigateur jusqu&rsquo;à ce que celui-ci propose d&rsquo;arrêter le script qui lui semble boucler. Pour m&rsquo;aider à trouver la portion de code en cause, une fonction basique d&rsquo;affichage sur le port série a été ajoutée dans le fichier <em>drivers/printjs.c</em> (le pilote terminal série n&rsquo;est disponible que vers la fin de l&rsquo;initialisation du noyau).</p>
<p style="text-align:justify;">Après un débogage laborieux, les instructions d&rsquo;empilement et de dépilement de mots sur la pile, respectivement pushw et popw, s&rsquo;avèrent être la source du problème. Or celles-ci interviennent régulièrement dans le code de SOS, principalement lors des changements de contextes où les registres de segment 16bits sont sauvegardés sur la pile.</p>
<p style="text-align:justify;">Comment se fait-il alors que le noyau Linux ne soit pas impacté par ce problème? La raison,<em> objdump -d vmlinux | grep &quot;\(pushw\|popw\)&quot;</em> ne renvoie aucun résultat: Linux n&rsquo;utilise jamais ces instructions. De plus, Fabrice Bellard indique dans la section &quot;Technical Notes&quot; du site de Javascript PC Emulator:<em> A few seldom used instructions are missing.</em> Il y a donc de fortes chances que ces instructions ne soient pas émulées.</p>
<p style="text-align:justify;">La solution consiste à remplacer tous les appels à pushw et popw par un code qui manipule manuellement la pile. Par exemple pour empiler le registre SS:</p>
<pre>pushw %ss</pre>
<p>est remplacé par:</p>
<pre>subl  $2, %esp     //Décrémente le pointeur de pile ESP
movw  %ss, (%esp)  //Affecte la valeur du registre SS en fin de pile</pre>
<p>Idem pour le dépilement de SS:</p>
<pre>popw  %ss</pre>
<p>est remplacé par:</p>
<pre>movw  (%esp), %ss  //Attribue la valeur en fin de pile au registre SS
addl  $2, %esp     //Incrémente ESP</pre>
<p style="text-align:justify;">Après modification, SOS se lance et l&rsquo;on accède à un shell basique. (uname, ls, cat, touch&#8230;)Un petit souci d&rsquo;affichage apparait lors de l&rsquo;appui sur la touche Entrée. Ceci est corrigé en forçant l&rsquo;envoi d&rsquo;un retour chariot &lsquo;\r&rsquo; lors de l&rsquo;affichage d&rsquo;une chaîne de caractère se terminant par &lsquo;\n&rsquo;.</p>
<h2>Les pilotes</h2>
<p style="text-align:justify;">On peut remarquer lors du lancement de Linux une ligne qui indique le temps de boot. Un compteur est initialisé au lancement de la machine virtuelle dans le code javascript jslinux.js. Il suffit alors, une fois le noyau chargé, de récupérer la valeur courante du compteur en millisecondes sur le bus d&rsquo;entrées/sorties à l&rsquo;adresse 0x3CC. Au chargement de SOS, vous pouvez également le voir apparaître, il vaut environ 400ms sur mon portable avec Firefox 5 par exemple.</p>
<p style="text-align:justify;">Enfin, il reste une dernière fonction à ajouter pour profiter pleinement des fonctionnalités de l&rsquo;émulateur: le presse-papier. Le patch fourni par Fabrice Bellard destiné au noyau Linux contient le code d&rsquo;un driver en mode caractère.Celui-ci permet par l&rsquo;intermédiaire du fichier spécial /dev/clipboard de recevoir ou d&rsquo;envoyer du texte vers la fenêtre du presse-papier située à droite du terminal.</p>
<p style="text-align:justify;">La modèle de pilote de SOS étant largement inspiré de celui de Linux, ce code est facilement transposable. Le fichier <em>drivers/jsclipboard.c</em> implémente les fonctions de base open, close, read et write. En résumé, le pilote utilise les entrées/sorties suivantes:</p>
<pre>Adresse     I/O  Opération
0x3C0-0x3C3 In   Récupérer la taille totale du presse-papier
     -      Out  Vider le presse-papier
0x3C4-0x3C7 In   Récupérer la position dans le fichier
     -      Out  Affecter la position dans le fichier
0x3C8-0x3CB In   Lire le presse-papier
     -      Out  Ecrire dans le presse-papier
0x3CC-0x3CF In   Récupérer la valeur du compteur de boot
     -      Out  Synchroniser le presse-papier</pre>
<p style="text-align:justify;">Le fichier spécial /dev/clipboard d&rsquo;identifiant majeur 4 et d&rsquo;identifiant mineur 0 est créé dans le processus init (userland/init.c) par l&rsquo;appel système mknod. Il est désormais possible de lire le contenu du presse papier en ligne de commande par <em>cat /dev/clipboard</em>.</p>
<p style="text-align:justify;">L&rsquo;écriture dans le presse papier n&rsquo;est pas accessible directement par <em>cat fichier &gt; /dev/clipboard</em> car l&rsquo;opérateur de redirection &lsquo;&gt;&rsquo; n&rsquo;est pas supporté dans le shell de SOS. Par contre une commande <em>toclipboard</em> a été ajoutée dans userland/shell.c pour y remédier.</p>
<p style="text-align:justify;">Ces commandes permettent de copier le contenu d&rsquo;un fichier dans le presse-papier:</p>
<pre>$ edit fichier
Ligne 1
Ligne 2

$ toclipboard fichier</pre>
<p style="text-align:justify;">
<p style="text-align:center;"><a title="Sources de SOS sous JavaScript" href="http://gibusperon.free.fr/sos/sos_jslinux.tar.bz2" target="_blank">[Sources de SOS sous JavaScript]</a></p>
<p style="text-align:center;"><a title="Patch depuis l'article 9" href="http://gibusperon.free.fr/sos/sos-code-art9-js.diff" target="_blank">[Patch de l'article 9]</a></p>
<p><em>Merci à Fabrice Bellard pour m&rsquo;avoir autorisé à redistribuer JavaScript PC Emulator</em></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chuckoggy.wordpress.com/179/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chuckoggy.wordpress.com/179/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chuckoggy.wordpress.com&#038;blog=20194618&#038;post=179&#038;subd=chuckoggy&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://chuckoggy.wordpress.com/2011/07/04/sos-sous-javascript/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0e53af6633dc6dba87d625f5a99f0e78?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">gibusperon</media:title>
		</media:content>

		<media:content url="http://chuckoggy.files.wordpress.com/2011/07/screenshot.jpg" medium="image">
			<media:title type="html">SOS sous JavaScript</media:title>
		</media:content>
	</item>
		<item>
		<title>Modes lampe Web</title>
		<link>http://chuckoggy.wordpress.com/2011/03/15/modes-lampe-web/</link>
		<comments>http://chuckoggy.wordpress.com/2011/03/15/modes-lampe-web/#comments</comments>
		<pubDate>Tue, 15 Mar 2011 01:22:02 +0000</pubDate>
		<dc:creator>Gibus</dc:creator>
				<category><![CDATA[Electronique]]></category>
		<category><![CDATA[acme]]></category>
		<category><![CDATA[action script]]></category>
		<category><![CDATA[avr]]></category>
		<category><![CDATA[cris]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[electronique]]></category>
		<category><![CDATA[embarqué]]></category>
		<category><![CDATA[embedded]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[foxboard]]></category>
		<category><![CDATA[lamp]]></category>
		<category><![CDATA[lampe]]></category>
		<category><![CDATA[leds]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[living colors]]></category>
		<category><![CDATA[programmation]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[rgb]]></category>

		<guid isPermaLink="false">http://chuckoggy.wordpress.com/?p=158</guid>
		<description><![CDATA[De nouveaux modes pour la lampe Web, commandée à l&#8217;aide de scripts en Python Mode random La lampe change de couleur de manière aléatoire  suivant une temporisation: Code source du mode random Mode stroboscope Ce mode ne donne rien en &#8230; <a href="http://chuckoggy.wordpress.com/2011/03/15/modes-lampe-web/">Lire la suite <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chuckoggy.wordpress.com&#038;blog=20194618&#038;post=158&#038;subd=chuckoggy&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>De nouveaux modes pour la <a title="Lampe Web" href="http://chuckoggy.wordpress.com/2011/02/19/lampeweb/" target="_blank">lampe Web</a>, commandée à l&rsquo;aide de scripts en Python</p>
<h2><span id="more-158"></span>Mode random</h2>
<p>La lampe change de couleur de manière aléatoire  suivant une temporisation:</p>
<span class='embed-youtube' style='text-align:center; display: block;'><iframe class='youtube-player' type='text/html' width='584' height='359' src='http://www.youtube.com/embed/-1yyUZM9ZZg?version=3&#038;rel=1&#038;fs=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' frameborder='0'></iframe></span>
<p><a href="http://gibusperon.free.fr/colors/aleat.py">Code source du mode random</a></p>
<h2>Mode stroboscope</h2>
<p>Ce mode ne donne rien en vidéo mais permet de prendre ce genre de photos:</p>
<p style="text-align:left;"><a href="http://chuckoggy.files.wordpress.com/2011/03/strobo.jpg"><img class="size-full wp-image-161" title="Stroboscope" src="http://chuckoggy.files.wordpress.com/2011/03/strobo.jpg?w=584&#038;h=428" alt="" width="584" height="428" /></a></p>
<p style="text-align:left;"><a href="http://gibusperon.free.fr/colors/strobo.py">Code source du mode stroboscope</a></p>
<h2>Mode suivi du CPU</h2>
<p>La couleur de la lampe varie en fonction de la charge du processeur d&rsquo;un serveur de fichier:</p>
<span class='embed-youtube' style='text-align:center; display: block;'><iframe class='youtube-player' type='text/html' width='584' height='359' src='http://www.youtube.com/embed/d4xMb3VLRQ4?version=3&#038;rel=1&#038;fs=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' frameborder='0'></iframe></span>
<p><a href="http://gibusperon.free.fr/colors/cpulamp.py">Code source du mode CPU</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chuckoggy.wordpress.com/158/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chuckoggy.wordpress.com/158/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chuckoggy.wordpress.com&#038;blog=20194618&#038;post=158&#038;subd=chuckoggy&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://chuckoggy.wordpress.com/2011/03/15/modes-lampe-web/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0e53af6633dc6dba87d625f5a99f0e78?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">gibusperon</media:title>
		</media:content>

		<media:content url="http://chuckoggy.files.wordpress.com/2011/03/strobo.jpg" medium="image">
			<media:title type="html">Stroboscope</media:title>
		</media:content>
	</item>
		<item>
		<title>Lampe Web</title>
		<link>http://chuckoggy.wordpress.com/2011/02/19/lampeweb/</link>
		<comments>http://chuckoggy.wordpress.com/2011/02/19/lampeweb/#comments</comments>
		<pubDate>Sat, 19 Feb 2011 01:06:19 +0000</pubDate>
		<dc:creator>Gibus</dc:creator>
				<category><![CDATA[Electronique]]></category>
		<category><![CDATA[acme]]></category>
		<category><![CDATA[action script]]></category>
		<category><![CDATA[avr]]></category>
		<category><![CDATA[cris]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[electronique]]></category>
		<category><![CDATA[embarqué]]></category>
		<category><![CDATA[embedded]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[foxboard]]></category>
		<category><![CDATA[lamp]]></category>
		<category><![CDATA[lampe]]></category>
		<category><![CDATA[leds]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[living colors]]></category>
		<category><![CDATA[programmation]]></category>
		<category><![CDATA[rgb]]></category>

		<guid isPermaLink="false">http://chuckoggy.wordpress.com/?p=5</guid>
		<description><![CDATA[Il y a quelque temps, j&#8217;avais promis à une certaine personne que je réaliserais ma propre lampe de type Living Colors. Seulement, contrôler la couleur ambiante grâce à une télécommande c&#8217;est bien, mais je voulais pouvoir le faire depuis un &#8230; <a href="http://chuckoggy.wordpress.com/2011/02/19/lampeweb/">Lire la suite <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chuckoggy.wordpress.com&#038;blog=20194618&#038;post=5&#038;subd=chuckoggy&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p style="text-align:justify;">Il y a quelque temps, j&rsquo;avais promis à une certaine personne que je réaliserais ma propre lampe de type <a href="http://www.philips.fr/c/livingambiance/180980/cat/"><em>Living Colors</em></a>. Seulement, contrôler la couleur ambiante grâce à une télécommande c&rsquo;est bien, mais je voulais pouvoir le faire depuis un PC ou tout autre appareil connecté.</p>
<p style="text-align:center;"><span class='embed-youtube' style='text-align:center; display: block;'><iframe class='youtube-player' type='text/html' width='584' height='359' src='http://www.youtube.com/embed/Rw4Dijq4AkU?version=3&#038;rel=1&#038;fs=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' frameborder='0'></iframe></span></p>
<p style="text-align:left;"><span id="more-5"></span></p>
<p style="text-align:justify;">Dès le début, je pensais réaliser un montage autour d&rsquo;une carte FOX LX832 développée par la société italienne <a href="http://www.acmesystems.it/"><em>Acme Systems</em></a>. La carte FOX est un système embarqué complet basé sur un processeur Etrax 100LX construit par <a href="http://www.axis.com/"><em>Axis</em></a>. Elle permet de faire tourner un système GNU/Linux (noyau 2.6) et propose une multitude d&rsquo;interfaces (USB, i2c, SPI, UART, Ethernet, GPIO&#8230;) Tout ça pour un poids de moins de 40g.</p>
<p style="text-align:center;"><a href="http://chuckoggy.files.wordpress.com/2011/02/fox832.jpg"><img class="aligncenter size-full wp-image-12" title="Fox LX832" src="http://chuckoggy.files.wordpress.com/2011/02/fox832.jpg?w=584" alt=""   /></a><em>Acme Systems FOX LX832</em></p>
<p style="text-align:justify;">Selon un premier schéma, la carte FOX héberge un serveur TCP à l&rsquo;écoute d&rsquo;un client et pilote, selon les réglages de l&rsquo;utilisateur, trois LEDs: une rouge, une verte et une bleue.</p>
<h2 style="text-align:left;">L&rsquo;interface utilisateur</h2>
<p style="text-align:justify;">Au départ je comptais coder l&rsquo;interface en C++ à l&rsquo;aide d&rsquo;un framework tel que GTK ou QT. Après réflexion, il apparaissait plus judicieux de réaliser le client en flash: le résultat est directement utilisable sur de nombreux OS et architectures, l&rsquo;aspect graphique est complètement personnalisable et, le plus important: le composant peut être inséré dans une simple page HTML. L&rsquo;interface de contrôle est alors accessible de n&rsquo;importe où avec un simple navigateur web (pour peu que le matériel utilisé supporte Flash).</p>
<p style="text-align:justify;">L&rsquo;espace colorimétrique le plus adapté à ce genre d&rsquo;application semble être le <a href="http://en.wikipedia.org/wiki/HSL_and_HSV">HSV</a>. La première chose que l&rsquo;on cherche à régler est la teinte de la lumière (hue), puis on peut ajuster le niveau de luminosité (value) et la saturation des couleurs.</p>
<p style="text-align:justify;">Deux composants de type &quot;slider&quot; sont présents pour définir le niveau de saturation et de luminosité. Pour ce qui est de la teinte, il n&rsquo;existe pas de composant prédéfini satisfaisant. Avec un peu de  code ActionScript, on peut créer une roue de sélection de teinte avec curseur (j&rsquo;ai honteusement copié le design de la <em>Living Colors</em>) et par la même occasion, ajouter au centre une prévisualisation de la couleur sélectionnée.</p>
<p style="text-align:center;"><a href="http://chuckoggy.files.wordpress.com/2011/02/client1.jpg"><img class="aligncenter size-full wp-image-67" title="Client" src="http://chuckoggy.files.wordpress.com/2011/02/client1.jpg?w=584" alt=""   /></a><em>Interface de contrôle</em></p>
<p style="text-align:justify;">A chaque modification d&rsquo;un paramètre, les valeurs des composantes rouge, verte et bleue correspondantes sont calculées. Cette conversion est réalisée par le client qui dispose d&rsquo;une capacité de calcul supérieure à celle du système embarqué.</p>
<p style="text-align:justify;">Restait à faire communiquer l&rsquo;application Flash avec la carte FOX. Une solution consiste à envoyer des requêtes HTTP classiques. Cependant, ce type de connexion n&rsquo;est pas persistant: un nouveau socket TCP doit être créé à chaque échange de données. Or, dans le cadre d&rsquo;une application &quot;temps réel&quot;, il est important de réduire un maximum les temps de latence lors de communications entre les différents éléments. Heureusement, il est également possible d&rsquo;utiliser la classe XMLSocket qui permet l&rsquo;envoi/réception de fichiers XML sur un socket TCP persistant. (Ce n&rsquo;est qu&rsquo;après avoir terminé que je me suis aperçu qu&rsquo;il existait une classe Socket qui permet de se passer du formatage XML)</p>
<p style="text-align:justify;">Le format utilisé pour envoyer les données à la platine est réduit au strict minimum: #RRVVBB suivi du caractère de nouvelle ligne et du caractère nul (où RR, VV, BB représentent les valeurs des composantes rouge, verte et bleue en notation hexadécimale) L&rsquo;utilisation d&rsquo;un caractère en première position (ici #) assure par la suite de pouvoir étendre le protocole avec de nouvelles commandes. La notation hexadécimale est préférée au format binaire afin de pouvoir communiquer plus facilement en mode texte avec le serveur (avec netcat par exemple)</p>
<p style="text-align:justify;">Dernier détail: depuis la version 9.0.124.0 de Flash, l&rsquo;utilisation d&rsquo;un fichier de régulation d&rsquo;accès est imposée. Avant toute connexion à un socket, le client tente de se connecter au port 843 du serveur et envoie une requête de fichier policy. Il s&rsquo;attend alors à recevoir en retour un fichier XML, contenant une description des autorisations d&rsquo;accès ,suivi d&rsquo;un caractère nul. Si le serveur ne répond pas sur ce port, il tente la même procédure sur le port distant du socket.</p>
<p style="text-align:justify;">Il sera donc nécessaire de mettre en place un second serveur sur la carte FOX qui aura pour unique rôle de répondre à ce type de requête. Un seul serveur pourrait suffire mais j&rsquo;ai préféré dissocier les services: d&rsquo;autres serveurs de clients flash pourraient par la suite être hébergés sur le système, ils partageraient alors un seul et unique serveur de régulation.</p>
<p style="text-align:justify;">Une fois le projet Flash compilé, le fichier swf obtenu est intégré dans une page HTML. La carte FOX héberge un serveur HTTP boa qui, par défaut, sert à transférer des fichiers sur le système. Les transferts étant également possibles en FTP ou SCP,  le fichier de configuration de boa a été modifié pour affecter le nouveau fichier HTML en page d&rsquo;accueil. De base, le répertoire racine du serveur HTTP est situé sur une partition montée en lecture seule, il a donc été redirigé vers un répertoire localisé sur une partition accessible en écriture.</p>
<p style="text-align:center;"><a title="Code ActionScript du client" href="http://gibusperon.free.fr/colors/ColorCtrl.txt" target="_blank"><strong>Code ActionScript du client</strong></a></p>
<h2>Le serveur</h2>
<p style="text-align:justify;">Pour permettre une compilation croisée du noyau Linux et des applications destinés à la carte LX832, le phrozen SDK de <em>Acme Systems</em> a été installé sur un distribution Gentoo.</p>
<p style="text-align:justify;">Le système par défaut présent sur la carte ne convenant pas, il a fallu dans un premier temps recompiler le noyau Linux après avoir avoir modifié certaines options puis flasher la nouvelle image. En effet, comme je le verrai plus tard, le support du bus i2c est indispensable. Seulement, le support du module RTC est activé par défaut dans l&rsquo;image d&rsquo;usine et, je ne sais pour quelle raison, empêche le bon fonctionnement des autres périphériques i2c.</p>
<p style="text-align:justify;">La première application C s&rsquo;exécutant sur la platine a pour rôle la distribution du fichier de régulation, elle effectue les opérations suivantes: un socket est créé, rattaché au port local 843 et mis en attente de clients. A chaque connexion , un thread est créé pour renvoyer le contenu du fichier policy stocké sur le système suivi d&rsquo;un caractère nul. Le socket  est ensuite fermé. Le fichier de régulation est le suivant:</p>
<pre style="text-align:justify;padding-left:30px;"><span style="color:#008000;">&lt;cross-domain-policy&gt;</span>
<span style="color:#008000;">&lt;allow-access-from domain="*" to-ports="7777" secure="false" /&gt;</span>
<span style="color:#008000;">&lt;/cross-domain-policy&gt;</span></pre>
<p style="text-align:justify;">Petit détail: pour que ce programme puisse fonctionner correctement sur la cible, il faut lors de l&rsquo;édition des liens que la librairie pthread soit liée en statique.</p>
<p style="text-align:justify;">Le second programme a pour rôle la réception des trames de couleurs provenant du client Flash et la commande des LEDs. Il suit le même principe que le premier: un socket est à l&rsquo;écoute du port 7777. Lors d&rsquo;une connexion client, un thread est créé qui reçoit puis décode le message au format #RRVVBB. Le fait que la gestion des connexions soit multi-threadée permet à plusieurs clients de contrôler la lampe en même temps et évite qu&rsquo;une session non déconnectée bloque les autres.</p>
<p style="text-align:justify;">La question qui se pose alors est la suivante: comment faire varier individuellement la luminosité des 3 LEDs à partir de la platine? La solution qui s&rsquo;impose de par sa simplicité et sa linéarité est une commande en <a title="PWM" href="http://fr.wikipedia.org/wiki/Modulation_de_largeur_d%27impulsion">PWM</a>. Seulement, contrairement à sa petite sœur la <a title="FOX G20" href="http://eshop.acmesystems.it/?id=FOXG20"><em>FOX G20</em></a>, la LX832 ne dispose pas de ce type de sortie.</p>
<p style="text-align:justify;">J&rsquo;ai donc d&rsquo;abord essayé d&rsquo;émuler des sorties PWM logicielles en utilisant un port GPIO. Des appels systèmes sont implémentés dans le système Linux embarqué: ils permettent de fixer l&rsquo;état d&rsquo;une sortie et ainsi d&rsquo;obtenir des signaux carrés dont la fréquence peut atteindre les 150KHz. A l&rsquo;aide de temporisations entre les transitions vers l&rsquo;état haut/bas, on peut faire varier le rapport cyclique du signal.</p>
<p style="text-align:justify;">En pratique, cette implémentation fonctionne uniquement en monotâche. En effet, tant que le thread qui gère le PWM monopolise à lui seul le temps processeur, tout se passe bien. A partir du moment où il se produit des changements de contextes, il devient difficile de générer un signal correct: le noyau se base (comme sur PC) sur un timer de fréquence 100Hz pour scheduler les threads. Cela veut dire que lors du switch vers un autre thread, il faudra attendre jusqu&rsquo;à 10ms pour revenir à notre routine, période pendant laquelle le signal est bloqué sur un même état.</p>
<p style="text-align:justify;">Une option de compilation du noyau permet bien d&rsquo;augmenter la valeur de la fréquence de ce timer mais la mise en place resterait trop complexe, sans compter qu&rsquo;il faut gérer 3 signaux simultanément.</p>
<p style="text-align:justify;">Je me suis donc tourné vers des circuits PWM spécialisés utilisant le bus i2c. Ces circuits sont soit trop couteux pour cette utilisation, soit indisponibles.</p>
<p style="text-align:justify;">J&rsquo;ai au final fait le choix d&rsquo;un microcontrôleur <a href="http://www.atmel.com/dyn/products/devices.asp?category_id=163&amp;family_id=607&amp;subfamily_id=760">ATMEL AVR</a>. On y gagne en flexibilité (je décide de la manière dont sont échangées les données entre la platine et le périphérique) au détriment d&rsquo;une mise en place légèrement plus complexe (il faudra également programmer l&rsquo;AVR). En ce qui concerne le modèle, mon choix s&rsquo;est porté sur l&rsquo;ATMEGA8: il dispose de trois canaux Fast PWM, d&rsquo;une interface i2c (désigné TWI par Atmel) et il se programme en C (il s&rsquo;est avéré après coup que le modèle ATTINY2313 aurait aussi bien fait l&rsquo;affaire).</p>
<p style="text-align:justify;">Le schéma final ressemble donc à ceci:</p>
<p style="text-align:center;"><a href="http://chuckoggy.files.wordpress.com/2011/02/schemageneral.jpg"><img class="aligncenter size-full wp-image-126" title="SchemaGeneral" src="http://chuckoggy.files.wordpress.com/2011/02/schemageneral.jpg?w=584&#038;h=190" alt="" width="584" height="190" /></a><em>Schéma global</em></p>
<p style="text-align:justify;">Les communications entre la carte et le microcontrôleur se feront sur le bus <a href="http://en.wikipedia.org/wiki/I2c">i2c</a>. Ce mode de communication ne nécessite que deux lignes (horloge et données) et atteint en mode normal des débits de 100kb/s. La platine joue le rôle de maître et l&rsquo;AVR celui d&rsquo;esclave. Un seul mode sera utilisé dans ce contexte: maître émetteur, esclave récepteur. Le maître envoie d&rsquo;abord un bit de start sur le bus, suivi de l&rsquo;adresse de l&rsquo;esclave sur 7bits et d&rsquo;un bit à 0 indiquant une demande d&rsquo;écriture. Après cela, plusieurs octets peuvent être émis, acquittés un à un par l&rsquo;esclave jusqu&rsquo;à l&rsquo;envoi d&rsquo;un bit de stop par le maître.</p>
<p style="text-align:justify;">Dans le cas de notre application, le serveur envoie des séries de trois octets à la cible correspondant dans l&rsquo;ordre aux composantes rouge, verte et bleue. Sur la carte FOX, le bus i2c est géré par le noyau. L&rsquo;accès en espace utilisateur se fait à l&rsquo;aide de l&rsquo;appel système ioctl. Afin d&rsquo;éviter tout accès simultané au bus i2c par plusieurs threads, un mutex protège les sections où des données sont envoyées.</p>
<p style="text-align:center;"><a href="http://chuckoggy.files.wordpress.com/2011/02/i2c-message.jpg"><img class="aligncenter size-full wp-image-81" title="I2C Message" src="http://chuckoggy.files.wordpress.com/2011/02/i2c-message.jpg?w=584&#038;h=213" alt="" width="584" height="213" /></a><em>Exemple de message envoyé depuis la platine vers l&rsquo;AVR sur le bus i2c</em></p>
<p style="text-align:center;"><a title="Code source du serveur de policy" href="http://gibusperon.free.fr/colors/policysvr.c" target="_blank"><strong>Code source du serveur de policy</strong></a><em> &#8211; </em><a title="Code source du serveur de commande" href="http://gibusperon.free.fr/colors/colors.c" target="_blank"><strong>Code source du serveur de commande</strong></a><em><br />
</em></p>
<h2 style="text-align:left;">Le microcontrôleur</h2>
<p style="text-align:justify;">Le programme C exécuté par l&rsquo;AVR a pour rôle de réceptionner le niveau de luminosité souhaité pour chaque  LED depuis le bus i2c et de commander les sorties PWM.</p>
<p style="text-align:justify;">Les pins PB1, PB2 et PB3 sont d&rsquo;abord configurés en sorties. Les trois canaux PWM rattachés sont configurés en mode fast et activés. Le bus TWI est ensuite configuré en esclave et l&rsquo;adresse du périphérique est fixé à &rsquo;0010101&prime; ( j&rsquo;ai cherché à utiliser une adresse ne correspondant à aucun périphérique connu). Un traitement en boucle scrute le flag de réception d&rsquo;un message sur le bus et affecte chacun des trois octets reçus au canal PWM correspondant.</p>
<p style="text-align:center;"><a href="http://chuckoggy.files.wordpress.com/2011/02/pwm.jpg"><img class="aligncenter size-full wp-image-111" title="PWM" src="http://chuckoggy.files.wordpress.com/2011/02/pwm.jpg?w=584&#038;h=213" alt="" width="584" height="213" /></a><em>Les trois signaux PWM en sortie de l&rsquo;AVR</em></p>
<p style="text-align:justify;">Le programme est compilé sous Windows en utilisant l&rsquo;IDE <a href="http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2725"><em>AVR Studio</em></a> associé à <a href="http://winavr.sourceforge.net/"><em>WinAVR</em></a> (version Windows de avr-gcc). Le fichier binaire obtenu est transféré dans la mémoire flash de l&rsquo;ATMEGA8 à l&rsquo;aide d&rsquo;un programmateur ISP USB trouvé sur ebay pour une quinzaine d&rsquo;€uros.</p>
<p style="text-align:center;"><a href="http://chuckoggy.files.wordpress.com/2011/02/usb-isp.jpg"><img class="aligncenter size-full wp-image-45" title="Programmateur ISP USB" src="http://chuckoggy.files.wordpress.com/2011/02/usb-isp.jpg?w=584" alt=""   /></a><em>Programmateur ISP USB</em></p>
<p>Pour simplifier le montage, le microcontrôleur est alimenté en 3.3V par la carte FOX. Cette solution assure aussi une compatibilité des niveaux logiques des communications en i2c entre la platine et l&rsquo;AVR.</p>
<p>Même si chaque sortie de l&rsquo;ATMEGA8 est capable de fournir ou absorber jusqu&rsquo;à 40 mA, ça ne suffit pas pour alimenter directement des LEDs de puissance. Un circuit de commande doit être intercalé.</p>
<p style="text-align:center;"><strong><a title="Code source du programme de l'AVR" href="http://gibusperon.free.fr/colors/avrcolors.c" target="_blank">Code source du programme de l&rsquo;AVR</a></strong></p>
<h2>Etage de &quot;puissance&quot;</h2>
<p style="text-align:justify;">Les LEDs utilisées sont de type haute luminosité et peuvent atteindre une intensité lumineuse de 50 candelas. Leur consommation varie de 50 mA pour le bleu à 70 mA pour le rouge. Le montage contient trois groupes de deux LEDs. L&rsquo;ensemble produit au maximum un éclairement équivalent à une ampoule de 20W, ce qui est suffisant pour une lampe d&rsquo;ambiance. L&rsquo;inconvénient majeur de ce modèle de LED est son faible angle d&rsquo;éclairage: 50% du flux lumineux est émis à un angle inférieur à 15°. Il est donc préférable d&rsquo;utiliser un diffuseur de lumière.</p>
<p style="text-align:justify;">Chaque groupe de LEDs est alimenté par une alimentation secondaire de 9V et est commandé par un transistor NPN fonctionnant en commutation. Les sorties PWM de l&rsquo;AVR atteignent des fréquences de plusieurs dizaines de kilohertz, le modèle BC337 suffit amplement..</p>
<p style="text-align:center;"><a href="http://chuckoggy.files.wordpress.com/2011/03/schema.jpg"><img class="aligncenter size-full wp-image-123" title="Schema" src="http://chuckoggy.files.wordpress.com/2011/03/schema.jpg?w=584" alt=""   /></a><em>Circuit de commande des LEDs</em></p>
<p style="text-align:left;">Reste la question du diffuseur. Après plusieurs essais, le modèle qui convient le mieux est étonnement un gobelet en carton de McDonald&rsquo;s. Le carton blanc est assez épais et le couvercle en plastique mélange bien les couleurs sans trop atténuer la lumière.</p>
<p style="text-align:center;"><a href="http://chuckoggy.files.wordpress.com/2011/02/lampe2.jpg"><img class="aligncenter size-full wp-image-134" title="Lampe2" src="http://chuckoggy.files.wordpress.com/2011/02/lampe2.jpg?w=584" alt=""   /></a><em>Le &quot;diffuseur&quot;</em></p>
<h2 style="text-align:left;">Et après?</h2>
<p style="text-align:justify;">Il reste encore pleins de choses à améliorer sur cette lampe: augmenter le nombre de LEDs pour agmenter l&rsquo;intensité lumineuse, utiliser des contrôleurs de tension pour améliorer la stabilité de l&rsquo;alimentation des LEDs ou encore ajouter de nouveaux modes de commande  (cycle de couleurs, stroboscope, présélections&#8230;). Une autre idée serait de miniaturiser le montage en utilisant un unique microcontrôleur qui jouerait à la fois le rôle de l&rsquo;ATMEGA8 et celui de la carte FOX.</p>
<p><a href="http://chuckoggy.files.wordpress.com/2011/02/ambiance.jpg"><img class="size-full wp-image-138 aligncenter" title="Ambiance" src="http://chuckoggy.files.wordpress.com/2011/02/ambiance.jpg?w=584" alt=""   /></a><a href="http://chuckoggy.files.wordpress.com/2011/02/montage1.jpg"><img class="size-full wp-image-139 aligncenter" title="Montage1" src="http://chuckoggy.files.wordpress.com/2011/02/montage1.jpg?w=584" alt=""   /></a><a href="http://chuckoggy.files.wordpress.com/2011/02/montage2.jpg"><img class="aligncenter size-full wp-image-140" title="Montage2" src="http://chuckoggy.files.wordpress.com/2011/02/montage2.jpg?w=584&#038;h=388" alt="" width="584" height="388" /></a><a href="http://chuckoggy.files.wordpress.com/2011/02/lampe1.jpg"><img class="aligncenter size-full wp-image-141" title="Lampe1" src="http://chuckoggy.files.wordpress.com/2011/02/lampe1.jpg?w=584&#038;h=388" alt="" width="584" height="388" /></a><a href="http://chuckoggy.files.wordpress.com/2011/02/leds1.jpg"><img class="aligncenter size-full wp-image-142" title="Leds" src="http://chuckoggy.files.wordpress.com/2011/02/leds1.jpg?w=584&#038;h=392" alt="" width="584" height="392" /></a><a href="http://chuckoggy.files.wordpress.com/2011/02/hexachrome.jpg"><img class="aligncenter size-full wp-image-143" title="HexaChrome" src="http://chuckoggy.files.wordpress.com/2011/02/hexachrome.jpg?w=584&#038;h=441" alt="" width="584" height="441" /></a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chuckoggy.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chuckoggy.wordpress.com/5/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chuckoggy.wordpress.com&#038;blog=20194618&#038;post=5&#038;subd=chuckoggy&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://chuckoggy.wordpress.com/2011/02/19/lampeweb/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0e53af6633dc6dba87d625f5a99f0e78?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">gibusperon</media:title>
		</media:content>

		<media:content url="http://chuckoggy.files.wordpress.com/2011/02/fox832.jpg" medium="image">
			<media:title type="html">Fox LX832</media:title>
		</media:content>

		<media:content url="http://chuckoggy.files.wordpress.com/2011/02/client1.jpg" medium="image">
			<media:title type="html">Client</media:title>
		</media:content>

		<media:content url="http://chuckoggy.files.wordpress.com/2011/02/schemageneral.jpg" medium="image">
			<media:title type="html">SchemaGeneral</media:title>
		</media:content>

		<media:content url="http://chuckoggy.files.wordpress.com/2011/02/i2c-message.jpg" medium="image">
			<media:title type="html">I2C Message</media:title>
		</media:content>

		<media:content url="http://chuckoggy.files.wordpress.com/2011/02/pwm.jpg" medium="image">
			<media:title type="html">PWM</media:title>
		</media:content>

		<media:content url="http://chuckoggy.files.wordpress.com/2011/02/usb-isp.jpg" medium="image">
			<media:title type="html">Programmateur ISP USB</media:title>
		</media:content>

		<media:content url="http://chuckoggy.files.wordpress.com/2011/03/schema.jpg" medium="image">
			<media:title type="html">Schema</media:title>
		</media:content>

		<media:content url="http://chuckoggy.files.wordpress.com/2011/02/lampe2.jpg" medium="image">
			<media:title type="html">Lampe2</media:title>
		</media:content>

		<media:content url="http://chuckoggy.files.wordpress.com/2011/02/ambiance.jpg" medium="image">
			<media:title type="html">Ambiance</media:title>
		</media:content>

		<media:content url="http://chuckoggy.files.wordpress.com/2011/02/montage1.jpg" medium="image">
			<media:title type="html">Montage1</media:title>
		</media:content>

		<media:content url="http://chuckoggy.files.wordpress.com/2011/02/montage2.jpg" medium="image">
			<media:title type="html">Montage2</media:title>
		</media:content>

		<media:content url="http://chuckoggy.files.wordpress.com/2011/02/lampe1.jpg" medium="image">
			<media:title type="html">Lampe1</media:title>
		</media:content>

		<media:content url="http://chuckoggy.files.wordpress.com/2011/02/leds1.jpg" medium="image">
			<media:title type="html">Leds</media:title>
		</media:content>

		<media:content url="http://chuckoggy.files.wordpress.com/2011/02/hexachrome.jpg" medium="image">
			<media:title type="html">HexaChrome</media:title>
		</media:content>
	</item>
	</channel>
</rss>
