<?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/"
	>

<channel>
	<title>Electronique Innovante</title>
	<atom:link href="http://innovelectronique.fr/feed/" rel="self" type="application/rss+xml" />
	<link>http://innovelectronique.fr</link>
	<description>Apprendre l'électronique par l'exemple</description>
	<pubDate>Sat, 18 May 2013 09:30:32 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Horloge RTC gérée par le noyau Linux sur RaspberryPi</title>
		<link>http://innovelectronique.fr/2013/05/18/horloge-rtc-geree-par-le-noyau-linux-sur-raspberrypi/</link>
		<comments>http://innovelectronique.fr/2013/05/18/horloge-rtc-geree-par-le-noyau-linux-sur-raspberrypi/#comments</comments>
		<pubDate>Sat, 18 May 2013 09:29:38 +0000</pubDate>
		<dc:creator>Olivier</dc:creator>
		
		<category><![CDATA[GNU/Linux]]></category>

		<category><![CDATA[Informatique]]></category>

		<category><![CDATA[Linux Embarqué]]></category>

		<guid isPermaLink="false">http://innovelectronique.fr/?p=1354</guid>
		<description><![CDATA[Vous savez sans nul doute que le RaspberryPi n&#8217;est pas équipé d&#8217;une horloge temps réel pour des raisons de coût. La distribution Raspian a fait le choix de récupérer l&#8217;heure sur Internet quand la carte est connecté sinon elle repart avec la dernière heure connu (fake_hwclock). Bien sur ce n&#8217;est pas satisfaisant&#8230;aussi vous trouverez sur [...]]]></description>
			<content:encoded><![CDATA[<p>Vous savez sans nul doute que le RaspberryPi n&#8217;est pas équipé d&#8217;une horloge temps réel pour des raisons de coût. La distribution Raspian a fait le choix de récupérer l&#8217;heure sur Internet quand la carte est connecté sinon elle repart avec la dernière heure connu (<a href="http://packages.debian.org/unstable/main/fake-hwclock" target="_blank">fake_hwclock</a>). Bien sur ce n&#8217;est pas satisfaisant&#8230;aussi vous trouverez sur le grand &#8220;n&#8217;Internet&#8221; nombre de site qui décrive comment rajouter une RTC (principalement en I2C). J&#8217;ai même fait quelques lignes la-dessus à la fin de l&#8217;<a href="http://innovelectronique.fr/2013/03/02/utilisation-du-bus-i2c-sur-raspberrypi/" target="_blank">article sur l&#8217;I2C sur Raspberry</a>. Cependant je voudrais faire &#8220;encore mieux&#8221;, en particulier que la partie &#8220;user space&#8221; (espace utilisateur) ne gère pas cette RTC mais que le noyau s&#8217;en charge de A à Z. Cette article décrit cette mise en oeuvre.</p>
<p><span id="more-1354"></span>Pour être précis, c&#8217;est la lecture des articles de Christophe Blaess (<a href="http://www.blaess.fr/christophe/2012/11/30/raspberry-pi-from-scratch/" target="_blank">article1</a>, <a href="http://www.blaess.fr/christophe/articles/files-glmf/" target="_blank">ressources</a>) dans Gnu Linux France Magazine qui m&#8217;a titillé ! Aussi j&#8217;ai suivi son article sur la cross-compilation d&#8217;une chaîne de développement avec BuildRoot (<a href="http://buildroot.uclibc.org/download.html" target="_blank">version 2013.02</a>) ainsi que la compilation d&#8217;un noyau avec cette même chaîne. L&#8217;installation, la compilation de la chaîne de cross-compilation puis la compilation d&#8217;un noyau se sont fait assez rapidement (une seule erreur au moment de la compilation de la uClibC : changer la locale de la ligne UCLIBC_BUILD_MINIMAL_LOCALES=&#8221;fr_FR&#8221; du fichier buildroot-2013.02/output/toolchain/uClibc-0.9.33.2/.config) et j&#8217;ai obtenu le fameux &#8220;Kernel panic&#8230;&#8221; signe que ca roule ;-). En faisant le tour de la configuration du noyau (make menuconfig), j&#8217;ai fouillé du coté de l&#8217;I2C et des pilotes pour RTC. Comme je dispose de deux platines RTC maison je me suis intéressé à leur intégration directement dans le noyau.</p>
<p>Les platines sont équipées de :</p>
<ul>
<li>un <a href="http://www.google.com/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=1&amp;cad=rja&amp;ved=0CDQQFjAA&amp;url=http%3A%2F%2Fdatasheets.maximintegrated.com%2Fen%2Fds%2FDS1307.pdf&amp;ei=s7-GUYWlLIWChQfSoIHYBg&amp;usg=AFQjCNHa4nbB_Asd1yEkoa4azx7NRVLdeA&amp;sig2=Uf0YnCF2BAQPRNs64Nic4w&amp;bvm=bv.45960087,d.ZG4" target="_blank">DS1307</a> avec son quartz 32KHz et une pile bouton 3V : il faut alimenter ce circuit en 5V par l&#8217;intermédiaire de la broche du raspberry. Les lignes SDA et SCL sont toujours en 3,3V car ce sont des sorties à drain ouvert et les résistances de rappel des lignes SDA et SCL sont câblées sur le raspberry.</li>
<li>un <a href="http://www.google.com/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=2&amp;cad=rja&amp;ved=0CD4QFjAB&amp;url=http%3A%2F%2Fdatasheets.maximintegrated.com%2Fen%2Fds%2FDS3232.pdf&amp;ei=2L-GUdJ5ibOEB_H4gcgG&amp;usg=AFQjCNGdy8O-QrlKMSNyUNf1FlyPde5Xxg&amp;sig2=euYvb0T2iCOhp9IrSwZ6AQ&amp;bvm=bv.45960087,d.ZG4" target="_blank">DS3232</a> avec une pile bouton 3V : ce circuit dispose de son oscillateur interne compensé en température ce qui lui procure une grande précision et donc une dérive faible (de l&#8217;ordre de la minute sur un an). Cette platine est aussi équipé d&#8217;un capteur de température <a href="http://datasheets.maximintegrated.com/en/ds/DS1621.pdf?" target="_blank">DS1621</a>.</li>
</ul>
<p>Ces trois circuits disposent de pilotes natifs dans le noyau Linux (drivers/rtc/rtc-ds1307.c et rtc-ds3232.c, drivers/hwmon/ds1621.c). Comme je veux les utiliser très tôt dans le processus de démarrage du noyau il faut que les pilotes soient inclus dans le noyau et pas sous forme de modules. Comme ces circuits sont tous utilisés sur le bus I2C, il faut donc aussi que celui-ci soit compilé dans le noyau. Enfin la gestion de la RTC par le noyau se fait en cochant l&#8217;option  &#8220;Device driver -&gt; Real Time Clock -&gt; Set system time from RTC on startup and resume&#8221;. Cependant il reste un problème : comment indiquer au pilote l&#8217;adresse de la RTC sur le bus I2C (ici 0&#215;68) ainsi que le bus I2C actif (il y a deux bus i2c sur un raspberry qui n&#8217;ont pas la même numérotation suivant la version)&#8230;</p>
<p>Il faut lire la documentation du noyau sur &#8220;l&#8217;instantiation&#8221; de périphérique disponible sur <a href="https://www.kernel.org/doc/Documentation/i2c/instantiating-devices" target="_blank">https://www.kernel.org/doc/Documentation/i2c/instantiating-devices</a>. La méthode 4 décrite dans ce document est celle utilisée par quasiment tout le monde :  on instantie un périphérique en passant son type et son adresse au bus i2c concerné géré par le noyau (Ex: echo ds1307 0×68 &gt; /sys/class/i2c-adapter/i2c-1/new_device). A partir de ce moment vous pouvez utiliser la commande hwclock. Dans notre cas c&#8217;est un peu plus compliqué ! Il va falloir appliquer la méthode 1.</p>
<p>Le raspberryPi utilise un SoC Broadcom bcm2708. Il va donc falloir modifier le fichier d&#8217;initialisation de cette puce pour déclarer la RTC. Ce fichier est &#8220;arch/arm/mach-bcm2708/bcm2708.c&#8221;. Dans un premier temps il faut rajouter une structure :<br />
<code><br />
// Ajout O. Dartois pour test RTC DS3232<br />
static struct i2c_board_info __initdata bcm2708_i2c_devices[] = {<br />
{<br />
I2C_BOARD_INFO(&#8221;rtc-ds1307&#8243;, 0&#215;68),<br />
.type = &#8220;ds1307&#8243;,<br />
},<br />
};</code></p>
<p>J&#8217;ai rajouté cette structure juste avant la fonction bcm2708_init(void). Puis toujours dans la fonction bcm2708_init(void), j&#8217;ai rajouté les lignes suivantes après l&#8217;enregistrement des busi2c :<br />
<code><br />
bcm_register_device(&amp;bcm2708_spi_device);<br />
bcm_register_device(&amp;bcm2708_bsc0_device);<br />
bcm_register_device(&amp;bcm2708_bsc1_device);<br />
// Ajout O. Dartois<br />
printk("Declaration RTC ...n");<br />
i2c_register_board_info(1, bcm2708_i2c_devices, ARRAY_SIZE(bcm2708_i2c_devices));</code></p>
<p>On lance alors la compilation du noyau puis on copie le noyau zImage obtenu en kernel.img sur la carte SD du raspberryPi. On démarre la carte et on vérifie les messages du noyau (j&#8217;utilise le logiciel GrabSerial pour avoir une idée du temps de boot, c&#8217;est pour cette raison que vous avez des temps entre crochets au début de chaque ligne) :<br />
<code><br />
[...]<br />
[1.129414 0.000850] [    0.077531] DMA: preallocated 4096 KiB pool for atomic coherent allocations<br />
[1.148473 0.019059] [    0.078721] bcm2708.uart_clock = 0<br />
[1.149129 0.000656] [    0.079882] Declaration RTC &#8230;<br />
[1.149740 0.000611] [    0.080256] mailbox: Broadcom VideoCore Mailbox driver<br />
[1.150716 0.000976] [    0.080369] bcm2708_vcio: mailbox at f200b880<br />
[...]<br />
[2.072602 0.005752] [    1.813068] i2c /dev entries driver<br />
[2.086104 0.013502] [    1.819306] bcm2708_i2c bcm2708_i2c.0: BSC0 Controller at 0&#215;20205000 (irq 79) (baudrate 100k)<br />
[2.097600 0.011496] [    1.835187] rtc-ds1307 1-0068: rtc core: registered ds1307 as rtc0<br />
[2.104376 0.006776] [    1.843777] rtc-ds1307 1-0068: 56 bytes nvram<br />
[2.117500 0.013124] [    1.850403] bcm2708_i2c bcm2708_i2c.1: BSC1 Controller at 0&#215;20804000 (irq 79) (baudrate 100k)<br />
[...]<br />
[2.413443 0.015522] [    2.146339] rtc-ds1307 1-0068: setting system clock to 2013-05-06 06:25:21 UTC (1367821521)<br />
[...]<br />
pi@raspberrypi:~$ date<br />
lundi 6 mai 2013, 08:30:00 (UTC+0200)<br />
pi@raspberrypi:~$</code></p>
<p>Je vérifie la date à la fin du boot. La distribution utilisé ici est la Raspian, l&#8217;horloge RTC est en UTC, le système utilise le fuseau horaire de europe/paris. On est à l&#8217;heure d&#8217;été donc l&#8217;heure est bien cohérente (UTC+2).</p>
<p>Petite remarque supplémentaire : comme le bus i2c est intégré au noyau vous ne pouvez plus changer la vitesse du bus au moment du &#8220;insmod&#8221;. Pour changer dynamiquement la vitesse du bus i2c, il faut modifier la valeur de : /sys/module/i2c_bcm2708/parameters/baudrate</p>
]]></content:encoded>
			<wfw:commentRss>http://innovelectronique.fr/2013/05/18/horloge-rtc-geree-par-le-noyau-linux-sur-raspberrypi/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Utilisation du bus I2C sur RaspberryPi</title>
		<link>http://innovelectronique.fr/2013/03/02/utilisation-du-bus-i2c-sur-raspberrypi/</link>
		<comments>http://innovelectronique.fr/2013/03/02/utilisation-du-bus-i2c-sur-raspberrypi/#comments</comments>
		<pubDate>Sat, 02 Mar 2013 20:45:10 +0000</pubDate>
		<dc:creator>Olivier</dc:creator>
		
		<category><![CDATA[Linux Embarqué]]></category>

		<category><![CDATA[Horloge temps réel]]></category>

		<category><![CDATA[I2C]]></category>

		<category><![CDATA[RaspberryPi]]></category>

		<category><![CDATA[RTC]]></category>

		<guid isPermaLink="false">http://innovelectronique.fr/?p=1307</guid>
		<description><![CDATA[Dans la suite de l&#8217;article je présente l&#8217;activation puis l&#8217;utilisation du bus I2C sur la carte RaspberryPI (ou tout autre carte qui supporte un bus I2C : Olimex A13 ou iMX233, Beagle/PandaBoard de TI, TQ6410, etc&#8230;). L&#8217;interrogation des esclaves connectés au bus I2C peut se faire sans aucune programmation ! Cela permet de valider rapidement [...]]]></description>
			<content:encoded><![CDATA[<p>Dans la suite de l&#8217;article je présente l&#8217;activation puis l&#8217;utilisation du bus I2C sur la carte RaspberryPI (ou tout autre carte qui supporte un bus I2C : Olimex A13 ou iMX233, Beagle/PandaBoard de TI, TQ6410, etc&#8230;). L&#8217;interrogation des esclaves connectés au bus I2C peut se faire sans aucune programmation ! Cela permet de valider rapidement l&#8217;écriture ou la lecture des registres d&#8217;un esclave I2C. On peut alors passer à la programmation en C/C++ avec des valeurs validées.<span id="more-1307"></span></p>
<h1>Ressources internet</h1>
<p>Une fois n&#8217;est pas coutume, je commence par les ressources Internet :</p>
<ul>
<li>L&#8217;article Wikipédia sur l&#8217;I2C : <a href="http://fr.wikipedia.org/wiki/I2C" target="_blank">article wikipédia</a></li>
<li>Le site de LadyADA : <a href="http://learn.adafruit.com/" target="_blank">Adafruit Learning System</a></li>
<li>Le site eLinux (partie sur l&#8217;I2C) : <a href="http://elinux.org/Interfacing_with_I2C_Devices" target="_blank">eLinux</a></li>
<li>les pages de manuel de l&#8217;I2C : i2cdetect, i2cset, i2cget</li>
</ul>
<h1>Brochage du connecteur</h1>
<p>Vous trouverez sur Internet de nombreux exemples du brochage du connecteur du RaspberryPI. J&#8217;en ai choisi deux parmi d&#8217;autres:</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2013/02/gpios.png" rel="lightbox[1307]"><img class="size-medium wp-image-1336 alignnone" title="GPIO_Officiel" src="http://innovelectronique.fr/wp-content/uploads/2013/02/gpios-131x300.png" alt="GPIO_Officiel" width="131" height="300" /></a><a href="http://innovelectronique.fr/wp-content/uploads/2013/02/gpio-srm.png" rel="lightbox[1307]"><img class="size-medium wp-image-1337 alignnone" title="gpio-ladyada" src="http://innovelectronique.fr/wp-content/uploads/2013/02/gpio-srm-300x153.png" alt="gpio-ladyada" width="300" height="153" /></a></p>
<p>Les broches qui nous intéressent ici (pour la V2 revB) :</p>
<ul>
<li>GPIO0 (SDA) : broche 3 du connecteur,</li>
<li>GPIO1 (SCL) : broche 5 du connecteur,</li>
<li>la masse (GROUND) : broche 6 du connecteur,</li>
<li>l&#8217;alimentation (on prendra des esclaves I2C qui fonctionnent en 3,3V) : broche 1 du connecteur</li>
</ul>
<h1>Utilisation de l&#8217;I2C sur le RaspberryPI</h1>
<h2>Activation de l&#8217;I2C</h2>
<p>Il faut tout d&#8217;abord être &#8220;root&#8221; pour réaliser les commandes suivantes : sudo su. Il faut éditer le fichier &#8220;/etc/modprobe.d/raspi-blacklist.conf&#8221; avec l&#8217;éditeur nano puis commenter (mettre le caractère #) la ligne &#8220;blacklist i2c-bcm2708&#8243;.<br />
Puis rajouter la ligne &#8220;i2c-dev&#8221; dans le fichier &#8220;/etc/modules&#8221;. Redémarrez le RaspberryPI avec la commande &#8220;reboot&#8221;.<br />
Pour vérifier que le pilote de l&#8217;I2C est bien chargé, tapez ces deux commandes:</p>
<ul>
<li>dmesg | grep i2c : permet de visualiser les messages du noyau se rapportant au bus i2c,</li>
<li>ls /dev/i2c* : cette commande permet de savoir si le bus i2c est bien accessible depuis &#8220;l&#8217;espace utilisateur&#8221; donc depuis vos programmes.</li>
</ul>
<p>Voici le résultat de ces deux commandes :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1307code10'); return false;">View Code</a> TEXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p130710"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p1307code10"><pre class="text" style="font-family:monospace;">root@raspberrypi:/home/pi# dmesg|grep i2c
[   32.803506] bcm2708_i2c bcm2708_i2c.0: BSC0 Controller at 0x20205000 (irq 79) (baudrate 100k)
[   32.832122] bcm2708_i2c bcm2708_i2c.1: BSC1 Controller at 0x20804000 (irq 79) (baudrate 100k)
[   38.616811] i2c /dev entries driver
root@raspberrypi:/home/pi# ls /dev/i2c-
i2c-0  i2c-1</pre></td></tr></table></div>

<p>On remarque qu&#8217;il y a deux bus i2c reconnus sur la carte. La vitesse de ces bus est ici de 100kHz (mode basse vitesse du bus i2c). Ces deux bus sont accessibles par i2c-0 et i2c-1. En fait un seul bus est disponible sur le connecteur.</p>
<h2>Installation des outils I2C</h2>
<p>Pour tester si le bus I2C est fonctionnel on connecte une platine avec deux circuits :</p>
<ul>
<li>un capteur de température DS1631,</li>
<li>une horloge temps réel DS3231.</li>
</ul>
<p>Schéma électrique de la platine  et typon (échelle 2) :</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2013/03/schema-electrique-carte-ds1631-ds3231-sur-bus-i2c.png" rel="lightbox[1307]"><img class="size-thumbnail wp-image-1342 alignnone" title="schema-electrique-carte-ds1631-ds3231-sur-bus-i2c" src="http://innovelectronique.fr/wp-content/uploads/2013/03/schema-electrique-carte-ds1631-ds3231-sur-bus-i2c-150x150.png" alt="schema-electrique-carte-ds1631-ds3231-sur-bus-i2c" width="150" height="150" /></a> <a href="http://innovelectronique.fr/wp-content/uploads/2013/03/typon-carte-ds1631-ds3231-sur-bus-i2c.png" rel="lightbox[1307]"><img class="alignright size-full wp-image-1343" title="typon-carte-ds1631-ds3231-sur-bus-i2c" src="http://innovelectronique.fr/wp-content/uploads/2013/03/typon-carte-ds1631-ds3231-sur-bus-i2c.png" alt="typon-carte-ds1631-ds3231-sur-bus-i2c" width="307" height="159" /></a></p>
<p>Il faut ensuite installer les outils nécessaires pour dialoguer sur le bus i2c sans programmer. En tant qu&#8217;utilisateur root, tapez la commande suivante:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1307code11'); return false;">View Code</a> TEXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p130711"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p1307code11"><pre class="text" style="font-family:monospace;">root@raspberrypi:/home/pi# aptitude install i2c-tools
Les NOUVEAUX paquets suivants vont être installés :
  i2c-tools
0 paquets mis à jour, 1 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de télécharger 59,5 ko d'archives. Après dépaquetage, 223 ko seront utilisés.
Prendre :  1 http://mirrordirector.raspbian.org/raspbian/ wheezy/main i2c-tools armhf 3.1.0-2 [59,5 kB]
 59,5 ko téléchargés en 1s (56,8 ko/s)
Sélection du paquet i2c-tools précédemment désélectionné.
(Lecture de la base de données... 60077 fichiers et répertoires déjà installés.)
Dépaquetage de i2c-tools (à partir de .../i2c-tools_3.1.0-2_armhf.deb) ...
Traitement des actions différées (« triggers ») pour « man-db »...
Paramétrage de i2c-tools (3.1.0-2) ...</pre></td></tr></table></div>

<p>L&#8217;utilitaire i2cdetect permet de parcourir le bus i2c pour détecter des esclaves reliés à ce bus. Les commandes suivantes permettent de parcourir le bus i2c-0 : raspberry V2revA ou le bus i2c-1 : raspberry V2revB.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1307code12'); return false;">View Code</a> TEXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p130712"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code" id="p1307code12"><pre class="text" style="font-family:monospace;">root@raspberrypi:/home/pi# i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
root@raspberrypi:/home/pi# i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --</pre></td></tr></table></div>

<p>On remarque que sur le bus i2c-1 il y a deux esclaves i2c :</p>
<ul>
<li>adresse 0&#215;48 : capteur DS1631 dont les lignes d&#8217;adresses A2, A1 et A0 sont reliées à la masse. L&#8217;adresse de ce composant est donné dans la documentation : 0b1001A2A1A0 donc 0b1001000 donc en hexadécimal 0&#215;48.</li>
<li>adresse 0&#215;68 : horloge RTC. Dans la documentation on trouve l&#8217;adresse suivante : 0b1101000 soit 0&#215;68.</li>
</ul>
<p>Le résultat du parcours du bus est donc concluant.</p>
<h2>Utilitaires d&#8217;interrogation du bus i2c</h2>
<p>Nous allons commencer à interroger le capteur de température de l&#8217;horloge temps réel. Le résultat de la conversion de température est accessible à l&#8217;adresse 0&#215;11 sur deux octets (voir extrait de la documentation ci-dessous ) :</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2013/02/registre-temp-ds3231.png" rel="lightbox[1307]"><img class="aligncenter size-medium wp-image-1320" title="registre-temp-ds3231" src="http://innovelectronique.fr/wp-content/uploads/2013/02/registre-temp-ds3231-300x32.png" alt="registre-temp-ds3231" width="300" height="32" /></a>Vous disposez de deux utilitaires pour cela : i2cset et i2cget. Ci-dessous vous trouverez ce que renvoie ces commandes lorsqu&#8217;on les lance sans paramètres :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1307code13'); return false;">View Code</a> TEXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p130713"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code" id="p1307code13"><pre class="text" style="font-family:monospace;">root@raspberrypi:/home/pi# i2cset
Usage: i2cset [-f] [-y] [-m MASK] I2CBUS CHIP-ADDRESS DATA-ADDRESS [VALUE] ... [MODE]
  I2CBUS is an integer or an I2C bus name
  ADDRESS is an integer (0x03 - 0x77)
  MODE is one of:
    c (byte, no value)
    b (byte data, default)
    w (word data)
    i (I2C block data)
    s (SMBus block data)
    Append p for SMBus PEC
root@raspberrypi:/home/pi# i2cget
Usage: i2cget [-f] [-y] I2CBUS CHIP-ADDRESS [DATA-ADDRESS [MODE]]
  I2CBUS is an integer or an I2C bus name
  ADDRESS is an integer (0x03 - 0x77)
  MODE is one of:
    b (read byte data, default)
    w (read word data)
    c (write byte/read byte)
    Append p for SMBus PEC</pre></td></tr></table></div>

<p>En gros on remarque qu&#8217;il faut spécifier :</p>
<ul>
<li>le numéro du bus i2c,</li>
<li>l&#8217;adresse de l&#8217;esclave,</li>
<li>la ou les registres à écrire/lire.</li>
</ul>
<p>Dans l&#8217;exemple qui suit, on lit la température fourni par l&#8217;horloge temps réél : adresse 0&#215;68, registres 0&#215;11 et lecture d&#8217;un mot (2 octets) :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1307code14'); return false;">View Code</a> TEXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p130714"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code" id="p1307code14"><pre class="text" style="font-family:monospace;">root@raspberrypi:/home/pi# i2cget 1 0x68 0x11 w
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will read from device file /dev/i2c-1, chip address 0x68, data address
0x11, using read word data.
Continue? [Y/n] y
0x4013
root@raspberrypi:/home/pi# i2cget -y 1 0x68 0x11 w
0x4013</pre></td></tr></table></div>

<p>On obtient la valeur hexadécimal 0&#215;4013. La valeur 0&#215;13 correspond au contenu du registre 0&#215;11 (partie entière de la température). La valeur 0&#215;40 correspond à la valeur du registre 0&#215;12 (partie fractionnaire de la température) dont seul les bits B7 B6 nous intéresse. On obtient donc la température suivante : 0&#215;13 = 19 et 0&#215;40 =&gt; B7=0 et B6=1. B7 représente 2^-1=0,5°C et B6 représente 2^-2=0,25°C. La température finale est donc de 19,25°C.</p>
<p>Pour initialiser correctement la RTC, il faut écrire la valeur 0&#215;04 dans le registre 0&#215;0E (registre de &#8220;control&#8221;) et 0&#215;08 dans le registre 0&#215;0F (registre de &#8220;status&#8221;). Pour la signification de ces valeurs reportez-vous à la documentation officielle. Cela se traduit par les commandes suivantes :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1307code15'); return false;">View Code</a> TEXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p130715"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p1307code15"><pre class="text" style="font-family:monospace;">root@raspberrypi:/home/pi# i2cset -y 1 0x68 0x0E 0x04 b
root@raspberrypi:/home/pi# i2cget -y 1 0x68 0x0F b
0x88
root@raspberrypi:/home/pi# i2cset -y 1 0x68 0x0F 0x08 b
root@raspberrypi:/home/pi# i2cget -y 1 0x68 0x0F b
0x08</pre></td></tr></table></div>

<p>Vous pouvez maintenant lire les secondes, minutes, heures, jour du mois, mois et année. Exemple avec la lecture des secondes et de l&#8217;année :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1307code16'); return false;">View Code</a> TEXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p130716"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p1307code16"><pre class="text" style="font-family:monospace;">root@raspberrypi:/home/pi# i2cget -y 1 0x68 0x00 b
0x41
root@raspberrypi:/home/pi# i2cget -y 1 0x68 0x06 b
0x00</pre></td></tr></table></div>

<p>On obtient donc pour les secondes : 0&#215;41 =&gt; 4 x 10s + 1 x 1s = 41s. Pour les années 0 ! La RTC n&#8217;est donc pas réglé. Je vous invite à chercher par vous même les commandes pour mettre à l&#8217;heure votre horloge RTC.</p>
<h2>Bonus : installer une RTC sur le Raspberry</h2>
<p>Par défaut, le raspberryPi n&#8217;a pas d&#8217;horloge RTC. Il récupère la date et l&#8217;heure au démarrage à condition d&#8217;avoir une connexion Internet. Pour pallier ce défaut on peut connecter au bus i2c une horloge.<br />
Vous trouverez ci-dessous les pilotes gérés par le noyau Linux de la raspberry:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1307code17'); return false;">View Code</a> TEXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p130717"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p1307code17"><pre class="text" style="font-family:monospace;">root@raspberrypi:/home/pi# ls /lib/modules/3.6.11-rpi-aufs/kernel/drivers/rtc/
rtc-bq32k.ko   rtc-ds1672.ko  rtc-isl12022.ko  rtc-max6900.ko  rtc-r9701.ko	rtc-rx8581.ko
rtc-ds1305.ko  rtc-ds3232.ko  rtc-isl1208.ko   rtc-max6902.ko  rtc-rs5c348.ko	rtc-s35390a.ko
rtc-ds1307.ko  rtc-ds3234.ko  rtc-m41t80.ko    rtc-pcf2123.ko  rtc-rs5c372.ko	rtc-x1205.ko
rtc-ds1374.ko  rtc-em3027.ko  rtc-m41t93.ko    rtc-pcf8563.ko  rtc-rv3029c2.ko
rtc-ds1390.ko  rtc-fm3130.ko  rtc-m41t94.ko    rtc-pcf8583.ko  rtc-rx8025.ko</pre></td></tr></table></div>

<p>Une des plus répandues de ces horloges est certainement la DS1307. Cependant la DS3231 est compatible au niveau des registres de date et d&#8221;heure d&#8217;une DS1307, elle est plus chère mais aussi beaucoup plus précise. Les commandes suivantes permettent de régler la RTC à partir de l&#8217;heure récupérer sur Internet.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1307code18'); return false;">View Code</a> TEXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p130718"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code" id="p1307code18"><pre class="text" style="font-family:monospace;">root@raspberrypi:/home/pi# echo ds1307 0x68 &gt; /sys/class/i2c-adapter/i2c-1/new_device
root@raspberrypi:/home/pi# hwclock -r
sam. 29 mars 2011 15:02:36 CET  -0.302646 seconds
root@raspberrypi:/home/pi# date
samedi 9 février 2013, 16:27:34 (UTC+0100)
root@raspberrypi:/home/pi# hwclock -w
root@raspberrypi:/home/pi# hwclock -r
sam. 09 févr. 2013 16:28:11 CET  -0.763037 seconds</pre></td></tr></table></div>

<p>Si l&#8217;on détaille les lignes précédentes:</p>
<ol>
<li>déclaration d&#8217;un nouvel esclave sur le bus i2c : son type (ds1307) et son adresse (0&#215;68),</li>
<li>lecture de la date dans la RTC : ici la RTC n&#8217;est pas à l&#8217;heure,</li>
<li>vérification de l&#8217;heure système avec la commande date,</li>
<li>transfert de l&#8217;heure système dans la RTC : paramètre -w de la commande hwclock,</li>
<li>vérification de l&#8217;heure de la RTC.</li>
</ol>
<p>Pour que l&#8217;heure de la RTC soit appliquée au système au démarrage, il faut rajouter les lignes suivantes à la fin du fichier &#8220;/etc/rc.local&#8221; avant la ligne &#8220;exit 0&#8243; :</p>
<ol>
<li>&#8220;echo ds1307 0&#215;68 &gt; /sys/class/i2c-adapter/i2c-1/new_device&#8221;,</li>
<li>&#8220;sudo hwclock -s&#8221;.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://innovelectronique.fr/2013/03/02/utilisation-du-bus-i2c-sur-raspberrypi/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Installer une chaîne de cross-compilation pour µP ARM sur une Debian Squeeze (6.0) ou Wheezy (7.0)</title>
		<link>http://innovelectronique.fr/2013/01/30/installer-une-chaine-de-cross-compilation-pour-%c2%b5p-arm-sur-une-debian-squeeze-60-ou-wheezy-70/</link>
		<comments>http://innovelectronique.fr/2013/01/30/installer-une-chaine-de-cross-compilation-pour-%c2%b5p-arm-sur-une-debian-squeeze-60-ou-wheezy-70/#comments</comments>
		<pubDate>Wed, 30 Jan 2013 17:18:17 +0000</pubDate>
		<dc:creator>Olivier</dc:creator>
		
		<category><![CDATA[GNU/Linux]]></category>

		<category><![CDATA[Informatique]]></category>

		<category><![CDATA[Linux Embarqué]]></category>

		<category><![CDATA[Cross-compilation]]></category>

		<category><![CDATA[emdebian]]></category>

		<category><![CDATA[Olinuxino]]></category>

		<category><![CDATA[RaspberryPi]]></category>

		<guid isPermaLink="false">http://innovelectronique.fr/?p=1284</guid>
		<description><![CDATA[De plus en plus de cartes électroniques à bas coût sont disponibles sur le marché de l&#8217;embarqué. Dans quasiment tous les cas elles sont équipées d&#8217;un coeur ARM. Par exemple, le RaspberryPi (ARM11 : architecture armv6) ou les cartes Olinuxino (ARM9 (armv5) pour la iMX233 et Cortex A8 (armv7) pour la carte A13) utilisent des processeurs [...]]]></description>
			<content:encoded><![CDATA[<p>De plus en plus de cartes électroniques à bas coût sont disponibles sur le marché de l&#8217;embarqué. Dans quasiment tous les cas elles sont équipées d&#8217;un coeur <a href="http://fr.wikipedia.org/wiki/Architecture_ARM" target="_blank">ARM</a>. Par exemple, le <a href="http://www.raspberrypi.org/" target="_blank">RaspberryPi</a> (ARM11 : architecture armv6) ou les cartes <a href="https://www.olimex.com/Products/OLinuXino/" target="_blank">Olinuxino</a> (ARM9 (armv5) pour la iMX233 et Cortex A8 (armv7) pour la carte A13) utilisent des processeurs ayant un coeur ARM. Suivant le processeur utilisé, celui-ci peut posséder une unité de calcul en virgule flottante. Nous aurons donc à installer une chaîne de cross-compilation qui supporte ou pas l&#8217;unité de calcul en virgule flottante. Sur Debian, le projet <a href="http://www.emdebian.org/" target="_blank">emdebian</a> propose des cross-compilateurs pour les architectures précédemment cités.<br />
Note : Il existe un lien d'impression intégré dans ce post, veuillez svp visiter ce post pour l'imprimer.<br />
<span id="more-1284"></span></p>
<h1>Qu&#8217;est-ce que la cross-compilation ?</h1>
<p>Je reprend ici la définition de <a href="http://c.developpez.com/faq/?page=compilation" target="_blank">developpez.com</a> :</p>
<p><span><em>Il peut arriver, souvent ou rarement selon votre domaine, que vous ayez besoin de compiler un programme pour une plateforme différente de celle qui est utilisée pour le développement. Par exemple, pour créer une application pour un téléphone portable, vous n&#8217;allez certainement pas programmer avec votre téléphone. Vous développerez plutôt votre application toujours sur ordinateur mais la compilerez pour le téléphone et non pour votre système. C&#8217;est la cross-compilation.</em></span></p>
<p>Dans notre cas la machine de développement est un PC sous GNU/Linux Debian 6 ou 7 et la cible est un système embarqué à base de <a href="http://www.pobot.org/+-SoC-pour-System-on-Chip-+.html" target="_blank">SoC</a> ARM (RaspberryPi ou Olinuxino).</p>
<h1>Installer la chaîne de cross-compilation sur votre Debian</h1>
<p>Lancez un interpréteur de commandes avec les droits &#8220;root&#8221; sur votre Debian (généralement &#8220;Terminal administrateur&#8221;). Il faut tout d&#8217;abord rajouter la clé public <a href="http://www.gnupg.org/" target="_blank">GnuPG</a> du dépôt emdebian (cela permet de vérifier la signature des paquets que vous téléchargez). Puis éditer le fichier des sources de paquetages pour ajouter le dépôt de la emdebian enfin il faut installer le cross-compilateur à proprement parler. Vous pouvez donc taper les commandes suivantes :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1284code34'); return false;">View Code</a> TEXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p128434"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p1284code34"><pre class="text" style="font-family:monospace;">root@portable-od:~# apt-get install emdebian-archive-keyring
root@portable-od:~# nano /etc/apt/sources.list</pre></td></tr></table></div>

<p>Rajoutez alors la première ligne pour une debian 7 Wheezy OU la deuxième ligne pour une debian 6 Squeeze:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1284code35'); return false;">View Code</a> TEXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p128435"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p1284code35"><pre class="text" style="font-family:monospace;">deb http://www.emdebian.org/debian/ sid main
deb http://www.emdebian.org/debian/ squeeze main</pre></td></tr></table></div>

<p>Mettez à jour la liste des paquetages disponibles :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1284code36'); return false;">View Code</a> TEXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p128436"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1284code36"><pre class="text" style="font-family:monospace;">root@portable-od:~# aptitude update</pre></td></tr></table></div>

<p>On cherche maintenant les différentes versions du cross-compilateur gcc pour arm:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1284code37'); return false;">View Code</a> TEXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p128437"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
</pre></td><td class="code" id="p1284code37"><pre class="text" style="font-family:monospace;">root@portable-od:~# aptitude search gnueabi
root@debian7:~# aptitude search gnueabi
p   binutils-arm-linux-gnueabi      - GNU binary utilities, for arm-linux-gnueab
p   binutils-arm-linux-gnueabihf    - GNU binary utilities, for arm-linux-gnueab
v   c++-compiler-arm-linux-gnueabi  -
v   c++-compiler-arm-linux-gnueabih -
v   c-compiler-arm-linux-gnueabi    -
v   c-compiler-arm-linux-gnueabihf  -
p   cpp-4.3-arm-linux-gnueabi       - The GNU C preprocessor
p   cpp-4.4-arm-linux-gnueabi       - GNU C preprocessor
p   cpp-4.4-arm-linux-gnueabihf     - The GNU C preprocessor
p   cpp-4.5-arm-linux-gnueabi       - The GNU C preprocessor
p   cpp-4.5-arm-linux-gnueabihf     - The GNU C preprocessor
p   cpp-4.6-arm-linux-gnueabi       - GNU C preprocessor
p   cpp-4.6-arm-linux-gnueabihf     - GNU C preprocessor
p   cpp-4.7-arm-linux-gnueabi       - GNU C preprocessor
p   cpp-4.7-arm-linux-gnueabihf     - GNU C preprocessor
p   g++-4.3-arm-linux-gnueabi       - The GNU C++ compiler
p   g++-4.4-arm-linux-gnueabi       - GNU C++ compiler
p   g++-4.4-arm-linux-gnueabihf     - The GNU C++ compiler
p   g++-4.5-arm-linux-gnueabi       - The GNU C++ compiler
p   g++-4.5-arm-linux-gnueabihf     - The GNU C++ compiler
p   g++-4.6-arm-linux-gnueabi       - GNU C++ compiler
p   g++-4.6-arm-linux-gnueabihf     - GNU C++ compiler
p   g++-4.7-arm-linux-gnueabi       - GNU C++ compiler
p   g++-4.7-arm-linux-gnueabihf     - GNU C++ compiler
p   gcc-4.3-arm-linux-gnueabi       - The GNU C compiler
p   gcc-4.3-arm-linux-gnueabi-base  - The GNU Compiler Collection (base package)
p   gcc-4.4-arm-linux-gnueabi       - GNU C compiler
p   gcc-4.4-arm-linux-gnueabi-base  - GCC, the GNU Compiler Collection (base pac
p   gcc-4.4-arm-linux-gnueabihf     - The GNU C compiler
p   gcc-4.4-arm-linux-gnueabihf-bas - The GNU Compiler Collection (base package)
p   gcc-4.5-arm-linux-gnueabi       - The GNU C compiler
p   gcc-4.5-arm-linux-gnueabi-base  - The GNU Compiler Collection (base package)
p   gcc-4.5-arm-linux-gnueabihf     - The GNU C compiler
p   gcc-4.5-arm-linux-gnueabihf-bas - The GNU Compiler Collection (base package)
p   gcc-4.5-plugin-dev-arm-linux-gn - Files for GNU GCC plugin development.
p   gcc-4.5-plugin-dev-arm-linux-gn - Files for GNU GCC plugin development.
p   gcc-4.6-arm-linux-gnueabi       - GNU C compiler
p   gcc-4.6-arm-linux-gnueabi-base  - GCC, the GNU Compiler Collection (base pac
p   gcc-4.6-arm-linux-gnueabihf     - GNU C compiler
p   gcc-4.6-arm-linux-gnueabihf-bas - GCC, the GNU Compiler Collection (base pac
p   gcc-4.6-plugin-dev-arm-linux-gn - Files for GNU GCC plugin development.
p   gcc-4.6-plugin-dev-arm-linux-gn - Files for GNU GCC plugin development.
p   gcc-4.7-arm-linux-gnueabi       - GNU C compiler
p   gcc-4.7-arm-linux-gnueabi-base  - GCC, the GNU Compiler Collection (base pac
p   gcc-4.7-arm-linux-gnueabihf     - GNU C compiler
p   gcc-4.7-arm-linux-gnueabihf-bas - GCC, the GNU Compiler Collection (base pac
p   gcc-4.7-plugin-dev-arm-linux-gn - Files for GNU GCC plugin development.
p   gcc-4.7-plugin-dev-arm-linux-gn - Files for GNU GCC plugin development.
p   gccgo-4.7-arm-linux-gnueabi     - GNU Go compiler
p   gccgo-4.7-arm-linux-gnueabihf   - GNU Go compiler
p   gdb-arm-linux-gnueabi           - The GNU Debugger</pre></td></tr></table></div>

<p>Si vous désirez installer la chaîne de cross-compilation &#8220;<strong>classique</strong>&#8221; (sans support pour l&#8217;unité de calculs flottants) tapez par exemple :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1284code38'); return false;">View Code</a> TEXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p128438"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1284code38"><pre class="text" style="font-family:monospace;">root@portable-od:~# aptitude install g++-4.7-arm-linux-gnueabi</pre></td></tr></table></div>

<p>Si vous désirez une chaîne qui supporte &#8220;<strong>l&#8217;unité de calculs flottants</strong>&#8221; (hf : hard float en anglais, actuellement seulement si vous êtes sous debian 7 Wheezy), tapez:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1284code39'); return false;">View Code</a> TEXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p128439"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1284code39"><pre class="text" style="font-family:monospace;">root@portable-od:~# aptitude install g++-4.7-arm-linux-gnueabihf</pre></td></tr></table></div>

<p>Vérifiez votre installation en tapant le début du compilateur puis la touche TAB deux fois (exemple ci-dessous pour le compilateur g++ classique) :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1284code40'); return false;">View Code</a> TEXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p128440"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code" id="p1284code40"><pre class="text" style="font-family:monospace;">root@portable-od:~# arm-linux-
arm-linux-gnueabi-addr2line       arm-linux-gnueabi-gprof
arm-linux-gnueabi-ar              arm-linux-gnueabi-ld
arm-linux-gnueabi-as              arm-linux-gnueabi-ld.bfd
arm-linux-gnueabi-c++filt         arm-linux-gnueabi-ld.gold
arm-linux-gnueabi-cpp-4.7         arm-linux-gnueabi-nm
arm-linux-gnueabi-elfedit         arm-linux-gnueabi-objcopy
arm-linux-gnueabi-g++-4.7         arm-linux-gnueabi-objdump
arm-linux-gnueabi-gcc-4.7         arm-linux-gnueabi-ranlib
arm-linux-gnueabi-gcc-ar-4.7      arm-linux-gnueabi-readelf
arm-linux-gnueabi-gcc-nm-4.7      arm-linux-gnueabi-size
arm-linux-gnueabi-gcc-ranlib-4.7  arm-linux-gnueabi-strings
arm-linux-gnueabi-gcov-4.7        arm-linux-gnueabi-strip</pre></td></tr></table></div>

<p>Il faut ensuite établir les liens symboliques vers le nom du cross-compilateur (ci dessous pour la version classique, pour la version avec support des calculs flottants rajouter &#8216;hf&#8217; coller à &#8216;gnueabi&#8217; =&gt; &#8216;gnueabihf&#8217;) :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1284code41'); return false;">View Code</a> TEXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p128441"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p1284code41"><pre class="text" style="font-family:monospace;">root@portable-od:~# ln -s /usr/bin/arm-linux-gnueabi-gcc-4.7 /usr/bin/arm-linux-gnueabi-gcc
root@portable-od:~# ln -s /usr/bin/arm-linux-gnueabi-g++-4.7 /usr/bin/arm-linux-gnueabi-g++</pre></td></tr></table></div>

<h1>Premier test de la chaîne de cross-compilation</h1>
<p>Vous allez compiler le programme suivant:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1284code42'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p128442"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code" id="p1284code42"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;iostream&gt;</span>
using namespace std<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
   <span style="color: #000066;">cout</span> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #ff0000;">&quot;Cross compilation ARM OK&quot;</span> <span style="color: #339933;">&lt;&lt;</span> endl<span style="color: #339933;">;</span>
   <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Vous taperez donc les commandes suivantes:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1284code43'); return false;">View Code</a> TEXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p128443"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p1284code43"><pre class="text" style="font-family:monospace;">root@portable-od:~# nano arm-hello.cpp
root@portable-od:~# arm-linux-gnueabi-g++ arm-hello.cpp -o arm-hello
root@portable-od:~# ./arm-hello
-bash: ./arm-hello : fichier binaire impossible à lancer</pre></td></tr></table></div>

<p>La dernière commande est intéressante. On a essayé de lancer le binaire &#8220;arm-hello&#8221; sur une architecture i386 alors que l&#8217;on a compilé pour une architecture de type ARM : résultat le binaire ne peut être exécuté !<br />
Pour savoir pour quel architecture un binaire est compilé, vous utilisez la commande &#8216;file&#8217; (qu&#8217;il faut installer si elle n&#8217;est pas disponible) :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1284code44'); return false;">View Code</a> TEXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p128444"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p1284code44"><pre class="text" style="font-family:monospace;">root@portable-od:~# aptitude install file
root@portable-od:~# file arm-hello
arm-hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), 
for GNU/Linux 2.6.26, BuildID[sha1]=0x72fa9b146a359e4f866133ed06be736488ea71fa, not stripped</pre></td></tr></table></div>

<p>Il y a deux choses intéressantes à signaler :</p>
<ul>
<li>le binaire &#8220;arm-hello&#8221; est bien compilé pour une architecture ARM,</li>
<li>le binaire est &#8220;not stripped&#8221;, ce qui signifie qu&#8217;il a encore les symboles dans son code pour le débogage. Or si l&#8217;on ne désire pas déboger cet exécutable, il faut retirer ce qui n&#8217;est pas utile. Le binaire final sera alors plus &#8220;léger&#8221;.</li>
</ul>
<p>Ci-dessous, on regarde la taille du binaire avant et après avoir retiré les informations de debogage avec la commande &#8217;strip&#8217; :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1284code45'); return false;">View Code</a> TEXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p128445"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p1284code45"><pre class="text" style="font-family:monospace;">root@portable-od:~# ls -l arm-hello
-rwxr-xr-x 1 root root 7377 janv. 30 16:55 arm-hello
root@portable-od:~# arm-linux-gnueabi-strip arm-hello
root@portable-od:~# ls -l arm-hello
-rwxr-xr-x 1 root root 4244 janv. 30 17:07 arm-hello</pre></td></tr></table></div>

<p>On passe de 7377 octets à 4244 octets !</p>
<h1>Transférer et exécuter le binaire sur la plateforme ARM</h1>
<p>Une fois que vous disposez du binaire, il faut le tester sur la plateforme concernée : RaspberryPi ou Olinuxino. Dans les deux cas, il faut connecter la carte à un réseau ethernet : soit en filaire, soit en Wifi. Il est conseillé pour cette partie d&#8217;utiliser une des bornes wifi disponible dans la section et de la configurer pour qu&#8217;elle distribue des adresses ip par le serveur dhcp intégré. Votre station de développement sera configuré en dhcp, la carte ARM sera configuré en dhcp soit en filaire, soit en wifi : ainsi les deux machines seront sur le même réseau.<br />
Vérifiez la config réseau sur chacune des machines avec la commande &#8216;ifconfig&#8217;. Testez la commande ping entre les deux machines. Enfin pour envoyer un fichier vers la carte ARM depuis votre station de développement:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1284code46'); return false;">View Code</a> TEXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p128446"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1284code46"><pre class="text" style="font-family:monospace;">root@portable_od:~# scp arm-hello root@adresse_ip_machine_arm</pre></td></tr></table></div>

<p>Dans un autre terminal vous pouvez vous connecter sur la carte ARM par ssh:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1284code47'); return false;">View Code</a> TEXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p128447"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1284code47"><pre class="text" style="font-family:monospace;">root@portable_od:~# ssh root@adresse_ip_machine_arm</pre></td></tr></table></div>

<p>Sur la machine ARM, vous pouvez alors lancer l&#8217;exécutable :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1284code48'); return false;">View Code</a> TEXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p128448"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p1284code48"><pre class="text" style="font-family:monospace;">root@olinuxino:~# ./arm-hello
Cross compilation ARM OK</pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://innovelectronique.fr/2013/01/30/installer-une-chaine-de-cross-compilation-pour-%c2%b5p-arm-sur-une-debian-squeeze-60-ou-wheezy-70/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Prise en main du compactRIO-9074 de National Instrument</title>
		<link>http://innovelectronique.fr/2013/01/22/prise-en-main-du-ni-crio-9074/</link>
		<comments>http://innovelectronique.fr/2013/01/22/prise-en-main-du-ni-crio-9074/#comments</comments>
		<pubDate>Tue, 22 Jan 2013 22:06:58 +0000</pubDate>
		<dc:creator>Olivier</dc:creator>
		
		<category><![CDATA[LabVIEW]]></category>

		<category><![CDATA[compactRIO]]></category>

		<guid isPermaLink="false">http://innovelectronique.fr/?p=1208</guid>
		<description><![CDATA[Le NI cRIO-9074 (Système avec contrôleur temps réel 400 MHz intégré et FPGA 2 millions de portes) équipe désormais tous les lycées ayant des sections STI2D SIN. De plus il est livré avec trois modules d&#8217;acquisition :

le NI9201 : Module d&#8217;entrée analogique 8 voies, ± 10 V, 500 kéch./s, 12 bits
le NI 9263 : Module de sortie analogique [...]]]></description>
			<content:encoded><![CDATA[<p>Le <a href="http://sine.ni.com/nips/cds/view/p/lang/fr/nid/203964" target="_blank">NI cRIO-9074</a> (Système avec contrôleur temps réel 400 MHz intégré et FPGA 2 millions de portes) équipe désormais tous les lycées ayant des sections STI2D SIN. De plus il est livré avec trois modules d&#8217;acquisition :</p>
<ul>
<li>le <a href="http://sine.ni.com/nips/cds/view/p/lang/fr/nid/208798" target="_blank">NI9201</a> : Module d&#8217;entrée analogique 8 voies, ± 10 V, 500 kéch./s, 12 bits</li>
<li>le <a href="http://sine.ni.com/nips/cds/view/p/lang/fr/nid/208806" target="_blank">NI 9263</a> : Module de sortie analogique 4 voies, 16 bits, 100 kéch./s, ±10 V</li>
<li>le <a href="http://sine.ni.com/nips/cds/view/p/lang/fr/nid/208809" target="_blank">NI 9401</a> : Module d&#8217;E/S numériques bidirectionnelles haute vitesse 8 voies, TTL 5 V</li>
<li>Documentation au format PDF de ces trois modules : <a href="http://innovelectronique.fr/wp-content/uploads/2013/01/docs_modules_9201_9263_9401.zip">docs_modules_9201_9263_9401</a></li>
</ul>
<p>Nous allons donc réaliser la mise en œuvre de cet appareil dans les pages suivantes.</p>
Note : Il existe un lien d'impression intégré dans ce post, veuillez svp visiter ce post pour l'imprimer.
<p><span id="more-1208"></span></p>
<h1>Le châssis NI cRIO-9074</h1>
<p>Commencez par lire les spécifications techniques de la <a href="http://sine.ni.com/nips/cds/view/p/lang/fr/nid/203964" target="_blank">page d&#8217;accueil</a> de ce châssis et la page généraliste sur les <a href="http://www.ni.com/compactrio/f/" target="_blank">compactRIO</a>.</p>
<p>Pour la partie logiciel, il faut installer :</p>
<ul>
<li>LabVIEW 2011 ou plus récent et les drivers NI-DAQmx (<a href="http://joule.ni.com/nidu/cds/view/p/id/3622/lang/fr" target="_blank">version 9.6.1</a> à la date de rédaction de l&#8217;article),</li>
<li>Le driver RIO et les extensions RT (Real-Time) et FPGA (<a href="http://www.ni.com/gettingstarted/installsoftware/f/compactrio.htm" target="_blank">lire ces pages</a>),</li>
<li>Le driver <a href="http://joule.ni.com/nidu/cds/view/p/id/3619/lang/fr" target="_blank">NI-488</a> et le driver <a href="http://joule.ni.com/nidu/cds/view/p/id/3337/lang/fr" target="_blank">NI-VISA</a></li>
</ul>
<h3>Ces trois étapes sont très importantes sinon le logiciel MAX, le gestionnaire de systèmes distribués puis ensuite LabVIEW ne fonctionneront pas avec le compactRIO !</h3>
<p>Pour la partie matériel, il vous faut :</p>
<ul>
<li>une alimentation 24V/50W continue : livré avec le matériel</li>
<li>un câble ethernet droit si vous prévoyez de connecter le compactRIO sur le réseau de l&#8217;établissement ou un câble croisé si vous voulez relier le compactRIO à votre ordinateur</li>
</ul>
<p>Sur le coté gauche du compactRIO vous trouvez un ensemble de mini-interrupteurs. Par défaut tous ces interrupteurs sont en position &#8216;OFF&#8217; :</p>
<ul>
<li><a href="http://innovelectronique.fr/wp-content/uploads/2013/01/microinterrupteur.png" rel="lightbox[1208]"><img class="alignright size-full wp-image-1211" title="Microinterrupteur CompactRIO" src="http://innovelectronique.fr/wp-content/uploads/2013/01/microinterrupteur.png" alt="Microinterrupteur CompactRIO" width="183" height="132" /></a><strong>SAFE MODE</strong> : cet interrupteur permet de lancer le système temps réel du compactRIO en mode normal (OFF) ou en position dégradé (ON). Le passage en mode dégradé est nécessaire si le logiciel embarqué est défectueux. Le logiciel embarqué est mis à jour depuis l&#8217;utilitaire MAX.</li>
<li><strong>CONSOLE OUT</strong> : En utilisant un logiciel de terminal (hyperterminal sous Windows ou minicom sous GNU/Linux) vous pouvez visualiser les messages de démarrage du système compactRIO. Pour cela mettre l&#8217;interrupteur en position ON et connecter le DB9 du compactRIO à l&#8217;aide d&#8217;un cable croisé à la voie série du PC (utilisation possible de convertisseur USB-Série). La transmission de données s&#8217;effectue en mode 8N1 9600 bits/s. Vous pouvez alors visualiser la configuration IP et la version du logiciel embarqué entre autre. Dans le cadre normal, cet interrupteur est en position OFF.</li>
<li><strong>IP RESET</strong> : Pour réinitialiser la configuration IP du compactRIO, positionner cet interrupteur en position ON puis démarrer l&#8217;appareil. Vous pouvez aussi activer cet interrupteur pour &#8220;débloquer&#8221; un châssis qui a été bloqué par le logiciel MAX. La position normale est donc OFF.</li>
<li><strong>NO APP</strong> : Mettre cet interrupteur en position ON permet de ne PAS exécuter le VI téléchargé dans le chassis.</li>
<li><strong>USER1</strong> : la position de cet interrupteur peut être lu dans une application d&#8217;un utilisateur (VI RT Read Switch).</li>
<li><strong>NO FPGA</strong> : Mettre cet interrupteur en position ON empêche une application FPGA de ce lancer au démarrage de l&#8217;appareil. Après le démarrage du compactRIO, vous pourrez téléchargé une nouvelle application FPGA depuis LabVIEW indépendamment de la position de ce bouton.</li>
</ul>
<p>L&#8217;ensemble de DELs sur le coté gauche du compactRIO vous renseigne sur le fonctionnement de celui-ci :</p>
<ul>
<li>DEL Power : une alimentation adéquate est connectée au chassis (alimentation continue 19 à 30V - 20W)</li>
<li>DEL FPGA : cette DEL peut être utilisée dans vos programmes.</li>
<li>DEL STATUS : cette DEL est éteinte en fonctionnement normal. Cet DEL s&#8217;allumera pour signaler des erreurs en clignotant un certain nombre de fois :
<ul>
<li>1 fois : le châssis n&#8217;est pas configuré. Utilisez MAX pour le configurer.</li>
<li>2 fois : le châssis a détecté une erreur dans son logiciel (par exemple aprés une mise à jour interrompue). Reprogrammez le logiciel embarqué depuis MAX.</li>
<li>3 fois : le châssis est en mode dégradé (safe mode) (interrupteur safe mode en position ON ou pas de logiciel installé sur le châssis).</li>
<li>4 fois : Le logiciel a &#8220;planté&#8221; deux fois ou plus. Cela peut arrivé si le châssis n&#8217;a plus assez de mémoire. Modifiez le VI implanté dans le compactRIO pour qu&#8217;il consomme moins de mémoire.</li>
<li>clignotement continu : le châssis a détecté une erreur irrécupérable. Contactez NI.</li>
<li>clignotement continu ou allumage constant : le châssis est configuré en mode DHCP et n&#8217;a pu récupérer une adresse IP. Vérifiez le câblage ethernet et que le serveur DHCP est actif.</li>
</ul>
<p>DEL USER1 : DEL disponible pour vos applications en utilisant le VI &#8220;RT LED&#8221;.</li>
</ul>
<p>Le châssis est équipé de deux ports ethernet : le premier sert à la connexion à votre réseau, le second à chainer plusieurs compactRIO. Dans les huit emplacements disponibles vous pouvez connecter les modules d&#8217;entrées/sorties de la série C.</p>
<h1>Premier démarrage du compactRIO, configuration IP de l&#8217;appareil et installation de logiciels</h1>
<p>Câblez l&#8217;alimentation au module, suivant le cas connectez le châssis à l&#8217;aide d&#8217;un câble ethernet au réseau de l&#8217;établissement (câble droit) ou à votre PC (câble croisée). La configuration IP de votre établissement ou de votre portable est censé vous être connu. Si votre établissement est équipé d&#8217;un serveur DHCP ou si vous utilisé le châssis à la maison pour des tests (boxADSL), le châssis récupérera tout seul une adresse IP.</p>
<p>Nous allons maintenant configurer le châssis en fixant son adresse IP (adresse IP fixe : adapté au fonctionnement en établissement). Si vous avez un adaptateur série-usb et un câble série croisé sous la main, n&#8217;hésitez pas à regarder les messages de démarrage du compactRIO dans Hyperterminal (pensez à mettre l&#8217;interrupteur CONSOLE sur ON).</p>
<p>Avant toute chose : désactivez le parefeu de Microsoft Windows et éventuellement l&#8217;antivirus surtout s&#8217;il est lui aussi équipé d&#8217;un parefeu !</p>
<p>Lancez le logiciel MAX puis cliquez sur le &#8216;+&#8217; de &#8220;Systèmes déportés&#8221; pour qu&#8217;une recherche sur le réseau s&#8217;effectue pour trouver les appareils compactRIO. Dans la capture ci-dessous, un appareil a été trouvé à l&#8217;adresse 192.168.1.67. Si l&#8217;appareil n&#8217;a pas pu récupérer une adresse ip sur un serveur DHCP, son adresse sera 0.0.0.0 = non configuré.</p>
<p style="text-align: center;"><a href="http://innovelectronique.fr/wp-content/uploads/2013/01/captur-logiciel-max-onglet-parametres.png" rel="lightbox[1208]"><img class="size-medium wp-image-1225 aligncenter" title="captur-logiciel-max-onglet-parametres" src="http://innovelectronique.fr/wp-content/uploads/2013/01/captur-logiciel-max-onglet-parametres-300x270.png" alt="captur-logiciel-max-onglet-parametres" width="300" height="270" /></a></p>
<p>Dans le même temps, vous pouvez observer la voie série du compactRIO :</p>
<pre>                            cRIO-9074 Boot

Copyright 2007-2010 National Instruments Corp.

Bootrom version: 3.1.2f0
Creation date: Jan 25 2011, 13:41:02

Press any key to stop auto-boot...
 0
auto-booting...

boot device          : tffs=0,0
unit number          : 0
processor number     : 0
host name            : lvrt
file name            : /c/ni-rt/system/vxWorks
flags (f)            : 0x8

Selecting PIO mode 6
Attaching to ATA disk device... Using SST NANDrive
Reliance File System Driver
Datalight Reliance v3.2.2 Build 1376BV
VxWorks Edition for ppc603
Copyright (c) 2003-2008 Datalight, Inc.  All Rights Reserved Worldwide.
done.
Loading /c/ni-rt/system/vxWorks...3597136
Starting at 0x10000...

Selecting PIO mode 6
Using SST NANDrive
Reliance File System Driver
Datalight Reliance v3.2.2 Build 1376BV
VxWorks Edition for ppc603
Copyright (c) 2003-2008 Datalight, Inc.  All Rights Reserved Worldwide.

Adding 8519 symbols for standalone.
Mounting onboard storage...
Configuring primary storage device...

-&gt; * Loading vxfpsup.out: vxfpsup
lvusEngine: PPC603 CPU detected...
CPU tick frequency: 33.000259 MHz [Using: 1000 MHz]

VxWorks kernel image
Build time: Dec  2 2011, 16:46:53

LabVIEW Real-Time Executive
Build Time: Dec  4 2011 15:56:37
(C) Copyright 2002-2011 National Instruments Corporation

MAX system identification name: RIO
Initializing network...
Device 1 - MAC addr: 00:80:2F:14:4A:A2 - 192.168.1.67 /24 (primary - static)
Device 2 - MAC addr: 00:80:2F:14:4A:A3 - 0.0.0.0 /32 (static)
* Loading nimdnsResponder.out: nimdnsResponder
Starting mDNSResponder task tMDNS.
* Loading nirtdm.out: nirtdm

Loading LVRT...
* Loading nimdnsResponder.out: nimdnsResponder
* Loading nirtdm.out: nirtdm
* Loading vxfpsup.out: vxfpsup
* Loading tsengine.out: tsengine
Time sync source: rtc now active
* Loading nisvcloc.out: nisvcloc
* Loading nisysrpc.out: nisysrpc
* Loading NiRioRpc.out: NiRioRpc
* Loading NiViSrvr.out: NiViSrvr
* Loading niserial.out: niserial

Welcome to LabVIEW Real-Time 11.0.1

NI-VISA Server 5.1 started successfully.
NI-RIO Server 4.1 started successfully.</pre>
<p>On remarque que l&#8217;adresse est &#8220;statique&#8221; donc qu&#8217;elle a été fixée par l&#8217;utilisateur. Les serveurs VISA et RIO sont fonctionnels.</p>
<p>Pour changer ou fixer l&#8217;adresse ip de l&#8217;appareil, cliquez sur l&#8217;onglet &#8220;Paramètres réseau&#8221; en bas de la fenêtre de MAX. Vous obtenez alors la page suivante :</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2013/01/capture-logiciel-max-onglet-reseau.png" rel="lightbox[1208]"><img class="alignleft size-medium wp-image-1227" title="capture-logiciel-max-onglet-reseau" src="http://innovelectronique.fr/wp-content/uploads/2013/01/capture-logiciel-max-onglet-reseau-234x300.png" alt="capture-logiciel-max-onglet-reseau" width="234" height="300" /></a> Ici on remarque que l&#8217;adresse est en mode &#8220;statique&#8221;. Si vous souhaitez passer votre compactRIO en mode DHCP ou si vous reliez le compactRIO à votre ordinateur à l&#8217;aide d&#8217;un cable croisé, cliquez sur le bouton à coté de &#8220;Configurer l&#8217;adresse IPv4&#8243; et choisissez l&#8217;option &#8220;DHCP ou Link-local&#8221;.</p>
<p>Ici on restera en &#8220;statique&#8221; : il faudra adapter les paramètres IP à votre établissement.</p>
<p>Laissez la deuxième carte ethernet &#8220;eth1&#8243; désactivée.</p>
<p>Sauvegardez vos changements par l&#8217;icone &#8220;Enregistrer&#8221; et faites redémarrer l&#8217;appareil par l&#8217;icone &#8220;Redémarrer&#8221;. Suivez le &#8220;boot&#8221; par voie série pour vérifier que les changements IP ont été pris en compte.</p>
<p>Laissez du temps à MAX pour retrouver l&#8217;appareil.</p>
<p><strong>Remarque</strong> : si le compactRIO n&#8217;est pas visible dans les &#8220;systèmes déportés&#8221; il peut y avoir deux raisons essentielles à cela :</p>
<ul>
<li>Les pilotes de matériel sont incomplets, manquants ou non installés : reprendre la procédure d&#8217;installation avec les DVD de LabVIEW,</li>
<li>votre PC et le compactRIO ne sont pas sur le même réseau IP et/ou dans le même adressage IP. Vérifiez vos paramètres IP et faites un &#8220;ping&#8221; entre votre PC et le compactRIO.</li>
</ul>
<p>Nous allons maintenant rajouter quelques fonctionnalités à notre compactRIO. Pour cela toujours dans MAX cliquez sur l&#8217;item &#8220;Logiciels&#8221; de votre RIO. Puis en haut de la fenêtre cliquez sur &#8220;Ajouter/supprimer des logiciels&#8221;. Une nouvelle fenêtre s&#8217;ouvre comme dans la capture ci-dessous:</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2013/01/ajout-logiciels-dans-compactrio.png" rel="lightbox[1208]"><img class="aligncenter size-medium wp-image-1231" title="ajout-logiciels-dans-compactrio" src="http://innovelectronique.fr/wp-content/uploads/2013/01/ajout-logiciels-dans-compactrio-300x207.png" alt="ajout-logiciels-dans-compactrio" width="300" height="207" /></a></p>
<p>Vous pouvez par exemple rajouter les fonctionnalités &#8220;webserver&#8221;. Ce qui permettra d&#8217;accéder au compactRIO et à ces réglages par l&#8217;intermédiaire d&#8217;un navigateur. Une fois cette fonctionnalité installée, pointez votre navigateur vers l&#8217;adresse ip du compactRIO pour observer le résultat. Rajoutez aussi la fonctionnalité &#8220;NI Scan engine&#8221; que nous allons utiliser par la suite.</p>
<h1>Vérification du fonctionnement des modules de la série C du compactRIO</h1>
<p>Le compactRIO est livré avec les trois modules décrit en début d&#8217;article. Pour pouvoir les tester à distance, il faut installer l&#8217;extension ou le logiciel &#8220;NI Scan engine&#8221; dans votre compactRIO (voir ci-dessus). Ensuite lancez l&#8217;application &#8220;Gestionnaire de systèmes distribués&#8221; dans le menu &#8220;Démarrer&#8221;, &#8220;National Instrument&#8221;.</p>
<p><span>Le Gestionnaire de systèmes distribués centralise la gestion et la surveillance des systèmes NI sur votre réseau. C&#8217;est un outil très utile pour la mise au point et la visualisation rapide des valeurs de vos E/S ainsi que de l&#8217;utilisation des ressources systèmes.</span></p>
<p><span>Vous devez obtenir l&#8217;écran suivant (l&#8217;adresse IP peut être différente ainsi que le nombre de compactRIO détecté) :</span></p>
<p><span><a href="http://innovelectronique.fr/wp-content/uploads/2013/01/gestionnaire-de-systemes-distribues.png" rel="lightbox[1208]"><img class="alignleft size-full wp-image-1236" title="gestionnaire-de-systemes-distribues" src="http://innovelectronique.fr/wp-content/uploads/2013/01/gestionnaire-de-systemes-distribues.png" alt="gestionnaire-de-systemes-distribues" width="315" height="255" /></a>Vous remarquez que l&#8217;on retrouve les trois modules installés sur le châssis. Ici les noms sont &#8220;Mod1&#8243;, &#8220;Mod2&#8243; et &#8220;Mod3&#8243;. Cliquez sur les différents items afin d&#8217;observer ce qu&#8217;ils contiennent.</span></p>
<p><span>Vérifiez que l&#8217;item &#8220;Affichage automatique&#8221; est coché dans le menu &#8220;Affichage&#8221; pour avoir des graphes déroulants et des renseignements complémentaires sur l&#8217;état des modules.</span></p>
<p><span>Vous pouvez connecter un capteur de température analogique LM35 ou un potentiomètre sur une des entrées analogiques pour vérifier qu&#8217;elle fonctionne correctement. Ou encore relier AO0 (Analogue Out 0) à AI0 (Analog In 0) à l&#8217;aide d&#8217;un simple fil&#8230;</span></p>
<h1><span>Premier VI implanté sur le compactRIO</span></h1>
<p><span>Lancez LabVIEW. Au démarrage si l&#8217;installation des logiciels c&#8217;est passé correctement, vous devez avoir le &#8220;SplashScreen&#8221; ci-dessous (notez l&#8217;horloge) et un choix supplémentaire en bas de la page d&#8217;accueil : Cibles =&gt; Projet Temps Réel.</span></p>
<p><span><a href="http://innovelectronique.fr/wp-content/uploads/2013/01/splashscreen_labview.png" rel="lightbox[1208]"><img class="aligncenter size-full wp-image-1259" title="splashscreen_labview" src="http://innovelectronique.fr/wp-content/uploads/2013/01/splashscreen_labview.png" alt="splashscreen_labview" width="426" height="173" /></a>Lors de la création d&#8217;un projet, vous pouvez sélectionner le mode de programmation de votre application :</span></p>
<ul>
<li>le mode &#8220;Scan interface&#8221; qui vous permet d&#8217;utiliser vos modules de la série C directement depuis LabVIEW. Les entrées/sorties de chaque module sont accésibles comme de simples variables que vous glissez-déposez sur le diagramme.</li>
<li>le mode &#8220;FPGA interface&#8221; qui vous permet de piloter vos modules par le FPGA embarqué. Cette solution nécessite d&#8217;avoir installé l&#8217;extension FPGA de LabVIEW. C&#8217;est la solution pour avoir le maximum de rapidité (temps réel)  au prix d&#8217;une mise en oeuvre plus complexe. C&#8217;est aussi par ce biais que vous pouvez réaliser les bus I2C, SPI, Série matériel&#8230;</li>
</ul>
<p>Dans notre cas, nous allons utiliser le mode &#8220;Scan Interface&#8221; (ou alors rajoutez 1H de téléchargement et une heure d&#8217;installation pour la solution FPGA).</p>
<p><span>Créez un &#8220;projet vide&#8221;, puis dans la fenêtre de projet qui s&#8217;est ouverte faites un clic droit sur l&#8217;item &#8220;Projet&#8221;. Choisissez &#8220;Nouveau&#8221;, &#8220;Cibles et périphériques&#8221;. Choisissez alors dans la fenêtre qui s&#8217;ouvre votre compactRIO (Item Real-Time CompactRIO). La fenêtre de l&#8217;explorateur de projet peut se présenter de la manière suivante (à l&#8217;adresse ip prés) :</span></p>
<p><span><a href="http://innovelectronique.fr/wp-content/uploads/2013/01/explorateur-de-projet.png" rel="lightbox[1208]"><img class="alignleft size-full wp-image-1261" title="explorateur-de-projet" src="http://innovelectronique.fr/wp-content/uploads/2013/01/explorateur-de-projet.png" alt="explorateur-de-projet" width="399" height="460" /></a>On retrouve votre compactRIO (ici nommé RIO) avec l&#8217;adresse IP qui lui est affecté.</span></p>
<p><span>Vous retrouvez aussi les trois modules de la série C installés sur le châssis. </span>Dans l&#8217;exercice qui suit on se propose de relier AO0 à AI0 à l&#8217;aide d&#8217;un fil, positionner DIO3 en sortie et DIO7 en entrée puis les relier par un fil et de vérifier que l&#8217;ensemble fonctionne correctement.</p>
<p><span>Ici le module1 (NI9201 : Entrées Analogiques) est déroulé et vous avez accès aux différentes voies (notées AI0 à AI7).</span></p>
<p><span>Pour accéder à ces entrées, il suffit de les glisser/déposer sur un diagramme.</span></p>
<p><span>Pour créer un VI qui sera implanté dans le compactRIO, il faut faire un clic droit  sur le nom de votre châssis (ici RIO) puis &#8220;Nouveau&#8221; puis &#8220;VI&#8221;. Vous retrouvez alors les fenêtres classiques de LabVIEW (face avant et diagramme). Renommez-le si vous le souhaitez puis glissez/déposez AI0 et AO0 sur le diagramme.</span></p>
<p><span>Il faut alors mettre en place une boucle de scrutation des entrées/sorties. En environnement temps réel, c&#8217;est la boucle &#8220;boucle cadencée&#8221; qui est utilisée.</span></p>
<p><span>Pour utiliser les E/S TOR TTL, il faut tout d&#8217;abord les configurer. Le module NI9401 permet de déterminer le sens des E/S par groupe de 4 (D7:D4 et D3:D0). Vous ne pouvez pas gérer individuellement chaque broche. Ce réglage est accessible en faisant un clic droit sur l&#8217;item &#8220;Mod3&#8243; (NI9401) puis en choisissant &#8220;Propriétés&#8221;. Dans la fenêtre qui apparaît, choisissez le sens des E/S :<a href="http://innovelectronique.fr/wp-content/uploads/2013/01/choix_es_numerique.png" rel="lightbox[1208]"><img class="aligncenter size-medium wp-image-1272" title="choix_es_numerique" src="http://innovelectronique.fr/wp-content/uploads/2013/01/choix_es_numerique-300x136.png" alt="choix_es_numerique" width="300" height="136" /></a>Vous pouvez alors glisser/déposer les E/S numériques dans le diagramme.</span></p>
<p><span>Vous réalisez donc la face avant suivante et le diagramme associé :</span></p>
<p><span><a href="http://innovelectronique.fr/wp-content/uploads/2013/01/face-avant-test-es.png" rel="lightbox[1208]"><img class="aligncenter size-full wp-image-1274" title="face-avant-test-es" src="http://innovelectronique.fr/wp-content/uploads/2013/01/face-avant-test-es.png" alt="face-avant-test-es" width="489" height="289" /></a><a href="http://innovelectronique.fr/wp-content/uploads/2013/01/diagramme-test-es.png" rel="lightbox[1208]"><img class="aligncenter size-full wp-image-1275" title="diagramme-test-es" src="http://innovelectronique.fr/wp-content/uploads/2013/01/diagramme-test-es.png" alt="diagramme-test-es" width="677" height="255" /></a>Un mot sur la boucle cadencé : il faudra régler ces paramètres en double-cliquant sur son bloc de gauche. Les deux paramètres à régler sont :</span></p>
<ul>
<li>la source de cadencement de la boucle : mettre &#8220;Synchroniser avec le moteur de balayage&#8221;,</li>
<li>Dans les attributs de cadencement de la boucle : régler la période (1: envoi des données à travers le réseau à chaque synchronisation de boucle, XX: envoi toutes les XX synchronisation de boucle). Dans le cas de phénomènes qui évoluent lentement il est donc inutile d&#8217;envoyer le résultat du capteur à chaque tour de boucle pour ne pas engorger le réseau ethernet. Le réglage du temps de balayage se fait en cliquant avec le bouton droit sur le nom de votre appareil dans l&#8217;arbre de projet (ici RIO) puis choisir &#8220;Propriétés&#8221;. Dans la fenêtre qui s&#8217;ouvre choisir l&#8217;item &#8220;Moteur de balayage&#8221; : vous pouvez alors modifier la période de balayage sur la partie droite de la fenêtre.</li>
</ul>
<p>Vous pouvez observez l&#8217;effet du &#8220;dt&#8221; en le modifiant dans la boucle cadencée et en regardant à quel allure évolue l&#8217;indicateur &#8220;Nb d&#8217;itérations&#8221;.</p>
<h1><span>Fonctionnalités étendues du module NI9401</span></h1>
<p><span>Ce module permet de configurer ces 8 E/S suivant différentes configurations visibles ci dessous (clic droit sur le module NI9401 dans l&#8217;arbre de projet puis &#8220;Propriétés&#8221;. Dans la fenêtre qui vient de &#8217;s&#8217;ouvrir sélectionnez &#8220;Specialty Digital Configuration&#8221;):</span></p>
<p><span><a href="http://innovelectronique.fr/wp-content/uploads/2013/01/choix_mode_es_numerique.png" rel="lightbox[1208]"><img class="aligncenter size-medium wp-image-1278" title="choix_mode_es_numerique" src="http://innovelectronique.fr/wp-content/uploads/2013/01/choix_mode_es_numerique-300x66.png" alt="choix_mode_es_numerique" width="300" height="66" /></a>Vous avez donc le choix entre :</span></p>
<ul>
<li>des compteurs rapides (jusqu&#8217;à 1MHz),</li>
<li>des sorties MLI,</li>
<li>la gestion d&#8217;encodeur en quadrature.</li>
</ul>
<p>Mais vous ne pouvez pas &#8220;mixer&#8221; ces configurations. De plus toutes les E/S sont concernées : c&#8217;est à dire que vous avez 8 compteurs ou 8 MLI ou 2 gestion d&#8217;encodeur.</p>
<p>Réalisez le VI ci-dessous. Il permet juste de générer un signal MLI (à l&#8217;origine je voulais piloter un petit servo moteur et faire l&#8217;alimentation avec une des sorties MLI en la mettant à 100% !) :</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2013/01/face-avant-test-pwm.png" rel="lightbox[1208]"><img class="alignleft size-full wp-image-1280" title="face-avant-test-pwm" src="http://innovelectronique.fr/wp-content/uploads/2013/01/face-avant-test-pwm.png" alt="face-avant-test-pwm" width="208" height="120" /></a><a href="http://innovelectronique.fr/wp-content/uploads/2013/01/diagramme-test-pwm.png" rel="lightbox[1208]"><img class="alignright size-medium wp-image-1281" title="diagramme-test-pwm" src="http://innovelectronique.fr/wp-content/uploads/2013/01/diagramme-test-pwm-300x134.png" alt="diagramme-test-pwm" width="300" height="134" /></a></p>
<p>Vous prendrez pour la PWM1 une période de 50Hz. Le réglage de la MLI se fait avec une valeur comprise entre 0 et 100. Vérifiez à l&#8217;oscilloscope l&#8217;allure de la courbe et appréciez la justesse des temps ! (même en augmentant la fréquence de la MLI !</p>
<h1>Lectures pour approfondir vos connaissances&#8230;</h1>
<p>Je n&#8217;ai fait qu’effleurer les possibilités du compactRIO. Il faut explorer plus avant et en particulier avec le FPGA. Je vous conseille de lire les PDFs joints à la formation : &#8220;<a href="http://www.ni.com/pdf/manuals/372596b.pdf" target="_blank">Getting started with CompactRIO and LabVIEW</a>&#8221; et <a href="https://lumen.ni.com/nicif/f/infocriodevgudfull/content.xhtml" target="_blank">le guide du développeur du compactRIO</a> (en anglais également)</p>
<p><span><br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://innovelectronique.fr/2013/01/22/prise-en-main-du-ni-crio-9074/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Gestion des &#8220;GPIO&#8221; - E/S Tout Ou Rien (TOR) sur la carte TQ6410</title>
		<link>http://innovelectronique.fr/2012/11/25/gestion-des-gpio-es-tout-ou-rien-tor-sur-la-carte-tq6410/</link>
		<comments>http://innovelectronique.fr/2012/11/25/gestion-des-gpio-es-tout-ou-rien-tor-sur-la-carte-tq6410/#comments</comments>
		<pubDate>Sun, 25 Nov 2012 11:36:11 +0000</pubDate>
		<dc:creator>Olivier</dc:creator>
		
		<category><![CDATA[Linux Embarqué]]></category>

		<category><![CDATA[emdebian]]></category>

		<category><![CDATA[GPIO]]></category>

		<category><![CDATA[TQ6410]]></category>

		<guid isPermaLink="false">http://innovelectronique.fr/?p=1138</guid>
		<description><![CDATA[Pour un projet industriel, nous devons gérer 8 entrées/sorties tout ou rien (TOR). Le noyau Linux, s&#8217;il est correctement configuré et compilé permet de gérer ces E/S au travers d&#8217;une interface de type fichier. Les notes qui suivent permettent de gérer ces E/S.
Il faut tout d&#8217;abord vérifier que les options de compilation du noyau concernant [...]]]></description>
			<content:encoded><![CDATA[<p>Pour un projet industriel, nous devons gérer 8 entrées/sorties tout ou rien (TOR). Le noyau Linux, s&#8217;il est correctement configuré et compilé permet de gérer ces E/S au travers d&#8217;une interface de type fichier. Les notes qui suivent permettent de gérer ces E/S.</p>
<p><span id="more-1138"></span>Il faut tout d&#8217;abord vérifier que les options de compilation du noyau concernant la gestion des GPIO à travers le système de fichier &#8220;sysfs&#8221; sont activées.</p>
<p>Après démarrage de la carte TQ6410, nous pouvons vérifier que nous avons accès aux GPIOs en tapant:</p>
<pre>root@TQ6410-Iris:~# ls /sys/class/gpio/
export       gpiochip137  gpiochip178  gpiochip38  gpiochip9
gpiochip0    gpiochip144  gpiochip194  gpiochip55  gpiochip91
gpiochip104  gpiochip161  gpiochip26   gpiochip63  unexport
gpiochip121  gpiochip17   gpiochip32   gpiochip74</pre>
<p>On ne trouve pas directement d’accès aux broches (répertoire gpioXXX) mais des répertoires gpiochipXXX. Pour comprendre le fonctionnement des GPIOs il faut lire la documentation fournie dans les sources du noyau ou sur le site kernel.org :<a href="http://www.kernel.org/doc/Documentation/gpio.txt" target="_blank"> http://www.kernel.org/doc/Documentation/gpio.txt</a></p>
<p>Ci-dessous un extrait qui correspond à nos attentes:</p>
<pre>Paths in Sysfs
--------------
There are three kinds of entry in /sys/class/gpio:

   -	Control interfaces used to get userspace control over GPIOs;

   -	GPIOs themselves; and

   -	GPIO controllers ("gpio_chip" instances).

That's in addition to standard files including the "device" symlink.

The control interfaces are write-only:

    /sys/class/gpio/

    	"export" ... Userspace may ask the kernel to export control of
		a GPIO to userspace by writing its number to this file.

		Example:  "echo 19 &gt; export" will create a "gpio19" node
		for GPIO #19, if that's not requested by kernel code.

    	"unexport" ... Reverses the effect of exporting to userspace.

		Example:  "echo 19 &gt; unexport" will remove a "gpio19"
		node exported using the "export" file.

GPIO signals have paths like /sys/class/gpio/gpio42/ (for GPIO #42)
and have the following read/write attributes:

    /sys/class/gpio/gpioN/

	"direction" ... reads as either "in" or "out".  This value may
		normally be written.  Writing as "out" defaults to
		initializing the value as low.  To ensure glitch free
		operation, values "low" and "high" may be written to
		configure the GPIO as an output with that initial value.

		Note that this attribute *will not exist* if the kernel
		doesn't support changing the direction of a GPIO, or
		it was exported by kernel code that didn't explicitly
		allow userspace to reconfigure this GPIO's direction.

	"value" ... reads as either 0 (low) or 1 (high).  If the GPIO
		is configured as an output, this value may be written;
		any nonzero value is treated as high.

		If the pin can be configured as interrupt-generating interrupt
		and if it has been configured to generate interrupts (see the
		description of "edge"), you can poll(2) on that file and
		poll(2) will return whenever the interrupt was triggered. If
		you use poll(2), set the events POLLPRI and POLLERR. If you
		use select(2), set the file descriptor in exceptfds. After
		poll(2) returns, either lseek(2) to the beginning of the sysfs
		file and read the new value or close the file and re-open it
		to read the value.

	"edge" ... reads as either "none", "rising", "falling", or
		"both". Write these strings to select the signal edge(s)
		that will make poll(2) on the "value" file return.

		This file exists only if the pin can be configured as an
		interrupt generating input pin.

	"active_low" ... reads as either 0 (false) or 1 (true).  Write
		any nonzero value to invert the value attribute both
		for reading and writing.  Existing and subsequent
		poll(2) support configuration via the edge attribute
		for "rising" and "falling" edges will follow this
		setting.

GPIO controllers have paths like /sys/class/gpio/gpiochip42/ (for the
controller implementing GPIOs starting at #42) and have the following
read-only attributes:

    /sys/class/gpio/gpiochipN/

    	"base" ... same as N, the first GPIO managed by this chip

    	"label" ... provided for diagnostics (not always unique)

    	"ngpio" ... how many GPIOs this manges (N to N + ngpio - 1)</pre>
<p>Regardons ce que l&#8217;on obtient avec les commandes suivantes sur le contrôleur GPIO 137 :</p>
<pre>root@TQ6410-Iris:~# cat /sys/class/gpio/gpiochip137/
base       label      ngpio      subsystem/ uevent
root@TQ6410-Iris:~# cat /sys/class/gpio/gpiochip137/label
GPM
root@TQ6410-Iris:~# cat /sys/class/gpio/gpiochip137/base
137
root@TQ6410-Iris:~# cat /sys/class/gpio/gpiochip137/ngpio
6</pre>
<p>Le label contient GPM : c&#8217;est le nom du port de sortie du S3C6410 donc le port M. Si je regarde sur le schéma électrique de la carte (disponible au format PDF en fin d&#8217;article), je trouve que le port M est constitué de 6 broches (GPM0 à GPM5) et que les lignes GPM0 à GPM3 sont aussi identifiées par nLED1 à nLED4 (ce sont des DELs disponibles sur la carte pilotées au travers d&#8217;un transistor). L&#8217;adresse de base de ce port commence à 137. Donc la première broche de ce port (GPM0) aura comme numéro 137. &#8220;ngpio&#8221; contient le nombre d&#8217;E/S de ce port : ici 6 ce qui correspond bien au schéma électrique. La broche GPM5 aura donc comme numéro 142.</p>
<p>Il faut maintenant créer l’accès à une broche. Par exemple la GPM0 donc la numéro 137 (ainsi on pourra visualiser le fonctionnement sur une DEL). Il faut donc &#8220;créer&#8221; cette broche puis regarder ce que le noyau met à notre disposition:</p>
<pre>root@TQ6410-Iris:~# echo 137 &gt; /sys/class/gpio/export               

root@TQ6410-Iris:~# ls /sys/class/gpio/

export       gpiochip121  gpiochip17   gpiochip32  gpiochip74

gpio137      gpiochip137  gpiochip178  gpiochip38  gpiochip9

gpiochip0    gpiochip144  gpiochip194  gpiochip55  gpiochip91

gpiochip104  gpiochip161  gpiochip26   gpiochip63  unexport

root@TQ6410-Iris:~# ls /sys/class/gpio/gpio137/

direction  subsystem  uevent  value</pre>
<p>Si la création de la broche s&#8217;est dérouler correctement un nouveau répertoire est créé avec le nom de la broche (ici gpio137). Le répertoire contient alors tout ce qu&#8217;il faut pour piloter cette broche. &#8220;direction&#8221; permet de mettre cette broche en entrée ou en sortie (en écrivant &#8220;in&#8221; ou &#8220;out&#8221;). &#8220;value&#8221; permet de positionner (en écrivant &#8216;0&#8242; ou &#8216;1&#8242;) ou de lire la valeur de la broche. Les commandes suivantes permettent de positionner la broche 137 en sortie puis d&#8217;écrire un &#8216;0&#8242; ou un &#8216;1&#8242; sur celle-ci :</p>
<pre>root@TQ6410-Iris:~# echo "out" &gt; /sys/class/gpio/gpio137/direction

root@TQ6410-Iris:~# echo "1" &gt; /sys/class/gpio/gpio137/value

root@TQ6410-Iris:~# echo "0" &gt; /sys/class/gpio/gpio137/value</pre>
<p>Les dernières commandes allument/éteignent la del LED1 sur la carte. Il suffit maintenant de faire des opérations de lecture/écriture sur fichier pour commander une sortie ou lire une entrée. Notez qu’après un redémarrage les &#8220;gpio&#8221; ne sont pas conservés.</p>
<p>Pour compléter l&#8217;article, il faut lire <a href="https://www.ridgerun.com/developer/wiki/index.php/How_to_use_GPIO_signals" target="_blank">Howto use GPIO signals</a> et en particulier le <a href="https://www.ridgerun.com/developer/wiki/index.php/Gpio-int-test.c" target="_blank">code C</a> de gestion des GPIOs .</p>
<div class="attachments"><dl class="attachments attachments-large"><dt class="icon"><a title="Schéma électrique carte TQ6410" href="?aid=1150&pid=1138&sa=0"><img src="http://innovelectronique.fr/wp-content/plugins/eg-attachments/images/pdf.png" width="48" height="48" alt="" /></a></dt><dd class="caption"><strong>Titre: </strong><a title="Schéma électrique carte TQ6410" href="?aid=1150&pid=1138&sa=0">Schéma électrique carte TQ6410</a><br /><strong>Fichier: </strong>tq6410_sch.pdf<br /><strong>Taille: </strong>225 Ko</dd></dl></div>
]]></content:encoded>
			<wfw:commentRss>http://innovelectronique.fr/2012/11/25/gestion-des-gpio-es-tout-ou-rien-tor-sur-la-carte-tq6410/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Un &#8220;shield&#8221; pour la découverte de LabVIEW et LIFA</title>
		<link>http://innovelectronique.fr/2012/11/21/un-shield-pour-la-decouverte-de-labview-et-lifa/</link>
		<comments>http://innovelectronique.fr/2012/11/21/un-shield-pour-la-decouverte-de-labview-et-lifa/#comments</comments>
		<pubDate>Wed, 21 Nov 2012 17:35:12 +0000</pubDate>
		<dc:creator>Olivier</dc:creator>
		
		<category><![CDATA[Arduino]]></category>

		<category><![CDATA[Informatique]]></category>

		<category><![CDATA[LabVIEW]]></category>

		<category><![CDATA[lifa]]></category>

		<guid isPermaLink="false">http://innovelectronique.fr/?p=1096</guid>
		<description><![CDATA[Dans cet article, vous allez découvrir un &#8220;shield&#8221; utilisé en section de BTS IRIS pour aborder les fondamentaux de LabVIEW. Pourquoi réaliser un shield &#8220;maison&#8221; avec un arduino UNO plutôt que du matériel d&#8217;acquisition National Instrument ?

le coût d&#8217;une carte Arduino est faible (20€), une documentation abondante existe sur Internet
il n&#8217;y a pas de programmation [...]]]></description>
			<content:encoded><![CDATA[<p>Dans cet article, vous allez découvrir un &#8220;shield&#8221; utilisé en section de BTS IRIS pour aborder les fondamentaux de LabVIEW. Pourquoi réaliser un shield &#8220;maison&#8221; avec un arduino UNO plutôt que du matériel d&#8217;acquisition National Instrument ?</p>
<ul>
<li>le coût d&#8217;une carte Arduino est faible (20€), une documentation abondante existe sur Internet</li>
<li>il n&#8217;y a pas de programmation à faire coté Arduino : le &#8220;firmware&#8221; est fourni par NI puis programmé dans la mémoire flash du microcontroleur de l&#8217;arduino</li>
<li>le coût d&#8217;un &#8220;shield&#8221; maison reste raisonnable et permet d&#8217;avoir exactement ce que l&#8217;on souhaite comme capteurs, E/S&#8230;</li>
<li>La programmation de cette carte avec LabVIEW suit les &#8220;grands classiques&#8221; : ouverture d&#8217;un bus de communication, configuration des entrées/sorties, lecture des entrées, traitement numérique,  pilotage des sorties, fermeture du bus de communication</li>
<li>Chaque étudiant travaille sur &#8220;sa&#8221; carte à son rythme !  Éventuellement il peut acheter le matériel nécessaire pour faire le TP chez lui (bon là je rêve un peu <img src='http://innovelectronique.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </li>
</ul>
<p>Un document au format OpenOffice Writer est à télécharger et à compléter en fin d&#8217;article. Abordons maintenant la description de la carte arduino UNO et du shield &#8220;TP LIFA&#8221;&#8230;</p>
<p><span id="more-1096"></span></p>
<h1>La carte Arduino UNO R3</h1>
<p>Il suffit de se rendre sur le site officiel : <a href="http://www.arduino.cc/" target="_blank">http://www.arduino.cc/</a> et éventuellement sur les pages françaises mais celles-ci ne sont pas forcement à jour : <a href="http://www.arduino.cc/fr/" target="_blank">http://www.arduino.cc/fr/</a>.  La carte est décrite sur <a href="http://arduino.cc/en/Main/ArduinoBoardUno" target="_blank">http://arduino.cc/en/Main/ArduinoBoardUno</a>. En résumé et pour notre cas d&#8217;utilisation :</p>
<ul>
<li>Broches d&#8217;alimentation : 5V, 3,3V, GND</li>
<li>6 broches d&#8217;entrées analogiques numérotées A0 à A5 : ces broches permettront de numériser un signal analogique compris entre 0V et 5V issu d&#8217;un capteur par exemple.</li>
<li>13 broches d&#8217;entrées/sorties &#8220;tout ou rien&#8221; (TOR) numérotées de 0 à 13. Les broches qui sont précédés du caractère &#8216;~&#8217; (3, 5, 6, 9, 10 et 11) peuvent être configurés en mode MLI (Modulation de Largeur d&#8217;Impulsion) ou PWM en anglais (Pulse Width Modulation). Ce mode est décrit sur <a href="http://fr.wikipedia.org/wiki/Modulation_de_largeur_d%27impulsion" target="_blank">Wikipédia</a>. Il permet par exemple de faire varier la vitesse d&#8217;un moteur à courant continu ou encore sur notre &#8220;shield&#8221; l&#8217;intensité lumineuse d&#8217;une DEL. Les broches 0 et 1 permettent de réaliser une liaison série avec un PC par exemple, elles sont utilisées ici pour dialoguer avec LabVIEW. Les bus I2C ou SPI ne seront pas utilisés ici.</li>
</ul>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2012/11/arduinouno_r3.jpg" rel="lightbox[1096]"><img class="aligncenter size-full wp-image-1113" title="arduinouno_r3" src="http://innovelectronique.fr/wp-content/uploads/2012/11/arduinouno_r3.jpg" alt="arduinouno_r3" width="450" height="311" /></a></p>
<p><span style="font-family: mceinline;"><strong><span style="font-family: mceinline;"><span style="font-family: mceinline;">Complétez le document OpenOffice Writer - partie &#8220;Généralités&#8221;</span></span></strong></span></p>
<h1>La carte d&#8217;extension (shield) TP LIFA</h1>
<p>Cette carte embarque les éléments suivants:</p>
<ul>
<li> 3 interrupteurs pour réaliser des entrées logiques TOR</li>
<li>3 DELs pour réaliser des sorties TOR (une rouge, une orange, une verte)</li>
<li>une DEL RGB pour réaliser des sorties pilotables en mode MLI ou TOR. Cela permet d&#8217;obtenir n&#8217;importe quelle couleur.</li>
<li>un capteur de température analogique de type LM35 (<a href="http://www.ti.com/product/lm35" target="_blank">documentation</a>)</li>
<li>un potentiomètre qui permet de fixer une tension par exemple pour réaliser une consigne</li>
<li>une photorésistance montée dans un pont résistif qui permet donc de capter l&#8217;éclairement</li>
<li>une sortie MLI envoyée dans un filtre passe-bas : cela permet d&#8217;obtenir une sortie analogique 0V-5V. On pourra donc créer toute forme de signaux analogiques. Cette sortie peut être rebouclée par l&#8217;intermédiaire d&#8217;un cavalier sur une entrée analogique pour vérifier la forme d&#8217;onde générée</li>
</ul>
<p>Photographie de la carte:</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2012/11/carte-extension-lifa1.png" rel="lightbox[1096]"><img class="aligncenter size-full wp-image-1102" title="carte-extension-lifa1" src="http://innovelectronique.fr/wp-content/uploads/2012/11/carte-extension-lifa1.png" alt="carte-extension-lifa1" width="590" height="388" /></a></p>
<p>Schéma électrique:</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2012/11/shield_arduino_lifa.png" rel="lightbox[1096]"><img class="aligncenter size-medium wp-image-1104" title="shield_arduino_lifa" src="http://innovelectronique.fr/wp-content/uploads/2012/11/shield_arduino_lifa-300x210.png" alt="shield_arduino_lifa" width="300" height="210" /></a></p>
<p>Implantation:</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2012/11/shield_arduino_lifa_implantation.png" rel="lightbox[1096]"><img class="aligncenter size-full wp-image-1105" title="shield_arduino_lifa_implantation" src="http://innovelectronique.fr/wp-content/uploads/2012/11/shield_arduino_lifa_implantation.png" alt="shield_arduino_lifa_implantation" width="386" height="421" /></a></p>
<p>Complétez le document partie &#8220;Carte d&#8217;extension&#8221;</p>
<h1>Exercice 1 : Prise en main - E/S TOR</h1>
<p>A l&#8217;aide de<a href="http://innovelectronique.fr/2012/05/04/arduino-et-lifa-labview-interface-for-arduino/" target="_blank"> l&#8217;article sur LIFA</a> et de la documentation papier sur LabVIEW, réalisez la face avant suivante qui permet de piloter en tout ou rien les DELs rouge, orange et verte ainsi que le diagramme associé:</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2012/11/exercice1-commande-des-dels.png" rel="lightbox[1096]"><img class="aligncenter size-medium wp-image-1109" title="exercice1-commande-des-dels" src="http://innovelectronique.fr/wp-content/uploads/2012/11/exercice1-commande-des-dels-300x50.png" alt="exercice1-commande-des-dels" width="300" height="50" /></a>L&#8217;indicateur permet de choisir la voie série sur laquelle la carte arduino est reliée. Le bouton &#8220;Stop&#8221; permet d&#8217;arrêter la boucle &#8220;while&#8221; du diagramme. Les boutons de la face avant sont du type &#8220;Commutation jusqu&#8217;au relâchement&#8221;.</p>
<p>Rajoutez ensuite sur la même face avant des voyants qui permettent de lire l&#8217;état des boutons poussoirs :</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2012/11/exercice1-commande-des-dels-et-lecture-des-bps.png" rel="lightbox[1096]"><img class="aligncenter size-medium wp-image-1111" title="exercice1-commande-des-dels-et-lecture-des-bps" src="http://innovelectronique.fr/wp-content/uploads/2012/11/exercice1-commande-des-dels-et-lecture-des-bps-300x95.png" alt="exercice1-commande-des-dels-et-lecture-des-bps" width="300" height="95" /></a></p>
<h1>Exercice 2 - Lecture d&#8217;une entrée analogique - Capteur de température</h1>
<p>Complétez la face avant précédente ainsi que le diagramme associé pour lire le capteur de température :</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2012/11/exercice2-lecture-dune-tension-analogique-capteur-de-temperature.png" rel="lightbox[1096]"><img class="aligncenter size-medium wp-image-1123" title="exercice2-lecture-dune-tension-analogique-capteur-de-temperature" src="http://innovelectronique.fr/wp-content/uploads/2012/11/exercice2-lecture-dune-tension-analogique-capteur-de-temperature-300x67.png" alt="exercice2-lecture-dune-tension-analogique-capteur-de-temperature" width="300" height="67" /></a></p>
<p>Veuillez noter que l&#8217;axe des Y est gradué en °C.</p>
<p>Pour lisser le graphique de température (élimination des parasites), vous afficherez la moyenne des cinq dernières mesures.</p>
<p>Modifiez le diagramme pour que la del verte s&#8217;allume si la température est comprise entre 18°C et 21°C, la del orange entre 21°C et 24°C, la del rouge au dessus de 24°C (utilisez le sous-vi &#8220;Dans la gamme&#8221;).</p>
<h1>Exercice 3 - Signaux MLI ou PWM - DEL RGB</h1>
<p>Réalisez la face avant suivante qui permet de commander l&#8217;intensité lumineuse de chacune des dels de la DEL RGB :</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2012/11/exercice3-commande-mli-de-la-del-rgb.png" rel="lightbox[1096]"><img class="aligncenter size-medium wp-image-1160" title="exercice3-commande-mli-de-la-del-rgb" src="http://innovelectronique.fr/wp-content/uploads/2012/11/exercice3-commande-mli-de-la-del-rgb-300x102.png" alt="exercice3-commande-mli-de-la-del-rgb" width="300" height="102" /></a></p>
<p>Vérifiez le bon fonctionnement de votre montage en actionnant les curseurs de chacune des dels. Vous constatez que lorsqu&#8217;on est à 0 la del à l&#8217;éclairement maximal et à 255 qu&#8217;elle est éteinte. Modifiez votre diagramme afin que la valeur 0 éteigne la del et que la valeur 255 réalise l&#8217;éclairement maximal.</p>
<h2>Exercice 3.1</h2>
<p>Réalisez une face avant afin de visualiser sur un graphe déroulant la tension issu de la photorésistance (lecture d&#8217;une entrée analogique). Vérifiez le bon fonctionnement de ce graphe en cachant à l&#8217;aide de votre doigt la photorésistance. Vous souhaitez réaliser un éclairage automatique à l&#8217;aide de la DEL RGB en fonction de la luminosité. En pleine obscurité, on souhaite avoir l&#8217;intensité blanche maximale (255 sur les dels RGB). En plein soleil, la del RGB sera éteinte. Entre les deux l&#8217;intensité de la del RGB varie linéairement afin de produire une lumière blanche (même valeur sur les dels RGB).</p>
<h2>Exercice 3.2</h2>
<p>Réalisez un VI qui en fonction de la température pilote la del RGB avec les contraintes suivantes :</p>
<ul>
<li> en dessous de 10°C : la del bleue est à son maximum d&#8217;intensité, les autres dels sont éteintes,</li>
<li>à 20°C : la del verte est à son maximum, les autres dels sont éteintes,</li>
<li>à 30°C et au dessus : la del rouge est à son maximum, les autres dels sont éteintes,</li>
<li>entre 10°C et 20°C : vous ferez un mélange des couleurs bleu et verte proportionnellement à la température,</li>
<li>entre 20°C et 30°C:  vous ferez un mélange des couleurs verte et rouge proportionnellement à la température.</li>
</ul>
<h1>Exercice 4 - Génération de signaux - DEL RGB</h1>
<p>Afin de réaliser un mélange harmonieux des couleurs, il faut piloter chacune des dels RGB en sinusoidale ! De plus chacun des signaux sera déphasé de 120° (3 x 120° = 360°). Vous devez donc générer les signaux suivants :</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2012/11/exercice3-commande-sinusoidale-del-rgb.png" rel="lightbox[1096]"><img class="aligncenter size-medium wp-image-1164" title="exercice3-commande-sinusoidale-del-rgb" src="http://innovelectronique.fr/wp-content/uploads/2012/11/exercice3-commande-sinusoidale-del-rgb-282x300.png" alt="exercice3-commande-sinusoidale-del-rgb" width="282" height="300" /></a>En fonction de ce que vous avez déjà étudié, mémorisez dans un tableau les valeurs des trois sinusoïdes puis envoyez-les vers les dels RGB. Pensez à ralentir la boucle d&#8217;envoi avec un VI &#8220;Attendre&#8221;. Dans un second temps, faites varier la vitesse de changement des couleurs soit avec le potentiomètre disponible sur la carte, soit avec la luminosité.</p>
<h1>Exercice 5 - Datalogger - Traitements des chaînes et des fichiers</h1>
<p>Vous allez réaliser un &#8220;datalogger&#8221; de température. Un datalogger mémorise la donnée d&#8217;un capteur avec la date et l&#8217;heure courante, le tout est généralement visualisé à l&#8217;écran et sauvegardé dans un fichier. Pour découvrir les VIs de chaine et de fichiers, il faut lire le document de présentation de LabVIEW. On se propose de réaliser la face avant suivante:</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2012/12/exercice5-datalogger.png" rel="lightbox[1096]"><img class="aligncenter size-medium wp-image-1204" title="exercice5-datalogger" src="http://innovelectronique.fr/wp-content/uploads/2012/12/exercice5-datalogger-275x300.png" alt="exercice5-datalogger" width="275" height="300" /></a></p>
<p>Vous respecterez EXACTEMENT le format de sortie de la zone de texte. Une fois que ce système est fonctionnel, sauvegardez les mêmes données dans un fichier (le nom du fichier sera saisi par l&#8217;utilisateur sur la face avant.</p>
<div class="attachments"><dl class="attachments attachments-large"><dt class="icon"><a title="document-a-completer-pour-le-tp-lifa" href="?aid=1133&pid=1096&sa=0"><img src="http://innovelectronique.fr/wp-content/plugins/eg-attachments/images/odt.png" width="48" height="48" alt="" /></a></dt><dd class="caption"><strong>Titre: </strong><a title="document-a-completer-pour-le-tp-lifa" href="?aid=1133&pid=1096&sa=0">document-a-completer-pour-le-tp-lifa</a><br /><strong>Fichier: </strong>document-a-completer-pour-le-tp-lifa.odt<br /><strong>Taille: </strong>39 Ko</dd></dl></div>
]]></content:encoded>
			<wfw:commentRss>http://innovelectronique.fr/2012/11/21/un-shield-pour-la-decouverte-de-labview-et-lifa/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Carte TQ6410 - Support des souris USB et des claviers AZERTY USB</title>
		<link>http://innovelectronique.fr/2012/06/10/carte-tq6410-support-des-souris-usb-et-des-claviers-azerty-usb/</link>
		<comments>http://innovelectronique.fr/2012/06/10/carte-tq6410-support-des-souris-usb-et-des-claviers-azerty-usb/#comments</comments>
		<pubDate>Sun, 10 Jun 2012 17:44:03 +0000</pubDate>
		<dc:creator>Olivier</dc:creator>
		
		<category><![CDATA[Linux Embarqué]]></category>

		<category><![CDATA[emdebian]]></category>

		<category><![CDATA[QT]]></category>

		<category><![CDATA[TQ6410]]></category>

		<category><![CDATA[USB]]></category>

		<guid isPermaLink="false">http://innovelectronique.fr/?p=1084</guid>
		<description><![CDATA[La saga TQ6410 continue&#8230;Dernièrement la nappe de fils (4 fils) qui relie la dalle tactile à son contrôleur au dos de l&#8217;écran s&#8217;est coupée nette ! J&#8217;ai bien essayé de la réparer en grattant le plastique mais rien n&#8217;y fait et j&#8217;abime la nappe plus qu&#8217;autre chose. Donc direction e-bay pour l&#8217;achat d&#8217;une nouvelle dalle [...]]]></description>
			<content:encoded><![CDATA[<p>La saga TQ6410 continue&#8230;Dernièrement la nappe de fils (4 fils) qui relie la dalle tactile à son contrôleur au dos de l&#8217;écran s&#8217;est coupée nette ! J&#8217;ai bien essayé de la réparer en grattant le plastique mais rien n&#8217;y fait et j&#8217;abime la nappe plus qu&#8217;autre chose. Donc direction e-bay pour l&#8217;achat d&#8217;une nouvelle dalle tactile (à environ 15€). La carte devait être utilisé pour présenter le travail d&#8217;un étudiant sur la commande de régulateur de température sur ModBUS, il faut donc trouver une autre solution pour interagir avec les programmes en Qt. La carte dispose d&#8217;un port USB1.1, nous allons donc utiliser ce port pour connecter un hub usb, une souris et un clavier.<br />
<span id="more-1084"></span></p>
<h1>Compilation d&#8217;un noyau avec support USB (clavier, souris, convertisseurs USB/Série)</h1>
<p>Le problème est que j&#8217;avais optimisé le noyau linux de la carte en taille et en fonctionnalité. Le support USB n&#8217;était donc pas activé dans le noyau. La première des choses à faire est donc de modifier la configuration du noyau et relancer une compilation. Les options à activer sont les suivantes (que j&#8217;ai déterminé après moultes essais/erreurs) :</p>
<ul>
<li>Device Drivers
<ul>
<li>USB support
<ul>
<li>Support for Host-side USB
<ul>
<li>USB annouce new devices (pour voir les messages du sous-système USB dans les messages noyau)</li>
<li>OHCI HCD support (support matériel pour le bus USB1.1)</li>
</ul>
</li>
</ul>
</li>
<li>HID Devices
<ul>
<li>Generic HID support</li>
<li>USB Human Interface Device (full HID) support</li>
<li>Special HID drivers (je n&#8217;ai pas testé sans cette option, peut-être est-ce inutile)
<ul>
<li>Load all HID drivers on hid core load + tous les drivers (en particulier Samsung)</li>
</ul>
</li>
</ul>
</li>
<li>Input device support
<ul>
<li>Mouse interface (accés à la souris par /dev/input/mice)</li>
<li>Keyboards
<ul>
<li>AT keyboard</li>
</ul>
</li>
<li>Mice
<ul>
<li>PS/2 mouse + les options des différents constructeurs</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Pour disposer de la configuration de compilation du noyau on peut l&#8217;inclure dans celui-ci. Je vais aussi avoir besoin d&#8217;utiliser des convertisseurs USB/Série. J&#8217;ai donc aussi activé:</p>
<ul>
<li>General Setup -&gt; Kernel .config support
<ul>
<li>Enable access to .config through /proc/config.gz</li>
</ul>
</li>
<li>Device driver -&gt; USB support
<ul>
<li>USB Serial Converter support
<ul>
<li>USB CP2101 UART bridge controller</li>
<li>USB FTDI Single Port Serial Driver</li>
<li>USB Prolific 2303 Single Port Serial Driver</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>On lance alors la compilation puis l&#8217;implantation du nouveau nouyau comme décrit dans les articles précédents. Au niveau des messages du noyau j&#8217;obtiens donc quelques lignes supplémentaires:</p>
<blockquote><p>[21474536.995000] ohci_hcd: USB 1.1 &#8216;Open&#8217; Host Controller (OHCI) Driver<br />
[21474536.995000] s3c2410-ohci s3c2410-ohci: S3C24XX OHCI<br />
[21474537.000000] s3c2410-ohci s3c2410-ohci: new USB bus registered, assigned bus number 1<br />
[21474537.005000] s3c2410-ohci s3c2410-ohci: irq 79, io mem 0&#215;74300000<br />
[21474537.065000] usb usb1: configuration #1 chosen from 1 choice<br />
[21474537.070000] hub 1-0:1.0: USB hub found<br />
[21474537.070000] hub 1-0:1.0: 2 ports detected<br />
[21474537.080000] usb usb1: New USB device found, idVendor=1d6b, idProduct=0001<br />
[21474537.085000] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1<br />
[21474537.090000] usb usb1: Product: S3C24XX OHCI<br />
[21474537.095000] usb usb1: Manufacturer: Linux 2.6.28.6-IRIS-Turgot-O.Dartois ohci_hcd<br />
[21474537.100000] usb usb1: SerialNumber: s3c24xx<br />
[21474537.105000] usbcore: registered new interface driver usbserial<br />
[21474537.110000] usbserial: USB Serial Driver core<br />
[21474537.115000] USB Serial support registered for cp2101<br />
[21474537.120000] usbcore: registered new interface driver cp2101<br />
[21474537.125000] cp2101: v0.07:Silicon Labs CP2101/CP2102 RS232 serial adaptor driver<br />
[21474537.130000] USB Serial support registered for FTDI USB Serial Device<br />
[21474537.135000] usbcore: registered new interface driver ftdi_sio<br />
[21474537.140000] ftdi_sio: v1.4.3:USB FTDI Serial Converters Driver<br />
[21474537.145000] USB Serial support registered for pl2303<br />
[21474537.155000] usbcore: registered new interface driver pl2303<br />
[21474537.160000] pl2303: Prolific PL2303 USB to serial adaptor driver<br />
[21474537.165000] mice: PS/2 mouse device common for all mice<br />
[...]<br />
[21474537.625000] usb 1-1: configuration #1 chosen from 1 choice<br />
[21474537.625000] hub 1-1:1.0: USB hub found<br />
[21474537.630000] hub 1-1:1.0: 4 ports detected<br />
[21474537.645000] usb 1-1: New USB device found, idVendor=05e3, idProduct=0606<br />
[21474537.645000] usb 1-1: New USB device strings: Mfr=0, Product=1, SerialNumber=0<br />
[21474537.650000] usb 1-1: Product: USB2.0 Hub<br />
INIT: version 2.88 booting<br />
[21474537.930000] usb 1-1.3: new low speed USB device using s3c2410-ohci and address 3<br />
Using makefile-style concurrent boot in runlevel S.<br />
[21474538.025000] usb 1-1.3: no configurations<br />
[21474538.025000] usb 1-1.3: can&#8217;t read configurations, error -22<br />
[21474538.100000] usb 1-1.3: new low speed USB device using s3c2410-ohci and address 4<br />
[21474538.220000] usb 1-1.3: configuration #1 chosen from 1 choice<br />
[21474538.235000] input: Logitech USB-PS/2 Optical Mouse as /devices/platform/s3c2410-ohci/usb1/1-1/1-1.3/1-1.3:1.0/input/input1<br />
[21474538.280000] generic-usb 0003:046D:C03E.0001: input: USB HID v1.10 Mouse [Logitech USB-PS/2 Optical Mouse] on usb-s3c24xx-1.3/input0<br />
[21474538.285000] usb 1-1.3: New USB device found, idVendor=046d, idProduct=c03e<br />
[21474538.295000] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=0<br />
[21474538.300000] usb 1-1.3: Product: USB-PS/2 Optical Mouse<br />
[21474538.310000] usb 1-1.3: Manufacturer: Logitech<br />
[21474538.395000] usb 1-1.4: new low speed USB device using s3c2410-ohci and address 5<br />
[21474538.520000] usb 1-1.4: configuration #1 chosen from 1 choice<br />
[21474538.530000] input: LITEON Technology USB Multimedia Keyboard as /devices/platform/s3c2410-ohci/usb1/1-1/1-1.4/1-1.4:1.0/input/input2<br />
[21474538.580000] generic-usb 0003:046D:C312.0002: input: USB HID v1.10 Keyboard [LITEON Technology USB Multimedia Keyboard] on usb-s3c24xx-1.4/input0<br />
[21474538.590000] usb 1-1.4: New USB device found, idVendor=046d, idProduct=c312<br />
[21474538.590000] usb 1-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=0<br />
[21474538.595000] usb 1-1.4: Product: USB Multimedia Keyboard<br />
[21474538.600000] usb 1-1.4: Manufacturer: LITEON Technology</p></blockquote>
<p>Au moment du test j&#8217;avais un hub usb2 défaillant mais j&#8217;ai quand même pu y brancher un clavier LiteON et une souris Logitech USB. Bon visiblement le matériel est reconnu. Voyons si tout se passe correctement dans l&#8217;espace utilisateur&#8230;</p>
<h1>Support d&#8217;une souris USB, d&#8217;un clavier AZERTY USB dans l&#8217;espace utilisateur pour Qt Embedded</h1>
<p>Sur l&#8217;écran de la TQ6410, j&#8217;ai le programme login qui attend une connexion. Je commence à taper et des caractères apparaissent à l&#8217;écran ! Le clavier est reconnu mais en mode QWERTY. Il va donc falloir installer tout ce qu&#8217;il faut pour passer en mode &#8220;francais&#8221;:</p>
<blockquote><p>root@TQ6410-Iris:~# aptitude install keyboard-configuration<br />
root@TQ6410-Iris:~# aptitude install console-setup<br />
root@TQ6410-Iris:~# aptitude install console-data</p></blockquote>
<p>Lors de la configuration des différents paquets précédents j&#8217;ai choisi à chaque fois les options ayant rapport avec le clavier français (fr-latin9). Après redémarrage, je dispose d&#8217;un clavier AZERTY. Pour ce qui est de la souris, je voulais vérifier que j&#8217;obtenais bien des données sans lancer un programme graphique. Une solution peut être la commande suivante qui affiche en héxadécimal les données reçues :</p>
<blockquote><p>root@TQ6410-Iris:~# cat /dev/input/mice | hexdump</p></blockquote>
<p>Si vous recevez des données lorsque vous bougez la souris, il y a de fortes chances que ca fonctionne <img src='http://innovelectronique.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p>
<p>Bon maintenant il faut lancer un programme Qt qui active le framebuffer et qui à besoin de la souris et du clavier. J&#8217;ai donc recompilé mon programme de test de la carte ES ModBUS pour Qt embedded. Cependant avant de lancer le programme il faut lire la documentation de Qt sur les problèmes de clavier et de souris pour le monde embarqué :</p>
<ul>
<li><a href="http://doc-snapshot.qt-project.org/4.8/qt-embedded-pointer.html" target="_blank">http://doc-snapshot.qt-project.org/4.8/qt-embedded-pointer.html</a> pour la gestion de la souris</li>
<li><a href="http://doc-snapshot.qt-project.org/4.8/qt-embedded-charinput.html" target="_blank">http://doc-snapshot.qt-project.org/4.8/qt-embedded-charinput.html</a> pour la gestion du clavier</li>
</ul>
<p>Tout cela nous conduit à fixer les variables d&#8217;environnement suivantes:</p>
<blockquote><p>export QWS_KEYBOARD=&#8221;TTY:/dev/tty0:keymap=fr.qmap&#8221;<br />
export QWS_MOUSE_PROTO=&#8221;IntelliMouse:/dev/input/mice&#8221;</p></blockquote>
<p>On lance l&#8217;application graphique. La souris réagit correctement mais le clavier est un QWERTY ! En sortant de l&#8217;application j&#8217;ai un message d&#8217;erreur qui me dit que le &#8220;fr.qmap&#8221; n&#8217;a pas été trouvé, c&#8217;est pour cette raison qu&#8217;il a basculé sur un clavier QWERTY. Recherche sur internet et il faut lire la page suivante : <a href="http://doc-snapshot.qt-project.org/4.8/qt-embedded-kmap2qmap.html" target="_blank">http://doc-snapshot.qt-project.org/4.8/qt-embedded-kmap2qmap.html </a></p>
<p>Donc sur ma station de développement dans le répertoire de Qt-everywhere je dois avoir un répertoire &#8220;tools&#8221; qui contient un utilitaire qui se nomme &#8220;kmap2map&#8221; : c&#8217;est bien le cas dans le répertoire éponyme. Je croos-compile donc cet utilitaire pour la TQ6410. L&#8217;exécutable, une fois compilé, se trouve dans &#8220;bin&#8221;. Je transfert le programme par scp et l&#8217;exécute sans paramètre pour visualiser l&#8217;aide. En gros il faut faire &#8220;./kmap2qmap <em>clavier.kmap</em> <em>clavier.qmap</em>&#8220;. Pour ma part les claviers sont disponibles dans &#8220;/usr/share/keymaps/i386/azerty&#8221; (debian squeeze 6.0.4). Je tape donc les commandes suivantes:</p>
<blockquote><p>root@TQ6410-Iris:~# cp /usr/share/keymaps/i386/azerty/fr-latin9.kmap.gz .<br />
root@TQ6410-Iris:~# gunzip fr-latin9.kmap.gz<br />
root@TQ6410-Iris:~# ./kmap2qmap fr-latin9.kmap fr.qmap</p></blockquote>
<p>La génération du fichier &#8220;fr.qmap&#8221; vous donnera sûrement des erreurs ne pas en tenir compte. Relancez votre application, cette fois-ci le clavier doit être en français (du moins c&#8217;est le cas pour moi !)</p>
<h1>Conclusion</h1>
<p>On peut donc maintenant interagir avec les applications graphiques Qt et ceci sans dalle tactile. Cependant il ne faut pas perdre de vue que c&#8217;est la dalle tactile qui doit être utilisée in-fine !!!</p>
]]></content:encoded>
			<wfw:commentRss>http://innovelectronique.fr/2012/06/10/carte-tq6410-support-des-souris-usb-et-des-claviers-azerty-usb/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Aduino et LIFA (épisode 2)</title>
		<link>http://innovelectronique.fr/2012/05/23/aduino-et-lifa-episode-2/</link>
		<comments>http://innovelectronique.fr/2012/05/23/aduino-et-lifa-episode-2/#comments</comments>
		<pubDate>Wed, 23 May 2012 15:06:52 +0000</pubDate>
		<dc:creator>Olivier</dc:creator>
		
		<category><![CDATA[Arduino]]></category>

		<category><![CDATA[LabVIEW]]></category>

		<category><![CDATA[lifa]]></category>

		<guid isPermaLink="false">http://innovelectronique.fr/?p=976</guid>
		<description><![CDATA[Dans cette deuxième partie, nous allons tester une manette nunchuck, le SPI avec un montage à dels&#8230; Un peu à part et pas directement relié à l&#8217;utilisation de LIFA, nous réaliserons une face avant pour commander une del et lire un capteur de température par ethernet grâce à un shield ethernet. Bonne lecture&#8230;.
LIFA et manette [...]]]></description>
			<content:encoded><![CDATA[<p>Dans cette deuxième partie, nous allons tester une manette nunchuck, le SPI avec un montage à dels&#8230; Un peu à part et pas directement relié à l&#8217;utilisation de LIFA, nous réaliserons une face avant pour commander une del et lire un capteur de température par ethernet grâce à un shield ethernet. Bonne lecture&#8230;.</p>
Note : Il existe un lien d'impression intégré dans ce post, veuillez svp visiter ce post pour l'imprimer.
<h1><span id="more-976"></span>LIFA et manette Nunchuck</h1>
<p>La manette nunchuck est une des deux manettes utilisées avec la console de jeu Wii de Nintendo. Cette manette se présente de la manière suivante (les informations proviennent essentiellement d&#8217;une documentation nommée ZX-Nunchuck que j&#8217;ai corrigé) :</p>
<p style="text-align: center;"><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/nunchuck.jpg" rel="lightbox[976]"><img class="alignnone size-full wp-image-977" title="Manette Nunchuck de Wii" src="http://innovelectronique.fr/wp-content/uploads/2012/05/nunchuck.jpg" alt="Manette Nunchuck de Wii" width="225" height="225" /> </a><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/nun1.png" rel="lightbox[976]"><img class="alignnone size-medium wp-image-1007" title="Détail nunchuck et cablage de la prise" src="http://innovelectronique.fr/wp-content/uploads/2012/05/nun1-300x137.png" alt="Détail nunchuck et cablage de la prise" width="300" height="137" /></a></p>
<p>Cette manette est équipée de deux boutons tout ou rien (bouton C et Z), un joystick analogique deux axes et un accéléromètre trois axes. Les trois axes sont orientés de la manière suivante:</p>
<p style="text-align: center;"><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/nun2.png" rel="lightbox[976]"><img class="alignnone size-thumbnail wp-image-981" title="Mouvement Nunchuck - Axe X" src="http://innovelectronique.fr/wp-content/uploads/2012/05/nun2-150x150.png" alt="Mouvement Nunchuck - Axe X" width="150" height="150" /></a> <a href="http://innovelectronique.fr/wp-content/uploads/2012/05/nun3.png" rel="lightbox[976]"><img class="alignnone size-thumbnail wp-image-982" title="Mouvement Nunchuck - Axe Y" src="http://innovelectronique.fr/wp-content/uploads/2012/05/nun3-150x150.png" alt="Mouvement Nunchuck - Axe Y" width="150" height="150" /></a> <a href="http://innovelectronique.fr/wp-content/uploads/2012/05/nun4.png" rel="lightbox[976]"><img class="alignnone size-thumbnail wp-image-983" title="Mouvement Nunchuck - Axe Z" src="http://innovelectronique.fr/wp-content/uploads/2012/05/nun4-150x150.png" alt="Mouvement Nunchuck - Axe Z" width="150" height="150" /></a></p>
<p>Vous remarquez sur le connecteur que l&#8217;on retrouve des noms de signaux connus (SCL et SDA). En effet cette manette peut s&#8217;interroger par l&#8217;intermédiaire d&#8217;un bus I2C. Bien que l&#8217;alimentation nominale soit 3,3V, les lignes SCL et SDA sont tolérantes au +5V. Ne coupez pas le connecteur en bout de manette, des fils rigides suffisent pour réaliser la connexion avec l&#8217;arduino. Comme tout périphérique sur le bus I2C, cette manette a une adresse fixe qui est définie ci-dessous :</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/adresse_i2c_nunchuck.png" rel="lightbox[976]"><img class="aligncenter size-medium wp-image-984" title="Adresse I2C Nunchuck" src="http://innovelectronique.fr/wp-content/uploads/2012/05/adresse_i2c_nunchuck-300x23.png" alt="Adresse I2C Nunchuck" width="300" height="23" /></a>Soit en binaire 0b1010010 ou 0&#215;52 en hexadécimal ou 82 en décimal. Il faut ensuite initialiser la communication avec la manette. Vous trouverez sur Internet plusieurs solutions ( <a href="http://www.windmeadow.com/node/42" target="_blank">http://www.windmeadow.com/node/42</a> par ex. )mais une est plus simple que les autres ( <a href="http://arduino.cc/playground/Main/WiiChuckClass" target="_blank">http://arduino.cc/playground/Main/WiiChuckClass</a> ) car les données retournées ne sont pas codées. La séquence d’initialisation est donc la suivante :</p>
<ol>
<li>Écrire à l&#8217;adresse 0&#215;52 les valeurs 0xF0, 0&#215;55</li>
<li>pause de 1 ms</li>
<li>Écrire à l&#8217;adresse 0&#215;52 les valeurs 0xFB, 0&#215;00</li>
</ol>
<p>Pour obtenir les données de la nunchuck :</p>
<ol>
<li>Écrire à l&#8217;adresse 0&#215;52 la valeur 0&#215;00</li>
<li>Lire à l&#8217;adresse 0&#215;52 les 6 octets de résultat</li>
</ol>
<p>Les 6 octets représentent les données suivantes:</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/plan-dadressage-du-nunchuck.png" rel="lightbox[976]"><img class="aligncenter size-medium wp-image-985" title="Plan adressage du nunchuck" src="http://innovelectronique.fr/wp-content/uploads/2012/05/plan-dadressage-du-nunchuck-300x86.png" alt="Plan adressage du nunchuck" width="300" height="86" /></a></p>
<ul>
<li>Octet 1 : Joystick - Axe X : un octet donc de 0 à 255</li>
<li>Octet 2 : Joystick - Axe Y : un octet donc de 0 à 255</li>
<li>Octet 3 : Accéléromètre - Axe X : un octet représentant les 8 bits de poids fort sur les 10 bits possibles, si on utilise que cet octet on aura des valeurs de 0 à 255</li>
<li>Octet 4 : Accéléromètre - Axe Y : 8 bits de poids fort sur les 10 bits possibles : de 0 à 255</li>
<li>Octet 5 : Accéléromètre - Axe Z : 8 bits de poids fort sur les 10 bits possibles : de 0 à 255</li>
<li>Octet 6 : du MSB au LSB : 2 bits pour l&#8217;axe Z de l&#8217;accéléromètre, concaténé avec les 8 bits précédents vous pouvez obtenir 10 bits de résolution soit des valeurs de 0 à 1023. 2 bits pour l&#8217;axe Y de l&#8217;accéléromètre, 2 bits pour l&#8217;axe X de l&#8217;accéléromètre. 1 bit qui représente l&#8217;état du bouton C : 0:enfoncé, 1:relâché.  1 bit qui représente l&#8217;état du bouton Z : 0:enfoncé, 1:relâché.</li>
</ul>
<p>Nous avons tout ce qu&#8217;il faut pour travailler avec cette manette. On commence donc par le câblage :</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/cablage-arduino-nunchuck.png" rel="lightbox[976]"><img class="aligncenter size-medium wp-image-991" title="Cablage Arduino-Nunchuck" src="http://innovelectronique.fr/wp-content/uploads/2012/05/cablage-arduino-nunchuck-259x300.png" alt="Cablage Arduino-Nunchuck" width="259" height="300" /></a>J&#8217;ai testé directement avec le nunchuck sans mettre de résistance de rappel sur le bus i2c. Cela semble fonctionner normalement. On peut alors réaliser la face avant suivante sous LabVIEW pour tester toutes les fonctionnalités de la manette :</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/face-avant-labview-nunchuck.png" rel="lightbox[976]"><img class="aligncenter size-full wp-image-993" title="Face avant Labview pour Nunchuck" src="http://innovelectronique.fr/wp-content/uploads/2012/05/face-avant-labview-nunchuck.png" alt="Face avant Labview pour Nunchuck" width="942" height="343" /></a></p>
<p>L&#8217;adresse du capteur doit être modifiée à 0&#215;52 (82). Le potentiomètre permet de réaliser une mesure toutes les 50ms à 500ms. Le tableau &#8220;Données I2C&#8221; permet d&#8217;afficher les données brutes reçues du bus i2c. Deux dels permettent d&#8217;afficher l&#8217;état des boutons C et Z ( ce sont des booléens). Enfin deux graphiques déroulants permettent d&#8217;afficher l&#8217;évolution des données du joystick et de l&#8217;accéléromètre. Avant de regarder le diagramme ci-dessous, essayez de le réaliser par vous même&#8230;Ok le digramme peut se présenter de la manière suivante :</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/diagramme-labview-nunchuck.png" rel="lightbox[976]"><img class="aligncenter size-full wp-image-996" title="Diagramme LabVIEW - Nunchuck" src="http://innovelectronique.fr/wp-content/uploads/2012/05/diagramme-labview-nunchuck.png" alt="Diagramme LabVIEW - Nunchuck" width="993" height="369" /></a></p>
<ol>
<li>Initialisation de la communication avec l&#8217;arduino</li>
<li>Initialisation du bus i2c en mode maitre</li>
<li>Initialisation du Nunchuck avec l&#8217;écriture des valeurs définies dans la séquence vu  ci-dessus</li>
<li>Boucle infinie avec une temporisation gérée par le potentiomètre en face avant</li>
<li>Demande d&#8217;une lecture du nunchuck (écriture de la valeur 0)</li>
<li>Lecture des 6 octets attendus et affichage des données brutes dans le tableau. Ces valeurs sont dans un tableau 1D d&#8217;octets non signés</li>
<li>On extrait de ce tableau les coordonnées X et Y du joystick (indice 0 et 1 du tableau). On assemble ensuite ces valeurs pour le graph déroulant</li>
<li>De la même manière on extrait les valeurs X,Y et Z de l&#8217;accéléromètre (indice 2,3 et 4). On travaille donc ici avec les bits de poids fort issu de l&#8217;accéléromètre.</li>
<li>Enfin on récupère l&#8217;octet 5 qui contient l&#8217;état des boutons. On fait un ET logique entre cette valeur et la valeur 1 (0b0000 0001). Le résultat sera égale à 1 si le bouton Z n&#8217;est pas appuyé, 0 sinon. On traite de la même manière le bouton C avec un masque fixé à 2 (0b0000 0010).</li>
<li>On sort de la boucle infinie avec le bouton STOP.</li>
<li>On ferme la connexion avec l&#8217;arduino ou on affiche les éventuelles erreurs.</li>
</ol>
<p>Une vidéo pour vous rendre compte de ce que ça donne (video réalisé avec le logiciel wink : <a href="http://www.debugmode.com/wink/" target="_blank">http://www.debugmode.com/wink/</a> ): <a href="http://innovelectronique.fr/wp-content/uploads/2012/05/video-nunchuck.swf">Video Face avant LabVIEW pour Nunchuck<br />
</a></p>
<h1>Commande d&#8217;une del rgb avec une manette nunchuck</h1>
<p>Nous nous fixons comme but la commande d&#8217;une del RGB en fonction des valeurs des axes X,Y et Z de l&#8217;accéléromètre du nunchuck. Pour faire varier la luminosité de chaque del nous utiliserons la technique de la modulation MLI (ou PWM). Vous avez normalement tous les éléments pour mener à bien ce projet. La del RGB a comme référence chez Farnell <span class="template-min-width">1168585. Le brochage de cette del est le suivant :</span></p>
<p style="text-align: center;"><span class="template-min-width"><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/del-rgb.png" rel="lightbox[976]"><img class="size-full wp-image-1012 aligncenter" title="Brochage del RGB" src="http://innovelectronique.fr/wp-content/uploads/2012/05/del-rgb.png" alt="Brochage del RGB" width="650" height="360" /></a></span></p>
<p style="text-align: left;"><span class="template-min-width">Le câblage peut se présenter de la manière suivante&#8230;des photos car tous les composants ne sont pas disponibles dans fritzing. On utilise les canaux PWM 3,5 et 6 de la carte arduino pour commander individuellement les dels R,V et B. Cliquez sur les photos pour les avoir en plein écran et observer de manière plus fine les détails :</span></p>
<p style="text-align: center;"><span class="template-min-width"><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/cablage-del-rgb-vue-globale2.jpg" rel="lightbox[976]"><img class="alignnone size-full wp-image-1017" title="Cablage DEL RGB - Vue globale" src="http://innovelectronique.fr/wp-content/uploads/2012/05/cablage-del-rgb-vue-globale2.jpg" alt="Cablage DEL RGB - Vue globale" width="371" height="495" /></a><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/cablage-del-rgb-zoom.jpg" rel="lightbox[976]"><img class="alignnone size-medium wp-image-1020" title="Cablage DEL RGB - Zoom sur la DEL" src="http://innovelectronique.fr/wp-content/uploads/2012/05/cablage-del-rgb-zoom-300x154.jpg" alt="Cablage DEL RGB - Zoom sur la DEL" width="300" height="154" /></a></span></p>
<p style="text-align: left;"><span class="template-min-width">La face avant peut-être celle que l&#8217;on a vu précédemment en simplifié :</span></p>
<p style="text-align: left;"><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/face-avant-labview-nunchuck-del-rgb.png" rel="lightbox[976]"><img class="aligncenter size-full wp-image-1024" title="Face avant LabVIEW - Nunchuck - DEL RGB" src="http://innovelectronique.fr/wp-content/uploads/2012/05/face-avant-labview-nunchuck-del-rgb.png" alt="Face avant LabVIEW - Nunchuck - DEL RGB" width="643" height="347" /></a><span class="template-min-width"> Par contre le diagramme doit être modifié :</span></p>
<p style="text-align: left;"><span class="template-min-width"><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/diagramme-labview-nunchuck-del-rgb.png" rel="lightbox[976]"><img class="aligncenter size-full wp-image-1025" title="Diagramme LabVIEW - Nunchuck - DEL RGB" src="http://innovelectronique.fr/wp-content/uploads/2012/05/diagramme-labview-nunchuck-del-rgb.png" alt="Diagramme LabVIEW - Nunchuck - DEL RGB" width="1130" height="294" /></a>Les sous-VI nouveaux sont ceux fournis directement par la palette arduino ( sous VI : RGB Led configure et RGB Led write) et la conversion des trois valeurs RGB issues de la nunchuck en couleur (sous VI RGB en couleur). Cela fonctionne mais je suis relativement déçu de l&#8217;effet obtenu. En effet même avec une del &#8220;diffusée&#8221; le mélange des couleurs n&#8217;est pas correct, on voit encore trop les points lumineux de chaque del. D&#8217;autres part les variations sont trop faibles et surtout le point de repos de chaque axe de l&#8217;accéléromètre est trop élevé. Il faudrait ramener autour de 0 pour avoir de plus grande variation de l&#8217;intensité lumineuse. Si vous réalisez le montage vous verrez mieux de quoi je parle. </span></p>
<p style="text-align: left;"><span class="template-min-width">Pour tester de manière plus convaincante ce montage, remplacez les valeurs de l&#8217;accéléromètre par celle du joystick analogique&#8230;Le mieux est encore de faire un montage pour piloter deux moteurs en sens et en vitesse avec le joystick !</span></p>
<h1 style="text-align: left;"><span class="template-min-width">LIFA et le bus SPI : anneau de dels</span></h1>
<p style="text-align: left;"><span class="template-min-width">Parmi les VI que propose LIFA, nous n&#8217;avons pas encore testé le SPI (</span><span class="st"><em>Serial Peripheral Interface)</em></span><span class="template-min-width">. Ça tombe bien, j&#8217;avais réalisé un montage honteusement copié sur <a href="http://mayhewlabs.com/products/rotary-encoder-led-ring " target="_blank">http://mayhewlabs.com/products/rotary-encoder-led-ring </a>mais je ne l&#8217;avais jamais testé. En gros et sans s’occuper de l&#8217;encodeur il s&#8217;agit de piloter 16 dels avec le circuit spécialisé <a href="http://www.ti.com/product/tlc5925" target="_blank">TLC5925</a> de chez TI. On peut réaliser de beaux effet lumineux mais aussi montrer graphiquement l&#8217;évolution d&#8217;un encodeur (reportez-vous aux différentes vidéos du site officiel). Il s&#8217;agit juste d&#8217;envoyer les bonnes valeurs dans un registres à décalage 16 bits puis de valider le tout au bon moment ! Un chronogramme pour fixer les idées :</span></p>
<p style="text-align: left;"><span class="template-min-width"><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/chronogramme-tlc5925.png" rel="lightbox[976]"><img class="aligncenter size-full wp-image-1028" title="Chronogramme TLC5925" src="http://innovelectronique.fr/wp-content/uploads/2012/05/chronogramme-tlc5925.png" alt="Chronogramme TLC5925" width="456" height="382" /></a>Alors il nous faut une horloge (signal CLK ou SCK), une entrée de donnée coté TLC (SDI) donc sortie de données coté carte arduino (signal MOSI), un signal pour valider le verrou à l&#8217;instant opportun (signal LE actif à l&#8217;état haut, une sortie numérique sur la carte arduino). Le signal OE actif à l&#8217;état bas peut être directement câblé à la masse si vous souhaitez un éclairage maximal des dels ou à une sortie MLI de l&#8217;arduino pour régler l&#8217;intensité lumineuse. Donc il ne nous faut que 3 ou 4 fils pour piloter ce module.</span></p>
<p style="text-align: left;"><span class="template-min-width">Ce module ce présente de la manière suivante (schéma électrique, implantation, photographie) :</span></p>
<p style="text-align: center;"><span class="template-min-width"><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/schema-electrique-encodeur-lunmineux.png" rel="lightbox[976]"><img class="aligncenter size-medium wp-image-1030" title="Schéma électrique - Encodeur lumineux" src="http://innovelectronique.fr/wp-content/uploads/2012/05/schema-electrique-encodeur-lunmineux-300x240.png" alt="Schéma électrique - Encodeur lumineux" width="300" height="240" /></a><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/typon-implantation-encodeur-lunmineux.png" rel="lightbox[976]"><img class="aligncenter size-full wp-image-1031" title="Typon et implantation - Encodeur lunmineux" src="http://innovelectronique.fr/wp-content/uploads/2012/05/typon-implantation-encodeur-lunmineux.png" alt="Typon et implantation - Encodeur lunmineux" width="434" height="316" /></a><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/encodeur-lumineux-photo1.jpg" rel="lightbox[976]"><img class="alignnone size-medium wp-image-1032" title="Encodeur lumineux - Photo1" src="http://innovelectronique.fr/wp-content/uploads/2012/05/encodeur-lumineux-photo1-300x238.jpg" alt="Encodeur lumineux - Photo1" width="300" height="238" /></a> <a href="http://innovelectronique.fr/wp-content/uploads/2012/05/encodeur-lumineux-photo2.jpg" rel="lightbox[976]"><img class="alignnone size-medium wp-image-1033" title="Encodeur lumineux - Photo2" src="http://innovelectronique.fr/wp-content/uploads/2012/05/encodeur-lumineux-photo2-241x300.jpg" alt="Encodeur lumineux - Photo2" width="241" height="300" /></a></span></p>
<p style="text-align: left;"><span class="template-min-width">Pour ceux qui sont attentifs <img src='http://innovelectronique.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> il y a une petite différence entre les photos et le typon&#8230;j&#8217;ai fait disparaitre le petit régulateur de tension !</span></p>
<p style="text-align: left;"><span class="template-min-width">Sur ce module J1 est le connecteur principal. Les broches qui nous intéressent dans ce projet sont :</span></p>
<ul>
<li><span class="template-min-width">la broche 1 : la masse qu&#8217;il faut relier à une masse de l&#8217;arduino<br />
</span></li>
<li><span class="template-min-width">la broche 2 : l&#8217;alimentation en 5V qu&#8217;il faut relier au +5V de l&#8217;arduino</span></li>
<li><span class="template-min-width">la broche 6 : Latch Enable (LE) qu&#8217;il faut reliée à une sortie numérique de l&#8217;arduino : la broche 2 par exemple<br />
</span></li>
<li><span class="template-min-width">la broche 7 : l&#8217;horloge (SCK) qu&#8217;il faut reliée à la borne 13 de l&#8217;arduino<br />
</span></li>
<li><span class="template-min-width">la broche 8 : l&#8217;entrée de données (SDI) qu&#8217;il faut reliée à la sortie de données coté arduino broche 11</span></li>
<li><span class="template-min-width">la broche 9 : Output Enable peut être reliée soit à une sortie numérique de l&#8217;arduino pour allumer/éteindre les dels ou une sortie MLI de l&#8217;arduino (broche 3 par ex.) pour piloter l&#8217;intensité des dels ou relier plus simplement à la masse.</span></li>
</ul>
<h2>Premier test : animation de deux dels</h2>
<p>On se propose de réaliser un effet graphique avec cette platine : 2 dels opposées qui tournent dans un sens ou dans l&#8217;autre à une vitesse réglable par une glissière sur la face avant LabVIEW. On rajoutera aussi un potentiomètre sur la face avant pour régler l&#8217;intensité lumineuse des dels. Compte tenu de ce mini cahier des charges, on obtient le câblage suivant :</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/cablage-encodeur-lumineux.jpg" rel="lightbox[976]"><img class="aligncenter size-medium wp-image-1042" title="Cablage - Encodeur lumineux" src="http://innovelectronique.fr/wp-content/uploads/2012/05/cablage-encodeur-lumineux-300x170.jpg" alt="Cablage - Encodeur lumineux" width="300" height="170" /></a>La face avant peut se présenter ainsi :</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/face-avant-labview-encodeur-lumineux.png" rel="lightbox[976]"><img class="aligncenter size-full wp-image-1044" title="Face avant Labview - Encodeur lumineux" src="http://innovelectronique.fr/wp-content/uploads/2012/05/face-avant-labview-encodeur-lumineux.png" alt="Face avant Labview - Encodeur lumineux" width="456" height="452" /></a>Les deux tableaux contiennent des données non signées sur 8 bits (U8). Ce sont ces données qui seront envoyés sur le bus SPI. On doit piloter 16 sorties donc il nous faut assembler deux données 8 bits pour former une données 16 bits.</p>
<p>Le diagramme LabVIEW peut se présenter de la manière suivante (on verra sur un autre diagramme une méthode différente de traitement des données basée sur des entiers non signés codées sur 16 bits (U16).</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/diagramme-labview-encodeur-lumineux.png" rel="lightbox[976]"><img class="aligncenter size-full wp-image-1047" title="Diagramme Labview - Encodeur lumineux" src="http://innovelectronique.fr/wp-content/uploads/2012/05/diagramme-labview-encodeur-lumineux.png" alt="Diagramme Labview - Encodeur lumineux" width="862" height="444" /></a></p>
<p>Quelques explications sur ce diagramme :</p>
<ul>
<li>On initialise la communication avec l&#8217;arduino</li>
<li>la broche 2 de l&#8217;arduino est mise en sortie numérique. Cette broche est reliée à la broche LE (Latch Enable) du TLC. Une impulsion positive sur cette sortie valide le latch.</li>
<li>on initialise le bus SPI et on choisit l&#8217;ordre d&#8217;envoi des bits (ici les bits de poids fort en premier)</li>
<li>on lit la valeur du potentiomètre &#8220;luminosité des dels&#8221;. Cette valeur (moins 255) sert pour générer un signal MLI (par défaut sur la broche 3 de l&#8217;arduino) qui est relié à la broche OE (Output Enable) du TLC. On peut ainsi piloter l&#8217;intensité lumineuse des dels.</li>
<li>La glissière &#8220;Sens et vitesse de défilement&#8221; permet de choisir quel tableau va fournir les valeurs à envoyer. Si c&#8217;est positif le tableau &#8220;sens trigo&#8221; est utilisé sinon c&#8217;est le tableau &#8220;sens horaire&#8221;. La valeur fournie par la glissière sert aussi à la temporisation de la boucle infinie donc à la vitesse de &#8220;défilement&#8221; des dels.</li>
<li>Le sous VI &#8220;SPI Send Receive&#8221; reçoit en entrée un tableau 1D de U8. Nous construisons donc un tableau 1D qui contiendra deux valeurs de 8 bits et qui dépend du nombre de boucle modulo 8 (on doit envoyer 8 x 2 octets pour réaliser l&#8217;effet). Le mieux pour se rendre compte de comment fonctionne l&#8217;envoie des données, c&#8217;est de modifier les valeurs du tableau.</li>
<li>On verrouille les données dans le &#8220;latch&#8221; en créant une impulsion positive sur le broche 2 de l&#8217;arduino.</li>
<li>Une fois sorti de la boucle par le bouton STOP, on arrête le bus SPI, on ferme la communication avec l&#8217;arduino et on affiche les éventuelles erreurs.</li>
</ul>
<p style="text-align: center;">Voici le résultat :<object width="420" height="315" data="http://www.youtube.com/v/ypBwUyAa-PI?version=3&amp;hl=fr_FR&amp;rel=0" type="application/x-shockwave-flash"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/ypBwUyAa-PI?version=3&amp;hl=fr_FR&amp;rel=0" /><param name="allowfullscreen" value="true" /></object></p>
<h2>Deuxième test : Vu-mètre ou visualisation de la position d&#8217;un potentiomètre virtuel</h2>
<p>Dans cet exemple, on va utiliser une platine qui dispose de 8 dels vertes, 4 dels orange et 3 dels rouge soit un total de 15 dels qui forment l&#8217;anneau. La del 16 sera une del bleue qui peut servir de témoin d&#8217;appui par exemple. Le but de cet exercice est de visualiser sur les dels la position d&#8217;un potentiomètre virtuel sur une face avant d&#8217;un VI LabVIEW.</p>
<p>Le schéma de câblage est identique au précédent. Seule la platine a été changé. La face avant est très simple et peut se présenter de la manière suivante :</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/face-avant-labview-encodeur-lumineux-vumetre.png" rel="lightbox[976]"><img class="aligncenter size-full wp-image-1051" title="Face avant LabVIEW - Encodeur lumineux - VuMetre" src="http://innovelectronique.fr/wp-content/uploads/2012/05/face-avant-labview-encodeur-lumineux-vumetre.png" alt="Face avant LabVIEW - Encodeur lumineux - VuMetre" width="440" height="285" /></a>et le diagramme associé :</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/diagramme-labview-encodeur-lumineux-vumetre.png" rel="lightbox[976]"><img class="aligncenter size-full wp-image-1052" title="Diagramme LabVIEW - Encodeur lumineux - VuMetre" src="http://innovelectronique.fr/wp-content/uploads/2012/05/diagramme-labview-encodeur-lumineux-vumetre.png" alt="Diagramme LabVIEW - Encodeur lumineux - VuMetre" width="888" height="462" /></a></p>
<p>On retrouve l&#8217;initialisation de l&#8217;arduino et de la communication SPI. Sinon l&#8217;intérieur de la boucle infinie peut être expliqué comme suit :</p>
<ul>
<li>un tableau d&#8217;entiers non signés sur 16 bits (U16) est initialisé en dehors de la boucle. Il contient les 16 valeurs que l&#8217;on va &#8220;afficher&#8221; sur l&#8217;anneau de dels.</li>
<li>Le bouton rotatif renvoie un entier U8 compris entre 0 et 15. On affiche cette valeur sur le vu mètre de la face avant mais on s&#8217;en sert aussi d&#8217;indice pour extraire UNE  donnée (d’où la constante 1) d&#8217;un tableau (sous VI &#8220;Sous ensemble d&#8217;un tableau&#8221;).</li>
<li>Cette données est alors séparée en 8 bits de poids fort (ET logique avec 65280 et décalage de 8 bits vers la droite) et 8 bits de poids faible (ET logique avec 255)</li>
<li>le tout est ré-assemblé dans un tableau pour être écrit par le sous VI d&#8217;écriture sur le bus SPI.</li>
</ul>
<p style="text-align: center;">Voici ce que ça donne :<br />
<object width="420" height="315" data="http://www.youtube.com/v/rXPqge9Vhus?version=3&amp;hl=fr_FR&amp;rel=0" type="application/x-shockwave-flash"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/rXPqge9Vhus?version=3&amp;hl=fr_FR&amp;rel=0" /><param name="allowfullscreen" value="true" /></object></p>
<h1 style="text-align: left;">Dialogue par ethernet avec un arduino et son ethershield</h1>
<p style="text-align: left;">Il n&#8217;est plus question ici de travailler avec LIFA mais directement avec l&#8217;arduino et son shield ethernet. On se propose de réaliser une face avant qui va permettre de piloter une DEL et récupérer la température le tout par une liaison ethernet (voire même à travers Internet).</p>
<p style="text-align: left;">On utilisera un capteur de température LM35 connecté sur l&#8217;entrée A0 et une del sur la sortie 3. Comme le lm35 a une pente de 10mV/°C et 0V à 0°C, la variation de température dans une pièce entrainera une variation de quelques dizaines de mV. On va donc augmenter la précision de la mesure analogique en activant la référence de tension interne de 1,1V de l&#8217;arduino. Le convertisseur analogique-numérique est sur 10 bits, on obtiendra donc un quantum de 1,1V / 1024 = 1mV (1,0742mV précisément). On pourra donc mesurer des température de 0°C à +110°C ce qui est amplement suffisant. Le câblage se présente de la manière suivante :</p>
<p style="text-align: left;"><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/cablage-ethershield-del-capt-temp.png" rel="lightbox[976]"><img class="aligncenter size-medium wp-image-1072" title="Cablage Ethershield - DEL - Capteur de température" src="http://innovelectronique.fr/wp-content/uploads/2012/05/cablage-ethershield-del-capt-temp-210x300.png" alt="Cablage Ethershield - DEL - Capteur de température" width="210" height="300" /></a></p>
<p style="text-align: left;">Le code arduino est présenté ci-dessous. Il se base totalement sur l&#8217;exemple &#8220;Web Serveur&#8221; qu&#8217;il suffit alors de simplifier. Le code est commenté donc à lire attentivement !</p>
<pre style="text-align: left;">/*
  Serveur TCP
  O. DARTOIS, le 23/05/12
  Source directement basée sur l'exemple Web Server
 */

#include &lt;SPI.h&gt;
#include &lt;Ethernet.h&gt;

// Adresses MAC et IP à changer suivant vos besoins
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1, 177);

// Initialisation de la librairie ethernet
// et création d'un objet "Server" qui va accepter
// les connexions extérieures à l'adresse IP defini plus
// haut et sur le port indiqué (ici 8000)
EthernetServer server(8000);

void setup()
{
  Ethernet.begin(mac, ip);      // Initialisation de la pile TCP/IP
  server.begin();               // Démarrage du serveur
  pinMode(3,OUTPUT);            // Broche 2 en sortie (DEL)
  digitalWrite(3,LOW);          // Broche 2 à 0 =&gt; DEL eteinte
  analogReference(INTERNAL);    // Référence du CAN à 1,1V
}

void loop()
{
  // Attente des connexions et création d'un objet client s'il y a lieu
  EthernetClient client = server.available();
  if (client) {                                // Un client existe
    while (client.connected()) {               // il est connecté
      if (client.available()) {                // et il a envoyé des caractères
        char c = client.read();                // on lit le caractère reçu
        if (c == 'A') digitalWrite(3,HIGH);    // si c'est 'A' on allume la DEL
        if (c == 'a') digitalWrite(3,LOW);     // si c'est 'a' on éteint la DEL
      }
      // on renvoie au client une chaine de caractère qui représente le résultat de
      // la conversion AN (par ex: '236') suivi des caractères CR+LF
      server.println(analogRead(0));
      delay(100);                              // On ralenti un peu le flot de données
    }
    client.stop();                             // Fermeture de la connexion
  }
}</pre>
<p style="text-align: left;">Une fois ce code compilé et implanté dans l&#8217;arduino avec son ethershield, nous allons réaliser une face avant sous LabVIEW pour piloter ce montage.</p>
<p style="text-align: left;"><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/exemple8-face-avant-labview-ethershield.png" rel="lightbox[976]"><img class="aligncenter size-full wp-image-1073" title="Face avant LabVIEW - Ethershield" src="http://innovelectronique.fr/wp-content/uploads/2012/05/exemple8-face-avant-labview-ethershield.png" alt="Face avant LabVIEW - Ethershield" width="464" height="162" /></a>Le diagramme LabVIEW se présente de la manière suivante :</p>
<p style="text-align: left;"><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/exemple8-diagramme-labview-ethershield.png" rel="lightbox[976]"><img class="aligncenter size-full wp-image-1074" title="Diagramme LabVIEW - Ethershield" src="http://innovelectronique.fr/wp-content/uploads/2012/05/exemple8-diagramme-labview-ethershield.png" alt="Diagramme LabVIEW - Ethershield" width="669" height="266" /></a></p>
<p style="text-align: left;">Comme vous le remarquez, le diagramme est très simple&#8230;c&#8217;est grâce aux sous VI spécialisés de LabVIEW que l&#8217;on arrive à un tel niveau de simplicité. Un peu d&#8217;explication tout de même : le serveur du coté arduino implémente une pile TCP/IP simplifiée mais suffisante pour dialoguer sur un réseau de type ethernet. Du fait que l&#8217;on utilise IP et des adresses IP en version 4 vous pouvez réaliser du routage, ce qui veut dire que vous pouvez mettre un tel montage derrière votre box à la maison et y accéder depuis n&#8217;importe où sur Internet. Le protocole de transport utilisé ici est TCP, c&#8217;est un protocole de transport de données en mode connecté et fiable. Ce qui veut dire que normalement vos données arriveront toujours à bon port ! Les pertes de paquets seront gérés par TCP et pas par vos soins. Comme on le voit, on utilise TCP comme protocole de transport et pour faire de l&#8217;échange de données on travaille avec des &#8220;sockets&#8221; réseaux. Tout cela sera masqué grâce aux VI disponibles dans la palette &#8220;Communications de données&#8221; puis &#8220;Protocoles&#8221; puis &#8220;TCP&#8221;. Pour dialoguer avec l&#8217;arduino, il faut suivre la démarche suivante:</p>
<ol>
<li>Mettre un VI &#8220;TCP Ouvrir une connexion&#8221; puis le configurer. Dans notre cas, l&#8217;adresse IP de l&#8217;arduino est 192.168.1.177 et son port d&#8217;écoute est le 8000. Il faudra donc que votre PC soit dans le même réseau que votre arduino. Par exemple ici, l&#8217;adresse ip de votre portable pourrai être 192.168.1.15.</li>
<li>Une fois la connexion ouverte, vous pouvez envoyer des données avec le VI &#8220;TCP écrire&#8221;. Il prend en entrée des caractères ou chaines de caractères. Ici suivant l&#8217;état du bouton &#8220;Commande DEL&#8221;, on va envoyer le caractère &#8216;A&#8217; (pour allumer la DEL, voir le code arduino) ou le caractère &#8216;a&#8217;.</li>
<li>Pour réceptionner des données, vous utiliserez le VI &#8220;TCP Lire&#8221; : celui-ci réclame un &#8220;buffer&#8221; d&#8217;octets pour stocker les données reçues (ici j&#8217;ai mis 10 même si l&#8217;on va recevoir moins de caractères). Par contre ce qui est important c&#8217;est le &#8220;mode&#8221; de fonctionnement de ce VI. Ici il est en mode &#8220;CRLF&#8221; : c&#8217;est à dire qu&#8217;il attend soit que le buffer soit plein pour mettre sur sa sortie les caractères reçues, soit lorsqu&#8217;il reçoit &#8220;CRLF&#8221;, il met sur sa sortie les caractères reçues SANS CRLF. Vous comprenez peut-être mieux pourquoi c&#8217;est la méthode &#8220;println&#8221; et pas &#8220;print&#8221; qui a été employée (println rajoute automatiquement CRLF après les caractères qu&#8217;on lui a passé). La chaine de caractère reçue est affichée de manière &#8220;brute&#8221; dans l&#8217;indicateur &#8220;données reçues&#8221;. On veut afficher la température sur un vumètre mais il faut transformer le résultat de la conversion AN de l&#8217;arduino que l&#8217;on a reçu en un nombre. C&#8217;est le rôle du sous VI &#8220;Chaine décimale en nombre&#8221; et de la multiplication par le coefficient pour retrouver la température ( quantum = 1,074.10-3 et sensibilité du capteur de 10mV/°C). Enfin on affiche la température en °C sur le vumètre.</li>
<li>Lorsqu&#8217;on arrête la boucle infinie avec le bouton stop, il faut fermer proprement la connexion TCP avec le VI &#8220;TCP Fermer la connexion&#8221;. On affiche alors les éventuelles erreurs.</li>
</ol>
<p>Testez l&#8217;ensemble et vous verrez que c&#8217;est fonctionnel. Modifiez le diagramme et le code arduino pour piloter la DEL en MLI par exemple&#8230;</p>
<h1>Conclusion</h1>
<p>Les deux articles sur LIFA et LabVIEW ne présentent pas de projets complets mais ils fournissent toutes les base pour débuter ceux-ci. Ces articles ont surtout comme but de vous initier à LIFA et de vous faire gagner du temps. Bon courage pour vos futures réalisations.</p>
<div class="attachments"><dl class="attachments attachments-large"><dt class="icon"><a title="Exemples LIFA - 2ème partie" href="?aid=1078&pid=976&sa=0"><img src="http://innovelectronique.fr/wp-content/plugins/eg-attachments/images/zip.png" width="48" height="48" alt="" /></a></dt><dd class="caption"><strong>Titre: </strong><a title="Exemples LIFA - 2ème partie" href="?aid=1078&pid=976&sa=0">Exemples LIFA - 2ème partie</a><br /><strong>Fichier: </strong>exemples-lifa-2eme-partie.zip<br /><strong>Taille: </strong>6 Mo</dd></dl></div>
]]></content:encoded>
			<wfw:commentRss>http://innovelectronique.fr/2012/05/23/aduino-et-lifa-episode-2/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Arduino et LIFA (LabVIEW Interface For Arduino)</title>
		<link>http://innovelectronique.fr/2012/05/04/arduino-et-lifa-labview-interface-for-arduino/</link>
		<comments>http://innovelectronique.fr/2012/05/04/arduino-et-lifa-labview-interface-for-arduino/#comments</comments>
		<pubDate>Fri, 04 May 2012 11:19:52 +0000</pubDate>
		<dc:creator>Olivier</dc:creator>
		
		<category><![CDATA[Arduino]]></category>

		<category><![CDATA[LabVIEW]]></category>

		<category><![CDATA[lifa]]></category>

		<guid isPermaLink="false">http://innovelectronique.fr/?p=891</guid>
		<description><![CDATA[LIFA signifie LabVIEW Interface For Arduino. C&#8217;est une extension de LabVIEW (compatible à partir de la version 2009) qui permet de piloter une carte compatible Arduino depuis LabVIEW. Dans cet article je vous propose d&#8217;installer et de découvrir LIFA car pour l&#8217;instant je n&#8217;ai pas trouvé beaucoup de ressources sur Internet à ce sujet. Attention [...]]]></description>
			<content:encoded><![CDATA[<p>LIFA signifie LabVIEW Interface For Arduino. C&#8217;est une extension de LabVIEW (compatible à partir de la version 2009) qui permet de piloter une carte compatible Arduino depuis LabVIEW. Dans cet article je vous propose d&#8217;installer et de découvrir LIFA car pour l&#8217;instant je n&#8217;ai pas trouvé beaucoup de ressources sur Internet à ce sujet. Attention cet article n&#8217;est pas une présentation de LabVIEW ou d&#8217;Arduino (vous avez plein de ressources pour cela sur le web) mais une utilisation conjointe de LabVIEW et Arduino. Cependant les VI (Virtual Instrument) de tests sont très simples et il n&#8217;y a <strong>PAS</strong> de programmation C/C++ du coté Arduino.<br />
Note : Il existe un lien d'impression intégré dans ce post, veuillez svp visiter ce post pour l'imprimer.<br />
<span id="more-891"></span></p>
<h1>Matériels et logiciels nécessaire</h1>
<p><em>Matériels :</em></p>
<ul>
<li>un ordinateur de 	type compatible PC avec Microsoft Windows7 ou WindowsXP (je n&#8217;ai pas testé sous GNU/Linux mais ça doit être fonctionnel)</li>
<li>une carte compatible 	Arduino : dans notre cas une carte <a href="http://arduino.cc/en/Main/ArduinoBoardUno" target="_blank">arduino UNO</a></li>
<li>un shield de	prototypage ou une plaquette d&#8217;essai sans soudure (<a href="http://www.lextronic.fr/P4130-kit-arduino-protoshield.html">http://www.lextronic.fr/P4130-kit-arduino-protoshield.html</a> à 15€ par exemple)</li>
<li>divers shields en fonction des utilisations avancées : ethershield, Xbee Shield, etc&#8230; (facultatif)</li>
<li>quelques composants de bases (résistance, dels, &#8230;) et des capteurs (température, humidité aussi bien en I2C qu&#8217;en analogique)</li>
</ul>
<p><em>Logiciels :</em></p>
<ul>
<li>L&#8217;environnement de développement d&#8217;arduino ( <a href="http://arduino.cc/en/Main/Software">http://arduino.cc/en/Main/Software</a> )</li>
<li>NI LabVIEW (version d&#8217;évaluation disponible sur <a href="http://www.ni.com/trylabview/" target="_blank">http://www.ni.com/trylabview/</a>) avec les pilotes VISA qui gèrent la voie série ( <a href="http://joule.ni.com/nidu/cds/view/p/id/2251/lang/en" target="_blank">http://joule.ni.com/nidu/cds/view/p/id/2251/lang/en</a> )</li>
<li>VI Packet Manager : logiciel qui gère l&#8217;installation des extensions de LabVIEW disponible sur le site d&#8217;un partenaire de National Instrument ( 	<a href="http://jki.net/vipm/download">http://jki.net/vipm/download )<br />
</a></li>
<li>Le paquet LIFA décrit sur <a href="https://decibel.ni.com/content/groups/labview-interface-for-arduino">https://decibel.ni.com/content/groups/labview-interface-for-arduino</a> et son installation sur <a href="https://decibel.ni.com/content/docs/DOC-15971">https://decibel.ni.com/content/docs/DOC-15971</a></li>
<li>Le logiciel Fritzing 	pour dessiner les schémas de câblage ( <a href="http://fritzing.org/welcome/">http://fritzing.org/welcome/</a> )</li>
</ul>
<p>Téléchargez le tout puis installez dans l&#8217;ordre ci-dessus. La plupart du temps ça se résume à &#8220;suivant&#8221;, &#8220;suivant&#8221;,&#8230;&#8221;terminer&#8221;. La version de LIFA utilisée ici est 2.XX.</p>
<h1>Installation du firmware LIFA sur la carte Arduino</h1>
<p>Le firmware LIFA est disponible après installation dans le répertoire &#8220;C:\Program Files\National Instruments\LabVIEW 2011\vi.lib\LabVIEW Interface for Arduino\Firmware\LVIFA_Base&#8221; (du moins sur mon installation). Vous trouverez alors plusieurs fichiers dont les trois principaux sont :</p>
<ul>
<li>le sketch &#8220;LVIFA_Base.ino&#8221; : c&#8217;est ce sketch que vous compilerez et transfèrerez dans la platine Arduino</li>
<li>le sketch &#8220;LabVIEWInterface.ino&#8221; : il contient l&#8217;implémentation de toutes les fonctions utilisées par LabVIEW pour dialoguer avec la carte Arduino</li>
<li>le fichier d&#8217;inclusion &#8220;LabVIEWInterface.h&#8221; : ce fichier d&#8217;en-tête est particulièrement intéressant puisque c&#8217;est lui qui contient les &#8220;define&#8221; que vous pouvez modifier pour adapter LIFA. Trois &#8220;define&#8221; en particulier seront à modifier suivant vos projets :
<ul>
<li>DEFAULTBAUDRATE : la vitesse de transmission de la voie série. En effet LabVIEW communique avec la carte Arduino par une voie série, par défaut la vitesse est de 115200 bauds/s mais si vous utilisez une liaison série sans fil (XBee ou Bluetooth), il faudra sans doute baisser la vitesse de transmission pour fiabiliser le dialogue</li>
<li>COMMANDLENGHT : le nombre d&#8217;octets transmis en une seule fois par une commande LabVIEW. Par défaut cette valeur est à 15. Si c&#8217;est insuffisant pour votre projet il faut le changer ici et sur le diagramme LabVIEW</li>
<li>STEPPER_SUPPORT : permet ou non d&#8217;intégrer le support des moteurs pas à pas dans le firmware, cela permet de diminuer la taille du fichier hex</li>
</ul>
</li>
<li>Les autres fichiers sont pour la gestion des moteurs pas à pas.</li>
</ul>
<p>Chargez donc &#8220;LVIFA_Base.ino&#8221; dans l&#8217;environnement Arduino, compilez-le puis programmez votre carte Arduino.</p>
<p>Vous disposez normalement maintenant d&#8217;une Arduino prête à fonctionner avec LabVIEW.</p>
<p><em>Remarque</em> : L&#8217;extension &#8220;ino&#8221; est la nouvelle extension pour les &#8220;sketches&#8221; arduino depuis la version 1.00, avant l&#8217;extension était &#8220;pde&#8221;.</p>
<h1>Premier exemple : Allumer une diode depuis LabVIEW et lire l&#8217;état d&#8217;une entrée</h1>
<p>On commence toujours par une del <img src='http://innovelectronique.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> donc on échappe pas à la tradition ! Le câblage sur la plaquette d&#8217;essai peut se présenter de la manière suivante (le dessin est réalisé avec le logiciel Fritzing) :</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/exemple1-del.png" rel="lightbox[891]"><img class="aligncenter size-thumbnail wp-image-899" title="Cablage Exemple1 DEL" src="http://innovelectronique.fr/wp-content/uploads/2012/05/exemple1-del-150x150.png" alt="Cablage Exemple1 DEL" width="150" height="150" /></a></p>
<p>Lancez LabVIEW, puis réalisez la face avant suivante:</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/faceavant-exemple1-del.png" rel="lightbox[891]"><img class="aligncenter size-full wp-image-903" title="Face avant Exemple1 DEL" src="http://innovelectronique.fr/wp-content/uploads/2012/05/faceavant-exemple1-del.png" alt="Face avant Exemple1 DEL" width="104" height="268" /></a></p>
<p>Lorsque vous passez sur le diagramme, une nouvel palette dédié à Arduino doit apparaitre :</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/palette-arduino-diagramme-labview.png" rel="lightbox[891]"><img class="aligncenter size-full wp-image-902" title="Palette arduino diagramme labview" src="http://innovelectronique.fr/wp-content/uploads/2012/05/palette-arduino-diagramme-labview.png" alt="Palette arduino diagramme labview" width="241" height="67" /></a></p>
<p>Réalisons le diagramme suivant:</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/diagramme-exemple1-del.png" rel="lightbox[891]"><img class="aligncenter size-full wp-image-904" title="Diagramme Exemple1-DEL" src="http://innovelectronique.fr/wp-content/uploads/2012/05/diagramme-exemple1-del.png" alt="Diagramme Exemple1-DEL" width="664" height="236" /></a></p>
<p>Les applications LabVIEW utilisant LIFA sont toutes construites sur le même modèle:</p>
<ol>
<li><strong>Établir la connexion avec la platine Arduino à l&#8217;aide du sous VI &#8220;INIT&#8221;</strong>. Celui-ci dispose de nombreuses entrées pour le configurer. Je vous conseille de créer des constantes pour ces entrées afin d&#8217;observer les différents choix possibles. La création d&#8217;une constante se fait en cliquant avec le bouton droit sur une des entrées puis choisir &#8220;Créer&#8221;, &#8220;Constante&#8221;. Si vous souhaitez modifier ces paramètres sur la face avant créez des indicateurs. Tout d&#8217;abord choisir le port COM qui a été créé lors de la première connexion de l&#8217;arduino (ici COM19). Choisir la vitesse, elle doit correspondre avec celle défini dans &#8220;LabVIEWInterface.h&#8221; (ici 115200 qui est la valeur par défaut), ensuite le choix de la carte Arduino (par défaut UNO). Les deux derniers paramètres sont laissés tels quels. En sortie vous obtenez la &#8220;ressource&#8221; initialisée (trait épais rose) qui sera utilisée par tous les sous VI arduino et de quoi gérer les erreurs (trait épais jaune).</li>
<li><strong>Initialiser les E/S</strong>. Si vous utilisez des E/S numériques, utilisez le sous VI &#8220;Set Digital Pin Mode&#8221;. Il faut préciser alors la broche concernée ( ici 8 ) et son sens ( ici output : on pilote une del ).</li>
<li><strong>Boucle infinie de gestion des évènements</strong>. Comme sur micro-controlleur vous avez une boucle infinie qui gère les évènements (on ne considère pas ici les interruptions). Cette boucle infinie est ici représentée par une boucle &#8220;while&#8221; (flèche épaisse grise qui reboucle sur elle-même). Pour arrêter cette boucle, créez un indicateur sur le terminal de répétition de la boucle (ici point rouge). On doit allumer la DEL en fonction de l&#8217;état de l&#8217;interrupteur à levier de la face avant (Commande DEL). On transforme tout d&#8217;abord l&#8217;information booléenne (true, false) en nombre (0,1) puis on envoie cette information à l&#8217;entrée du sous VI &#8220;Digital Write Pin&#8221;. La broche de sortie est bien sur toujours la 8. Si vous regardez bien le diagramme, un petit point rouge à l&#8217;entrée du VI &#8220;Digital Write Pin&#8221; est présent. Ce qui indique que les formats utilisés ne sont pas totalement compatibles (ici la conversion booléenne se fait vers un entier signé codée sur 16 bits, or le VI attend une valeur non signé sur 8 bits).</li>
<li><strong>Fermeture de la connexion avec la carte Arduino à l&#8217;aide du sous VI &#8220;CLOSE&#8221;</strong>. On libère ainsi proprement la mémoire et le port COM. Éventuellement câblez un gestionnaire d&#8217;erreurs simple.</li>
</ol>
<p>Testez votre programme, lors de la manipulation de l&#8217;interrupteur de la face avant la diode doit réagir en conséquence. Vous savez donc piloter en tout ou rien des sorties. A titre d&#8217;exercice, modifiez le câblage, la face avant et le diagramme pour lire et afficher l&#8217;état d&#8217;un interrupteur&#8230;..</p>
<p>La correction est donnée ci-dessous :</p>
<p>Le câblage :<a href="http://innovelectronique.fr/wp-content/uploads/2012/05/exemple1-del-inter.png" rel="lightbox[891]"><img class="aligncenter size-thumbnail wp-image-917" title="Exemple 1 : DEL et Interrupteur" src="http://innovelectronique.fr/wp-content/uploads/2012/05/exemple1-del-inter-150x150.png" alt="Exemple 1 : DEL et Interrupteur" width="150" height="150" /></a>La face avant dans LabVIEW:<a href="http://innovelectronique.fr/wp-content/uploads/2012/05/faceavant-exemple1-del-inter.png" rel="lightbox[891]"><img class="aligncenter size-full wp-image-918" title="Face avant dans LabVIEW - Exemple 1 DEL et Inter" src="http://innovelectronique.fr/wp-content/uploads/2012/05/faceavant-exemple1-del-inter.png" alt="Face avant dans LabVIEW - Exemple 1 DEL et Inter" width="283" height="264" /></a>Le diagramme :<a href="http://innovelectronique.fr/wp-content/uploads/2012/05/diagramme-exemple1-del-inter.png" rel="lightbox[891]"><img class="aligncenter size-full wp-image-919" title="Diagramme LabVIEW - Exemple 1 : DEL et Inter" src="http://innovelectronique.fr/wp-content/uploads/2012/05/diagramme-exemple1-del-inter.png" alt="Diagramme LabVIEW - Exemple 1 : DEL et Inter" width="715" height="248" /></a></p>
<p><em>Remarque</em>: Le microcontrolleur Atmel présent sur la carte Arduino possède des résistance de pull-up interne activable individuellement. Vous pouvez donc vous passez de la résistance de 10K sur le schéma de câblage à condition de modifier le &#8220;sketch&#8221; de LIFA dans la fonction setup. Lire cet article : <a href="http://arduino.cc/fr/Main/ApprendreBrochesEntreeSortie" target="_blank">http://arduino.cc/fr/Main/ApprendreBrochesEntreeSortie</a></p>
<p><em>Remarque</em>: Si vous avez plusieurs broches à initialiser en entrée ou en sortie, le faire dans une boucle sous LabVIEW.</p>
<h1>Deuxième exemple : Lire une tension analogique</h1>
<p>Nous allons lire la tension issu d&#8217;un capteur de température analogique (LM35 : datasheet <a href="http://www.ti.com/product/lm35" target="_blank">ici</a>) et l&#8217;afficher sous LabVIEW. Ce capteur donne 0V à 0°C et à une pente de +10mV/°C. Ce qui fait par exemple à 25°C : 250mV. La variation de tension n&#8217;est pas importante et nous choisissons de ne pas amplifier cette tension pour garder un schéma de câblage simple. Le convertisseur analogique numérique de l&#8217;Atmel est un 10bits. La plage de numérisation est de base entre 0V et +Vcc = 5V. Le quantum fait donc 5/2^10 = 4,88mV. On réalise le câblage suivant:</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/exemple2-temp.png" rel="lightbox[891]"><img class="aligncenter size-thumbnail wp-image-923" title="Exemple 2 - Capteur de température analogique" src="http://innovelectronique.fr/wp-content/uploads/2012/05/exemple2-temp-150x150.png" alt="Exemple 2 - Capteur de température analogique" width="150" height="150" /></a>La face avant sous LabVIEW peut se présenter de la manière suivante:</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/exemple2-temp-face-avant-labview.png" rel="lightbox[891]"><img class="aligncenter size-full wp-image-925" title="Exemple 2 - Capteur de température analogique - Face avant LabVIEW" src="http://innovelectronique.fr/wp-content/uploads/2012/05/exemple2-temp-face-avant-labview.png" alt="Exemple 2 - Capteur de température analogique - Face avant LabVIEW" width="594" height="298" /></a></p>
<p>Le diagramme se présente de la manière suivante :</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/exemple2-temp-diagramme-labview.png" rel="lightbox[891]"><img class="aligncenter size-full wp-image-926" title="Exemple 2 - Capteur de température analogique - Diagramme LabVIEW" src="http://innovelectronique.fr/wp-content/uploads/2012/05/exemple2-temp-diagramme-labview.png" alt="Exemple 2 - Capteur de température analogique - Diagramme LabVIEW" width="619" height="241" /></a><em>Remarque</em> : la sortie du sous VI &#8220;Analog Read Pin&#8221; donne une tension et pas un nombre compris entre 0 et 1023 !</p>
<h1>Troisième exemple : Moteur CC commandé en sens et en vitesse</h1>
<p>Nous allons utiliser un circuit intégré qui permet de piloter deux moteurs CC : le L293D (datasheet <a href="http://www.ti.com/lit/ds/symlink/l293d.pdf" target="_blank">ici</a>). Ce circuit est relativement facile à mettre en œuvre et comme nous allons piloter qu&#8217;un seul moteur cela simplifie encore l&#8217;ensemble. Notez qu&#8217;il existe des shields pour piloter des moteurs CC (par ex : <a href="http://www.lextronic.fr/P5073-platine-de-commande-de-moteurs-dc.html" target="_blank">http://www.lextronic.fr/P5073-platine-de-commande-de-moteurs-dc.html</a>). La broche 1 (EN1) permet d&#8217;activer le premier pont en H, si l&#8217;on connecte cette broche à une broche de l&#8217;arduino qui fourni un signal MLI alors on pourra faire varier la vitesse du moteur. Les broches 2 (IN1) et 7 (IN2) permettent de fixer le sens de rotation du moteur ou encore de le freiner. Les broches 3 (OUT1) et 6 (OUT2) sont les broches de sorties de puissance vers le moteur. La broche 16 (VSS) reçoit une alimentation 5V issu de la carte arduino. La broche 8 (VS) est connecté au +9V d&#8217;une pile pour assurer l&#8217;alimentation en puissance du moteur. Enfin les broches 4,5,12, 13 sont reliées aux masses (GND de l&#8217;arduino et pôle négatif de la pile). On obtient donc le schéma de câblage suivant :</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/exemple3-moteur.png" rel="lightbox[891]"><img class="aligncenter size-thumbnail wp-image-931" title="Exemple 3 - Pilotage n MLI d'un moteur CC" src="http://innovelectronique.fr/wp-content/uploads/2012/05/exemple3-moteur-150x150.png" alt="Exemple 3 - Pilotage n MLI d'un moteur CC" width="150" height="150" /></a>Les broches 7 et 8 de l&#8217;arduino devront donc être en mode &#8220;digital&#8221; pour piloter le sens du moteur, la broche 11 en mode MLI (remarque: seul les broches avec une tilde peuvent être mises en mode MLI matériel : 6 broches en tout sur une arduino UNO). Le sens de rotation du moteur suit le tableau suivant:</p>
<p align="center">
<table style="text-align: center;" border="1" cellspacing="0" cellpadding="4">
<tbody>
<tr valign="top">
<td width="25%"><span style="color: black;"><strong>Enable 1 (EN1)<br />
</strong></span></td>
<td width="25%"><span style="color: black;"><strong>Input 1 (IN1)<br />
</strong></span></td>
<td width="25%"><span style="color: black;"><strong>Input 2 (IN 2)<br />
</strong></span></td>
<td width="25%"><span style="color: black;"><strong>Fonction</strong></span></td>
</tr>
<tr valign="top">
<td width="25%" bgcolor="#e6e6ff">High</td>
<td width="25%" bgcolor="#e6e6ff">Low</td>
<td width="25%" bgcolor="#e6e6ff">High</td>
<td width="25%" bgcolor="#e6e6ff">Tourne dans le sens horaire<strong></strong></td>
</tr>
<tr valign="top">
<td width="25%">High</td>
<td width="25%">High</td>
<td width="25%">Low</td>
<td width="25%">tourne dans le sens trigonométrique<strong></strong></td>
</tr>
<tr valign="top">
<td width="25%" bgcolor="#e6e6ff">High</td>
<td width="25%" bgcolor="#e6e6ff">Low</td>
<td width="25%" bgcolor="#e6e6ff">Low</td>
<td width="25%" bgcolor="#e6e6ff">Stop</td>
</tr>
<tr valign="top">
<td width="25%">High</td>
<td width="25%">High</td>
<td width="25%">High</td>
<td width="25%">Stop</td>
</tr>
<tr valign="top">
<td width="25%" bgcolor="#e6e6ff">Low</td>
<td width="25%" bgcolor="#e6e6ff">Non applicable</td>
<td width="25%" bgcolor="#e6e6ff">Non applicable</td>
<td width="25%" bgcolor="#e6e6ff">Stop</td>
</tr>
</tbody>
</table>
<p>La face avant de cette exemple sera très simple (un potentiomètre unique qui évolue de -100% à +100%, le signe permet de fixer le sens de rotation) :</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/exemple3-moteur-face-avant-labview.png" rel="lightbox[891]"><img class="aligncenter size-full wp-image-935" title="Exemple 3 - Commande Moteur CC - Face avant LabVIEW" src="http://innovelectronique.fr/wp-content/uploads/2012/05/exemple3-moteur-face-avant-labview.png" alt="Exemple 3 - Commande Moteur CC - Face avant LabVIEW" width="413" height="311" /></a>Le programme LabVIEW peut se présenter de la manière suivante (la seule partie qui varie d&#8217;une capture à l&#8217;autre, c&#8217;est l&#8217;intérieur de la boite de test : Vrai et Faux :</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/exemple3-moteur-diagramme-labview-cas-vrai.png" rel="lightbox[891]"><img class="aligncenter size-full wp-image-936" title="Exemple 3 - Commande moteur CC - Diagramme LabVIEW - Cas vrai" src="http://innovelectronique.fr/wp-content/uploads/2012/05/exemple3-moteur-diagramme-labview-cas-vrai.png" alt="Exemple 3 - Commande moteur CC - Diagramme LabVIEW - Cas vrai" width="937" height="285" /></a><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/exemple3-moteur-diagramme-labview-cas-faux.png" rel="lightbox[891]"><img class="aligncenter size-full wp-image-938" title="Exemple 3 - Commande moteur CC - Diagramme LabVIEW - Cas faux" src="http://innovelectronique.fr/wp-content/uploads/2012/05/exemple3-moteur-diagramme-labview-cas-faux.png" alt="Exemple 3 - Commande moteur CC - Diagramme LabVIEW - Cas faux" width="936" height="290" /></a>Câblez et testez : le moteur doit varier en vitesse et en sens. A l&#8217;oscilloscope la fréquence de la MLI est de 400Hz. Cette fréquence n&#8217;est pas réglable par l&#8217;intermédiaire d&#8217;un VI.</p>
<h1>Quatrième exemple : Capteur de température DS1621 sur bus I2C</h1>
<p>Le DS1621 est un capteur de température relativement répandu (datasheet <a href="http://datasheets.maxim-ic.com/en/ds/DS1621.pdf" target="_blank">ici</a>). Je ne vais pas détailler ici la documentation, on va juste préciser les commandes à envoyer au DS1621 pour l&#8217;initialiser et faire une lecture simple de température. La broche 1 est SDA, la 2 est SCL : signaux du bus I2C. La broche 3 (Tout) ne sera pas utilisée dans notre application. Les broches 7 (A0), 6 (A1) et 5 (A0) sont reliés à la masse pour fixer l&#8217;adresse I2C de ce capteur. La broche 4 est la masse et la broche 8 +Vcc (ici 5V).</p>
<p>La séquence d&#8217;initialisation est la suivante (broches A0, A1 et A2 reliées à la masse) :</p>
<ol>
<li>Condition de départ (start)</li>
<li>Écrire 0&#215;90 : on sélectionne le boitier à l&#8217;adresse A2A1A0 = 000 en écriture</li>
<li>Écrire 0xAC : on écrit dans le registre de configuration</li>
<li>Écrire 0&#215;00 : conversion de température en continu</li>
<li>Condition d&#8217;arrêt (stop)</li>
<li>Attendre 20ms : écriture en eeprom de la configuration précédente</li>
<li>Condition de départ (start)</li>
<li>Écrire 0&#215;90 : on sélectionne le boitier à l&#8217;adresse A2A1A0 = 000 en écriture</li>
<li>Écrire 0xEE : lancement de la conversion en continu de la température</li>
<li>Condition d&#8217;arrêt (stop)</li>
</ol>
<p>La séquence suivante permet la lecture de la température :</p>
<ol>
<li>Condition de départ (start)</li>
<li>Ecrire 0&#215;90 : on sélectionne le boitier à l&#8217;adresse A2A1A0 = 000 en écriture</li>
<li>Ecrire 0xAA : demande de lecture de la dernière température échantillonnée</li>
<li>Condition de départ (restart)</li>
<li>Ecrire 0&#215;91 : on sélectionne le boitier à l&#8217;adresse A2A1A0 = 000 en<strong> lecture</strong></li>
<li>Lire les 8 bits de poids fort de la température</li>
<li>Lire les 8 bits de poids faible de la température et faire un NACK !!</li>
<li>Condition d&#8217;arrêt (stop)</li>
</ol>
<p>Vous remarquez que ce n&#8217;est pas très simple mais on va essayer d&#8217;implémenter le tout en LabVIEW avec les fonctions Arduino. Suivant la version de la carte arduino UNO que vous possédez les broches SCL et SDA ne sont pas au même endroit (UNO Rev2 : A4=SDA, A5=SCL; UNO Rev3: deux broches dédiées sur un connecteur SCL et SDA). Au moment de rédiger ce tutoriel  je dispose d&#8217;une carte arduino UNO rev2, le schéma de câblage ci-dessous est donc adapté pour cette plate-forme :</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/exemple4-temp-i2c.png" rel="lightbox[891]"><img class="aligncenter size-thumbnail wp-image-946" title="Exemple 4 - Capteur de température DS1621 sur bus i2c" src="http://innovelectronique.fr/wp-content/uploads/2012/05/exemple4-temp-i2c-150x150.png" alt="Exemple 4 - Capteur de température DS1621 sur bus i2c" width="150" height="150" /></a>La face avant sous LabVIEW se présente de la manière suivante :</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/exemple4-temp-i2c-face-avant-labview.png" rel="lightbox[891]"><img class="aligncenter size-full wp-image-949" title="Exemple 4 - Capteur de température DS1621 sur bus I2C - Face avant LabVIEW" src="http://innovelectronique.fr/wp-content/uploads/2012/05/exemple4-temp-i2c-face-avant-labview.png" alt="Exemple 4 - Capteur de température DS1621 sur bus I2C - Face avant LabVIEW" width="249" height="301" /></a><em>Remarque</em> : un indicateur permet de choisir l&#8217;adresse du capteur DS1621 sur le bus I2C. Sous l&#8217;intitulé &#8220;Données I2C&#8221; c&#8217;est en fait un indicateur sous forme de tableau, il permet de visualiser les données brutes lues sur le bus I2C.</p>
<p>Le diagramme peut se présenter de la manière suivante :</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/exemple4-temp-i2c-diagramme-labview.png" rel="lightbox[891]"><img class="aligncenter size-full wp-image-950" title="Exemple 4 - Capteur de température DS1621 sur bus I2C - Diagramme LabVIEW" src="http://innovelectronique.fr/wp-content/uploads/2012/05/exemple4-temp-i2c-diagramme-labview.png" alt="Exemple 4 - Capteur de température DS1621 sur bus I2C - Diagramme LabVIEW" width="931" height="288" /></a>Cela mérite quelques explications !!! Tout d&#8217;abord j&#8217;ai triché&#8230;pour comprendre comment fonctionne les sous VI I2C j&#8217;ai regardé les signaux I2C issu de l&#8217;arduino sur un oscilloscope et je dois dire que ça m&#8217;a bien aidé ! Lecture du diagramme de gauche à droite:</p>
<ol>
<li>Initialisation du bus I2C (TWI dans la terminologie arduino)</li>
<li>Initialisation du DS1621. Tout d&#8217;abord l&#8217;adresse du composant. L&#8217;adresse est sur 7 bits (bit de poids fort en premier), les 4 premiers sont fixes (1001 voir documentation), les 3 derniers sont fixés avec les broches A2A1A0. Dans notre cas A2A1A0=000 donc l&#8217;adresse du composant est 0b1001000 en binaire ou 0&#215;48 en hexadécimal ou 72 en décimal. Vous avez donc l&#8217;explication de la valeur 72 sur la face avant. Ensuite il faut écrire les valeurs 0xAC (172) et 0&#215;00 (0) : c&#8217;est le rôle du premier sous VI  &#8220;I2C Write&#8221;.</li>
<li>Suite de l&#8217;initialisation. Normalement il faut attendre une dizaine de ms mais comme la transmission des 15 octets de LabVIEW vers l&#8217;arduino prend du temps, on peut considérer que la temporisation est réalisée. On écrit alors la valeur 0xEE (238). A ce point le DS1621 est correctement initialisé.</li>
<li>On rentre alors dans une boucle infinie. La température sera demandée toutes les 500ms. Pour faire la demande de la dernière température, il faut écrire la valeur 0xAA (170).</li>
<li>On lit alors le résultat : ici le DS1621 doit nous renvoyer 2 octets d’où la valeur 2 sur le sous VI &#8220;I2C Read&#8221;. Ce sous VI se charge aussi de faire le NACK final (vérifié à l&#8217;oscilloscope). On obtient alors un tableau 1D à deux cases contenant des entiers non signés codés sur 8 bits. Ces données sont affichées de manière brute dans un l&#8217;indicateur de la face avant &#8220;Données I2C&#8221;.</li>
<li>Il faut traiter les deux valeurs fourni par le DS1621. On commence par extraire les données du tableau avec le sous VI &#8220;Indexer un tableau&#8221;. L&#8217;indice  &#8216;0&#8242; : 8 bit de poids fort du résultat de la température en entier signé et l&#8217;indice &#8216;1&#8242; : 8 bit de poids faible de la conversion : dans notre cas cet octet prendra deux valeurs : soit 128 pour indiquer qu&#8217;il faut rajouter 0,5°C, soit 0.</li>
<li>On reconstruit alors la température réelle et on l&#8217;affiche sur le thermomètre.</li>
</ol>
<p>Cela fonctionne, notez cependant que l&#8217;on ne gère pas les températures négatives&#8230;c&#8217;est à faire en guise d&#8217;exercice <img src='http://innovelectronique.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<h1>Cinquième exemple : Afficheur LCD alphanumérique</h1>
<p>Pour ce test il existe un shield (par exemple <a href="http://www.zartronic.fr/shield-lcd-pour-arduino-p-125.html" target="_blank">http://www.zartronic.fr/shield-lcd-pour-arduino-p-125.html</a>) ou on peut le fabriquer à partir des fichiers Isis et Ares disponible sur <a href="http://www.ac-limoges.fr/sti_ge/spip.php?article38" target="_blank">http://www.ac-limoges.fr/sti_ge/spip.php?article38</a>. L&#8217;afficheur LCD sera utilisé en mode 4 bits et la ligne RW sera reliée à la masse pour diminuer le nombre de fils. On peut avoir le câblage suivant qui n&#8217;est <strong>PAS DU TOUT</strong> le câblage par défaut proposé sous LabVIEW :</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/exemple5-aff-lcd1.png" rel="lightbox[891]"><img class="aligncenter size-thumbnail wp-image-958" title="Exemple 5 - Afficheur LCD Alphanumerique" src="http://innovelectronique.fr/wp-content/uploads/2012/05/exemple5-aff-lcd1-150x150.png" alt="Exemple 5 - Afficheur LCD Alphanumerique" width="150" height="150" /></a></p>
<p>Pour être plus explicite on a le câblage suivant (j&#8217;exclue les alimentations et le réglage de contraste avec le potentiomètre).</p>
<ul>
<li>broche 4 de l&#8217;arduino vers broche 4 (RS) de l&#8217;afficheur</li>
<li>broche 5 (RW) de l&#8217;afficheur reliée à la masse : l&#8217;afficheur est toujours en mode écriture</li>
<li>broche 6 de l&#8217;arduino vers broche 6 (E) de l&#8217;afficheur</li>
<li>broches 10,11,12,13 de l&#8217;arduino respectivement sur 11,12,13,14 (DB4,DB5,DB6,DB7) les 4 bits de poids fort du bus de données de l&#8217;afficheur</li>
</ul>
<p><em>Remarque</em> : suivant votre afficheur, vous pouvez tenter de mettre la broche 3 (Vcontrast) directement à la masse. Si les caractères sont encore visibles cela simplifie encore le câblage.</p>
<p>On va afficher la date et l&#8217;heure courante du PC sur l&#8217;afficheur LCD. On vérifiera que la longueur de la chaine à afficher est compatible avec le nombre de colonne de l&#8217;afficheur sinon on affichera le mot &#8220;Erreur !!&#8221; et on positionnera un témoin lumineux à rouge. La face avant peut être celle-ci :</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/exemple5-aff-lcd-face-avant-labview.png" rel="lightbox[891]"><img class="aligncenter size-full wp-image-959" title="Exemple 5 - Afficheur LCD alphanumerique - Face avant LabVIEW" src="http://innovelectronique.fr/wp-content/uploads/2012/05/exemple5-aff-lcd-face-avant-labview.png" alt="Exemple 5 - Afficheur LCD alphanumerique - Face avant LabVIEW" width="273" height="158" /></a>Compte tenu du cahier des charges précédent, on peut obtenir le diagramme LabVIEW suivant :</p>
<p><a href="http://innovelectronique.fr/wp-content/uploads/2012/05/exemple5-aff-lcd-diagramme-labview.png" rel="lightbox[891]"><img class="aligncenter size-full wp-image-961" title="Exemple 5 - Afficheur LCD alphanumerique - Diagramme LabVIEW" src="http://innovelectronique.fr/wp-content/uploads/2012/05/exemple5-aff-lcd-diagramme-labview.png" alt="Exemple 5 - Afficheur LCD alphanumerique - Diagramme LabVIEW" width="966" height="367" /></a></p>
<p>Quelques commentaires sur ce diagramme:</p>
<ul>
<li>le sous VI &#8220;LCD configure 4-bit&#8221; permet d&#8217;affecter les broches de l&#8217;afficheur LCD aux broches de l&#8217;arduino. Le nom des broches est rappelé sur le diagramme. La valeur 255 pour la ligne R/W indique que cette ligne n&#8217;est pas cablé du coté de l&#8217;arduino. La broche &#8220;LCD&#8221; précise quel ligne sur l&#8217;arduino sera utilisée pour piloter le rétroéclairage de l&#8217;afficheur s&#8217;il en possède un. Ne connectez pas directement la broche de l&#8217;arduino à la broche d&#8217;alimentation du rétro-éclairage (vu sur les exemples de chez NI) mais utilisez plutôt un petit transistor MOS type BS170 (datasheet <a href="http://www.fairchildsemi.com/ds/BS/BS170.pdf" target="_blank">ici</a>) pour piloter l&#8217;alimentation du rétro-éclairage.</li>
<li>Le sous VI &#8220;LCD Init&#8221; permet de préciser le nombre de colonnes (ici 16) et le nombre de ligne (ici 2) de l&#8217;afficheur LCD.</li>
<li>Tout ce qui est dans la partie supérieure de la boucle while concerne la récupération de la date et de l&#8217;heure du PC (avec un format précis) et du test pour savoir si la longueur de la chaine générée est compatible avec le nombre de colonnes de l&#8217;afficheur</li>
<li>Le sous VI &#8220;LCD Set Cursor Position&#8221; permet de fixer la position de départ de la chaine à afficher. Notez bien que les coordonnées x,y de l&#8217;afficheur commence à 0,0 et pas 1,1 !</li>
<li>Le sous VI &#8220;LCD print&#8221; permet d&#8217;afficher la chaine que l&#8217;on a généré auparavant</li>
</ul>
<p><em>Remarque</em> : le VI précédent a été testé sur un afficheur LCD 16&#215;2 et un afficheur LCD 20&#215;4 en changeant les paramètres d&#8217;initialisation et la position d&#8217;affichage. Tout a bien fonctionné <img src='http://innovelectronique.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<h1>Conclusion&#8230;</h1>
<p>Pour explorer plus avant les possibilités de LIFA, il suffit d&#8217;ouvrir les VI exemples fournis. Ceux-ci se trouvent dans &#8220;C:\Program Files\National Instruments\LabVIEW 2011\vi.lib\LabVIEW Interface for Arduino\Palette Examples&#8221;. J&#8217;espère aussi que les quelques exemples précédents vous ont ouvert l&#8217;appétit ! Je trouve le &#8220;mariage&#8221; open-source, open-harware de l&#8217;arduino et le très propriétaire NI LabVIEW assez intéressant car il permet de développer rapidement de petites applications ou projets. De ce point de vue LIFA correspond bien à une philosophie d&#8217;apprentissage par projet !</p>
<p>Je compte, si j&#8217;ai assez de temps faire un second article, sur une utilisation plus avancé de LIFA. Un des thèmes abordés pourrait être la manette nunchuck de la wii car elle embarque un accéléromètre 3 axes, un joystick analogique et deux boutons poussoirs, le tout interrogeable par un bus I2C pour un prix de 20€&#8230;</p>
<p>Vous trouverez ci-dessous une archive zip contenant les captures d&#8217;écrans, les fichiers pour fritzing, les VI des exemples (réalisés avec la version 2011 de LabVIEW). N&#8217;hésitez pas à commenter cet article et à apporter votre pierre à l&#8217;édifice de l&#8217;open source - open hardware.</p>
<div class="attachments"><dl class="attachments attachments-large"><dt class="icon"><a title="Exemples LIFA" href="?aid=968&pid=891&sa=0"><img src="http://innovelectronique.fr/wp-content/plugins/eg-attachments/images/zip.png" width="48" height="48" alt="" /></a></dt><dd class="caption"><strong>Titre: </strong><a title="Exemples LIFA" href="?aid=968&pid=891&sa=0">Exemples LIFA</a><br /><strong>L&eacute;gende: </strong>VI, fichiers Fritzing, captures d'écran pour LIFA<br /><strong>Fichier: </strong>exemples-lifa.zip<br /><strong>Taille: </strong>1 Mo</dd></dl></div>
]]></content:encoded>
			<wfw:commentRss>http://innovelectronique.fr/2012/05/04/arduino-et-lifa-labview-interface-for-arduino/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Installation et utilisation de QTExtSerialPort sous Debian/GNU Linux 6.0</title>
		<link>http://innovelectronique.fr/2012/03/13/installation-et-utilisation-de-qtextserialport-sous-debiangnu-linux-60/</link>
		<comments>http://innovelectronique.fr/2012/03/13/installation-et-utilisation-de-qtextserialport-sous-debiangnu-linux-60/#comments</comments>
		<pubDate>Tue, 13 Mar 2012 08:04:19 +0000</pubDate>
		<dc:creator>Olivier</dc:creator>
		
		<category><![CDATA[GNU/Linux]]></category>

		<category><![CDATA[Linux Embarqué]]></category>

		<category><![CDATA[port série]]></category>

		<category><![CDATA[QT]]></category>

		<guid isPermaLink="false">http://innovelectronique.fr/?p=828</guid>
		<description><![CDATA[Pour un projet industriel, les étudiants doivent utiliser QT4 et dialoguer avec différents appareils par le port série. QT4 ne délivrant pas nativement de classe gérant le port série, il faut se tourner vers des développements extérieurs. Pour l&#8217;instant j&#8217;en connais deux:

QTExtSerialPort : http://code.google.com/p/qextserialport/
QTSerialDevice : http://gitorious.org/qserialdevice

Mon environnement de développement sera une debian Squeeze. QTCreator est [...]]]></description>
			<content:encoded><![CDATA[<p>Pour un projet industriel, les étudiants doivent utiliser QT4 et dialoguer avec différents appareils par le port série. QT4 ne délivrant pas nativement de classe gérant le port série, il faut se tourner vers des développements extérieurs. Pour l&#8217;instant j&#8217;en connais deux:</p>
<ul>
<li>QTExtSerialPort : <a href="http://code.google.com/p/qextserialport/" target="_blank">http://code.google.com/p/qextserialport/</a></li>
<li>QTSerialDevice : <a href="http://gitorious.org/qserialdevice" target="_blank">http://gitorious.org/qserialdevice</a></li>
</ul>
<p>Mon environnement de développement sera une debian Squeeze. QTCreator est installé depuis les paquets standards (en version 1.3.1 basé sur les librairies QT 4.6.3).<span id="more-828"></span></p>
<h1>Test avec QExtSerialPort</h1>
<p>Il faut se rendre àl&#8217;adresse indiquée plus haut. On va faire une copie du projet en utilisant Mercurial. Il faut d&#8217;abord installer celui-ci puis se déplacer dans un endroit adéquate puis enfin rapatrier le projet:</p>
<pre>olivier@portable-od:~$ sudo aptitude install mercurial
olivier@portable-od:~$ cd Documents/BTS_IRIS/LangageC-C++/Qt
olivier@portable-od:~/Documents/BTS_IRIS/LangageC-C++/Qt$ hg clone https://code.google.com/p/qextserialport/
destination directory: qextserialport
requesting all changes
adding changesets
adding manifests
adding file changes
added 106 changesets with 726 changes to 124 files (+2 heads)
updating to branch default
95 files updated, 0 files merged, 0 files removed, 0 files unresolved
olivier@portable-od:~/Documents/BTS_IRIS/LangageC-C++/Qt$ ls
basiclayouts   imageviewer         qextserialport
collidingmice  localfortuneclient  Test_crosscompilateur</pre>
<p>On rentre dans le répertoire &#8220;qextserialport&#8221;. On remarque un &#8220;qextserialport.pro&#8221; (un projet Qt4). On va donc essayer de compiler ce projet avec une simple commande &#8220;make&#8221;. En analysant les messages de compilation, on remarque que l&#8217;on a obtenu:</p>
<ul>
<li>une librairie partagée :  libqextserialport.so.1.2.0 dans le répertoire &#8220;src/build&#8221; et les liens symboliques</li>
<li>des exemples : enumerator,  event (le projet QEPSTA nécessite une compilation dans QTCreator)</li>
</ul>
<p>On teste donc les exemples fournis&#8230;le problème est que la librairie partagée n&#8217;est pas reconnue. Je copie donc celle-ci dans &#8220;/lib&#8221; et je fais les liens symboliques associés. Enfin on remet à jour la liste des librairies avec ldconfig:</p>
<pre>olivier@portable-od:~/Documents/BTS_IRIS/LangageC-C++/Qt/qextserialport$ cd src/build/
olivier@portable-od:~/Documents/BTS_IRIS/LangageC-C++/Qt/qextserialport/src/build$ ls
libqextserialport.so  libqextserialport.so.1  libqextserialport.so.1.2  libqextserialport.so.1.2.0
olivier@portable-od:~/Documents/BTS_IRIS/LangageC-C++/Qt/qextserialport/src/build$ sudo cp libqextserialport.so.1.2.0 /lib
[sudo] password for olivier:
olivier@portable-od:~/Documents/BTS_IRIS/LangageC-C++/Qt/qextserialport/src/build$ cd /lib
olivier@portable-od:/lib$ sudo ln -s libqextserialport.so.1.2.0 libqextserialport.so.1.2
olivier@portable-od:/lib$ sudo ln -s libqextserialport.so.1.2.0 libqextserialport.so.1
olivier@portable-od:/lib$ sudo ln -s libqextserialport.so.1.2.0 libqextserialport.so
olivier@portable-od:/lib$ sudo ldconfig
olivier@portable-od:/lib$ cd /home/olivier/Documents/BTS_IRIS/LangageC-C++/Qt/qextserialport/examples/enumerator/
olivier@portable-od:~/Documents/BTS_IRIS/LangageC-C++/Qt/qextserialport/examples/enumerator$</pre>
<ul>
<li>enumerator : on lance l&#8217;éxecution du programme &#8220;enumerator&#8221; et l&#8217;on obtient la liste des &#8220;ports séries&#8221; disponible sur la machine.</li>
</ul>
<pre>olivier@portable-od:~/Documents/BTS_IRIS/LangageC-C++/Qt/qextserialport/examples/enumerator$ ./enumerator
List of ports:
port name: "ttyS0"
friendly name: "Serial port 0"
physical name: "/dev/ttyS0"
enumerator name: "/dev"
vendor ID: "ffffffffa3e49cf8"
product ID: "7fff"
===================================
port name: "ttyS1"
friendly name: "Serial port 1"
physical name: "/dev/ttyS1"
enumerator name: "/dev"
vendor ID: "ffffffffa3e49cf8"
product ID: "7fff"
===================================
port name: "ttyS2"
friendly name: "Serial port 2"
physical name: "/dev/ttyS2"
enumerator name: "/dev"
vendor ID: "ffffffffa3e49cf8"
product ID: "7fff"
===================================
port name: "ttyS3"
friendly name: "Serial port 3"
physical name: "/dev/ttyS3"
enumerator name: "/dev"
vendor ID: "ffffffffa3e49cf8"
product ID: "7fff"
===================================
port name: "ttyUSB0"
friendly name: "USB-serial adapter 0"
physical name: "/dev/ttyUSB0"
enumerator name: "/dev"
vendor ID: "ffffffffa3e49cf8"
product ID: "7fff"
===================================</pre>
<p>En fait le seul port série que j&#8217;ai sur ma machine est le &#8220;/dev/ttyUSB0&#8243; : c&#8217;est un adaptateur USB-Serie basé sur le circuit FT232 de FTDI.</p>
<ul>
<li>event : si on exécute ce programme, le message d&#8217;erreur suivant apparaît :</li>
</ul>
<pre>olivier@portable-od:~/Documents/BTS_IRIS/LangageC-C++/Qt/qextserialport/examples/event$ ./event
hi there
trying to open file "COM1"
could not open file: Aucun fichier ou dossier de ce type
device failed to open: "The COM1 file doesn't exists"
^C</pre>
<p>Visiblement le nom du port est codé &#8220;en dur&#8221;. Donc on modifie le fichier source (remplacement de COM0 par /dev/ttyUSB0) et on recompile (make dans le répertoire) puis on exécute :</p>
<pre>olivier@portable-od:~/Documents/BTS_IRIS/LangageC-C++/Qt/qextserialport/examples/event$ nano main.cpp
olivier@portable-od:~/Documents/BTS_IRIS/LangageC-C++/Qt/qextserialport/examples/event$ ls
event  event.pro  main.cpp  Makefile  PortListener.cpp  PortListener.h  tmp
olivier@portable-od:~/Documents/BTS_IRIS/LangageC-C++/Qt/qextserialport/examples/event$ make
g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I../../src -Itmp -o tmp/main.o main.cpp
main.cpp: In function ‘int main(int, char**)’:
main.cpp:15: warning: unused variable ‘listener’
g++ -Wl,-O1 -o event tmp/main.o tmp/PortListener.o tmp/moc_PortListener.o    -L../../src/build -L/usr/lib -lqextserialport -lQtGui -lQtCore -lpthread
olivier@portable-od:~/Documents/BTS_IRIS/LangageC-C++/Qt/qextserialport/examples/event$ ./event
hi there
trying to open file "/dev/ttyUSB0"
file opened succesfully
warning: device is not turned on
listening for data on "/dev/ttyUSB0"
bytes read: 2
bytes: "f "
bytes read: 2
bytes: "f "
bytes read: 2
bytes: "x "</pre>
<p>Visiblement le programme fonctionne et reçoit les données de la voie série. Nous avons donc deux codes sources à examiner.</p>
<p>J&#8217;ouvre enfin le programme QEPSTA dans QTCreator (ouvrir le projet QEPSTA.pro) et je lance la compilation et l&#8217;exécution. A la compilation une erreur apparaît, je modifie la ligne d&#8217;include concernée en #include &#8220;../../src/qextserialport.h&#8221;. Je relance la compilation est j&#8217;obtiens deux erreurs sur fprintf et stderr. Je choisis la solution radicale de commenter les lignes concernées. Il y a d&#8217;autres erreurs du mêmes types. Cependant à la fin le programme ne pouvait être lié avec la bibliothèque qextserialportd (voir le fichier qespta.pro, d pour debug). J&#8217;ai donc changé en qextserialport et c&#8217;est OK. Le programme graphique s&#8217;exécute.</p>
<p>J&#8217;ai depuis développé une petite application de test basé sur trois &#8220;scrool bar&#8221; R,G,B pour commander le microcontrolleur. Le tout est fonctionnel. Le code sera mis plus tard avec les classes associées.</p>
<p>Comme nous avons des doutes sur la compilation de cette librairie sous la dernière version de QT (4.8 à l&#8217;instant d&#8217;écriture de ces lignes) j&#8217;installe dans une machine virtuelle VirtualBox une ubuntu 11.10. QTCreator sera alors installé ensuite pour voir quel version est utilisé dans cette environnement. Suivant la version, j&#8217;installerai le dernier SDK directement depuis le site de QT.</p>
]]></content:encoded>
			<wfw:commentRss>http://innovelectronique.fr/2012/03/13/installation-et-utilisation-de-qtextserialport-sous-debiangnu-linux-60/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
