<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Capteurs &#8211; Electronique et Informatique</title>
	<atom:link href="https://amaury-laurent.fr/category/realisation/capteurs/feed/" rel="self" type="application/rss+xml" />
	<link>https://amaury-laurent.fr</link>
	<description>Site web d&#039;Amaury LAURENT</description>
	<lastBuildDate>Sat, 09 Mar 2019 10:12:14 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.3.2</generator>

<image>
	<url>https://amaury-laurent.fr/wp-content/uploads/2015/09/favicon.png</url>
	<title>Capteurs &#8211; Electronique et Informatique</title>
	<link>https://amaury-laurent.fr</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Mesure Lidar rotatif embarqué sur LattePanda et piloté par LabVIEW (LINX)</title>
		<link>https://amaury-laurent.fr/mesure-lidar-rotatif-embarque-sur-lattepanda-et-pilote-par-labview-linx/</link>
					<comments>https://amaury-laurent.fr/mesure-lidar-rotatif-embarque-sur-lattepanda-et-pilote-par-labview-linx/#comments</comments>
		
		<dc:creator><![CDATA[adrienBS]]></dc:creator>
		<pubDate>Wed, 06 Mar 2019 14:36:49 +0000</pubDate>
				<category><![CDATA[Microcontrôleur]]></category>
		<category><![CDATA[Capteurs]]></category>
		<category><![CDATA[Informatique]]></category>
		<category><![CDATA[Tutoriaux]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[LabVIEW]]></category>
		<category><![CDATA[LattePanda]]></category>
		<category><![CDATA[Lidar]]></category>
		<category><![CDATA[LINX]]></category>
		<guid isPermaLink="false">http://amaury-laurent.fr/?p=1012</guid>

					<description><![CDATA[<p>Le sujet abordé dans cet article présente la réalisation d’une mesure de distance à l’aide d’un capteur Lidar monté sur un moteur pas à pas et commandé par LabVIEW à travers la bibliothèque LINX. Nous verrons comment rendre ce système embarqué sur un LattePanda. L’objectif est de pouvoir mesurer une distance entre 0,1 à 20 [&#8230;]</p>
<p>Cet article <a rel="nofollow" href="https://amaury-laurent.fr/mesure-lidar-rotatif-embarque-sur-lattepanda-et-pilote-par-labview-linx/">Mesure Lidar rotatif embarqué sur LattePanda et piloté par LabVIEW (LINX)</a> est apparu en premier sur <a rel="nofollow" href="https://amaury-laurent.fr">Electronique et Informatique</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Le sujet abordé dans cet article présente la réalisation d’une mesure de distance à l’aide d’un capteur Lidar monté sur un moteur pas à pas et commandé par LabVIEW à travers la bibliothèque LINX. Nous verrons comment rendre ce système embarqué sur un LattePanda. L’objectif est de pouvoir mesurer une distance entre 0,1 à 20 mètres sur 360° et de contrôler l’ensemble à partir d’une IHM (Interface Homme Machine) tactile.</p>
<p><em>Avant de commercer cet article, je tiens à remercier Amaury qui m&rsquo;a permis de publier cet article sur son site. 🙂</em></p>
<div style="width: 640px;" class="wp-video"><!--[if lt IE 9]><script>document.createElement('video');</script><![endif]-->
<video class="wp-video-shortcode" id="video-1012-1" width="640" height="360" preload="metadata" controls="controls"><source type="video/mp4" src="https://amaury-laurent.fr/wp-content/uploads/2019/03/20190225_222725.mp4?_=1" /><a href="https://amaury-laurent.fr/wp-content/uploads/2019/03/20190225_222725.mp4">https://amaury-laurent.fr/wp-content/uploads/2019/03/20190225_222725.mp4</a></video></div>
<p>Je découvre actuellement l’électronique et la programmation entre  LabVIEW et Arduino et je tiens à partager certains résultats avec vous. Certaines notions abordées ne seront pas forcément poussées ou assez détaillées pour des lectures ou lectrices plus expérimenté(e)s.</p>
<h1><a name="_Toc2727674"></a>Théorie de mesure de distance Lidar</h1>
<p>Lidar est l’acronyme anglais de <em>light detection and ranging </em>qui est une technique qui permet de mesurer des distances allant de quelques centimètres à la distance Terre-Lune. Le lidar Garmin utilisé ici, génère un train d’onde électromagnétique cohérente (un faisceau laser InfraRouge) de longueur d’onde λ de 905 nm. Les trains d’onde sont envoyés à une fréquence comprise entre 10 à 20 kHz (à ne pas confondre avec la fréquence propre de l’onde du laser IR) d’après les datasheet. Les trains d’ondes se réfléchissent sur la cible visée par le capteur. Une partie de la lumière du laser revient sur le capteur. Une photodiode placée dans le Lidar et sensible dans la plage de longueur d’onde des IR reçoit l’onde réfléchie. L’écart de temps entre le départ d’un train d’onde et son retour est mesuré par le capteur. Cet écart de temps est proportionnel à la distance parcourue par l’onde. Cette technologie de mesure est communément appelée <em>Time of Flight</em>.</p>
<h1><a name="_Toc2727675"></a>Le matériel utilisé pour la réalisation</h1>
<table style="height: 778px" width="621">
<tbody>
<tr style="height: 24px">
<td style="width: 224px;text-align: center;height: 24px"><strong>Matériel</strong></td>
<td style="width: 172px;text-align: center;height: 24px"><strong>Prix (neufs)</strong></td>
<td style="width: 203px;text-align: center;height: 24px"><strong>Site achat</strong></td>
</tr>
<tr style="height: 72px">
<td style="width: 224px;height: 72px;text-align: center">Carte LattePanda 4 GB/64 GB DFR0419 (sans écran et capteur tactile)</td>
<td style="width: 172px;height: 72px;text-align: center">~ 187 €</td>
<td style="width: 203px;height: 72px;text-align: center">Go Tronic</td>
</tr>
<tr style="height: 72px">
<td style="width: 224px;height: 72px;text-align: center">Ecran 7’ + capteur tactile + Ventilateur et refroidisseur métalliques</td>
<td style="width: 172px;height: 72px;text-align: center">~ 80 €</td>
<td style="width: 203px;height: 72px;text-align: center">Go Tronic</td>
</tr>
<tr style="height: 72px">
<td style="width: 224px;height: 72px;text-align: center">LabVIEW pour l&rsquo;enseignement 2014 (version d’essai gratuite 7 jours)</td>
<td style="width: 172px;height: 72px;text-align: center">A partir de 196 €</td>
<td style="width: 203px;height: 72px;text-align: center">NI</td>
</tr>
<tr style="height: 48px">
<td style="width: 224px;height: 48px;text-align: center">LIDAR GARMIN lite V3</td>
<td style="width: 172px;height: 48px;text-align: center">143 €</td>
<td style="width: 203px;height: 48px;text-align: center">Amazon (Expédié et vendu par <a href="https://www.amazon.fr/gp/help/seller/at-a-glance.html/ref=dp_merchant_link?ie=UTF8&amp;seller=A2PIW95AGLR8G3" target="_blank" rel="noopener">RobotShop inc</a>.)</td>
</tr>
<tr style="height: 120px">
<td style="width: 224px;height: 120px;text-align: center">Driver de moteur Pas à Pas Bipolaire</p>
<p>(A4988 1182)</td>
<td style="width: 172px;height: 120px;text-align: center">7€</td>
<td style="width: 203px;height: 120px;text-align: center">Go Tronic</td>
</tr>
<tr style="height: 48px">
<td style="width: 224px;height: 48px;text-align: center">Moteur pas à Pas Bipolaire (14HM11-0404S)</td>
<td style="width: 172px;height: 48px;text-align: center">18 €</td>
<td style="width: 203px;height: 48px;text-align: center">Go Tronic</td>
</tr>
<tr style="height: 24px">
<td style="width: 224px;height: 24px;text-align: center">Laser Rouge de niveau recyclé</td>
<td style="width: 172px;height: 24px;text-align: center">0 €</td>
<td style="width: 203px;height: 24px;text-align: center">Sans objet</td>
</tr>
<tr style="height: 48px">
<td style="width: 224px;height: 48px;text-align: center">2 Piles de 9 Volts + 2 connecteurs</td>
<td style="width: 172px;height: 48px;text-align: center">~ 10 €</td>
<td style="width: 203px;height: 48px;text-align: center">Amazon</td>
</tr>
<tr style="height: 48px">
<td style="width: 224px;height: 48px;text-align: center">Une breadboard (400 points minimum)</td>
<td style="width: 172px;height: 48px;text-align: center">3 €</td>
<td style="width: 203px;height: 48px;text-align: center">Amazon</td>
</tr>
<tr style="height: 24px">
<td style="width: 224px;height: 24px;text-align: center">Batterie Li 20000mAh</td>
<td style="width: 172px;height: 24px;text-align: center">30 €</td>
<td style="width: 203px;height: 24px;text-align: center">Amazon</td>
</tr>
<tr style="height: 24px">
<td style="width: 224px;height: 24px;text-align: center">1 Condensateur 100µF 16V</td>
<td style="width: 172px;height: 24px;text-align: center">Qlq centimes</td>
<td style="width: 203px;height: 24px;text-align: center">Amazon</td>
</tr>
<tr style="height: 24px">
<td style="width: 224px;height: 24px;text-align: center">2 Condensateurs 0.1µF</td>
<td style="width: 172px;height: 24px;text-align: center">Idem</td>
<td style="width: 203px;height: 24px;text-align: center">Amazon/ Go Tronic</td>
</tr>
<tr style="height: 24px">
<td style="width: 224px;height: 24px;text-align: center">1 Résistance de 1KΩ</td>
<td style="width: 172px;height: 24px;text-align: center">Idem</td>
<td style="width: 203px;height: 24px;text-align: center">Amazon/ Go Tronic</td>
</tr>
<tr style="height: 48px">
<td style="width: 224px;height: 48px;text-align: center">1 Résistance de 500Ω de 1W (ou 4 de 2KΩ mis en parallèles)</td>
<td style="width: 172px;height: 48px;text-align: center">Idem</td>
<td style="width: 203px;height: 48px;text-align: center">Amazon/ Go Tronic</td>
</tr>
<tr style="height: 24px">
<td style="width: 224px;height: 24px;text-align: center">Régulateur de tension LM7815</td>
<td style="width: 172px;height: 24px;text-align: center">1,5€</td>
<td style="width: 203px;height: 24px;text-align: center">RS Components</td>
</tr>
<tr style="height: 10px">
<td style="width: 224px;height: 10px;text-align: center">Des fils</td>
<td style="width: 172px;height: 10px;text-align: center">recyclés</td>
<td style="width: 203px;height: 10px;text-align: center"></td>
</tr>
<tr style="height: 24px">
<td style="width: 224px;height: 24px;text-align: center"><strong>Coût total</strong></td>
<td style="width: 172px;height: 24px;text-align: center"><strong>667 €</strong></td>
<td style="width: 203px;height: 24px;text-align: center"></td>
</tr>
</tbody>
</table>
<p>Nota : un clavier et une souris seront très certainement nécessaires pour naviguer sur LattePanda.</p>
<h1><a name="_Toc2727676"></a>Le Montage global</h1>
<p>Le schéma suivant a été réalisé sur le logiciel libre Fritzing. N’ayant pas trouvé de modèle de LattePanda dans la librairie Fritzing, il a donc été représenté par sa carte Arduino qu’il intègre. Un schéma du LattePanda est donné après.</p>
<p><img decoding="async" fetchpriority="high" class="alignnone wp-image-1016 aligncenter" src="https://ml9zfxsqktal.i.optimole.com/w:auto/h:auto/q:mauto/f:best/https://amaury-laurent.fr/wp-content/uploads/2019/03/Schema-Fritzing-Stepper-et-Lidar_regulationtension.png" alt="" width="962" height="908" /></p>
<p style="text-align: center">Figure 1 Schéma Global de la mesure Lidar (à l’aide du logiciel gratuit Fritzing)</p>
<p>L’intégration des différents éléments a été faite à l’aide d’un vieux jeu mécanos.</p>
<h2><a name="_Toc2727677"></a>LattePanda</h2>
<p>Le modèle de  LattePanda utilisé est le 4 GB/64 GB sous Windows 10. Ce modèle suffit pour faire tourner un LabVIEW 2014 (<a href="https://www.gotronic.fr/art-carte-lattepanda-4-gb-64-gb-dfr0419-24792.htm" target="_blank" rel="noopener">https://www.gotronic.fr/art-carte-lattepanda-4-gb-64-gb-dfr0419-24792.htm</a> ). LattePanda sera très utile car il intègre une carte Arduino Leonardo et ses E/S associées. A l’aide des entrées et sorties numériques (0-5V), il sera possible de piloter le moteur pas à pas, le laser et d’acquérir le signal du Lidar. Le LattePanda est enfaîte un petit ordinateur d’instrumentation très compacte et assez puissant. Le projet n’utilise ici qu’une petite partie de sa capacité. Pour plus de détails sur LattePanda, le lecteur pourra se référer à l&rsquo;article : <a href="https://amaury-laurent.fr/lattapanda-premiere-mise-route/">LattePanda – Première mise en route</a></p>
<p>Le schéma ci-dessous reprend les principales E/S :</p>
<p><img decoding="async" class="alignnone size-full wp-image-1017 aligncenter" src="https://ml9zfxsqktal.i.optimole.com/w:auto/h:auto/q:mauto/f:best/https://amaury-laurent.fr/wp-content/uploads/2019/03/lattepanda.jpg" alt="" width="649" height="637" /></p>
<p style="text-align: center">Figure 2 E/S LattePanda 4GB/64GB (https://www.lattepanda.com)</p>
<h2><a name="_Toc2727678"></a>Le moteur Pas à Pas</h2>
<p>Le moteur Pas à Pas bipolaire est contrôlé par un Driver Pololu (A4988). Le schéma ci-après (d’après le site Pololu qui commercialise le Driver) permet de connecter le moteur et le Driver. La puce du Driver est alimentée en 5 V par la carte Arduino du LattePanda. Ce driver a été choisi car il est facilement pilotable à partir des E/S digitales du Arduino, qui seront contrôlées par le logiciel ; lequel qui sera abordé après.</p>
<p><img decoding="async" class="alignnone size-full wp-image-1018 aligncenter" src="https://ml9zfxsqktal.i.optimole.com/w:auto/h:auto/q:mauto/f:best/https://amaury-laurent.fr/wp-content/uploads/2019/03/SchémaDriver.png" alt="" width="605" height="377" /></p>
<p style="text-align: center">Figure 3 Schéma de fonctionnement du Drive couplé au moteur Pas à Pas (bipolaire)</p>
<p>Pour connecter correctement le moteur pas à pas au driver on pourra suivre le tableau suivant :</p>
<table>
<tbody>
<tr>
<td width="136"><strong>Fils côté moteur</strong></td>
<td width="140"><strong>Pin entrée Driver</strong></td>
</tr>
<tr>
<td width="136">A (noir)</td>
<td width="140">1A</td>
</tr>
<tr>
<td width="136">C (vert)</td>
<td width="140">1B</td>
</tr>
<tr>
<td width="136">B (rouge)</td>
<td width="140">2A</td>
</tr>
<tr>
<td width="136">D (bleu)</td>
<td width="140">2B</td>
</tr>
</tbody>
</table>
<p><img decoding="async" class="alignnone size-full wp-image-1019 aligncenter" src="https://ml9zfxsqktal.i.optimole.com/w:auto/h:auto/q:mauto/f:best/https://amaury-laurent.fr/wp-content/uploads/2019/03/Schema-Moteur.png" alt="" width="209" height="212" /></p>
<p style="text-align: center">Figure 4 Schéma du moteur Pas à Pas (14HM11-0404S) d&rsquo;après datasheet Go Tronic</p>
<p>Il est conseillé de relier la masse de l’alimentation du moteur à la masse du circuit afin d’éviter de le moteur ne grésille. Un petit régulateur LM7815 (15 V) permet de limiter la tension en entrée. Pour ma part j’ai utilisé deux piles de 9 V. En sortie du régulateur il vaut mieux ne pas oublier de limiter le courant à l’aide d’une résistance de charge. Le moteur consomme 400 mA par phase. Pour limiter le courant j’ai choisi de mettre en parallèle 4 résistances de 2 kΩ de 1/4 W qui forment une résistance 500 Ω supportant 1 W. Avec ce montage, le moteur ne chauffe et a assez de puissance pour réaliser ses pas. Un potentiomètre présent sur le driver permet de réguler la tension. Le réglage du courant limite est disponible dans la vidéo disponible en suivant de <a href="https://www.youtube.com/watch?v=89BHS9hfSUk" target="_blank" rel="noopener">lien</a> (https://www.youtube.com/watch?v=89BHS9hfSUk). Pololu préconise de régler le courant limite à l’aide du réglage du VREF et non en entrée comme cela a été fait ici.</p>
<ul>
<li>Une fois le montage du moteur réalisé, un test du moteur peut être réalise. Pour cela, la Pin STEP du driver peut être connecté au 5V délivré par l’Arduino. Le moteur est censé faire un pas. Sinon, revérifier le schéma de montage.</li>
</ul>
<p>Les entrées MS1, MS2 et MS3 permettent de réduire le Pas, c’est-à-dire de gagner en précision angulaire. Le tableau ci-dessous affiche les niveaux à utiliser sur les pins en fonctions de la résolution du pas.</p>
<p><img decoding="async" class="alignnone size-full wp-image-1021 aligncenter" src="https://ml9zfxsqktal.i.optimole.com/w:auto/h:auto/q:mauto/f:best/https://amaury-laurent.fr/wp-content/uploads/2019/03/Tableau-resolution-pas.png" alt="" width="369" height="193" /></p>
<p style="text-align: center">Figure 5 Tableau de résolution des pas d&rsquo;après le site Pololu</p>
<p>Dans le cas présent, un pas complet est de 0,9°, un demi-pas en vaudra la moitié et ainsi de suite. Dans le présent projet, il n’est pas possible de descendre en dessous du demi-pas.</p>
<p><strong>Nota important:</strong> il est fortement<strong> déconseillé de déconnecter le moteur du driver quand le moteur est en fonctionnement</strong> car le Driver peut-être endommagé. Il faudra couper l’alimentation du moteur pour effectuer des changements de postions (si besoin) sur les 4 fils du moteur pas à pas.</p>
<h2><a name="_Toc2727679"></a>Le Lidar</h2>
<p>Pour fonctionner le Lidar doit être alimenté en 5 V. L’alimentation 5 V de l’Arduino du LattePanda convient parfaitement. L’acquisition de la mesure de distance est lue en largeur d’impulsion (PWM) sur le fil jaune. Les datasheet préconisent l’utilisation d’une résistance de 1KΩ qui est reliée entre le fil de sortie de la mesure et la masse comme ci-dessous :</p>
<p><img decoding="async" class="size-full wp-image-1020 aligncenter" src="https://ml9zfxsqktal.i.optimole.com/w:auto/h:auto/q:mauto/f:best/https://amaury-laurent.fr/wp-content/uploads/2019/03/schema-cablage-lidar.png" alt="" width="604" height="457" /></p>
<p style="text-align: center">Figure 6 Schéma de câblage du lidar en acquisition de mesure en PWM (d&rsquo;après datasheet Gramin)</p>
<p>Concernant les aspects métrologiques du capteur, la portée maximale du Lidar est de 40 mètres. Sa résolution est de 1 cm.</p>
<p>L&rsquo;incertitude de mesure du Lidar Lite V3,  entre 0 et 5m est de ± 2.5cm et ± 10 cm au delà.</p>
<p>En sortie de mesure en largeur d&rsquo;impulsion, la sensibilité est de 10 µs/cm. Cette valeur est à retenir pour comprendre la partie acquisition du signal du logiciel.</p>
<h2><a name="_Toc2727680"></a>Le Laser de visée</h2>
<p>Le laser est utile ici afin d&rsquo;avoir un repère visuel sur l&rsquo;orientation du Lidar. Le laser est du même type qu’utilisé pour les pointeurs laser de présentation (diode laser). Dans le cas présent, un laser d’alignement de 1 mW (λ = 650 nm) de couleur rouge a été utilisé. Il est alimenté en 5V par une entrée digitale de carte Arduino activable à partir du logiciel.</p>
<p><strong><span style="color: #ff0000">Attention aux yeux !</span></strong> Le laser concentre l&rsquo;énergie sur une surface très petite et a pour conséquence d&rsquo;être nocif pour l’œil.</p>
<p>L&rsquo;utilisateur est responsable de sa sécurité mais également celle des personnes autour !</p>
<h1><a name="_Toc2727681"></a>Le logiciel/programme</h1>
<p>Pour piloter les instruments (Lidar, moteur, laser) le logiciel LabVIEW 2014 est utilisé. Le but n’est pas de faire la présentation ni la promotion de ce logiciel mais de tenter d’expliquer comment utiliser certaines briques LINX. Si LabVIEW n’est pas utilisé, il sera quand même possible de piloter les instruments via un programme développé sur l’IDE Arduino. La suite de l’article pourra paraître obscure pour les personnes non initiées à LabVIEW; je m’en excuse par avance. Cependant, un petit effort a été fait pour que le code soit compris des personnes non initiées à LabVIEW.</p>
<p>Des briques (ou VI) de code LabVIEW ont été développées afin de faciliter grandement la compatibilité entre des cartes Arduino et LabVIEW. Pour utiliser les briques de codes LINX, la bibliothèque LINX côté LabVIEW doit avoir été installée préalablement dans VI Pack Manager (logiciel qui permet de charger des ToolKit ou librairies de programme).</p>
<h2><a name="_Toc2727682"></a>Chargement des librairies</h2>
<p>Avant de compiler le code, il faut charger les bibliothèques. Pour charger les bibliothèques, aller sur l’onglet <em>Tool\MakerHub\LINX\Generate Firmware Librairies :</em></p>
<p><img decoding="async" class="size-full wp-image-1022 aligncenter" src="https://ml9zfxsqktal.i.optimole.com/w:auto/h:auto/q:mauto/f:best/https://amaury-laurent.fr/wp-content/uploads/2019/03/screen-chargement-librairies.png" alt="" width="612" height="399" /></p>
<p>Et mettre en cible : <strong>C:\Program Files\Arduino\Libraries</strong></p>
<p><img decoding="async" class="wp-image-1023 aligncenter" src="https://ml9zfxsqktal.i.optimole.com/w:auto/h:auto/q:mauto/f:best/https://amaury-laurent.fr/wp-content/uploads/2019/03/screen-chargement-librairies_2.png" alt="" width="579" height="486" /></p>
<p>Les librairies sont donc maintenant chargées et opérationnelles.</p>
<h2><a name="_Toc2727683"></a>Configuration du type de carte</h2>
<p>Avant de compiler le code, il faudra configurer le type de carte (Mega, Leonardo) et le type de liaison. Dans ce projet avec LattePanda, la carte Arduino Leonardo est utilisée sur le port COM 4. Dans LabVIEW cliquez dans l&rsquo;onglet <em>Tool </em>puis <em>\MakerHub\LINX\LINX Firmware Wizard… </em>il faut configurer les champs à l’aide des informations mentionnées plus haut.</p>
<h2><a name="_Toc2727683"></a>TEST simple avec une LED</h2>
<p>Pour vérifier que la carte fonctionne correctement, l’exemple du pilotage d’une LED pourra être réalisé (onglet <em>HELP/Find Example…</em>). L&rsquo;exemple est prêt à être utilisé et ne nécessite que la mise en place d&rsquo;une LED en série avec une résistance de 220 Ω reliées au LattePanda.</p>
<p><img decoding="async" class="size-full wp-image-1024 aligncenter" src="https://ml9zfxsqktal.i.optimole.com/w:auto/h:auto/q:mauto/f:best/https://amaury-laurent.fr/wp-content/uploads/2019/03/screen-test-example-LED-LINX.png" alt="" width="605" height="421" /><img decoding="async" class="size-full wp-image-1025 aligncenter" src="https://ml9zfxsqktal.i.optimole.com/w:auto/h:auto/q:mauto/f:best/https://amaury-laurent.fr/wp-content/uploads/2019/03/Screen-Exemple-LED-LINX.png" alt="" width="766" height="616" /></p>
<p>Mettre le port COM 4 (normalement) et configurer la pin du Arduino sur laquelle est reliée l&rsquo;anode de la LED (la patte la plus longue) et ne pas oublier la résistance de 220 Ω en série 😉 . Puis relier la résistance à la masse et lancer le programme (flèche blanche).</p>
<p>Si la LED clignote quand le bouton est pressé, c’est gagné. Passer aux étapes suivantes. Sinon, il faut trouver la raison de cette malchance.</p>
<p>Ne pas hésiter à reconfigurer la carte car il arrive (trop) souvent que cela saute au bout de 3 à 4 compilations. Par exemple, il vaut mieux arrêter proprement la boucle avec un bouton « stop » placé dans la boucle While plutôt que de stopper le programme avec le bouton rouge de LabVIEW.</p>
<h1>L&rsquo;IHM (côté « Face Avant » de LabVIEW)</h1>
<p>L&rsquo;IHM qui permet à l&rsquo;utilisateur de contrôler les instruments pourra ressembler fortement à celle présentée ci-dessous.</p>
<p>Les configurations des Pins et du port sont situées à gauche.</p>
<p>Le bouton « Motor ON » permet d&rsquo;activer le driver sur la Pin ENABLE (Driver).</p>
<p>Le bouton « Left » permet d&rsquo;activer la Pin STEP (Driver)  et faire faire un pas au moteur.</p>
<p>Le bouton « Right »agit comme le bouton « Left » mais active la pin DIR (Driver) à l&rsquo;état haut et permet de changer de sens de rotation.</p>
<p>Un bouton « Laser » permet d&rsquo;activer le laser de visée.</p>
<p>Un bouton STOP permet d&rsquo;arrêter l’exécution proprement et d&rsquo;arrêter le moteur (ENABLE) et le Laser.</p>
<p>Trois types d’indicateurs sont présents : numérique (format chaîne de caractère), une barre de remplissage, et un graphe déroulant.</p>
<p>Un contrôleur barre graphe permet de passer au pilotage Pas par Pas (un clique sur LEFT ou RGTH = 0,9°) ou active la vitesse constante (comme sur la vidéo du début de l&rsquo;article).</p>
<p><img decoding="async" class=" wp-image-1036 aligncenter" src="https://ml9zfxsqktal.i.optimole.com/w:auto/h:auto/q:mauto/f:best/https://amaury-laurent.fr/wp-content/uploads/2019/03/IHM.png" alt="" width="700" height="376" /></p>
<p>Pour le lecteur non initié à LabVIEW, la « face avant » est la partie visible finale du programme disponible pour l&rsquo;utilisateur.</p>
<p>Le code est développé dans une seconde fenêtre appelée « Diagramme ». Et c&rsquo;est la partie de développement du Diagramme que nous allons maintenant aborder.</p>
<p><em>Nota : un Crtl+E permet de permuter rapidement rentre la face avant et le diagramme.</em></p>
<h2><a name="_Toc2727684"></a>La structure (côté diagramme)</h2>
<p>La structure générale du programme est la suivante :</p>
<p><img decoding="async" class="size-full wp-image-1026 aligncenter" src="https://ml9zfxsqktal.i.optimole.com/w:auto/h:auto/q:mauto/f:best/https://amaury-laurent.fr/wp-content/uploads/2019/03/screen-LINX-boucle-while.png" alt="" width="605" height="230" /></p>
<p style="text-align: center">Figure 7 Structure générale du programme dans un boucle While</p>
<p>Le code source ne sera pas disponible dans cet article mais les principales briques seront détaillées pour arriver facilement au résultat. 🙂</p>
<h2><a name="_Toc2727685"></a>Lecture de la valeur de la distance du Lidar</h2>
<p>Le Lidar Garmin Lite V3 admet deux sorties de données pour la lecture des mesures : I2C ou PWM. La lecture en modulation de largeur d’impulsion est apparue comme le plus simple du point de vue du soft. Un VI LINX permet de réaliser cette mesure rapidement contre plusieurs VI pour la communication en I2C.</p>
<p>Dans la boucle While cadencée à 50 ms, la mesure du Lidar est effectuée à l’aide du VI « <strong>Lecture de la largueur d’impulsion</strong> » :</p>
<p><img decoding="async" class="size-full wp-image-1027 aligncenter" src="https://ml9zfxsqktal.i.optimole.com/w:auto/h:auto/q:mauto/f:best/https://amaury-laurent.fr/wp-content/uploads/2019/03/LINX-lecture-largeur-impulsion.png" alt="" width="385" height="150" /></p>
<p>L’entrée <strong>DO Channel</strong> est connectée et la valeur de la Pin 0 de la carte Arduino est rentrée (cf Figure 8 ci-dessous).</p>
<p>Un tableau général de configuration des Pins d’E/S pourra être créé en amont de la boucle While comme ceci :</p>
<p><img decoding="async" class="size-full wp-image-1028" src="https://ml9zfxsqktal.i.optimole.com/w:auto/h:auto/q:mauto/f:best/https://amaury-laurent.fr/wp-content/uploads/2019/03/LINX-tableau-E_S-ecrire.png" alt="" width="733" height="645" /></p>
<p>La valeur en sortie du VI n’est pas en cm mais en largeur d’une impulsion (µs), qui est proportionnelle à la distance mesurée en cm par le lidar. Afin de lire et d’afficher une valeur en cm, il faut diviser les valeurs en sortie du VI par une constante valant 10 pour obtenir une mesure de longueur (en cm). Cette constante est la sensibilité (en µs/cm) du capteur abordé précédemment que l&rsquo;on peut retrouver dans la documentation du Lidar Lite V3 (page 4, §Mode Pin Control).</p>
<p>Une moyenne glissante pourra être développée afin d’obtenir une mesure plus stable et plus juste à l’aide des registres à décalage (flèches oranges sur les bords de la boucle While). L’inconvénient de cette technique est qu’il faudra attendre n fois le nombre de points moyennés, pour obtenir le résultat. Si l’on choisit de moyenner sur 10 points et que le temps du cadencement est de 500 ms, alors le résultat sera juste au bout de 5 secondes. Ne pas oublier d’initialiser les registres à décalage à zéro. Différents types d’indicateurs pourront être placés en face avant comme ci-dessous :</p>
<p><img decoding="async" class="alignnone size-full wp-image-1029 aligncenter" src="https://ml9zfxsqktal.i.optimole.com/w:auto/h:auto/q:mauto/f:best/https://amaury-laurent.fr/wp-content/uploads/2019/03/LINX-moyenne-glissante.png" alt="" width="1069" height="627" /></p>
<p style="text-align: center">Figure 9 Moyenne glissante (côté diagramme/code) et exemples d&rsquo;indicateurs en face avant</p>
<p>Comme le Lidar affiche une incertitude de ± 2.5 cm et une résolution de 1 cm, il a été choisi de n’afficher que des valeurs entières arrondies au centimètre.</p>
<h2><a name="_Toc2727686"></a>VI de contrôle du Driver et du moteur</h2>
<p>Un VI « écrire sur des E/S digitales » permet d’activer les sorties de l’Arduino du LattePanda afin de piloter le Driver.</p>
<p>La fonction suivante a été construite comme ci-après :</p>
<p><img decoding="async" class="size-full wp-image-1030 aligncenter" src="https://ml9zfxsqktal.i.optimole.com/w:auto/h:auto/q:mauto/f:best/https://amaury-laurent.fr/wp-content/uploads/2019/03/LINX-ecrire-E-S-digitales.png" alt="" width="186" height="156" /></p>
<p>Cette fonctionnalité permet de prendre, en entrée, un tableau de booléens (ordres des boutons pressés en face avant) et d’activer les E/S correspondantes.</p>
<ul>
<li><strong>La première entrée</strong> (en partant du haut) de la fonction « <strong>Construire un tableau</strong>» est reliée au bouton « MOTOR ON » et agit sur la Pin « ENABLE » du Driver. Ce bouton permet vraisemblablement d’activer l’alimentation du driver et du moteur.</li>
<li><strong>La seconde entrée </strong>permet de gérer la direction du moteur. Le fil (vert) est relié au bouton « RIGHT » de mon interface afin d’active la Pin « DIR » du driver. Le moteur tourne ainsi dans le sens horaire.</li>
<li><strong>La troisième entrée</strong> active la pin « STEP » du driver et permet d’effectuer un Pas de 0,9° (avec les entrées du driver MS1=MS2=MS3=0=GND). Le moteur effectue un pas par changement de niveau de l’état bas à l’état haut. Cette entrée est active si le bouton « LEFT » OU le bouton « RIGHT » est activé. Nous verrons ensuite comment faire tourner le moteur à vitesse constante.</li>
<li><strong>La quatrième entrée</strong> active le laser. Un laser de visée peut fonctionner qu’avec une tension de 5V et ne consomme que quelques milliampères. Il est souhaitable pour la sécurité des personnes, que le bouton « STOP » qui arrête le programme, puisse stopper l’émission du laser à la fin de la manip en même temps. Pour cela on pourra mettre une boucle conditions comme ci-dessous :</li>
</ul>
<p><img decoding="async" class="size-full wp-image-1031 aligncenter" src="https://ml9zfxsqktal.i.optimole.com/w:auto/h:auto/q:mauto/f:best/https://amaury-laurent.fr/wp-content/uploads/2019/03/LINX-Secu-Laser.png" alt="" width="746" height="166" /></p>
<p>Il pourra être fait de même avec l’arrêt du moteur (« MOTOR ON ») à la fin de l’exécution du programme.</p>
<ul>
<li><strong>Les cinquième, sixième et septième</strong> entrées activent les Pins MS1, MS2 et MS3 du driver et permettent de gagner en précision d’angle (jusqu’au demi pas ici).</li>
</ul>
<p>Afin de faire fonctionner le moteur à vitesse constante, la fonctionnalité suivante a été développée :</p>
<p><img decoding="async" class="size-full wp-image-1032 aligncenter" src="https://ml9zfxsqktal.i.optimole.com/w:auto/h:auto/q:mauto/f:best/https://amaury-laurent.fr/wp-content/uploads/2019/03/LINX-ecrire-signal-carre.png" alt="" width="294" height="155" /></p>
<p>Lorsqu’un booléen (bouton) active la structure « Cas », le VI « écrire un signal carré » est activé avec une fréquence nulle et d&rsquo;une durée nulle sur la pin STEP. Cette fonctionnalité m&rsquo;a permis de faire fonctionner le moteur à vitesse constante. Dans ce cas, la vitesse est fonction du temps de cadencement de la boucle (réglée à 50 ms). A l’heure où est écrit cet article, il existe surement de meilleures solutions, notamment avec le VI « PWM Set Duty Cycle »:</p>
<p><img decoding="async" class="size-full wp-image-1033 aligncenter" src="https://ml9zfxsqktal.i.optimole.com/w:auto/h:auto/q:mauto/f:best/https://amaury-laurent.fr/wp-content/uploads/2019/03/LINX-PWM.png" alt="" width="126" height="74" /></p>
<p>Mais cela n’a pas fonctionné comme il était souhaité lors du test.</p>
<p>A la suite de ces nombreux réglages et bidouillages, le programme doit pouvoir se lancer (flèche blanche non brisée). Si cela n&rsquo;est pas le cas, résoudre les erreurs unes à unes.</p>
<p>Il fortement probable que rien ne fonctionne du premier coup, ou qu’à moitié, il est alors conseillé, dans un premier temps, de vérifier les branchements (alimentation) des organes dysfonctionnant.</p>
<p>L&rsquo;utilisateur pourra jouer avec les différents types d&rsquo;actions mécaniques pour contrôler le moteur (clique droit sur un bouton) :</p>
<p><img decoding="async" class=" wp-image-1040 aligncenter" src="https://ml9zfxsqktal.i.optimole.com/w:auto/h:auto/q:mauto/f:best/https://amaury-laurent.fr/wp-content/uploads/2019/03/LabVIEW_acrion-boutons.png" alt="" width="326" height="354" /></p>
<p>&nbsp;</p>
<h1><a name="_Toc2727687"></a>Résultats en images :</h1>
<p><img decoding="async" class="size-full wp-image-1015 aligncenter" src="https://ml9zfxsqktal.i.optimole.com/w:auto/h:auto/q:mauto/f:best/https://amaury-laurent.fr/wp-content/uploads/2019/03/20190225_222601.jpg" alt="" width="4608" height="3456" /></p>
<p>Figure 10 Interface de la mesure de distance (Windows n&rsquo;est pas à l&rsquo;heure ^_^ )</p>
<p>J’espère que ce projet a pu continuer d’éveiller votre curiosité et a pu vous aider dans vos futurs développements !</p>
<h1><a name="_Toc2727688"></a>Sources :</h1>
<ul>
<li>Site Pololu (<a href="https://www.pololu.com/product/1182" target="_blank" rel="noopener">https://www.pololu.com/product/1182</a> )</li>
<li>Site GO Tronic</li>
<li><a href="https://www.lattepanda.com" target="_blank" rel="noopener">https://www.lattepanda.com</a></li>
<li>Ressources LINX : <a href="http://sine.ni.com/nips/cds/view/p/lang/fr/nid/212478" target="_blank" rel="noopener">http://sine.ni.com/nips/cds/view/p/lang/fr/nid/212478</a></li>
<li>Forum LINX : <a href="https://www.labviewmakerhub.com/doku.php?id=libraries:linx:start" target="_blank" rel="noopener">https://www.labviewmakerhub.com/doku.php?id=libraries:linx:start</a></li>
<li>Datasheet Lidar Garmin lite V3 : <a href="https://static.garmin.com/pumac/LIDAR_Lite_v3_Operation_Manual_and_Technical_Specifications.pdf" target="_blank" rel="noopener">https://static.garmin.com/pumac/LIDAR_Lite_v3_Operation_Manual_and_Technical_Specifications.pdf</a></li>
<li><em>LabVIEW &#8211; 4e édition &#8211; Programmation et applications &#8211; Introduction à LabVIEW NXG, </em>Collection : Technique et ingénierie, Dunod, Parution : août 2018,Francis Cottet, Luc Desruelle, Michel Pinard</li>
</ul>
<ul>
<li><em>The Art of electronic</em>, Third edition, Paul Horowitz et Winfield Hill</li>
</ul>
<p>Cet article <a rel="nofollow" href="https://amaury-laurent.fr/mesure-lidar-rotatif-embarque-sur-lattepanda-et-pilote-par-labview-linx/">Mesure Lidar rotatif embarqué sur LattePanda et piloté par LabVIEW (LINX)</a> est apparu en premier sur <a rel="nofollow" href="https://amaury-laurent.fr">Electronique et Informatique</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://amaury-laurent.fr/mesure-lidar-rotatif-embarque-sur-lattepanda-et-pilote-par-labview-linx/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		<enclosure url="https://amaury-laurent.fr/wp-content/uploads/2019/03/20190225_222725.mp4" length="98513038" type="video/mp4" />

			</item>
		<item>
		<title>Thermomètre USB à sonde de platine</title>
		<link>https://amaury-laurent.fr/thermometre-usb-a-sonde-de-platine/</link>
					<comments>https://amaury-laurent.fr/thermometre-usb-a-sonde-de-platine/#respond</comments>
		
		<dc:creator><![CDATA[Amaury LAURENT]]></dc:creator>
		<pubDate>Sat, 19 Sep 2015 16:32:24 +0000</pubDate>
				<category><![CDATA[Capteurs]]></category>
		<guid isPermaLink="false">http://vps200917.ovh.net/?p=65</guid>

					<description><![CDATA[<p>Ce projet vise à réaliser un thermomètre capable d&#8217;enregistrer des points, de les envoyer à un PC via USB et de permettre son utilisation en autonomie. La température est acquise par une thermorésistance en platine ou par un LM35 monté sur le circuit imprimé. Les informations sont traitées par un classique PIC18F4550 et affichées par [&#8230;]</p>
<p>Cet article <a rel="nofollow" href="https://amaury-laurent.fr/thermometre-usb-a-sonde-de-platine/">Thermomètre USB à sonde de platine</a> est apparu en premier sur <a rel="nofollow" href="https://amaury-laurent.fr">Electronique et Informatique</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Ce projet vise à réaliser un thermomètre capable d&rsquo;enregistrer des points, de les envoyer à un <em>PC</em> via USB et de permettre son utilisation en autonomie. La température est acquise par une thermorésistance en platine ou par un LM35 monté sur le circuit imprimé. Les informations sont traitées par un classique PIC18F4550 et affichées par un afficheur LCD.</p>
<h2>1 &#8211; Le conditionneur pour Pt500</h2>
<p><a href="http://vps200917.ovh.net/wp-content/uploads/2015/09/schema_cond.png" target="_blank" rel="noopener"><img decoding="async" class="aligncenter wp-image-71 size-medium" src="http://vps200917.ovh.net/wp-content/uploads/2015/09/schema_cond-300x148.png" alt="Schéma du conditionneur" width="300" height="148" /></a></p>
<p>Les thermorésistances à fil de platine sont des capteurs de température de qualité offrant une bonne répétabilitée et une grande étendue de mesure (possibilité de mesurer des températures très faibles, de l&rsquo;ordre de quelques kelvins). Malgré leur coût élevé, ces sondes de température sont très répandues pour les applications de mesure de précision.</p>
<p>D&rsquo;une manière générale, la résistance électrique des métaux augmente avec la température. En effet, la température se traduit par la vibration des atomes constitutifs de la matière autour de leur position d&rsquo;équilibre. Plus la température est élevée, plus l&rsquo;amplitude de vibration est grande.</p>
<p>Le modèle communément utilisé pour décrire les métaux est le suivant: on considère un réseau de noyaux atomiques aux positions d&rsquo;équilibre fixes baignant dans une « mer d&rsquo;électrons ». C&rsquo;est cette mer d&rsquo;électrons qui permet aux métaux de conduire l&rsquo;électricité. Une forte amplitude de vibration des atomes, donc des noyaux, va rendre le mouvement des électrons de conduction plus difficile: la résistance électrique augmente.</p>
<p><img decoding="async" class="aligncenter" src="http://promenades-quantiques.com/journal/lettres_2012/lettre_12_02/metal.jpg" alt="" width="688" height="273" /></p>
<p>La loi de variation de résistance des métaux est la suivante:</p>
<p><code><span class="katex-eq" data-katex-display="false">R(\theta ) = R_0\cdot (1 + \alpha \cdot \theta + \beta \cdot \theta^2 + \gamma \cdot \theta^3 + ...)</span></code></p>
<p>Thêta correspond à la température du fil en °C et R0 correspond à la résistance du fil à 0°C. La finesse du modèle peut être adaptée à l&rsquo;application de la sonde et à la précision recherchée. Pour le platine les coefficients sont les suivants:<br />
<code><span class="katex-eq" data-katex-display="false">\alpha = 3.9083\cdot 10^{-3} K^{-1}</span></code><br />
<code><span class="katex-eq" data-katex-display="false">\beta = -5.775\cdot 10^{-7} K^{-2}</span></code><br />
<code><span class="katex-eq" data-katex-display="false">\gamma = -4.183\cdot 10^{-12} K^{-3}</span></code><br />
Ma sonde est une Pt500. Cela signifie qu&rsquo;elle utilise un fil de platine et que sa résistance à 0°C est 500 Ohms. Le conditionneur que je propose peut bien sûr être modifié pour utiliser des Pt100, PT1000 et autres sondes résistives comme les thermistances (CTN et CTP à oxydes métalliques). Le traitement du signal devra être adapté en conséquence.</p>
<p>La mesure de la température se résume donc à une mesure de résistance. Il est possible d&rsquo;appliquer simplement la loi d&rsquo;Ohm: faire circuler un courant dans la sonde et mesurer la tension à ces bornes. Cette méthode d&rsquo;apparence simpliste offre de bons résultats. Cependant, le principal inconvénient de cette méthode est la présence d&rsquo;un mode commun. En claire, la tension correspondant à une température nulle n&rsquo;est pas 0V mais U/R0. Pour pallier à cet inconvénient, j&rsquo;ai préféré utiliser un pont de Wheatstone.</p>
<p>Le pont de Wheatstone est basé sur le principe du diviseur de tension. Il est très utilisé pour les applications de mesure, notamment le conditionnement de <a class="fancybox-iframe" href="http://fr.wikipedia.org/wiki/Jauge_de_d%C3%A9formation" target="_blank" rel="noopener noreferrer">jauges de déformation résistives</a>. L&rsquo;idée est de réaliser un pont diviseur de référence avec des résistances fixes de précision et un autre contenant le capteur, puis de mesurer la tension différentielle entre les deux points milieux des ponts. Si les résistances fixes du pont sont choisies judicieusement, il est possible d&rsquo;annuler le mode commun. S&rsquo;il n&rsquo;y a qu&rsquo;un capteur dans le pont, le montage est dit « quart de pont ». Il est possible d&rsquo;augmenter la sensibilité du pont en mettant deux ou quatre capteurs (montages demi-pont ou pont complet) à condition d&rsquo;avoir des capteurs dont la résistance varie dans des directions opposées pour une même stimulation.</p>
<p>Pour conditionner ma Pt500, j&rsquo;ai réalisé un montage quart de pont avec des résistances fixes de 500 Ohms (deux 1k en parallèle). Ainsi à 0°C, la tension de sortie du pont est égale à E/2 &#8211; E/2 = 0V (où E est la tension d&rsquo;alimentation du pont)!</p>
<p>La mesure de la tension différentielle est confiée à un amplificateur d&rsquo;instrumentation: l&rsquo;<a class="fancybox-iframe" href="http://www.ti.com/lit/ds/symlink/ina126.pdf" target="_blank" rel="noopener noreferrer">INA126</a>. Basiquement, il s&rsquo;agit d&rsquo;un montage soustracteur de tension. À la différence d&rsquo;un montage traditionnel mettant en jeu un seul amplificateur opérationnel, l&rsquo;amplificateur d&rsquo;instrumentation présente une très grande impédance sur ses deux entrées (environ 10^12 Ohms). Pour cette application, l&rsquo;INA126 peut avantageusement être remplacé par son petit frère l&rsquo;<a class="fancybox-iframe" href="http://www.ti.com/lit/ds/symlink/ina125.pdf" target="_blank" rel="noopener noreferrer">INA125</a> qui propose en plus une référence de tension pour alimenter le pont. Le gain de l&rsquo;amplificateur d&rsquo;instrumentation est fixé par une résistance externe: G = 5 + 80k/Rg. Je ne l&rsquo;ai pas connectée, ce qui m&rsquo;offre un gain de 5 qui convient parfaitement à mon application.</p>
<p>L&rsquo;INA126 est alimenté comme tous les composants du montage par le 5V issu de l&rsquo;alimentation. On se place en limite de fonctionnement de l&rsquo;amplificateur (tension mini d&rsquo;alimentation: +/- 1.35V soit 2.70V). Comme tous les amplificateurs opérationnels (à part la série des LM124, 224 et 324) il a besoin d&rsquo;une alimentation symétrique, ou au moins d&rsquo;une partie négative et d&rsquo;une partie positive, pour pouvoir amplifier des signaux tantôt positifs, tantôt négatifs. L&rsquo;INA126 à un fonctionnement un peu particulier: il a besoin d&rsquo;une tension alimentation et d&rsquo;une tension de référence. La sortie de l&rsquo;INA126 est alors: <!--?php formule_math("V_{out} = G\cdot(V_+-V_-) + V_{ref}"); ?--> dans la mesure où Vout est inférieure à la tension d&rsquo;alimentation.</p>
<p>Dans une application classique, l&rsquo;INA126 serait alimenté en +15V / -15V avec Vref = 0V. Ainsi, il pourrait amplifier tous les signaux positifs ou négatifs qui ne feraient pas saturer la sortie. Dans mon montage, je l&rsquo;ai alimenté en +5V / 0V avec Vref fixé à 1V par un potentiomètre bufferisé par un LM124 (lui aussi alimenté en +5V / 0V). Ainsi les signaux négatifs donneront ne valeur comprise entre 1V et 0V quand les signaux positifs donneront une sortie comprise entre 1V et 5V. J&rsquo;ai délibérément choisi Vref différent 2.5V pour obtenir une plus grande dynamique dans les températures positives (voir le chapitre 4 &#8211; Calculs).</p>
<p>NB:<br />
La mesure de température est l&rsquo;une des plus compliquées à réaliser: on mesure tout sauf ce qui nous intéresse (en réalité, on mesure la température de l&rsquo;élément sensible, qui peut différer sensiblement de la température que l&rsquo;on souhaite mesurer). En effet, pour mesurer une résistance électrique, il faut faire circuler un courant dedans! C&rsquo;est là qu&rsquo;intervient l&rsquo;effet Joule: P = R.I². En mesurant la résistance de la sonde de température, on l&rsquo;échauffe. Tout est question de compromis: il faut maintenir le courant assez faible pour limiter l&rsquo;échauffement, mais il faut que la tension de point milieu du pont de Wheatstone soit suffisante pour polariser l&rsquo;amplificateur d&rsquo;instrumentation. Donc en alimentant le pont avec une tension faible, on s&rsquo;assure de peut échauffer la sonde, mais l&rsquo;amplificateur risque de ne pas fonctionner (j&rsquo;ai eu des problèmes en alimentant le pont sous 50mV), par contre, en alimentant le pont avec une tension plus importante, on augmente le rapport signal sur bruit et on s&rsquo;assure la polarisation de l&rsquo;amplificateur, mais on chauffe la sonde&#8230; En alimentant le pont en 5V avec des résistances de 500 Ohms, j&rsquo;ai un courant d&rsquo;à peu près 5mA qui circule dans ma sonde, soit une puissance dissipée de 12.5mW à 0°C. À la mise sous tension, on observe une légère variation du signal de sortie due à l&rsquo;auto échauffement de la sonde, mais l&rsquo;effet reste négligeable pour des mesures courantes. Par contre si la sonde sert à mesurer la température d&rsquo;un <a class="fancybox-iframe" href="http://fr.wikipedia.org/wiki/Cryostat" target="_blank" rel="noopener noreferrer">cryostat</a>, il faut apporter un soin tout particulier au choix du courant traversant la sonde. Pour remplacer la Pt500 par une Pt100, il est souhaitable de monter une résistance de 100 Ohms en série avec le pont pour abaisser la tension d&rsquo;alimentation du pont à 2.5V. Dans ces conditions, l&rsquo;INA126 fonctionne et la sonde ne chauffe pas trop. Une astuce consistant à alimenter la sonde uniquement pendant l&rsquo;acquisition de la tension de pont peut être utilisée pour limiter l&rsquo;échauffement.</p>
<h2>2 &#8211; L&rsquo;alimentation</h2>
<p><a href="http://vps200917.ovh.net/wp-content/uploads/2015/09/schema_alim.png" target="_blank" rel="noopener"><img decoding="async" class="aligncenter wp-image-70 size-medium" src="http://vps200917.ovh.net/wp-content/uploads/2015/09/schema_alim-300x80.png" alt="Schéma de l'alimentation" width="300" height="80" /></a></p>
<p>Pour ce projet, j&rsquo;ai eu envie d&rsquo;essayer quelque chose de nouveau: une alimentation mixte sur USB et sur batterie avec possibilité de recharge de la batterie par l&rsquo;USB. Voici les problèmes auxquels je me suis heurté.</p>
<p>Tout d&rsquo;abord, pour alimenter un montage fonctionnant en 5V à partir d&rsquo;une source de tension aussi fluctuante que des piles ou une batterie, qui plus ai offrant une tension inférieure à 5V, il faut un régulateur de tension particulier. Une fois n&rsquo;est pas coutume, <a class="fancybox-iframe" href="http://www.powertrends.com/index2.htm" target="_blank" rel="noopener noreferrer">Powertrend</a> (racheté par TI) va nous simplifier la vie ! Pour l&rsquo;histoire, Powertrend est une entreprise spécialisée dans la conception de régulateurs de tension à découpage. Il propose un régulateur BOOST, le <a class="fancybox-iframe" href="http://www.ti.com/lit/ds/symlink/ptn04050c.pdf" target="_blank" rel="noopener noreferrer">PTN04050</a>, qui peut fournir une tension ajustable entre 5V et 15V sous 12W à partir d&rsquo;une alimentation comprise entre 2.65V et 5.5V. La seule contrainte est que la tension d&rsquo;alimentation doit être au moins inférieure à la tension de sorties de 0.5V. C&rsquo;est parfait me direz-vous, en mettant deux piles en série on atteint 3V, avec trois batteries en série, on monte à 3.6V, donc pas de quoi s&rsquo;inquiéter ! En effet, si le montage était exclusivement alimenté par cette source d&rsquo;énergie, il n&rsquo;y aurait pas de problème. Mais je souhaite aussi alimenter mon thermomètre depuis l&rsquo;USB, qui fournit lui du 5V&#8230; Il peut sembler idiot de réguler du 5V pour obtenir du 5V, mais dans le cas d&rsquo;une alimentation double, c&rsquo;est nécessaire.</p>
<p>Une petite pirouette électronique permet de s&rsquo;en sortir honorablement! Pour choisir la source d&rsquo;alimentation, je monte en série avec chaque source une diode AU SILICIUM (nous verrons pourquoi c&rsquo;est important&#8230;).</p>
<p>Supposant une alimentation sur batterie, donc 3.6V en entrée. Quand la batterie alimente le montage, la tension à l&rsquo;entrée du régulateur est 3.6V moins la tension de seuil de la diode (0.6V pour le silicium, cf diagramme d&rsquo;énergie des semi-conducteurs =&gt; Eg = 0.6 eV pour le silicium) donc 3V (juste aux limites de fonctionnement du régulateur!). Quand l&rsquo;USB est connecté, la tension à l&rsquo;entrée du régulateur est donc 5V &#8211; 0.6V = 4.4V (là encore aux limites de fonctionnement du régulateur). Comme les 4.4V sont supérieurs aux 3.6V de la batterie, la diode en série avec la batterie se retrouve bloquée. C&rsquo;est là que l&rsquo;utilisation de diodes au silicium est obligatoire. En mettant une diode au germanium en série avec l&rsquo;USB, on obtient en entrée du régulateur une tension de 5V-0.3V = 4.7V, trop proche du 5V de sortie, et le régulateur ne fonctionne pas correctement.</p>
<p>Enfin, une résistance de 10 Ohms entre l&rsquo;alimentation USB et une diode montée en inverse en parallèle de l&rsquo;interrupteur permettent la charge de la batterie sous un courant de (5V-3.6V-0.6V)/10 = 80mA (en réalité, les 80mA correspondent au courant de maintien, quand la batterie est complètement chargée).</p>
<h2>3 &#8211; Le montage complet</h2>
<p><a href="http://vps200917.ovh.net/wp-content/uploads/2015/09/schema.png" target="_blank" rel="noopener"><img decoding="async" class="aligncenter wp-image-69 size-medium" src="http://vps200917.ovh.net/wp-content/uploads/2015/09/schema-300x103.png" alt="Schéma général" width="300" height="103" /></a></p>
<p>La tension fournie par l&rsquo;INA126 est directement appliquée à une entrée analogique du PIC18F4550, ainsi que la tension Vref. J&rsquo;ai ajouté un LM35 pour pouvoir mesurer la température ambiante même sans la sonde Pt500. Le PIC travaille à une fréquence de 48MHz, à partir d&rsquo;un quartz oscillant à 20MHz (cf: <a class="menu_link" href="http://vps200917.ovh.net/index.php/2015/10/03/interface-usb-hid/" target="_blank" rel="noopener">interface HID</a>). Les températures sont affichées sur un écran LCD 2 lignes 16 caractères monté en mode 4bits. Le contraste et la luminosité du rétroéclairage (selon modèle) sont ajustés par deux potentiomètres. Un connecteur ICSP permet de programmer le PIC directement avec un pickit ou un autre programmateur afin de se passer d&rsquo;un bootloader USB qui ralentit considérablement le démarrage du PIC.</p>
<p>Le schéma proposé peut être amélioré en connectant l&rsquo;afficheur LCD sur un autre port pour récupérer les lignes 4 à 7 du port B (qui envoient des interruptions au microprocesseur) pour y connecter des boutons poussoirs.</p>
<h2>4 &#8211; Calculs</h2>
<p>Une fois le montage réalisé, il faut savoir comment, à partir des deux entrées analogiques du PIC, remonter à la température mesurée. Un peu de maths nous donnent rapidement la réponse:</p>
<p>Partons de la sonde. Pour une utilisation courante, je me suis fixé une dynamique de mesure allant de -40°C à +100 °C. Calculons les résistances de la sonde pour ces deux extrêmes (j&rsquo;utilise un modèle à l&rsquo;ordre un, négligeant les coefficients bêta, gamma et supérieurs):<br />
<code><span class="katex-eq" data-katex-display="false">R(-40) = 500\cdot (1 + 3.9\cdot 10^{-3}\cdot (-40)) = 422\Omega</span></code><br />
<code><span class="katex-eq" data-katex-display="false">R(100) = 500\cdot (1 + 3.9\cdot 10^{-3}\cdot 100) = 695\Omega</span></code></p>
<p>On obtient donc deux valeurs de Delta_R pour les deux extrêmes:</p>
<p><code><span class="katex-eq" data-katex-display="false">\Delta R_{min} = -78\Omega</span></code><br />
<code><span class="katex-eq" data-katex-display="false">\Delta R_{max} = 195\Omega</span></code></p>
<p>En introduisant cette sonde dans le pont suivant, on obtient:</p>
<p><a href="http://vps200917.ovh.net/wp-content/uploads/2015/09/wheatstone.png" target="_blank" rel="noopener"><img decoding="async" class="aligncenter size-medium wp-image-73" src="http://vps200917.ovh.net/wp-content/uploads/2015/09/wheatstone-278x300.png" alt="Pont de Wheatstone" width="278" height="300" /></a></p>
<p><code><span class="katex-eq" data-katex-display="false">V = E\cdot \frac{R2\cdot R3-R1\cdot R4}{(R1+R3)\cdot (R2+R4)}</span></code></p>
<p>On prend: <code><span class="katex-eq" data-katex-display="false">R1 = R2 = R3 = R_0 ; R4 = R_0 + \Delta R</span></code> en supposant de petites variations de Delta_R (inférieures à 10%), l&rsquo;expression devient:</p>
<p><code><span class="katex-eq" data-katex-display="false">V = \frac{E}{4}\cdot \frac{\Delta R}{R}</span></code></p>
<p>Cette expression bien connue est très souvent prise pour argent comptant. Cependant, pour de grandes variations de résistances, comme pour notre application, ce modèle linéaire n&rsquo;est plus valable:</p>
<p><a href="http://vps200917.ovh.net/wp-content/uploads/2015/09/simulation_wheatstone.jpg" target="_blank" rel="noopener"><img decoding="async" class="aligncenter wp-image-72 size-medium" src="http://vps200917.ovh.net/wp-content/uploads/2015/09/simulation_wheatstone-300x152.jpg" alt="Simulation de la réponse d'un pont de Wheatstone" width="300" height="152" /></a></p>
<p>Je vais donc utiliser la formule de base du pont. En la renversant, on obtient l&rsquo;expression de R(Thêta) en fonction de R0, E et V la tension mesurée aux bornes du pont.</p>
<p><code><span class="katex-eq" data-katex-display="false">R(\theta ) = \frac{-R_0\cdot (2\cdot V-E)}{2\cdot V+E}</span></code></p>
<p>En introduisant l&rsquo;expression de R(Thêta) en fonction de la température, on obtient l&rsquo;expression suivante:</p>
<p><code><span class="katex-eq" data-katex-display="false">R_0\cdot (1+\alpha \cdot \theta) = \frac{-R_0\cdot (2\cdot V-E)}{2\cdot V+E} \Leftrightarrow \theta = \frac{-4\cdot V}{\alpha \cdot V+E}</span></code></p>
<p>Nous tenons donc l&rsquo;expression de la température en fonction de la tension de déséquilibre du pont. Calculons maintenant les tensions correspondant à -40°C et 100°C afin de choisir le gain de l&rsquo;amplificateur pour bénéficier de la pleine capacité des convertisseurs du PIC. Pour ce faire, je vais utiliser le modèle linéaire du pont.</p>
<p><code><span class="katex-eq" data-katex-display="false">V(100^oC) = \frac{5}{4} \cdot \frac{195}{500} = 488mV</span></code><br />
<code><span class="katex-eq" data-katex-display="false">V(-40^oC) = \frac{5}{4} \cdot \frac{-78}{500} = -195mV</span></code></p>
<p>Ce qui donne une excursion de 488+195 = 683 mV. Pour occuper l&rsquo;excursion maximale des convertisseurs du PIC, il faut amener cette variation de 683mV au plus proche des 5V de pleine échelle. Donc un gain théorique de 5/0.683 = 7.32. J&rsquo;ai choisi de me simplifier l&rsquo;existence et de me contenter d&rsquo;un gain de 5 (qui me permet de ne pas monter la résistance Rg de l&rsquo;INA126). Avec ce gain de 5, une entrée de -40°C donne une tension de -975mV. Je choisis donc la tension Vref de l&rsquo;INA126 à 1V. La température minimale mesurable est obtenue pour une tension de déséquilibre de -1/5 = -0.2V et devient donc:</p>
<p><code><span class="katex-eq" data-katex-display="false">\Delta R = \frac{4\cdot R\cdot V}{E} = \frac{4\cdot 500\cdot -0.2}{5} = -80\Omega</span></code><br />
<code><span class="katex-eq" data-katex-display="false">\theta = \frac{-(R_0-R(\theta )}{\alpha \cdot R_0} = \frac{-(500-420)}{3.9\cdot 10^{-3} \cdot 500} = -41.0^oC</span></code></p>
<p>Pour les valeurs positives, on refait le même calcul, avec cette fois-ci une tension de déséquilibre de 4/5 = 0.8V:<br />
<code><span class="katex-eq" data-katex-display="false">\Delta R = \frac{4\cdot R\cdot V}{E} = \frac{4\cdot 500\cdot 0.8}{5} = 200\Omega</span></code><br />
<code><span class="katex-eq" data-katex-display="false">\theta = \frac{-(R_0-R(\theta )}{\alpha \cdot R_0} = \frac{-(500-700)}{3.9\cdot 10^{-3} \cdot 500} = 102.5^oC</span></code></p>
<p>Calculons maintenant le quantum de température dû à l&rsquo;échantillonnage à l&rsquo;entrée du PIC. Les convertisseurs du PIC travaillent sur 10 bits, ce qui fait 1024 points:</p>
<p><code><span class="katex-eq" data-katex-display="false">q = \frac{102.5+41}{1024} = 0.14^oC</span></code></p>
<h2>5 &#8211; Programmation</h2>
<p>Comme on ne change pas une équipe qui gagne, j&rsquo;ai utilisé MikroC pour programmer mon PIC. Le programme que je vous propose ci-dessous fait juste l’acquisition des tensions, le traitement et l&rsquo;affichage. Je ne me suis pas encore penché sur l&rsquo;interface USB et le logiciel PC de traitement de données.</p>
<div class="source">
<pre class="EnlighterJSRAW" data-enlighter-language="c">// LCD module connections
sbit LCD_RS at LATB0_bit;
sbit LCD_EN at LATB1_bit;
sbit LCD_D4 at LATB2_bit;
sbit LCD_D5 at LATB3_bit;
sbit LCD_D6 at LATB4_bit;
sbit LCD_D7 at LATB5_bit;
 
sbit LCD_RS_Direction at TRISB0_bit;
sbit LCD_EN_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB4_bit;
sbit LCD_D7_Direction at TRISB5_bit;
// End LCD module connections
 
#include "USBdsc.c"
#define TAILLE_BUFFER  64
#define TAILLE_MOYENNE 10
#define PE             5.
#define N              1024.
#define ALPHA          0.0039
#define E              5.
#define VOIE_OFFSET    2
#define VOIE_PT500     1
#define VOIE_LM35      0
#define GAIN_INA126    5
 
char ReadBuffer[TAILLE_BUFFER], WriteBuffer[TAILLE_BUFFER];
 
void Vider_Buffer(char * Buffer)
{
     char i;
     for (i=0;i&lt;TAILLE_BUFFER;i++) Buffer[i]=0;
}
 
void interrupt()
{
    if (PIR2.USBIF == 1)
    {
      USB_Interrupt_Proc();
    }
}
 
void InitPic() {
     ADCON1=0b1011;
     CMCON = 7;
     TRISB = 0;
     
//------------- USB -------------
    TRISC.f4=1;  //D-
    TRISC.f5=1;  //D+
    HID_Enable(&amp;ReadBuffer,&amp;WriteBuffer);
}
 
int GetSample (int channel) {
    int i;
    int mean;
    
    mean = 0;
    
    for (i=0; i&lt;TAILLE_MOYENNE; i++)
    {
      mean += ADC_Read(channel);
      Delay_ms(1);
    }
    mean /= TAILLE_MOYENNE;
    return mean;
}
 
void main() {
     float value;
     float offset;
     float temp_pt500 = 0;
     
     char ligne1[17];
     char ligne2[17];
     
     InitPic();
     Lcd_Init();
     Lcd_Cmd(_LCD_CLEAR);
     Lcd_Cmd(_LCD_CURSOR_OFF);
     while(1) {
              value = GetSample(VOIE_LM35) * PE / N;
              sprintf(ligne2, "LM35: %2.1f °C  ",value/0.01);
              Lcd_Out(2,1,ligne2);
              
              offset =  (GetSample(VOIE_OFFSET) * PE / N);
              value = ((GetSample(VOIE_PT500) * PE / N) - offset)/GAIN_INA126;
              temp_pt500 = (4. * value) / (ALPHA * (2.*value + E));
              sprintf(ligne1, "Pt500: %2.1f °C  ",temp_pt500);
              Lcd_Out(1,1,ligne1);
 
              Delay_ms(100);
     }
}

</pre>
</div>
<p>&nbsp;</p>
<p>Libre à vous de modifier ce code pour l&rsquo;adapter à votre application ! Bonne réalisation à vous et à la prochaine 😉 .</p>
<h4>Mise à jour: Envoie des températures par USB</h4>
<p>Afin d&rsquo;exploiter au mieux ce thermomètre, j&rsquo;ai enfin implanté un protocole de communication sur USB. Il s&rsquo;inspire de la norme <a href="http://fr.wikipedia.org/wiki/Standard_Commands_for_Programmable_Instruments" target="_blank" rel="noopener">SCPI</a> (prononcez skeepi&#8230;) utilisée pour les communications avec les instruments de mesure sur le bus <a href="http://fr.wikipedia.org/wiki/GPIB" target="_blank" rel="noopener">GPIB</a>. Le thermomètre est donc capable de répondre à certaines questions, par exemple *IDN? qui lui demande son nom.</p>
<p>Voici le code source du PIC:</p>
<div class="source">
<pre class="EnlighterJSRAW" data-enlighter-language="c">// LCD module connections
sbit LCD_RS at LATB0_bit;
sbit LCD_EN at LATB1_bit;
sbit LCD_D4 at LATB2_bit;
sbit LCD_D5 at LATB3_bit;
sbit LCD_D6 at LATB4_bit;
sbit LCD_D7 at LATB5_bit;
 
sbit LCD_RS_Direction at TRISB0_bit;
sbit LCD_EN_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB4_bit;
sbit LCD_D7_Direction at TRISB5_bit;
// End LCD module connections
 
#include "USBdsc.c"
#define TAILLE_BUFFER  64
#define TAILLE_MOYENNE 10
#define PE             5.
#define N              1024.
#define ALPHA          0.0039
#define E              5.
#define VOIE_OFFSET    2
#define VOIE_PT500     1
#define VOIE_LM35      0
#define GAIN_INA126    5
 
#define TMR0_PRECHARGE 28036
 
#define name           "Thermometre USB"
#define soft_rev       "1.1.0"
#define hard_rev       "1.0"
#define mcu            "PIC18F4550"
#define clk            "48MHz"
#define developper     "Amaury LAURENT"
#define release_date   "03/11/2012"
 
char ReadBuffer[TAILLE_BUFFER] absolute 0x500;
char WriteBuffer[TAILLE_BUFFER] absolute 0x540;
 
int GetSample (int channel);
char toogle = 0;
 
void Vider_Buffer(char * Buffer)
{
     char i;
     for (i=0;i&lt;TAILLE_BUFFER;i++) Buffer[i]=0;
}
 
void interrupt()
{
    float value;
    float offset;
    float temp_pt500 = 0;
 
    char ligne1[17];
    char ligne2[17];
    
    if (PIR2.USBIF == 1)
    {
      INTCON.TMR0IE = 0;
      USB_Interrupt_Proc();
 
      if (HID_Read() != 0) {
        Vider_Buffer(WriteBuffer);
        if (strstr(ReadBuffer, "LM35?") != 0) {
           value = GetSample(VOIE_LM35) * PE / N;
           sprintf(WriteBuffer, "%2.1f",value/0.01);
        }
        else if (strstr(ReadBuffer, "MAX35?") != 0) {
           value = 4.99;
           sprintf(WriteBuffer, "%2.1f",value/0.01);
        }
        else if (strstr(ReadBuffer, "MIN35?") != 0) {
           value = 0.0;
           sprintf(WriteBuffer, "%2.1f",value/0.01);
        }
        else if (strstr(ReadBuffer, "PT500?") != 0) {
           offset =  (GetSample(VOIE_OFFSET) * PE / N);
           value = ((GetSample(VOIE_PT500) * PE / N) - offset)/GAIN_INA126;
           temp_pt500 = (4. * value) / (ALPHA * (2.*value + E));
           sprintf(WriteBuffer, "%2.1f",temp_pt500);
        }
        else if (strstr(ReadBuffer, "MAX500?") != 0) {
           offset =  (GetSample(VOIE_OFFSET) * PE / N);
           value = (4.99 - offset)/GAIN_INA126;
           temp_pt500 = (4. * value) / (ALPHA * (2.*value + E));
           sprintf(WriteBuffer, "%2.1f",temp_pt500);
        }
        else if (strstr(ReadBuffer, "MIN500?") != 0) {
           offset =  (GetSample(VOIE_OFFSET) * PE / N);
           value = (0.0 - offset)/GAIN_INA126;
           temp_pt500 = (4. * value) / (ALPHA * (2.*value + E));
           sprintf(WriteBuffer, "%2.1f",temp_pt500);
        }
        else if (strstr(ReadBuffer, "*IDN?") != 0) {
           strcpy(WriteBuffer, name);
        }
        else if (strstr(ReadBuffer, "*SREV?") != 0) {
           strcpy(WriteBuffer, soft_rev);
        }
        else if (strstr(ReadBuffer, "*HREV?") != 0) {
           strcpy(WriteBuffer, hard_rev);
        }
        else if (strstr(ReadBuffer, "*MCU?") != 0) {
           strcpy(WriteBuffer, mcu);
        }
        else if (strstr(ReadBuffer, "*CLK?") != 0) {
           strcpy(WriteBuffer, clk);
        }
        else if (strstr(ReadBuffer, "*AGE?") != 0) {
           strcpy(WriteBuffer, release_date);
        }
        else if (strstr(ReadBuffer, "*DEV?") != 0) {
           strcpy(WriteBuffer, developper);
        }
        else {
             strcpy(WriteBuffer, "Unknown command");
        }
        while(!HID_Write(&amp;WriteBuffer, TAILLE_BUFFER));
        /*
        Lcd_Out(1,1,ReadBuffer);
        Lcd_Out(2,1,WriteBuffer);
        */
        Vider_Buffer(ReadBuffer);
      }
 
      INTCON.TMR0IE = 1;
    }
 
    if (INTCON.TMR0IF == 1) {
       PIE2.USBIE = 0;
       TMR0L = TMR0_PRECHARGE % 256;
       TMR0H = TMR0_PRECHARGE / 256;
       
       if (toogle == 0) {
          Lcd_Init();
          Lcd_Cmd(_LCD_CLEAR);
          Lcd_Cmd(_LCD_CURSOR_OFF);
          toogle = 1;
       }
 
       value = GetSample(VOIE_LM35) * PE / N;
       sprintf(ligne2, "LM35: %2.1f °C  ",value/0.01);
       Lcd_Out(2,1,ligne2);
 
       offset =  (GetSample(VOIE_OFFSET) * PE / N);
       value = ((GetSample(VOIE_PT500) * PE / N) - offset)/GAIN_INA126;
       temp_pt500 = (4. * value) / (ALPHA * (2.*value + E));
       sprintf(ligne1, "Pt500: %2.1f °C  ",temp_pt500);
       Lcd_Out(1,1,ligne1);
 
       INTCON.TMR0IF = 0;
       PIE2.USBIE = 1;
    }
}
 
void InitPic() {
     ADCON1=0b1011;
     CMCON = 7;
     TRISB = 0;
     TRISD.f0 = 0;
     TRISD.f1 = 0;
     
     LATD.f0 = 1;
     LATD.f1 = 1;
     
     //------ Display Timer IT -------
    INTCON.GIE = 1;
    INTCON.PEIE = 1;
    INTCON.TMR0IE = 1;
    PIE2.TMR1IE = 1;
 
    TMR0L = TMR0_PRECHARGE % 256;
    TMR0H = TMR0_PRECHARGE / 256;
    T0CON = 0b110000100; // PS = 32
     
    //------------- USB -------------
    TRISC.f4=1;  //D-
    TRISC.f5=1;  //D+
    HID_Enable(&amp;ReadBuffer,&amp;WriteBuffer);
}
 
int GetSample (int channel) {
    int i;
    int mean;
    
    mean = 0;
    
    for (i=0; i&lt;TAILLE_MOYENNE; i++)
    {
      mean += ADC_Read(channel);
    }
    mean /= TAILLE_MOYENNE;
    return mean;
}
 
void main() {
     
     InitPic();
 
     while(1) ;
}

</pre>
<p>&nbsp;</p>
</div>
<p>Pour communiquer avec le thermomètre, vous pouvez utiliser <a href="?page=Tutoriaux/Informatique/TutorielLabview/contenu.php">LabVIEW et les drivers VISA</a>, ou bien faire appel à la dll hid (sous Windows) pour accéder au périphérique avec d&rsquo;autres langages. Voici un exemple de logiciel écrit en C# (prononcer C sharp).</p>
<p><a class="no-ajaxy" href="http://vps200917.ovh.net/wp-content/uploads/2015/09/Programme-PIC.zip" target="_blank" rel="noopener">Télécharger le projet MikroC</a></p>
<p>Cet article <a rel="nofollow" href="https://amaury-laurent.fr/thermometre-usb-a-sonde-de-platine/">Thermomètre USB à sonde de platine</a> est apparu en premier sur <a rel="nofollow" href="https://amaury-laurent.fr">Electronique et Informatique</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://amaury-laurent.fr/thermometre-usb-a-sonde-de-platine/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Débitmètre massique</title>
		<link>https://amaury-laurent.fr/debitmetre-massique/</link>
					<comments>https://amaury-laurent.fr/debitmetre-massique/#respond</comments>
		
		<dc:creator><![CDATA[Amaury LAURENT]]></dc:creator>
		<pubDate>Sat, 19 Sep 2015 15:27:43 +0000</pubDate>
				<category><![CDATA[Capteurs]]></category>
		<guid isPermaLink="false">http://vps200917.ovh.net/?p=41</guid>

					<description><![CDATA[<p>Microprojet capteur &#8211; 4ème année d&#8217;école d&#8217;ingénieur à Polytech&#8217; Annecy-Chambéry Afin de mettre en application les connaissances vues en cours de capteur, nous avons mené un microprojet dont le but était de réaliser un capteur avec les moyens du bord. Le groupe était constitué de cinq étudiants. Après tirage au sort, nous sommes tombés sur [&#8230;]</p>
<p>Cet article <a rel="nofollow" href="https://amaury-laurent.fr/debitmetre-massique/">Débitmètre massique</a> est apparu en premier sur <a rel="nofollow" href="https://amaury-laurent.fr">Electronique et Informatique</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Microprojet capteur &#8211; 4ème année d&rsquo;école d&rsquo;ingénieur à Polytech&rsquo; Annecy-Chambéry</h1>
<p>Afin de mettre en application les connaissances vues en cours de capteur, nous avons mené un microprojet dont le but était de réaliser un capteur avec les moyens du bord. Le groupe était constitué de cinq étudiants. Après tirage au sort, nous sommes tombés sur la réalisation d&rsquo;un débitmètre massique. Voici le récit palpitant de cette épopée instrumentale!</p>
<h3>Composition du Groupe de Projet</h3>
<ul>
<li>PERRIN Jimmy</li>
<li>HOYAU Jean-Philippe</li>
<li>LAURENT Amaury</li>
<li>MATUSZEK Guillaume</li>
<li>MERCHAT Grégory</li>
</ul>
<h3>Sujet imposé</h3>
<p>Le but du projet est de concevoir et de réaliser un « débitmètre massique » à effet thermique, permettant de mesurer, soit le débit, soit la vitesse d’un fluide (qui dans notre cas sera de l’air), selon le principe de la mesure de températures dans une veine de fluide, de part et d’autre d’un système de chauffage.<br />
Il s’agira de réaliser d’une part, la partie « mécanique » comportant la prise de températures (thermocouples) et le chauffage du tube et le circuit de mesure des tensions délivrées par les sondes de température, et la partie « acquisition » d’autre part, via une carte d’acquisition et LabVIEW.</p>
<h3>Matériel à notre disposition</h3>
<ul>
<li>Carte d&rsquo;acquisition <a href="http://sine.ni.com/nips/cds/view/p/lang/en/nid/10968" target="_blank" rel="noopener"> NI DAQ PCI 6024 </a></li>
<li>2 conditionneurs pour Thermocouples type K: <a href="http://www.atis.com.cn/pdf/Texys/4_thermocouple_amplifier.pdf" target="_blank" rel="noopener"> THAK 200 </a></li>
<li>2 thermocouples types K gainés</li>
</ul>
<h3>Principe de base</h3>
<figure id="attachment_42" aria-describedby="caption-attachment-42" style="width: 300px" class="wp-caption aligncenter"><a href="http://vps200917.ovh.net/wp-content/uploads/2015/09/principe.jpg" target="_blank" rel="noopener"><img decoding="async" class="wp-image-42 size-medium" src="http://vps200917.ovh.net/wp-content/uploads/2015/09/principe-300x95.jpg" alt="Principe de la mesure de débit" width="300" height="95" /></a><figcaption id="caption-attachment-42" class="wp-caption-text">Principe de la mesure de débit</figcaption></figure>
<ol>
<li>On déroute une veine de fluide pour la faire passer dans notre capteur.</li>
<li>L’organe de chauffage communique sa puissance au fluide (et uniquement au fluide, dans l&rsquo;idéal).</li>
<li>Deux sondes de températures sont placées en amont et en aval de l&rsquo;organe de chauffage pour mesurer la différence de température.</li>
</ol>
<h3>Calculs préliminaires</h3>
<p>Le principe de base du débitmètre massique à effet thermique est de communiquer de la chaleur à un fluide. En mesurant la différence de température entre avant et après l&rsquo;élément chauffant, on arrive à remonter au débit du fluide.</p>
<p>Dans un tube de fluide, le débit massique est donné par:</p>
<p><img decoding="async" class="aligncenter" src="http://latex.codecogs.com/gif.latex?Q_m%20%3D%20%5Cfrac%7B%5CDelta%20m%7D%7B%5CDelta%20t%7D" alt="" width="83" height="37" /></p>
<p><!--?php formule_math('Q_m = \frac{\Delta m}{\Delta t}');?--></p>
<p>Où Qm est le débit massique (kg/m^3), m est la masse (kg) et t est le temps (s).</p>
<p>En outre, l&rsquo;échauffement d&rsquo;un corps est régi par la loi suivante:</p>
<p><img decoding="async" class="aligncenter" src="http://latex.codecogs.com/gif.latex?Q%20%3D%20m.C_p.dT" alt="" width="106" height="19" /></p>
<p><!--?php formule_math('Q = m.C_p.dT');?--></p>
<p>Où Q est la chaleur apportée au corps (J), m est la masse (kg), Cp est la capacité calorifique massique du fluide (J/(kg.K)) et dT est le gradient de température.</p>
<p>En différenciant cette expression, on obtient:</p>
<p><img decoding="async" class="aligncenter" src="http://latex.codecogs.com/gif.latex?%5Cfrac%7BdQ%7D%7Bdt%7D%20%3D%20%5Cfrac%7Bdm%7D%7Bdt%7D.C_p.dT" alt="" width="130" height="38" /></p>
<p><img decoding="async" class="aligncenter" src="http://latex.codecogs.com/gif.latex?%5CLeftrightarrow%20P%20%3D%20Q_m.C_p.dT" alt="" width="140" height="19" /></p>
<p>Où P est la puissance apportée au fluide et Qm sont débit massique. En mesurant dT, connaissant Cp et P, on arrive à calculer Qm.</p>
<h3>Réalisation</h3>
<figure id="attachment_50" aria-describedby="caption-attachment-50" style="width: 300px" class="wp-caption aligncenter"><a href="http://vps200917.ovh.net/wp-content/uploads/2015/09/final.jpg" target="_blank" rel="noopener"><img decoding="async" class="wp-image-50 size-medium" src="http://vps200917.ovh.net/wp-content/uploads/2015/09/final-300x225.jpg" alt="Le débitmètre final muni de son ventilateur d'essai" width="300" height="225" /></a><figcaption id="caption-attachment-50" class="wp-caption-text">Le débitmètre final muni de son ventilateur d&rsquo;essai</figcaption></figure>
<p>La première chose à faire est d&rsquo;obtenir une veine de fluide que l&rsquo;on puisse chauffer et sur laquelle on puisse effectuer nos mesures. La manière la plus simple est de la confiner dans un tuyau. De quel diamètre me direz-vous? En première approximation, je vous répondrai: « Celui que vous avez&#8230; ». En deuxième approximation, il faut que le diamètre du tube soit suffisamment important pour que l&rsquo;écoulement soit laminaire. Attention, plus le tuyau est de grand diamètre, plus la puissance de chauffage doit être importante pour un même dT.</p>
<p>Nous avons effectué plusieurs tests avec:</p>
<ul>
<li>Un tube <a href="http://www.vente-chauffage-electrique.fr/detailsElec.php?produit=20&amp;id_cat=150" target="_blank" rel="noopener">IRO</a> de 16mm</li>
<li>Un tube PVC de 32mm x 2mm</li>
<li>un tube acier de 36mm x 2mm</li>
</ul>
<p>Nous avons retenu le tuyau d&rsquo;acier pour sa bonne conduction thermique et sa bonne tenue en température (le tube iro et le PVC ont fondu assez vite&#8230;)</p>
<figure id="attachment_49" aria-describedby="caption-attachment-49" style="width: 300px" class="wp-caption aligncenter"><a href="http://vps200917.ovh.net/wp-content/uploads/2015/09/tube.jpg" target="_blank" rel="noopener"><img decoding="async" class="wp-image-49 size-medium" src="http://vps200917.ovh.net/wp-content/uploads/2015/09/tube-300x224.jpg" alt="Tentative infructueuse d'utilisation de tube IRO" width="300" height="224" /></a><figcaption id="caption-attachment-49" class="wp-caption-text">Tentative infructueuse d&rsquo;utilisation de tube IRO</figcaption></figure>
<p>Pour l&rsquo;organe de chauffage, du fil de cuivre bobiné autour du tuyau fait parfaitement l&rsquo;affaire. Nous avons essayé un grand nombre de spires de fil fin (0.16mm de diamètre) et moins de spires de fil plus gros. Le plus intéressant pour nous fut de bobiner du fil de moyenne section de façon à obtenir une résistance de 1 Ohm. Ainsi, le calcul de la puissance fournie au fluide est simplifié. Pour être sûr que la puissance de chauffage parte entièrement dans le fluide, il faut calorifuger le capteur.</p>
<figure id="attachment_48" aria-describedby="caption-attachment-48" style="width: 300px" class="wp-caption aligncenter"><a href="http://vps200917.ovh.net/wp-content/uploads/2015/09/rendu6.jpg" target="_blank" rel="noopener"><img decoding="async" class="wp-image-48 size-medium" src="http://vps200917.ovh.net/wp-content/uploads/2015/09/rendu6-300x188.jpg" alt="Principe du corps de chauffe" width="300" height="188" /></a><figcaption id="caption-attachment-48" class="wp-caption-text">Principe du corps de chauffe</figcaption></figure>
<p>Il ne reste plus qu&rsquo;à choisir une alimentation suffisante pour notre capteur et à implanter les deux thermocouples. L&rsquo;alimentation choisie est, sans surprise, une vieille alimentation de PC capable de nous fournir 25W sous 5V et 144W sous 12V.</p>
<p>Pour accélérer le démarrage du capteur, nous faisons chauffer la résistance sous 144W jusqu&rsquo;à 60°C, puis nous descendons à 25W. En restant tous le temps à 144W, le fils peut allègrement dépasser les 130 °C, température à laquelle l&rsquo;isolant du fil commence à brûler (eh oui, on a essayé&#8230;).</p>
<p>Pour réaliser des mesures répétables, nous avons fabriqué un banc de test équipé d&rsquo;un ventilateur et d&rsquo;un guide pour canaliser le flux d&rsquo;air vers le capteur.</p>
<figure id="attachment_47" aria-describedby="caption-attachment-47" style="width: 300px" class="wp-caption aligncenter"><a href="http://vps200917.ovh.net/wp-content/uploads/2015/09/rendu5.jpg" target="_blank" rel="noopener"><img decoding="async" class="wp-image-47 size-medium" src="http://vps200917.ovh.net/wp-content/uploads/2015/09/rendu5-300x188.jpg" alt="Le ventilateur de test et son guide d'air" width="300" height="188" /></a><figcaption id="caption-attachment-47" class="wp-caption-text">Le ventilateur de test et son guide d&rsquo;air</figcaption></figure>
<p>Le compte rendu de projet au format PDF: <a class="fancybox-iframe no-ajaxy" href="http://vps200917.ovh.net/wp-content/uploads/2015/09/Compte_Rendu_Microprojet.pdf" target="_blank" rel="noopener">Compte_Rendu_Microprojet.pdf</a><br />
Le programme LabVIEW: <a class="no-ajaxy" href="http://vps200917.ovh.net/wp-content/uploads/2015/09/programmes.rar" target="_blank" rel="noopener">programmes.rar</a></p>
<p>Cet article <a rel="nofollow" href="https://amaury-laurent.fr/debitmetre-massique/">Débitmètre massique</a> est apparu en premier sur <a rel="nofollow" href="https://amaury-laurent.fr">Electronique et Informatique</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://amaury-laurent.fr/debitmetre-massique/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
