<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://wiki.makilab.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Quentin</id>
	<title>Wiki Makilab - Contributions de l’utilisateur [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.makilab.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Quentin"/>
	<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php/Sp%C3%A9cial:Contributions/Quentin"/>
	<updated>2026-05-06T13:06:39Z</updated>
	<subtitle>Contributions de l’utilisateur</subtitle>
	<generator>MediaWiki 1.31.16</generator>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=Fusion360&amp;diff=3589</id>
		<title>Fusion360</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=Fusion360&amp;diff=3589"/>
		<updated>2020-09-18T14:20:20Z</updated>

		<summary type="html">&lt;p&gt;Quentin : /* Présentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:Fusion360.png|Fusion360|right]]&lt;br /&gt;
&lt;br /&gt;
== Présentation == &lt;br /&gt;
Fusion 360 est un outil complet de CAO (conception assistée par ordinateur) paramétrique développé par Autodesk (les éditeurs d'AutoCAD). Ce n’est pas un logiciel libre, mais il possède de nombreuses qualités très utiles pour vos projets au Makilab. &amp;lt;br /&amp;gt;&lt;br /&gt;
Cet outil est destiné à dessiner et concevoir des pièces 3D aussi bien mécaniques que designs. Une solution CAM puissante est intégrée à l’outil pour piloter la CNC.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
! Bien que Fusion 360 aie été considéré et recommandé comme un des logiciels de CAO les plus adaptés pour les hobbyistes, &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt; nous ne recommendons plus au Makilab son utilisation depuis les restrictions apportées à la licence hobbyiste en septembre 2020 &amp;lt;/span&amp;gt; (plus [https://linuxfr.org/users/jona/journaux/la-licence-gratuite-de-fusion-360-d-autodesk-devient-plus-restrictive de détails ici]).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Avantages et fonctionnalités ==&lt;br /&gt;
Fusion 360 est gratuit pour les hobbyistes. Pour la très grande majorité des besoins, cet outil est suffisant. Il fonctionne sous Windows et Mac.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*Découpe laser : On peut dessiner une esquisse et directement la sauver en DXF pour faire une découpe laser.&amp;lt;br /&amp;gt;&lt;br /&gt;
*Impression 3D : Après avoir dessiné votre pièce en 3D, il est possible de l’exporter en STL pour imprimer la pièce en 3D.&amp;lt;br /&amp;gt;&lt;br /&gt;
*CAM : Fusion 360 contient un mode CAM qui est puissant et gratuit. Il est possible de paramétrer les mouvements de la fraiseuse directement sur son modèle 3D et voir une simulation de la découpe (on voit la tête de la fraiseuse faire ses mouvements).&amp;lt;br /&amp;gt;&lt;br /&gt;
*Mode sculpt : C'est un mode qui se trouve entre le CAD et la DAO (orienté design), mais avec les avantages de pouvoir passer de l'un à l’autre. Ce mode permet de dessiner des pièces designs en tirant sur des surfaces pour leur donner la forme voulue.&lt;br /&gt;
*Assemblage : Si votre projet contient plusieurs pièces, vous pouvez les assembler directement dans Fusion 360. Il est possible de créer des assemblages fixes, mais également ajouter des degrés de libertés, vous pourrez donc voir le déplacement de vos pièces virtuellement.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Licences ==&lt;br /&gt;
Il existe des licences hobbyistes (gratuites) renouvelables chaque année. C’est une très bonne nouvelle pour nous, car des logiciels professionnels de cette catégorie sont généralement hors de prix.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Autodesk indique que la licence est gratuite pendant un an pour les hobbyistes et les start-up qui font moins de 100k$ par an. La licence est renouvelable chaque année aussi longtemps que vous le jugez nécessaire.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Comment installer Fusion 360 ==&lt;br /&gt;
[https://knowledge.autodesk.com/support/fusion-360/troubleshooting/caas/sfdcarticles/sfdcarticles/How-to-activate-start-up-or-educational-licensing-for-Fusion-360.html La page officielle Autodesk sur les licences hobbyistes].&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Comment exporter ses pièces en DXF pour la découpeuse laser ==&lt;br /&gt;
Vous avez un tracé dessiné dans Fusion360 et vous voulez l'exporter vers la découpeuse laser? Il y a deux possibilités pour effectuer cette opération qui dépend surtout de votre esquisse.&amp;lt;br /&amp;gt;&lt;br /&gt;
* Première possibilité :&lt;br /&gt;
::Si votre esquisse ne contient pas de spline, il suffit de faire un clic droit sur votre esquisse (dans le dossier &amp;quot;Sketches&amp;quot; de l'arborescence de votre fichier dans Fusion360) et choisir &amp;quot;Save as DXF&amp;quot;.&lt;br /&gt;
* Seconde possibilité :&lt;br /&gt;
::Votre esquisse contient des splines. La solution précédente ne fonctionnera malheureusement plus, car la plupart des programmes comme Inkscape ou [[DecoupeLaser|LaserCut5.3]] supportent seulement les DXF r14. Or le format DXF r14 ne prend pas en charge les splines, donc lorsque vous ouvrez votre DXF sauvé selon la première méthode, certaines courbes n'apparaissent pas.&lt;br /&gt;
::Afin d'obtenir un DXF, contenant vos splines, compatible avec LaserCut5.3, il faut convertir les splines en polyline. Ne vous inquiétez pas, c'est moins compliqué qu'il n'y paraît.&amp;lt;br /&amp;gt;&lt;br /&gt;
::La première étape est de se rendre dans le [https://apps.autodesk.com/FUSION/fr/Home/Index Store Autodesk] et téléchargez le add-in &amp;quot;DXF for Laser&amp;quot;. Une fois installé, lancez Fusion360 et vous pourrez trouver dans le menu &amp;quot;Sketch&amp;quot;, le bouton &amp;quot;Save DXF for laser cutting&amp;quot;. Le module vous demandera de choisir une face de votre pièce 3D. Votre fichier DXF est maintenant compatible avec LaserCut5.3 et contient toutes les courbes.&amp;lt;br /&amp;gt;&lt;br /&gt;
::Comme l'application vous demande de sélectionner une face, après avoir dessiné votre esquisse, vous devrez extruder votre esquisse pour en créer une représentation tri-dimensionnelle.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Transformer un modèle 3D en couches 2D pour la découpeuse laser ==&lt;br /&gt;
Il est possible de transformer un modèle 3D en couches 2D à coller ou emboiter afin de produire une approximation du volume 3D.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Trex-couchesassemblees.jpg|Assemblage&lt;br /&gt;
Trex-couchescollees.jpg|Collage&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
Il faut installer le add-in SLICER via le store Fusion 360. &lt;br /&gt;
Lorsque votre modèle 3D est réalisé en Fusion 360, il faut choisir Make -&amp;gt; 3D print, sélectionner le corps et choisir l'application SLICER.&lt;br /&gt;
Vous trouverez [https://www.youtube.com/watch?v=4fFH_TcI-9U ici] un tutoriel d'utilisation du slicer.&lt;br /&gt;
&lt;br /&gt;
== Tutoriel ==&lt;br /&gt;
&lt;br /&gt;
[http://www.autodesk.com/products/fusion-360/learn-training-tutorials Cours en ligne sur le site Autodesk]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
N’hésitez pas à nous aider à compléter cette page en envoyant vos remarques par [mailto:info@makilab.org mail].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Softwares]]&lt;br /&gt;
[[Catégorie:3D]]&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=Fusion360&amp;diff=3588</id>
		<title>Fusion360</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=Fusion360&amp;diff=3588"/>
		<updated>2020-09-18T14:19:01Z</updated>

		<summary type="html">&lt;p&gt;Quentin : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:Fusion360.png|Fusion360|right]]&lt;br /&gt;
&lt;br /&gt;
== Présentation == &lt;br /&gt;
Fusion 360 est un outil complet de CAO (conception assistée par ordinateur) paramétrique développé par Autodesk (les éditeurs d'AutoCAD). Ce n’est pas un logiciel libre, mais il possède de nombreuses qualités très utiles pour vos projets au Makilab. &amp;lt;br /&amp;gt;&lt;br /&gt;
Cet outil est destiné à dessiner et concevoir des pièces 3D aussi bien mécaniques que designs. Une solution CAM puissante est intégrée à l’outil pour piloter la CNC.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
! Bien que Fusion 360 aie été considéré et recommandé comme un des logiciels de CAO les plus adaptés pour les hobbyistes, nous ne recommendons plus au Makilab son utilisation depuis les restrictions apportées à la licence hobbyiste en septembre 2020 (plus [https://linuxfr.org/users/jona/journaux/la-licence-gratuite-de-fusion-360-d-autodesk-devient-plus-restrictive de détails ici]).&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Avantages et fonctionnalités ==&lt;br /&gt;
Fusion 360 est gratuit pour les hobbyistes. Pour la très grande majorité des besoins, cet outil est suffisant. Il fonctionne sous Windows et Mac.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*Découpe laser : On peut dessiner une esquisse et directement la sauver en DXF pour faire une découpe laser.&amp;lt;br /&amp;gt;&lt;br /&gt;
*Impression 3D : Après avoir dessiné votre pièce en 3D, il est possible de l’exporter en STL pour imprimer la pièce en 3D.&amp;lt;br /&amp;gt;&lt;br /&gt;
*CAM : Fusion 360 contient un mode CAM qui est puissant et gratuit. Il est possible de paramétrer les mouvements de la fraiseuse directement sur son modèle 3D et voir une simulation de la découpe (on voit la tête de la fraiseuse faire ses mouvements).&amp;lt;br /&amp;gt;&lt;br /&gt;
*Mode sculpt : C'est un mode qui se trouve entre le CAD et la DAO (orienté design), mais avec les avantages de pouvoir passer de l'un à l’autre. Ce mode permet de dessiner des pièces designs en tirant sur des surfaces pour leur donner la forme voulue.&lt;br /&gt;
*Assemblage : Si votre projet contient plusieurs pièces, vous pouvez les assembler directement dans Fusion 360. Il est possible de créer des assemblages fixes, mais également ajouter des degrés de libertés, vous pourrez donc voir le déplacement de vos pièces virtuellement.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Licences ==&lt;br /&gt;
Il existe des licences hobbyistes (gratuites) renouvelables chaque année. C’est une très bonne nouvelle pour nous, car des logiciels professionnels de cette catégorie sont généralement hors de prix.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Autodesk indique que la licence est gratuite pendant un an pour les hobbyistes et les start-up qui font moins de 100k$ par an. La licence est renouvelable chaque année aussi longtemps que vous le jugez nécessaire.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Comment installer Fusion 360 ==&lt;br /&gt;
[https://knowledge.autodesk.com/support/fusion-360/troubleshooting/caas/sfdcarticles/sfdcarticles/How-to-activate-start-up-or-educational-licensing-for-Fusion-360.html La page officielle Autodesk sur les licences hobbyistes].&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Comment exporter ses pièces en DXF pour la découpeuse laser ==&lt;br /&gt;
Vous avez un tracé dessiné dans Fusion360 et vous voulez l'exporter vers la découpeuse laser? Il y a deux possibilités pour effectuer cette opération qui dépend surtout de votre esquisse.&amp;lt;br /&amp;gt;&lt;br /&gt;
* Première possibilité :&lt;br /&gt;
::Si votre esquisse ne contient pas de spline, il suffit de faire un clic droit sur votre esquisse (dans le dossier &amp;quot;Sketches&amp;quot; de l'arborescence de votre fichier dans Fusion360) et choisir &amp;quot;Save as DXF&amp;quot;.&lt;br /&gt;
* Seconde possibilité :&lt;br /&gt;
::Votre esquisse contient des splines. La solution précédente ne fonctionnera malheureusement plus, car la plupart des programmes comme Inkscape ou [[DecoupeLaser|LaserCut5.3]] supportent seulement les DXF r14. Or le format DXF r14 ne prend pas en charge les splines, donc lorsque vous ouvrez votre DXF sauvé selon la première méthode, certaines courbes n'apparaissent pas.&lt;br /&gt;
::Afin d'obtenir un DXF, contenant vos splines, compatible avec LaserCut5.3, il faut convertir les splines en polyline. Ne vous inquiétez pas, c'est moins compliqué qu'il n'y paraît.&amp;lt;br /&amp;gt;&lt;br /&gt;
::La première étape est de se rendre dans le [https://apps.autodesk.com/FUSION/fr/Home/Index Store Autodesk] et téléchargez le add-in &amp;quot;DXF for Laser&amp;quot;. Une fois installé, lancez Fusion360 et vous pourrez trouver dans le menu &amp;quot;Sketch&amp;quot;, le bouton &amp;quot;Save DXF for laser cutting&amp;quot;. Le module vous demandera de choisir une face de votre pièce 3D. Votre fichier DXF est maintenant compatible avec LaserCut5.3 et contient toutes les courbes.&amp;lt;br /&amp;gt;&lt;br /&gt;
::Comme l'application vous demande de sélectionner une face, après avoir dessiné votre esquisse, vous devrez extruder votre esquisse pour en créer une représentation tri-dimensionnelle.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Transformer un modèle 3D en couches 2D pour la découpeuse laser ==&lt;br /&gt;
Il est possible de transformer un modèle 3D en couches 2D à coller ou emboiter afin de produire une approximation du volume 3D.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Trex-couchesassemblees.jpg|Assemblage&lt;br /&gt;
Trex-couchescollees.jpg|Collage&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
Il faut installer le add-in SLICER via le store Fusion 360. &lt;br /&gt;
Lorsque votre modèle 3D est réalisé en Fusion 360, il faut choisir Make -&amp;gt; 3D print, sélectionner le corps et choisir l'application SLICER.&lt;br /&gt;
Vous trouverez [https://www.youtube.com/watch?v=4fFH_TcI-9U ici] un tutoriel d'utilisation du slicer.&lt;br /&gt;
&lt;br /&gt;
== Tutoriel ==&lt;br /&gt;
&lt;br /&gt;
[http://www.autodesk.com/products/fusion-360/learn-training-tutorials Cours en ligne sur le site Autodesk]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
N’hésitez pas à nous aider à compléter cette page en envoyant vos remarques par [mailto:info@makilab.org mail].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Softwares]]&lt;br /&gt;
[[Catégorie:3D]]&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=RaspberryPi&amp;diff=3546</id>
		<title>RaspberryPi</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=RaspberryPi&amp;diff=3546"/>
		<updated>2019-12-30T08:28:30Z</updated>

		<summary type="html">&lt;p&gt;Quentin : /* Tutoriel &amp;amp; Formations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Raspberry Pi=&lt;br /&gt;
&lt;br /&gt;
== Présentation&amp;lt;ref&amp;gt;https://fr.wikipedia.org/wiki/Raspberry_Pi&amp;lt;/ref&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
== Tutoriel &amp;amp; Formations ==&lt;br /&gt;
Il existe des dizaines de tutoriels pour découvrir le monde RaspberryPi.&lt;br /&gt;
&lt;br /&gt;
* [https://projects.raspberrypi.org/fr-FR/projects La page projets du site officiel], il y a déjà de quoi faire, et s'est assez bien filtré/organisé. Si vous connaissez l'anglais, il y a encore plus de resources dans cette langue.&lt;br /&gt;
* [https://magpi.raspberrypi.org Le magazine officiel Raspberry Pi] (en anglais), tous les numéros sont téléchargeables gratuitement en PDF. Une adaptation française existe ([https://www.magpi.fr]), mais les numéros ne sont pas téléchargeables librement.&lt;br /&gt;
* [https://wiki.mchobby.be/index.php?title=RaspberryPi-Accueil La section Raspberry Pi du wiki MC Hobby], avec pas mal de resources en anglais.&lt;br /&gt;
* [https://www.framboise314.fr Franboise 314], un des blogs de références en français, (attention, ça part parfois dans tous les sens).&lt;br /&gt;
&lt;br /&gt;
Les support des formations données au Makilab:&lt;br /&gt;
* [[Fichier:Formation RPi - bases - 20190518.pdf]]&lt;br /&gt;
* [[Fichier:Formation_RPi_-_avancé_-_20190615.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Références ==&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=RaspberryPi&amp;diff=3545</id>
		<title>RaspberryPi</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=RaspberryPi&amp;diff=3545"/>
		<updated>2019-12-30T08:25:58Z</updated>

		<summary type="html">&lt;p&gt;Quentin : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Raspberry Pi=&lt;br /&gt;
&lt;br /&gt;
== Présentation&amp;lt;ref&amp;gt;https://fr.wikipedia.org/wiki/Raspberry_Pi&amp;lt;/ref&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
== Tutoriel &amp;amp; Formations ==&lt;br /&gt;
Il existe des dizaines de tutoriels pour découvrir le monde RaspberryPi.&lt;br /&gt;
&lt;br /&gt;
* [https://projects.raspberrypi.org/fr-FR/projects La page projets du site officiel], il y a déjà de quoi faire, et s'est assez bien filtré/organisé. Si vous connaissez l'anglais, il y a encore plus de resources dans cette langue.&lt;br /&gt;
* [https://magpi.raspberrypi.org Le magazine officiel Raspberry Pi] (en anglais), tous les numéros sont téléchargeables gratuitement en PDF. Une adaptation française existe ([https://www.magpi.fr]), mais les numéros ne sont pas téléchargeables librement.&lt;br /&gt;
* [https://www.framboise314.fr Franboise 314], un des blogs de références en français, (attention, ça part parfois dans tous les sens).&lt;br /&gt;
&lt;br /&gt;
Les support des formations données au Makilab:&lt;br /&gt;
* [[Fichier:Formation RPi - bases - 20190518.pdf]]&lt;br /&gt;
* [[Fichier:Formation_RPi_-_avancé_-_20190615.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Références ==&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=Fichier:Formation_RPi_-_avanc%C3%A9_-_20190615.pdf&amp;diff=3544</id>
		<title>Fichier:Formation RPi - avancé - 20190615.pdf</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=Fichier:Formation_RPi_-_avanc%C3%A9_-_20190615.pdf&amp;diff=3544"/>
		<updated>2019-12-30T08:25:35Z</updated>

		<summary type="html">&lt;p&gt;Quentin : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=MediaWiki:Sidebar&amp;diff=3543</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=MediaWiki:Sidebar&amp;diff=3543"/>
		<updated>2019-12-30T08:20:02Z</updated>

		<summary type="html">&lt;p&gt;Quentin : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** help:aide|help&lt;br /&gt;
* Les Machines&lt;br /&gt;
** Imprimante3D|L'imprimante 3D BQ&lt;br /&gt;
** Imprimante3DUP|L'imprimante 3D UP mini&lt;br /&gt;
** DecoupeLaser|La découpe laser&lt;br /&gt;
** DecoupeVinyle|La découpe vinyle&lt;br /&gt;
** CNC-Stepcraft | La fraiseuse numérique&lt;br /&gt;
** BibliothèqueFraises | Les fraises&lt;br /&gt;
* Les Softwares&lt;br /&gt;
** Blender|Blender&lt;br /&gt;
** Cura|Cura&lt;br /&gt;
** DesignSparkM | DesignSpark&lt;br /&gt;
** FreeCad | FreeCad&lt;br /&gt;
** Fusion360 | Fusion360&lt;br /&gt;
** Inkscape|Inkscape&lt;br /&gt;
** Meshlab | Meshlab&lt;br /&gt;
** Openscad | Openscad&lt;br /&gt;
* L'électronique&lt;br /&gt;
** Arduino|Arduino&lt;br /&gt;
** RaspberryPi | Raspberry Pi&lt;br /&gt;
** Pico | L'Oscilloscope USB&lt;br /&gt;
* Le monde des Makers&lt;br /&gt;
** Bibliothèques | Bibliothèques d'objets&lt;br /&gt;
** PlaceList| Maker Places in Belgium&lt;br /&gt;
&lt;br /&gt;
* Aspects pratiques&lt;br /&gt;
** ROI|ROI&lt;br /&gt;
** Tarifs|Tarifs&lt;br /&gt;
** Login| Login et mot de passe&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=MediaWiki:Sidebar&amp;diff=3542</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=MediaWiki:Sidebar&amp;diff=3542"/>
		<updated>2019-12-30T08:19:41Z</updated>

		<summary type="html">&lt;p&gt;Quentin : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** help:aide|help&lt;br /&gt;
* Les Machines&lt;br /&gt;
** Imprimante3D|L'imprimante 3D BQ&lt;br /&gt;
** Imprimante3DUP|L'imprimante 3D UP mini&lt;br /&gt;
** DecoupeLaser|La découpe laser&lt;br /&gt;
** DecoupeVinyle|La découpe vinyle&lt;br /&gt;
** CNC-Stepcraft | La fraiseuse numérique&lt;br /&gt;
** BibliothèqueFraises | Les fraises&lt;br /&gt;
* Les Softwares&lt;br /&gt;
** Blender|Blender&lt;br /&gt;
** Cura|Cura&lt;br /&gt;
** DesignSparkM | DesignSpark&lt;br /&gt;
** FreeCad | FreeCad&lt;br /&gt;
** Fusion360 | Fusion360&lt;br /&gt;
** Inkscape|Inkscape&lt;br /&gt;
** Meshlab | Meshlab&lt;br /&gt;
** Openscad | Openscad&lt;br /&gt;
* L'électronique&lt;br /&gt;
** Arduino|Arduino&lt;br /&gt;
** RaspberrryPi | Raspberry Pi&lt;br /&gt;
** Pico | L'Oscilloscope USB&lt;br /&gt;
* Le monde des Makers&lt;br /&gt;
** Bibliothèques | Bibliothèques d'objets&lt;br /&gt;
** PlaceList| Maker Places in Belgium&lt;br /&gt;
&lt;br /&gt;
* Aspects pratiques&lt;br /&gt;
** ROI|ROI&lt;br /&gt;
** Tarifs|Tarifs&lt;br /&gt;
** Login| Login et mot de passe&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=Arduino&amp;diff=3541</id>
		<title>Arduino</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=Arduino&amp;diff=3541"/>
		<updated>2019-12-30T08:18:08Z</updated>

		<summary type="html">&lt;p&gt;Quentin : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:ArduinoLogo.png|Arduino|204px|right]]&lt;br /&gt;
&lt;br /&gt;
= Arduino =&lt;br /&gt;
&lt;br /&gt;
Ci-dessous, la présentation Arduino utilisée lors de la formation organisée au Makilab.&lt;br /&gt;
&lt;br /&gt;
[[Média:Arduino.pdf|Arduino.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Présentation&amp;lt;ref&amp;gt;https://fr.wikipedia.org/wiki/Arduino&amp;lt;/ref&amp;gt; ==&lt;br /&gt;
Arduino est un circuit imprimé en matériel libre (dont les plans de la carte elle-même sont publiés en licence libre dont certains composants de la carte, comme le microcontrôleur par exemple, ne sont pas en licence libre) sur lequel se trouve un microcontrôleur qui peut être programmé pour analyser et produire des signaux électriques, de manière à effectuer des tâches très diverses comme la domotique (le contrôle des appareils domestiques - éclairage, chauffage…), le pilotage d'un robot, etc.&lt;br /&gt;
&lt;br /&gt;
C'est une plateforme basée sur une interface entrée/sortie simple. Il était destiné à l'origine principalement mais pas exclusivement à la programmation multimédia interactive en vue de spectacle ou d'animations artistiques.&lt;br /&gt;
&lt;br /&gt;
Arduino peut être utilisé pour construire des objets interactifs indépendants (prototypage rapide), ou bien peut être connecté à un ordinateur pour communiquer avec ses logiciels&lt;br /&gt;
&lt;br /&gt;
== Téléchargement ==&lt;br /&gt;
Le logiciel de programmation est librement téléchargeable sur le site de &lt;br /&gt;
[http://arduino.cc/ Arduino] dans la catégorie [http://arduino.cc/en/Main/Software &amp;quot;Download&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
== Contenus des kits ==&lt;br /&gt;
* 14 LED blanches &lt;br /&gt;
* 5 résistances de 1kOhms &amp;lt;/br&amp;gt;&lt;br /&gt;
* 5 résistances de 10kOhms &amp;lt;/br&amp;gt;&lt;br /&gt;
* 8 résistances de 220 Ohms &amp;lt;/br&amp;gt;&lt;br /&gt;
* 1 potentiometre de 40kOhms &amp;lt;br&amp;gt;&lt;br /&gt;
* motor pas à pas 5V avec driver board [http://www.geeetech.com/wiki/index.php/Stepper_Motor_5V_4-Phase_5-Wire_%26_ULN2003_Driver_Board_for_Arduino &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 servomoteur [http://arduino.cc/en/Tutorial/sweep &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 afficheur 7 segments [http://www.engineersgarage.com/electronic-components/7-segment-display &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 afficheur 4x7 segments [http://learn.parallax.com/4-digit-7-segment-led-display-arduino-demo &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 afficheur LCD [http://www.openhacks.com/uploadsproductos/eone-1602a1.pdf &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 matrice de LED 8X8 [http://oomlout.com/8X8M/8X8M-Guide.pdf: &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 commande à distance infrarouge [http://www.instructables.com/id/Controlling-an-Arduino-Board-Using-an-Infrared-Rem/ &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 récepteur infrarouge&lt;br /&gt;
&lt;br /&gt;
* 1 capteur de température LM 35 [http://www.ti.com/lit/ds/symlink/lm35.pdf &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 NXP Semiconductors	8-bit serial-in, serial or parallel-out shift register  [http://pdf.datasheetcatalog.com/datasheet/NXP_Semiconductors/74HC_HCT595.pdf &amp;quot;Informations Techniques]&lt;br /&gt;
&lt;br /&gt;
== Tutoriel &amp;amp; Formations ==&lt;br /&gt;
Comme d'habitude, il existe des centaines de tutoriels pour découvrir le monde arduino.&lt;br /&gt;
* [http://uploads.siteduzero.com/pdf/515602-arduino-pour-bien-commencer-en-electronique-et-en-programmation.pdf le site du zero]&lt;br /&gt;
Un tutoriel très efficace mais qui n'est plus maintenu à jour.&lt;br /&gt;
* [http://eskimon.fr/ Le blog d'eskimon] L'auteur du premier tutoriel a déménagé ici...&lt;br /&gt;
&lt;br /&gt;
Les support des formations données au Makilab:&lt;br /&gt;
* [[Fichier:Formation Arduino - bases - 20190216.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Références ==&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=RaspberryPi&amp;diff=3540</id>
		<title>RaspberryPi</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=RaspberryPi&amp;diff=3540"/>
		<updated>2019-12-30T08:17:58Z</updated>

		<summary type="html">&lt;p&gt;Quentin : Page créée avec « = Raspberry Pi=  == Présentation&amp;lt;ref&amp;gt;https://fr.wikipedia.org/wiki/Raspberry_Pi&amp;lt;/ref&amp;gt; ==  == Tutoriel &amp;amp; Formations == Il existe des dizaines de tutoriels pour découvrir... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Raspberry Pi=&lt;br /&gt;
&lt;br /&gt;
== Présentation&amp;lt;ref&amp;gt;https://fr.wikipedia.org/wiki/Raspberry_Pi&amp;lt;/ref&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
== Tutoriel &amp;amp; Formations ==&lt;br /&gt;
Il existe des dizaines de tutoriels pour découvrir le monde RaspberryPi.&lt;br /&gt;
&lt;br /&gt;
* [https://projects.raspberrypi.org/fr-FR/projects La page projets du site officiel], il y a déjà de quoi faire, et s'est assez bien filtré/organisé. Si vous connaissez l'anglais, il y a encore plus de resources dans cette langue.&lt;br /&gt;
* [https://magpi.raspberrypi.org Le magazine officiel Raspberry Pi] (en anglais), tous les numéros sont téléchargeables gratuitement en PDF. Une adaptation française existe ([https://www.magpi.fr]), mais les numéros ne sont pas téléchargeables librement.&lt;br /&gt;
* [https://www.framboise314.fr Franboise 314], un des blogs de références en français, (attention, ça part parfois dans tous les sens).&lt;br /&gt;
&lt;br /&gt;
Les support des formations données au Makilab:&lt;br /&gt;
* [[Fichier:Formation RPi - bases - 20190518.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Références ==&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=Fichier:Formation_RPi_-_bases_-_20190518.pdf&amp;diff=3435</id>
		<title>Fichier:Formation RPi - bases - 20190518.pdf</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=Fichier:Formation_RPi_-_bases_-_20190518.pdf&amp;diff=3435"/>
		<updated>2019-05-20T08:30:53Z</updated>

		<summary type="html">&lt;p&gt;Quentin : Quentin a téléversé une nouvelle version de Fichier:Formation RPi - bases - 20190518.pdf&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
License CC-BY-SA&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=Fichier:Formation_Arduino_-_bases_-_20190216.pdf&amp;diff=3434</id>
		<title>Fichier:Formation Arduino - bases - 20190216.pdf</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=Fichier:Formation_Arduino_-_bases_-_20190216.pdf&amp;diff=3434"/>
		<updated>2019-05-20T08:29:52Z</updated>

		<summary type="html">&lt;p&gt;Quentin : Quentin a téléversé une nouvelle version de Fichier:Formation Arduino - bases - 20190216.pdf&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=Fichier:Formation_Arduino_-_bases_-_20190216.pdf&amp;diff=3433</id>
		<title>Fichier:Formation Arduino - bases - 20190216.pdf</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=Fichier:Formation_Arduino_-_bases_-_20190216.pdf&amp;diff=3433"/>
		<updated>2019-05-20T08:27:19Z</updated>

		<summary type="html">&lt;p&gt;Quentin : Quentin a téléversé une nouvelle version de Fichier:Formation Arduino - bases - 20190216.pdf&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=Fichier:Formation_RPi_-_bases_-_20190518.pdf&amp;diff=3432</id>
		<title>Fichier:Formation RPi - bases - 20190518.pdf</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=Fichier:Formation_RPi_-_bases_-_20190518.pdf&amp;diff=3432"/>
		<updated>2019-05-20T08:21:17Z</updated>

		<summary type="html">&lt;p&gt;Quentin : Quentin a téléversé une nouvelle version de Fichier:Formation RPi - bases - 20190518.pdf&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
License CC-BY-SA&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=Fichier:Formation_RPi_-_bases_-_20190518.pdf&amp;diff=3431</id>
		<title>Fichier:Formation RPi - bases - 20190518.pdf</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=Fichier:Formation_RPi_-_bases_-_20190518.pdf&amp;diff=3431"/>
		<updated>2019-05-20T08:20:26Z</updated>

		<summary type="html">&lt;p&gt;Quentin : Quentin a téléversé une nouvelle version de Fichier:Formation RPi - bases - 20190518.pdf&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
License CC-BY-SA&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=Fichier:Formation_RPi_-_bases_-_20190518.pdf&amp;diff=3430</id>
		<title>Fichier:Formation RPi - bases - 20190518.pdf</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=Fichier:Formation_RPi_-_bases_-_20190518.pdf&amp;diff=3430"/>
		<updated>2019-05-20T08:10:05Z</updated>

		<summary type="html">&lt;p&gt;Quentin : Quentin a téléversé une nouvelle version de Fichier:Formation RPi - bases - 20190518.pdf&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
License CC-BY-SA&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=Arduino&amp;diff=3429</id>
		<title>Arduino</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=Arduino&amp;diff=3429"/>
		<updated>2019-05-19T18:57:26Z</updated>

		<summary type="html">&lt;p&gt;Quentin : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:ArduinoLogo.png|Arduino|204px|right]]&lt;br /&gt;
&lt;br /&gt;
= Arduino =&lt;br /&gt;
&lt;br /&gt;
Ci-dessous, la présentation Arduino utilisée lors de la formation organisée au Makilab.&lt;br /&gt;
&lt;br /&gt;
[[Média:Arduino.pdf|Arduino.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Présentation&amp;lt;ref&amp;gt;https://fr.wikipedia.org/wiki/Arduino&amp;lt;/ref&amp;gt; ==&lt;br /&gt;
Arduino est un circuit imprimé en matériel libre (dont les plans de la carte elle-même sont publiés en licence libre dont certains composants de la carte, comme le microcontrôleur par exemple, ne sont pas en licence libre) sur lequel se trouve un microcontrôleur qui peut être programmé pour analyser et produire des signaux électriques, de manière à effectuer des tâches très diverses comme la domotique (le contrôle des appareils domestiques - éclairage, chauffage…), le pilotage d'un robot, etc.&lt;br /&gt;
&lt;br /&gt;
C'est une plateforme basée sur une interface entrée/sortie simple. Il était destiné à l'origine principalement mais pas exclusivement à la programmation multimédia interactive en vue de spectacle ou d'animations artistiques.&lt;br /&gt;
&lt;br /&gt;
Arduino peut être utilisé pour construire des objets interactifs indépendants (prototypage rapide), ou bien peut être connecté à un ordinateur pour communiquer avec ses logiciels&lt;br /&gt;
&lt;br /&gt;
== Téléchargement ==&lt;br /&gt;
Le logiciel de programmation est librement téléchargeable sur le site de &lt;br /&gt;
[http://arduino.cc/ Arduino] dans la catégorie [http://arduino.cc/en/Main/Software &amp;quot;Download&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
== Contenus des kits ==&lt;br /&gt;
* 14 LED blanches &lt;br /&gt;
* 5 résistances de 1kOhms &amp;lt;/br&amp;gt;&lt;br /&gt;
* 5 résistances de 10kOhms &amp;lt;/br&amp;gt;&lt;br /&gt;
* 8 résistances de 220 Ohms &amp;lt;/br&amp;gt;&lt;br /&gt;
* 1 potentiometre de 40kOhms &amp;lt;br&amp;gt;&lt;br /&gt;
* motor pas à pas 5V avec driver board [http://www.geeetech.com/wiki/index.php/Stepper_Motor_5V_4-Phase_5-Wire_%26_ULN2003_Driver_Board_for_Arduino &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 servomoteur [http://arduino.cc/en/Tutorial/sweep &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 afficheur 7 segments [http://www.engineersgarage.com/electronic-components/7-segment-display &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 afficheur 4x7 segments [http://learn.parallax.com/4-digit-7-segment-led-display-arduino-demo &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 afficheur LCD [http://www.openhacks.com/uploadsproductos/eone-1602a1.pdf &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 matrice de LED 8X8 [http://oomlout.com/8X8M/8X8M-Guide.pdf: &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 commande à distance infrarouge [http://www.instructables.com/id/Controlling-an-Arduino-Board-Using-an-Infrared-Rem/ &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 récepteur infrarouge&lt;br /&gt;
&lt;br /&gt;
* 1 capteur de température LM 35 [http://www.ti.com/lit/ds/symlink/lm35.pdf &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 NXP Semiconductors	8-bit serial-in, serial or parallel-out shift register  [http://pdf.datasheetcatalog.com/datasheet/NXP_Semiconductors/74HC_HCT595.pdf &amp;quot;Informations Techniques]&lt;br /&gt;
&lt;br /&gt;
== Tutoriel &amp;amp; Formations ==&lt;br /&gt;
Comme d'habitude, il existe des centaines de tutoriels pour découvrir le monde arduino.&lt;br /&gt;
* [http://uploads.siteduzero.com/pdf/515602-arduino-pour-bien-commencer-en-electronique-et-en-programmation.pdf le site du zero]&lt;br /&gt;
Un tutoriel très efficace mais qui n'est plus maintenu à jour.&lt;br /&gt;
* [http://eskimon.fr/ Le blog d'eskimon] L'auteur du premier tutoriel a déménagé ici...&lt;br /&gt;
&lt;br /&gt;
Les support des formations données au Makilab:&lt;br /&gt;
* [[Fichier:Formation Arduino - bases - 20190216.pdf]]&lt;br /&gt;
* [[Fichier:Formation RPi - bases - 20190518.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Références ==&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=Fichier:Formation_RPi_-_bases_-_20190518.pdf&amp;diff=3428</id>
		<title>Fichier:Formation RPi - bases - 20190518.pdf</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=Fichier:Formation_RPi_-_bases_-_20190518.pdf&amp;diff=3428"/>
		<updated>2019-05-19T18:56:34Z</updated>

		<summary type="html">&lt;p&gt;Quentin : License CC-BY-SA&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
License CC-BY-SA&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=Arduino&amp;diff=3427</id>
		<title>Arduino</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=Arduino&amp;diff=3427"/>
		<updated>2019-05-19T18:42:27Z</updated>

		<summary type="html">&lt;p&gt;Quentin : /* Tutoriel &amp;amp; Formations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:ArduinoLogo.png|Arduino|204px|right]]&lt;br /&gt;
&lt;br /&gt;
= Arduino =&lt;br /&gt;
&lt;br /&gt;
Ci-dessous, la présentation Arduino utilisée lors de la formation organisée au Makilab.&lt;br /&gt;
&lt;br /&gt;
[[Média:Arduino.pdf|Arduino.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Présentation&amp;lt;ref&amp;gt;https://fr.wikipedia.org/wiki/Arduino&amp;lt;/ref&amp;gt; ==&lt;br /&gt;
Arduino est un circuit imprimé en matériel libre (dont les plans de la carte elle-même sont publiés en licence libre dont certains composants de la carte, comme le microcontrôleur par exemple, ne sont pas en licence libre) sur lequel se trouve un microcontrôleur qui peut être programmé pour analyser et produire des signaux électriques, de manière à effectuer des tâches très diverses comme la domotique (le contrôle des appareils domestiques - éclairage, chauffage…), le pilotage d'un robot, etc.&lt;br /&gt;
&lt;br /&gt;
C'est une plateforme basée sur une interface entrée/sortie simple. Il était destiné à l'origine principalement mais pas exclusivement à la programmation multimédia interactive en vue de spectacle ou d'animations artistiques.&lt;br /&gt;
&lt;br /&gt;
Arduino peut être utilisé pour construire des objets interactifs indépendants (prototypage rapide), ou bien peut être connecté à un ordinateur pour communiquer avec ses logiciels&lt;br /&gt;
&lt;br /&gt;
== Téléchargement ==&lt;br /&gt;
Le logiciel de programmation est librement téléchargeable sur le site de &lt;br /&gt;
[http://arduino.cc/ Arduino] dans la catégorie [http://arduino.cc/en/Main/Software &amp;quot;Download&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
== Contenus des kits ==&lt;br /&gt;
* 14 LED blanches &lt;br /&gt;
* 5 résistances de 1kOhms &amp;lt;/br&amp;gt;&lt;br /&gt;
* 5 résistances de 10kOhms &amp;lt;/br&amp;gt;&lt;br /&gt;
* 8 résistances de 220 Ohms &amp;lt;/br&amp;gt;&lt;br /&gt;
* 1 potentiometre de 40kOhms &amp;lt;br&amp;gt;&lt;br /&gt;
* motor pas à pas 5V avec driver board [http://www.geeetech.com/wiki/index.php/Stepper_Motor_5V_4-Phase_5-Wire_%26_ULN2003_Driver_Board_for_Arduino &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 servomoteur [http://arduino.cc/en/Tutorial/sweep &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 afficheur 7 segments [http://www.engineersgarage.com/electronic-components/7-segment-display &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 afficheur 4x7 segments [http://learn.parallax.com/4-digit-7-segment-led-display-arduino-demo &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 afficheur LCD [http://www.openhacks.com/uploadsproductos/eone-1602a1.pdf &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 matrice de LED 8X8 [http://oomlout.com/8X8M/8X8M-Guide.pdf: &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 commande à distance infrarouge [http://www.instructables.com/id/Controlling-an-Arduino-Board-Using-an-Infrared-Rem/ &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 récepteur infrarouge&lt;br /&gt;
&lt;br /&gt;
* 1 capteur de température LM 35 [http://www.ti.com/lit/ds/symlink/lm35.pdf &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 NXP Semiconductors	8-bit serial-in, serial or parallel-out shift register  [http://pdf.datasheetcatalog.com/datasheet/NXP_Semiconductors/74HC_HCT595.pdf &amp;quot;Informations Techniques]&lt;br /&gt;
&lt;br /&gt;
== Tutoriel &amp;amp; Formations ==&lt;br /&gt;
Comme d'habitude, il existe des centaines de tutoriels pour découvrir le monde arduino.&lt;br /&gt;
* [http://uploads.siteduzero.com/pdf/515602-arduino-pour-bien-commencer-en-electronique-et-en-programmation.pdf le site du zero]&lt;br /&gt;
Un tutoriel très efficace mais qui n'est plus maintenu à jour.&lt;br /&gt;
* [http://eskimon.fr/ Le blog d'eskimon] L'auteur du premier tutoriel a déménagé ici...&lt;br /&gt;
&lt;br /&gt;
Les support des formations données au Makilab:&lt;br /&gt;
* [[Fichier:Formation Arduino - bases - 20190216.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Références ==&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=Arduino&amp;diff=3426</id>
		<title>Arduino</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=Arduino&amp;diff=3426"/>
		<updated>2019-05-19T18:38:23Z</updated>

		<summary type="html">&lt;p&gt;Quentin : /* Tutoriel &amp;amp; Formations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:ArduinoLogo.png|Arduino|204px|right]]&lt;br /&gt;
&lt;br /&gt;
= Arduino =&lt;br /&gt;
&lt;br /&gt;
Ci-dessous, la présentation Arduino utilisée lors de la formation organisée au Makilab.&lt;br /&gt;
&lt;br /&gt;
[[Média:Arduino.pdf|Arduino.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Présentation&amp;lt;ref&amp;gt;https://fr.wikipedia.org/wiki/Arduino&amp;lt;/ref&amp;gt; ==&lt;br /&gt;
Arduino est un circuit imprimé en matériel libre (dont les plans de la carte elle-même sont publiés en licence libre dont certains composants de la carte, comme le microcontrôleur par exemple, ne sont pas en licence libre) sur lequel se trouve un microcontrôleur qui peut être programmé pour analyser et produire des signaux électriques, de manière à effectuer des tâches très diverses comme la domotique (le contrôle des appareils domestiques - éclairage, chauffage…), le pilotage d'un robot, etc.&lt;br /&gt;
&lt;br /&gt;
C'est une plateforme basée sur une interface entrée/sortie simple. Il était destiné à l'origine principalement mais pas exclusivement à la programmation multimédia interactive en vue de spectacle ou d'animations artistiques.&lt;br /&gt;
&lt;br /&gt;
Arduino peut être utilisé pour construire des objets interactifs indépendants (prototypage rapide), ou bien peut être connecté à un ordinateur pour communiquer avec ses logiciels&lt;br /&gt;
&lt;br /&gt;
== Téléchargement ==&lt;br /&gt;
Le logiciel de programmation est librement téléchargeable sur le site de &lt;br /&gt;
[http://arduino.cc/ Arduino] dans la catégorie [http://arduino.cc/en/Main/Software &amp;quot;Download&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
== Contenus des kits ==&lt;br /&gt;
* 14 LED blanches &lt;br /&gt;
* 5 résistances de 1kOhms &amp;lt;/br&amp;gt;&lt;br /&gt;
* 5 résistances de 10kOhms &amp;lt;/br&amp;gt;&lt;br /&gt;
* 8 résistances de 220 Ohms &amp;lt;/br&amp;gt;&lt;br /&gt;
* 1 potentiometre de 40kOhms &amp;lt;br&amp;gt;&lt;br /&gt;
* motor pas à pas 5V avec driver board [http://www.geeetech.com/wiki/index.php/Stepper_Motor_5V_4-Phase_5-Wire_%26_ULN2003_Driver_Board_for_Arduino &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 servomoteur [http://arduino.cc/en/Tutorial/sweep &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 afficheur 7 segments [http://www.engineersgarage.com/electronic-components/7-segment-display &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 afficheur 4x7 segments [http://learn.parallax.com/4-digit-7-segment-led-display-arduino-demo &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 afficheur LCD [http://www.openhacks.com/uploadsproductos/eone-1602a1.pdf &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 matrice de LED 8X8 [http://oomlout.com/8X8M/8X8M-Guide.pdf: &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 commande à distance infrarouge [http://www.instructables.com/id/Controlling-an-Arduino-Board-Using-an-Infrared-Rem/ &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 récepteur infrarouge&lt;br /&gt;
&lt;br /&gt;
* 1 capteur de température LM 35 [http://www.ti.com/lit/ds/symlink/lm35.pdf &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 NXP Semiconductors	8-bit serial-in, serial or parallel-out shift register  [http://pdf.datasheetcatalog.com/datasheet/NXP_Semiconductors/74HC_HCT595.pdf &amp;quot;Informations Techniques]&lt;br /&gt;
&lt;br /&gt;
== Tutoriel &amp;amp; Formations ==&lt;br /&gt;
Comme d'habitude, il existe des centaines de tutoriels pour découvrir le monde arduino.&lt;br /&gt;
* [http://uploads.siteduzero.com/pdf/515602-arduino-pour-bien-commencer-en-electronique-et-en-programmation.pdf le site du zero]&lt;br /&gt;
Un tutoriel très efficace mais qui n'est plus maintenu à jour.&lt;br /&gt;
* [http://eskimon.fr/ Le blog d'eskimon] L'auteur du premier tutoriel a déménagé ici...&lt;br /&gt;
&lt;br /&gt;
Les support des formations données au Makilab:&lt;br /&gt;
* [[Fichier:Formation Arduino - bases - 20190216.pdf | La formation Arduino - les bases données en février 2019]]&lt;br /&gt;
&lt;br /&gt;
== Références ==&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=Arduino&amp;diff=3425</id>
		<title>Arduino</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=Arduino&amp;diff=3425"/>
		<updated>2019-05-19T18:37:41Z</updated>

		<summary type="html">&lt;p&gt;Quentin : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:ArduinoLogo.png|Arduino|204px|right]]&lt;br /&gt;
&lt;br /&gt;
= Arduino =&lt;br /&gt;
&lt;br /&gt;
Ci-dessous, la présentation Arduino utilisée lors de la formation organisée au Makilab.&lt;br /&gt;
&lt;br /&gt;
[[Média:Arduino.pdf|Arduino.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Présentation&amp;lt;ref&amp;gt;https://fr.wikipedia.org/wiki/Arduino&amp;lt;/ref&amp;gt; ==&lt;br /&gt;
Arduino est un circuit imprimé en matériel libre (dont les plans de la carte elle-même sont publiés en licence libre dont certains composants de la carte, comme le microcontrôleur par exemple, ne sont pas en licence libre) sur lequel se trouve un microcontrôleur qui peut être programmé pour analyser et produire des signaux électriques, de manière à effectuer des tâches très diverses comme la domotique (le contrôle des appareils domestiques - éclairage, chauffage…), le pilotage d'un robot, etc.&lt;br /&gt;
&lt;br /&gt;
C'est une plateforme basée sur une interface entrée/sortie simple. Il était destiné à l'origine principalement mais pas exclusivement à la programmation multimédia interactive en vue de spectacle ou d'animations artistiques.&lt;br /&gt;
&lt;br /&gt;
Arduino peut être utilisé pour construire des objets interactifs indépendants (prototypage rapide), ou bien peut être connecté à un ordinateur pour communiquer avec ses logiciels&lt;br /&gt;
&lt;br /&gt;
== Téléchargement ==&lt;br /&gt;
Le logiciel de programmation est librement téléchargeable sur le site de &lt;br /&gt;
[http://arduino.cc/ Arduino] dans la catégorie [http://arduino.cc/en/Main/Software &amp;quot;Download&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
== Contenus des kits ==&lt;br /&gt;
* 14 LED blanches &lt;br /&gt;
* 5 résistances de 1kOhms &amp;lt;/br&amp;gt;&lt;br /&gt;
* 5 résistances de 10kOhms &amp;lt;/br&amp;gt;&lt;br /&gt;
* 8 résistances de 220 Ohms &amp;lt;/br&amp;gt;&lt;br /&gt;
* 1 potentiometre de 40kOhms &amp;lt;br&amp;gt;&lt;br /&gt;
* motor pas à pas 5V avec driver board [http://www.geeetech.com/wiki/index.php/Stepper_Motor_5V_4-Phase_5-Wire_%26_ULN2003_Driver_Board_for_Arduino &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 servomoteur [http://arduino.cc/en/Tutorial/sweep &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 afficheur 7 segments [http://www.engineersgarage.com/electronic-components/7-segment-display &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 afficheur 4x7 segments [http://learn.parallax.com/4-digit-7-segment-led-display-arduino-demo &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 afficheur LCD [http://www.openhacks.com/uploadsproductos/eone-1602a1.pdf &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 matrice de LED 8X8 [http://oomlout.com/8X8M/8X8M-Guide.pdf: &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 commande à distance infrarouge [http://www.instructables.com/id/Controlling-an-Arduino-Board-Using-an-Infrared-Rem/ &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 récepteur infrarouge&lt;br /&gt;
&lt;br /&gt;
* 1 capteur de température LM 35 [http://www.ti.com/lit/ds/symlink/lm35.pdf &amp;quot;Informations Techniques&amp;quot;]&lt;br /&gt;
* 1 NXP Semiconductors	8-bit serial-in, serial or parallel-out shift register  [http://pdf.datasheetcatalog.com/datasheet/NXP_Semiconductors/74HC_HCT595.pdf &amp;quot;Informations Techniques]&lt;br /&gt;
&lt;br /&gt;
== Tutoriel &amp;amp; Formations ==&lt;br /&gt;
Comme d'habitude, il existe des centaines de tutoriels pour découvrir le monde arduino.&lt;br /&gt;
* [http://uploads.siteduzero.com/pdf/515602-arduino-pour-bien-commencer-en-electronique-et-en-programmation.pdf le site du zero]&lt;br /&gt;
Un tutoriel très efficace mais qui n'est plus maintenu à jour.&lt;br /&gt;
* [http://eskimon.fr/ Le blog d'eskimon] L'auteur du premier tutoriel a déménagé ici...&lt;br /&gt;
&lt;br /&gt;
Les support des formations données au Makilab:&lt;br /&gt;
* [Fichier:Formation Arduino - bases - 20190216.pdf | La formation Arduino - les bases données en février 2019]&lt;br /&gt;
== Références ==&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=Accueil&amp;diff=3424</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=Accueil&amp;diff=3424"/>
		<updated>2019-05-05T11:13:25Z</updated>

		<summary type="html">&lt;p&gt;Quentin : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div id=&amp;quot;mainpage_topbox&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;mainpage_pagetitle&amp;quot;&amp;gt;'''Bienvenue sur le [[wikipédia:Wiki|wiki]] du [http://makilab.org Makilab]'''&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpage_boxcontents&amp;quot;&amp;gt;&amp;lt;div id=&amp;quot;mf-intro&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il est destiné aux membres et contient des informations sur les [[:Catégorie:Machines|machines]] que l'on peut trouver au Makilab, les [[:Catégorie:Softwares|logiciels]] qui peuvent être utilisés tant pour la conception que pour la réalisation et sur des [[:Catégorie:Projets|projets]] réalisés dans le lab.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez voir [[Spécial:Toutes_les_pages|liste de toutes les pages]] ou naviguer par [[Spécial:Catégories|catégories]] (ou faire une recherche ;-D).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{| role=&amp;quot;presentation&amp;quot; style=&amp;quot;border:0; margin: 0;&amp;quot; width=&amp;quot;100%&amp;quot; cellspacing=&amp;quot;10&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; class=&amp;quot;mainpage_hubbox&amp;quot; |&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpage_hubtitle&amp;quot;&amp;gt;'''Liste des machines'''&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpage_boxcontents&amp;quot;&amp;gt;&lt;br /&gt;
[[Image:Machines.svg|x80px|center|link=:Catégorie:Machines]]&lt;br /&gt;
&amp;lt;div id=&amp;quot;mf-users&amp;quot; title=&amp;quot;Users&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;strong class=&amp;quot;mainpage_boxcontents_title&amp;quot;&amp;gt;[[:Catégorie:Machines|MACHINES]]&amp;lt;/strong&amp;gt;&lt;br /&gt;
* '''[[Imprimante3D|Imprimante 3D Witbox]]'''&lt;br /&gt;
* '''[[Imprimante3DUP|Imprimante 3D Up!]]'''&lt;br /&gt;
* '''[[DecoupeLaser|Découpe laser]]'''&lt;br /&gt;
* '''[[DecoupeVinyle|Découpe vinyle]]'''&lt;br /&gt;
* '''[[CNC-Stepcraft|Fraiseuse numérique - Stepcraft 2/840]]'''&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; class=&amp;quot;mainpage_hubbox&amp;quot; |&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpage_hubtitle&amp;quot;&amp;gt;'''Liste des logiciels recommandés'''&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpage_boxcontents&amp;quot;&amp;gt;&lt;br /&gt;
[[Image:Logiciels.svg|x80px|center|link=:Catégorie:Softwares]]&lt;br /&gt;
&amp;lt;div id=&amp;quot;mf-admins&amp;quot; title=&amp;quot;Logiciels&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;strong class=&amp;quot;mainpage_boxcontents_title&amp;quot;&amp;gt;[[:Catégorie:Softwares|LOGICIELS]]&amp;lt;/strong&amp;gt;&lt;br /&gt;
* Modélisation 3D:&lt;br /&gt;
** Dessin assisté par ordinateur (&amp;quot;artistique&amp;quot;):&lt;br /&gt;
*** '''[[Blender]]'''&lt;br /&gt;
** Conception assisté par ordinateur (&amp;quot;technique&amp;quot;):&lt;br /&gt;
*** '''[[Fusion360|Fusion 360]]'''&lt;br /&gt;
*** '''[[DesignSparkM|Design Spark Mechanical]]'''&lt;br /&gt;
*** '''[[FreeCad]]''' (plus avancé)&lt;br /&gt;
*** '''[[Openscad|OpenSCAD]]''' (ninja)&lt;br /&gt;
* &amp;quot;Slicer&amp;quot; (logiciel de préparation d'impression 3D):&lt;br /&gt;
** '''[[Cura]]'''&lt;br /&gt;
* Visualisation d'objet 3D: '''[[Meshlab]]'''&lt;br /&gt;
* Dessin vectoriel: '''[[Inkscape]]'''&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; class=&amp;quot;mainpage_hubbox&amp;quot; |&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpage_hubtitle&amp;quot;&amp;gt;'''Liste des projets'''&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpage_boxcontents&amp;quot;&amp;gt;&lt;br /&gt;
[[Image:projets.svg|x80px|center|link=:Catégorie:Projets]]&lt;br /&gt;
&amp;lt;div id=&amp;quot;mf-devs&amp;quot; title=&amp;quot;Projets&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;strong class=&amp;quot;mainpage_boxcontents_title&amp;quot;&amp;gt;[[:Catégorie:Projets|PROJETS]]&amp;lt;/strong&amp;gt;&lt;br /&gt;
* '''[[MakiCade]]''' (finalisé)&lt;br /&gt;
* '''[[CellarKare]]''' (en cours)&lt;br /&gt;
* '''[[GBE|Graham Bell Experiment]]''' (abandonné)&lt;br /&gt;
* '''[[Maquette d'architecture]]''' (finalisé)&lt;br /&gt;
* '''Micro-éolienne à axe horizontal imprimée en 3D''' ('''[[Micro-éolienne à axe horizontal imprimée en 3D|en français]]''' / '''[[3D-printed horizontal-axis micro wind turbine|in English]]''') (finalisé)&lt;br /&gt;
* '''[[SimpleSumo]]'''&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
{| role=&amp;quot;presentation&amp;quot; style=&amp;quot;border:0; margin: 0;&amp;quot; width=&amp;quot;100%&amp;quot; cellspacing=&amp;quot;10&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; class=&amp;quot;mainpage_hubbox&amp;quot; |&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpage_hubtitle&amp;quot;&amp;gt;'''Techniques spéciales'''&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpage_boxcontents&amp;quot;&amp;gt;&lt;br /&gt;
[[Image:questionMark.svg|x80px|center|link=:Catégorie:Projets]]&lt;br /&gt;
&amp;lt;div id=&amp;quot;mf-devs&amp;quot; title=&amp;quot;Techniques spéciales&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;strong class=&amp;quot;mainpage_boxcontents_title&amp;quot;&amp;gt;&amp;lt;/strong&amp;gt;&lt;br /&gt;
* [[Coller un film vinyle (PVC) sur une surface en plastique]]&lt;br /&gt;
* [[Moulage de résine dans du silicone]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; class=&amp;quot;mainpage_hubbox&amp;quot; |&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpage_hubtitle&amp;quot;&amp;gt;'''Autres'''&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpage_boxcontents&amp;quot;&amp;gt;&lt;br /&gt;
[[Image:questionMark.svg|x80px|center|link=:Catégorie:Projets]]&lt;br /&gt;
&amp;lt;div id=&amp;quot;mf-devs&amp;quot; title=&amp;quot;Autres&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;strong class=&amp;quot;mainpage_boxcontents_title&amp;quot;&amp;gt;&amp;lt;/strong&amp;gt;&lt;br /&gt;
* [[Bibliothèques|Bibliothèques d'objets]]&lt;br /&gt;
* Kits [[Arduino]] disponibles au Makilab&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Si vous désirez contribuer à ce wiki, n'hésitez pas à vous inscrire (pour des raisons de spams, nous avons désactivé l'inscription automatique, pour vous inscrire, il suffit de nous envoyer un [mailto:info@makilab.org mail] !&lt;br /&gt;
&lt;br /&gt;
Consultez le [//meta.wikimedia.org/wiki/Aide:Contenu Guide de l’utilisateur] pour plus d’informations sur l’utilisation de ce logiciel.&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=MakiCade&amp;diff=3423</id>
		<title>MakiCade</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=MakiCade&amp;diff=3423"/>
		<updated>2019-05-05T11:12:13Z</updated>

		<summary type="html">&lt;p&gt;Quentin : /* L'OS: RetroPie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Makicade1.jpg|thumb|100px]]&lt;br /&gt;
[[Image:Makicade2.jpg|thumb|100px]]&lt;br /&gt;
[[Image:Makicade3.jpg|thumb|100px]]&lt;br /&gt;
[[Image:Makicade4.jpg|thumb|100px]]&lt;br /&gt;
Un projet lancé par --[[Utilisateur:Quentin|Quentin]] ([[Discussion utilisateur:Quentin|discussion]]) le 1&amp;lt;sup&amp;gt;er&amp;lt;/sup&amp;gt; Mars 2018 (CEST)&lt;br /&gt;
&lt;br /&gt;
= En bref =&lt;br /&gt;
Une borne d'arcade pour jouer au Makilab en attendant une découpe ou une impression. Au départ, l'idée était de prendre un [https://shop.pimoroni.com/products/picade kit Picade], mais comme [[Utilisateur:Kris|Kris]] nous a gentiment fait don d'un kit de joystick et boutons d'arcade, je me suis dis que c'était un signe pour faire une version complètement personnelle de la borne ;-)&lt;br /&gt;
&lt;br /&gt;
= Les joysticks/Boutons =&lt;br /&gt;
Le kit gentiment donné par Kris est un kit &amp;quot;[https://www.ultimarc.com/ipac2.html I-Pac 2]&amp;quot; de chez Ultimarc.&lt;br /&gt;
L'installation est relativement simple, et assez bien détaillée sur leur site.&lt;br /&gt;
&lt;br /&gt;
= Le boitier =&lt;br /&gt;
Le point de départ sera le design proposé par [https://hackaday.io/project/10649-boxespy la libraire Boxes.py], dont le créateur a eu la bonne idée de proposer [https://www.festi.info/boxes.py/ une interface en ligne].&lt;br /&gt;
&lt;br /&gt;
Le design est dispo sur [https://gitlab.com/qberten/makicade/tree/master/cad Gitlab]&lt;br /&gt;
&lt;br /&gt;
= L'OS: RecalBox =&lt;br /&gt;
En recherchant un peu dans les différentes options possibles pour la distribution Linux, il y a pas mal d'options:&lt;br /&gt;
* [https://retropie.org.uk/ RetroPie]&lt;br /&gt;
* [http://www.lakka.tv/ Lakka]&lt;br /&gt;
* [https://www.recalbox.com/fr/ RecalBox]&lt;br /&gt;
* ...&lt;br /&gt;
Après rapide comparaison, j'ai opté pour RecalBox: cette distribution linux ne fait que console de jeux, mais elle le fait bien, et la configuration de base &amp;quot;juste marche&amp;quot;.&lt;br /&gt;
La seule modification apportée: le script de base pour la gestion des boutons d'aliementation a été modifié pour utilisé d'autres pin (script modifié [https://gitlab.com/qberten/makicade/tree/master/recalbox ici])&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Projets]]&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=MakiCade&amp;diff=3422</id>
		<title>MakiCade</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=MakiCade&amp;diff=3422"/>
		<updated>2019-05-05T11:00:41Z</updated>

		<summary type="html">&lt;p&gt;Quentin : /* Le boitier */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Makicade1.jpg|thumb|100px]]&lt;br /&gt;
[[Image:Makicade2.jpg|thumb|100px]]&lt;br /&gt;
[[Image:Makicade3.jpg|thumb|100px]]&lt;br /&gt;
[[Image:Makicade4.jpg|thumb|100px]]&lt;br /&gt;
Un projet lancé par --[[Utilisateur:Quentin|Quentin]] ([[Discussion utilisateur:Quentin|discussion]]) le 1&amp;lt;sup&amp;gt;er&amp;lt;/sup&amp;gt; Mars 2018 (CEST)&lt;br /&gt;
&lt;br /&gt;
= En bref =&lt;br /&gt;
Une borne d'arcade pour jouer au Makilab en attendant une découpe ou une impression. Au départ, l'idée était de prendre un [https://shop.pimoroni.com/products/picade kit Picade], mais comme [[Utilisateur:Kris|Kris]] nous a gentiment fait don d'un kit de joystick et boutons d'arcade, je me suis dis que c'était un signe pour faire une version complètement personnelle de la borne ;-)&lt;br /&gt;
&lt;br /&gt;
= Les joysticks/Boutons =&lt;br /&gt;
Le kit gentiment donné par Kris est un kit &amp;quot;[https://www.ultimarc.com/ipac2.html I-Pac 2]&amp;quot; de chez Ultimarc.&lt;br /&gt;
L'installation est relativement simple, et assez bien détaillée sur leur site.&lt;br /&gt;
&lt;br /&gt;
= Le boitier =&lt;br /&gt;
Le point de départ sera le design proposé par [https://hackaday.io/project/10649-boxespy la libraire Boxes.py], dont le créateur a eu la bonne idée de proposer [https://www.festi.info/boxes.py/ une interface en ligne].&lt;br /&gt;
&lt;br /&gt;
Le design est dispo sur [https://gitlab.com/qberten/makicade/tree/master/cad Gitlab]&lt;br /&gt;
&lt;br /&gt;
= L'OS: RetroPie =&lt;br /&gt;
Le standard de-facto pour les bornes d'arcade émulée sur un Raspberry Pi, c'est [https://retropie.org.uk/ RetroPie].&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Projets]]&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=DecoupeLaser&amp;diff=3419</id>
		<title>DecoupeLaser</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=DecoupeLaser&amp;diff=3419"/>
		<updated>2019-03-25T10:15:03Z</updated>

		<summary type="html">&lt;p&gt;Quentin : /* Faire des boîtes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:DecoupeLaserML.png|La découpe laser|500px|thumb]]&lt;br /&gt;
La découpe laser permet de découper et/ou de graver divers matériaux (bois, certains plastiques, cartons, papier, cuir, etc.).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La machine du Makilab: &lt;br /&gt;
&lt;br /&gt;
'''Surface de travail''' de 60x40cm et le laser a une puissance de 80 W.&lt;br /&gt;
&lt;br /&gt;
'''Les formats d'entrée''' supportés sont : &lt;br /&gt;
* BMP&lt;br /&gt;
* PLT&lt;br /&gt;
* DST&lt;br /&gt;
* DXF&lt;br /&gt;
* AI&lt;br /&gt;
* CDR&lt;br /&gt;
Nous conseillons le '''BMP''' pour le travail matriciel (gravure) et le '''DXF''' pour le vectoriel (supporté par Inkscape). Lors de la sauvegarde en DXF, utiliser la version AutocadR14 de préférence (les nouvelles fonctionnalités du DXF sont parfois mal gérées).&lt;br /&gt;
&lt;br /&gt;
Si vous voulez avoir différents réglages (niveaux de gravure) pour le même travail, nous conseillons d'appliquer une couleur à chaque réglage ou alors, de faire autant de fichiers que de réglages.&lt;br /&gt;
&lt;br /&gt;
'''Matériaux supportés''': bois, acrylique, plexiglass (!!! Vérifier auprès de votre fournisseur que l'utilisation laser est bien appropriée !!!)&lt;br /&gt;
&lt;br /&gt;
'''Non supportés''': métaux&lt;br /&gt;
&lt;br /&gt;
Pour avoir une idée des bons paramètres (vitesse et puissance), voici un [http://www.rabbitlaserusa.com/Manuals/SpeedsFeeds_RL.pdf petit tableaux (pdf)] (le site regorge d'infos : http://www.rabbitlaserusa.com/ManualsTutorials.html). Pour la gravure sur bois, nous conseillons de ne pas paramétrer une vitesse inférieure à 100 (un essai à 30 a donné un résultat carbonisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le logiciel utilisé pour contrôler la découpeuse est LaserCut ([http://makilab.org/sites/default/files/manuel_lasercut_francais.pdf Manuel], nous avons la version &amp;quot;universelle&amp;quot;)&amp;lt;ref&amp;gt;http://www.leetro.com/english/sale/manual.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Paramètres d'Inkscape ==&lt;br /&gt;
&lt;br /&gt;
Avant de sortir le travail, convertir tous les objects vers des chemins (Menu &amp;quot;Path&amp;quot; &amp;gt; Object to Path).&lt;br /&gt;
&lt;br /&gt;
Lors de la sauvegarde en DXF, ne pas sélectionner &amp;quot;use LWPOLYLINE type of line output&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Expériences == &lt;br /&gt;
Les essais laser de Monsieur Martin [http://wiki.makilab.org/index.php/EssaisLaser | Essai Laser]&lt;br /&gt;
&lt;br /&gt;
== Aller plus loin ==&lt;br /&gt;
&lt;br /&gt;
La présentation &amp;quot;avancée&amp;quot; répond à toutes une série de questions, [[Média:Formation_Laser_advanced_-_Makilab_-_11_oct_2015.pdf |  première édition donnée au Makilab le 11/10/2015)]].&lt;br /&gt;
&lt;br /&gt;
=== Faire des boîtes ===&lt;br /&gt;
&lt;br /&gt;
Il n'est pas nécessaire de dessiner toutes les dents à la main pour faire une boîte. Des logiciels peuvent le faire pour vous :&lt;br /&gt;
&lt;br /&gt;
* [http://www.twot.eu/111000/111000.html Plugin] pour [[Inkscape]]&lt;br /&gt;
* [http://boxmaker.connectionlab.org/ Boxmaker], un site pour obtenir les plans faire de boîtes &amp;quot;à tenons&amp;quot;&lt;br /&gt;
* [https://makeabox.io/ Make A Box], idem, pour des boîtes &amp;quot;à tenons&amp;quot;.&lt;br /&gt;
* [http://www.makercase.com/ MakeCase], avec pas mal d'options pour les tenons.&lt;br /&gt;
* [http://www.festi.info/boxes.py/ Boxes.py], la Rolls-Royce, avec pleins d'options (inclus les boîtes avec charnières flexibles).&lt;br /&gt;
* [http://www.packmage.com// PackMage], un autre site qui propose la même chose pour des boîtes en carton.&lt;br /&gt;
* [https://www.templatemaker.nl/ Templatemaker], spécialisé dans les boîtes et formes diverses en carton.&lt;br /&gt;
&lt;br /&gt;
Et encore plus d'infos dans le [http://www.instructables.com/id/The-Ultimate-Guide-to-Laser-cut-Box-Generators/ &amp;quot;Guide Ultime des générateurs de boîtes découpées au laser&amp;quot;] sur Instructables (en anglais).&lt;br /&gt;
&lt;br /&gt;
=== Optimiser les chutes ===&lt;br /&gt;
&lt;br /&gt;
Il existe un site pour améliorer l'emboitement des pièces d'un travail : http://svgnest.com/ (il prend du SVG en entrée, comme son nom l'indique !)&lt;br /&gt;
&lt;br /&gt;
== Opération / maintenance ==&lt;br /&gt;
&lt;br /&gt;
[[Image:Plaque instructions lasercut.jpg|Instructions d'utilisation|500px|thumb]]&lt;br /&gt;
* Les instructions générales (aussi maffichées à côté de la machine ;-) sont reproduites ici: &lt;br /&gt;
* Ne pas utiliser la machine sans le lit en nid d'abeille sur des planches d'épaisseur &amp;lt; ~ 20mm. L'axe Z va arriver en fin de course matérielle lors de la calibration Z=0 et forcer sur les axes: il n'y a pas de switch de fin de course sur l'axe Z.&lt;br /&gt;
* Si la table n'est plus horizontale, la procédure pour la réaligner est décrite ici: [[DecoupeLaserMaintenanceHorizontalite]].&lt;br /&gt;
&lt;br /&gt;
== Règles de sécurité Découpe Laser ==&lt;br /&gt;
* Ne pas contourner le système de sécurité, la machine ne peut fonctionner qu'à capot fermer&lt;br /&gt;
* En cas de comportement anormal de la machine, pressez le bouton d'arrêt d'urgence&lt;br /&gt;
* Vérifiez que l'extracteur de fumée est allumé&lt;br /&gt;
* Ne laissez pas la machine sans surveillance&lt;br /&gt;
&lt;br /&gt;
== Voir aussi ==&lt;br /&gt;
* [http://www.mllaser-co2.com/ml-w640.ws Fiche descriptive de la machine]&lt;br /&gt;
* [https://wiki.makilab.org/images/8/8a/Certificat_CE_laser.pdf Certificat de conformité]&lt;br /&gt;
* [http://www.atxhackerspace.org/wiki/Laser_Cutter_Materials Description en anglais des materiaux pouvant être utilisés]&lt;br /&gt;
* [https://docs.google.com/document/d/1FBl1hGjOUD_eQzHXYJvKVGYDYi1p2eSAhRKZmqyRHRc/ Carnet de route de Russ Sadler à la découverte de la découpeuse laser, en anglais]&lt;br /&gt;
&lt;br /&gt;
== Références ==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Machines]]&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=DecoupeLaser&amp;diff=3418</id>
		<title>DecoupeLaser</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=DecoupeLaser&amp;diff=3418"/>
		<updated>2019-03-25T10:14:33Z</updated>

		<summary type="html">&lt;p&gt;Quentin : /* Faire des boîtes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:DecoupeLaserML.png|La découpe laser|500px|thumb]]&lt;br /&gt;
La découpe laser permet de découper et/ou de graver divers matériaux (bois, certains plastiques, cartons, papier, cuir, etc.).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La machine du Makilab: &lt;br /&gt;
&lt;br /&gt;
'''Surface de travail''' de 60x40cm et le laser a une puissance de 80 W.&lt;br /&gt;
&lt;br /&gt;
'''Les formats d'entrée''' supportés sont : &lt;br /&gt;
* BMP&lt;br /&gt;
* PLT&lt;br /&gt;
* DST&lt;br /&gt;
* DXF&lt;br /&gt;
* AI&lt;br /&gt;
* CDR&lt;br /&gt;
Nous conseillons le '''BMP''' pour le travail matriciel (gravure) et le '''DXF''' pour le vectoriel (supporté par Inkscape). Lors de la sauvegarde en DXF, utiliser la version AutocadR14 de préférence (les nouvelles fonctionnalités du DXF sont parfois mal gérées).&lt;br /&gt;
&lt;br /&gt;
Si vous voulez avoir différents réglages (niveaux de gravure) pour le même travail, nous conseillons d'appliquer une couleur à chaque réglage ou alors, de faire autant de fichiers que de réglages.&lt;br /&gt;
&lt;br /&gt;
'''Matériaux supportés''': bois, acrylique, plexiglass (!!! Vérifier auprès de votre fournisseur que l'utilisation laser est bien appropriée !!!)&lt;br /&gt;
&lt;br /&gt;
'''Non supportés''': métaux&lt;br /&gt;
&lt;br /&gt;
Pour avoir une idée des bons paramètres (vitesse et puissance), voici un [http://www.rabbitlaserusa.com/Manuals/SpeedsFeeds_RL.pdf petit tableaux (pdf)] (le site regorge d'infos : http://www.rabbitlaserusa.com/ManualsTutorials.html). Pour la gravure sur bois, nous conseillons de ne pas paramétrer une vitesse inférieure à 100 (un essai à 30 a donné un résultat carbonisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le logiciel utilisé pour contrôler la découpeuse est LaserCut ([http://makilab.org/sites/default/files/manuel_lasercut_francais.pdf Manuel], nous avons la version &amp;quot;universelle&amp;quot;)&amp;lt;ref&amp;gt;http://www.leetro.com/english/sale/manual.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Paramètres d'Inkscape ==&lt;br /&gt;
&lt;br /&gt;
Avant de sortir le travail, convertir tous les objects vers des chemins (Menu &amp;quot;Path&amp;quot; &amp;gt; Object to Path).&lt;br /&gt;
&lt;br /&gt;
Lors de la sauvegarde en DXF, ne pas sélectionner &amp;quot;use LWPOLYLINE type of line output&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Expériences == &lt;br /&gt;
Les essais laser de Monsieur Martin [http://wiki.makilab.org/index.php/EssaisLaser | Essai Laser]&lt;br /&gt;
&lt;br /&gt;
== Aller plus loin ==&lt;br /&gt;
&lt;br /&gt;
La présentation &amp;quot;avancée&amp;quot; répond à toutes une série de questions, [[Média:Formation_Laser_advanced_-_Makilab_-_11_oct_2015.pdf |  première édition donnée au Makilab le 11/10/2015)]].&lt;br /&gt;
&lt;br /&gt;
=== Faire des boîtes ===&lt;br /&gt;
&lt;br /&gt;
Il n'est pas nécessaire de dessiner toutes les dents à la main pour faire une boîte. Des logiciels peuvent le faire pour vous :&lt;br /&gt;
&lt;br /&gt;
* [http://www.twot.eu/111000/111000.html Plugin] pour [[Inkscape]]&lt;br /&gt;
* [http://boxmaker.connectionlab.org/ Boxmaker], un site pour obtenir les plans faire de boîtes &amp;quot;à tenons&amp;quot;&lt;br /&gt;
* [https://makeabox.io/ Make A Box], idem, pour des boîtes &amp;quot;à tenons&amp;quot;.&lt;br /&gt;
* [http://www.makercase.com/ MakeCase], avec pas mal d'options pour les tenons.&lt;br /&gt;
* [http://www.festi.info/boxes.py/ Boxes.py], la Rolls-Royce, avec pleins d'options (inclus les boîtes avec charnières flexibles).&lt;br /&gt;
* [http://www.packmage.com// PackMage], un autre site qui propose la même chose pour des boîtes en carton.&lt;br /&gt;
* [https://www.templatemaker.nl/], spécialisé dans les boîtes et formes diverses en carton.&lt;br /&gt;
&lt;br /&gt;
Et encore plus d'infos dans le [http://www.instructables.com/id/The-Ultimate-Guide-to-Laser-cut-Box-Generators/ &amp;quot;Guide Ultime des générateurs de boîtes découpées au laser&amp;quot;] sur Instructables (en anglais).&lt;br /&gt;
&lt;br /&gt;
=== Optimiser les chutes ===&lt;br /&gt;
&lt;br /&gt;
Il existe un site pour améliorer l'emboitement des pièces d'un travail : http://svgnest.com/ (il prend du SVG en entrée, comme son nom l'indique !)&lt;br /&gt;
&lt;br /&gt;
== Opération / maintenance ==&lt;br /&gt;
&lt;br /&gt;
[[Image:Plaque instructions lasercut.jpg|Instructions d'utilisation|500px|thumb]]&lt;br /&gt;
* Les instructions générales (aussi maffichées à côté de la machine ;-) sont reproduites ici: &lt;br /&gt;
* Ne pas utiliser la machine sans le lit en nid d'abeille sur des planches d'épaisseur &amp;lt; ~ 20mm. L'axe Z va arriver en fin de course matérielle lors de la calibration Z=0 et forcer sur les axes: il n'y a pas de switch de fin de course sur l'axe Z.&lt;br /&gt;
* Si la table n'est plus horizontale, la procédure pour la réaligner est décrite ici: [[DecoupeLaserMaintenanceHorizontalite]].&lt;br /&gt;
&lt;br /&gt;
== Règles de sécurité Découpe Laser ==&lt;br /&gt;
* Ne pas contourner le système de sécurité, la machine ne peut fonctionner qu'à capot fermer&lt;br /&gt;
* En cas de comportement anormal de la machine, pressez le bouton d'arrêt d'urgence&lt;br /&gt;
* Vérifiez que l'extracteur de fumée est allumé&lt;br /&gt;
* Ne laissez pas la machine sans surveillance&lt;br /&gt;
&lt;br /&gt;
== Voir aussi ==&lt;br /&gt;
* [http://www.mllaser-co2.com/ml-w640.ws Fiche descriptive de la machine]&lt;br /&gt;
* [https://wiki.makilab.org/images/8/8a/Certificat_CE_laser.pdf Certificat de conformité]&lt;br /&gt;
* [http://www.atxhackerspace.org/wiki/Laser_Cutter_Materials Description en anglais des materiaux pouvant être utilisés]&lt;br /&gt;
* [https://docs.google.com/document/d/1FBl1hGjOUD_eQzHXYJvKVGYDYi1p2eSAhRKZmqyRHRc/ Carnet de route de Russ Sadler à la découverte de la découpeuse laser, en anglais]&lt;br /&gt;
&lt;br /&gt;
== Références ==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Machines]]&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=MakiCade&amp;diff=3233</id>
		<title>MakiCade</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=MakiCade&amp;diff=3233"/>
		<updated>2018-05-04T20:24:05Z</updated>

		<summary type="html">&lt;p&gt;Quentin : /* Le boitier */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Un projet lancé par --[[Utilisateur:Quentin|Quentin]] ([[Discussion utilisateur:Quentin|discussion]]) le 1&amp;lt;sup&amp;gt;er&amp;lt;/sup&amp;gt; Mars 2018 (CEST)&lt;br /&gt;
&lt;br /&gt;
= En bref =&lt;br /&gt;
Une borne d'arcade pour jouer au Makilab en attendant une découpe ou une impression. Au départ, l'idée était de prendre un [https://shop.pimoroni.com/products/picade kit Picade], mais comme [[Utilisateur:Kris|Kris]] nous a gentiment fait don d'un kit de joystick et boutons d'arcade, je me suis dis que c'était un signe pour faire une version complètement personnelle de la borne ;-)&lt;br /&gt;
&lt;br /&gt;
= Les joysticks/Boutons =&lt;br /&gt;
Le kit gentiment doné par Kris est un kit &amp;quot;[https://www.ultimarc.com/ipac2.html I-Pac 2]&amp;quot; de chez Ultimarc.&lt;br /&gt;
L'installation est relativement simple, et assez bien détaillée sur leur site.&lt;br /&gt;
&lt;br /&gt;
= Le boitier =&lt;br /&gt;
Le point de départ sera le design proposé par [https://hackaday.io/project/10649-boxespy la libraire Boxes.py], dont le créateur a eu la bonne idée de proposer [https://www.festi.info/boxes.py/ une interface en ligne].&lt;br /&gt;
&lt;br /&gt;
Le design est dispo sur [https://gitlab.com/qberten/makicade Gitlab]&lt;br /&gt;
&lt;br /&gt;
= L'OS: RetroPie =&lt;br /&gt;
Le standard de-facto pour les bornes d'arcade émulée sur un Raspberry Pi, c'est [https://retropie.org.uk/ RetroPie].&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=MakiCade&amp;diff=3231</id>
		<title>MakiCade</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=MakiCade&amp;diff=3231"/>
		<updated>2018-03-17T22:48:29Z</updated>

		<summary type="html">&lt;p&gt;Quentin : /* Les joysticks/Boutons */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Un projet lancé par --[[Utilisateur:Quentin|Quentin]] ([[Discussion utilisateur:Quentin|discussion]]) le 1&amp;lt;sup&amp;gt;er&amp;lt;/sup&amp;gt; Mars 2018 (CEST)&lt;br /&gt;
&lt;br /&gt;
= En bref =&lt;br /&gt;
Une borne d'arcade pour jouer au Makilab en attendant une découpe ou une impression. Au départ, l'idée était de prendre un [https://shop.pimoroni.com/products/picade kit Picade], mais comme [[Utilisateur:Kris|Kris]] nous a gentiment fait don d'un kit de joystick et boutons d'arcade, je me suis dis que c'était un signe pour faire une version complètement personnelle de la borne ;-)&lt;br /&gt;
&lt;br /&gt;
= Les joysticks/Boutons =&lt;br /&gt;
Le kit gentiment doné par Kris est un kit &amp;quot;[https://www.ultimarc.com/ipac2.html I-Pac 2]&amp;quot; de chez Ultimarc.&lt;br /&gt;
L'installation est relativement simple, et assez bien détaillée sur leur site.&lt;br /&gt;
&lt;br /&gt;
= Le boitier =&lt;br /&gt;
Le point de départ sera le design proposé par [https://hackaday.io/project/10649-boxespy la libraire Boxes.py], dont le créateur a eu la bonne idée de proposer [https://www.festi.info/boxes.py/ une interface en ligne].&lt;br /&gt;
&lt;br /&gt;
= L'OS: RetroPie =&lt;br /&gt;
Le standard de-facto pour les bornes d'arcade émulée sur un Raspberry Pi, c'est [https://retropie.org.uk/ RetroPie].&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=MakiCade&amp;diff=3230</id>
		<title>MakiCade</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=MakiCade&amp;diff=3230"/>
		<updated>2018-03-17T14:30:43Z</updated>

		<summary type="html">&lt;p&gt;Quentin : /* Le boitier */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Un projet lancé par --[[Utilisateur:Quentin|Quentin]] ([[Discussion utilisateur:Quentin|discussion]]) le 1&amp;lt;sup&amp;gt;er&amp;lt;/sup&amp;gt; Mars 2018 (CEST)&lt;br /&gt;
&lt;br /&gt;
= En bref =&lt;br /&gt;
Une borne d'arcade pour jouer au Makilab en attendant une découpe ou une impression. Au départ, l'idée était de prendre un [https://shop.pimoroni.com/products/picade kit Picade], mais comme [[Utilisateur:Kris|Kris]] nous a gentiment fait don d'un kit de joystick et boutons d'arcade, je me suis dis que c'était un signe pour faire une version complètement personnelle de la borne ;-)&lt;br /&gt;
&lt;br /&gt;
= Les joysticks/Boutons =&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
= Le boitier =&lt;br /&gt;
Le point de départ sera le design proposé par [https://hackaday.io/project/10649-boxespy la libraire Boxes.py], dont le créateur a eu la bonne idée de proposer [https://www.festi.info/boxes.py/ une interface en ligne].&lt;br /&gt;
&lt;br /&gt;
= L'OS: RetroPie =&lt;br /&gt;
Le standard de-facto pour les bornes d'arcade émulée sur un Raspberry Pi, c'est [https://retropie.org.uk/ RetroPie].&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=MakiCade&amp;diff=3229</id>
		<title>MakiCade</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=MakiCade&amp;diff=3229"/>
		<updated>2018-03-17T14:27:52Z</updated>

		<summary type="html">&lt;p&gt;Quentin : /* L'OS */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Un projet lancé par --[[Utilisateur:Quentin|Quentin]] ([[Discussion utilisateur:Quentin|discussion]]) le 1&amp;lt;sup&amp;gt;er&amp;lt;/sup&amp;gt; Mars 2018 (CEST)&lt;br /&gt;
&lt;br /&gt;
= En bref =&lt;br /&gt;
Une borne d'arcade pour jouer au Makilab en attendant une découpe ou une impression. Au départ, l'idée était de prendre un [https://shop.pimoroni.com/products/picade kit Picade], mais comme [[Utilisateur:Kris|Kris]] nous a gentiment fait don d'un kit de joystick et boutons d'arcade, je me suis dis que c'était un signe pour faire une version complètement personnelle de la borne ;-)&lt;br /&gt;
&lt;br /&gt;
= Les joysticks/Boutons =&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
= Le boitier =&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
= L'OS: RetroPie =&lt;br /&gt;
Le standard de-facto pour les bornes d'arcade émulée sur un Raspberry Pi, c'est [https://retropie.org.uk/ RetroPie].&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=MakiCade&amp;diff=3228</id>
		<title>MakiCade</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=MakiCade&amp;diff=3228"/>
		<updated>2018-03-17T14:25:48Z</updated>

		<summary type="html">&lt;p&gt;Quentin : MakiCade, la borne d'arcade du makilab&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Un projet lancé par --[[Utilisateur:Quentin|Quentin]] ([[Discussion utilisateur:Quentin|discussion]]) le 1&amp;lt;sup&amp;gt;er&amp;lt;/sup&amp;gt; Mars 2018 (CEST)&lt;br /&gt;
&lt;br /&gt;
= En bref =&lt;br /&gt;
Une borne d'arcade pour jouer au Makilab en attendant une découpe ou une impression. Au départ, l'idée était de prendre un [https://shop.pimoroni.com/products/picade kit Picade], mais comme [[Utilisateur:Kris|Kris]] nous a gentiment fait don d'un kit de joystick et boutons d'arcade, je me suis dis que c'était un signe pour faire une version complètement personnelle de la borne ;-)&lt;br /&gt;
&lt;br /&gt;
= Les joysticks/Boutons =&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
= Le boitier =&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
= L'OS =&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=Accueil&amp;diff=3227</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=Accueil&amp;diff=3227"/>
		<updated>2018-03-17T14:14:35Z</updated>

		<summary type="html">&lt;p&gt;Quentin : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div id=&amp;quot;mainpage_topbox&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;mainpage_pagetitle&amp;quot;&amp;gt;'''Bienvenue sur le [[wikipédia:Wiki|wiki]] du [http://makilab.org Makilab]'''&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpage_boxcontents&amp;quot;&amp;gt;&amp;lt;div id=&amp;quot;mf-intro&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il est destiné aux membres et contient des informations sur les [[:Catégorie:Machines|machines]] que l'on peut trouver au Makilab, les [[:Catégorie:Softwares|logiciels]] qui peuvent être utilisés tant pour la conception que pour la réalisation et sur des [[:Catégorie:Projets|projets]] réalisés dans le lab.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez voir [[Spécial:Toutes_les_pages|liste de toutes les pages]] ou naviguer par [[Spécial:Catégories|catégories]] (ou faire une recherche ;-D).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;div id=&amp;quot;mainpage_sitelinks&amp;quot;&amp;gt;&lt;br /&gt;
'''[[Makilab:À propos|À propos du Wiki Makilab]]''' &amp;amp;nbsp; | &amp;amp;nbsp; &lt;br /&gt;
'''[[Aide:Aide|Aide]]''' &amp;amp;nbsp; | &amp;amp;nbsp;&lt;br /&gt;
'''[[Special:Mylanguage/How to contribute|Contribuer]]'''&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{| role=&amp;quot;presentation&amp;quot; style=&amp;quot;border:0; margin: 0;&amp;quot; width=&amp;quot;100%&amp;quot; cellspacing=&amp;quot;10&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; class=&amp;quot;mainpage_hubbox&amp;quot; |&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpage_hubtitle&amp;quot;&amp;gt;'''Liste des machines'''&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpage_boxcontents&amp;quot;&amp;gt;&lt;br /&gt;
[[Image:Machines.svg|x80px|center|link=:Catégorie:Machines]]&lt;br /&gt;
&amp;lt;div id=&amp;quot;mf-users&amp;quot; title=&amp;quot;Users&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;strong class=&amp;quot;mainpage_boxcontents_title&amp;quot;&amp;gt;[[:Catégorie:Machines|MACHINES]]&amp;lt;/strong&amp;gt;&lt;br /&gt;
* '''[[Imprimante3D|Imprimante 3D Witbox]]'''&lt;br /&gt;
* '''[[Imprimante3DUP|Imprimante 3D Up!]]'''&lt;br /&gt;
* '''[[DecoupeLaser|Découpe laser]]'''&lt;br /&gt;
* '''[[DecoupeVinyle|Découpe vinyle]]'''&lt;br /&gt;
* '''[[CNC-Stepcraft|Fraiseuse numérique - Stepcraft 2/840]]'''&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; class=&amp;quot;mainpage_hubbox&amp;quot; |&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpage_hubtitle&amp;quot;&amp;gt;'''Liste des logiciels recommandés'''&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpage_boxcontents&amp;quot;&amp;gt;&lt;br /&gt;
[[Image:Logiciels.svg|x80px|center|link=:Catégorie:Softwares]]&lt;br /&gt;
&amp;lt;div id=&amp;quot;mf-admins&amp;quot; title=&amp;quot;Logiciels&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;strong class=&amp;quot;mainpage_boxcontents_title&amp;quot;&amp;gt;[[:Catégorie:Softwares|LOGICIELS]]&amp;lt;/strong&amp;gt;&lt;br /&gt;
* Modélisation 3D:&lt;br /&gt;
** Dessin assisté par ordinateur (&amp;quot;artistique&amp;quot;):&lt;br /&gt;
*** '''[[Blender]]'''&lt;br /&gt;
** Conception assisté par ordinateur (&amp;quot;technique&amp;quot;):&lt;br /&gt;
*** '''[[Fusion360|Fusion 360]]'''&lt;br /&gt;
*** '''[[DesignSparkM|Design Spark Mechanical]]'''&lt;br /&gt;
*** '''[[FreeCad]]''' (plus avancé)&lt;br /&gt;
*** '''[[Openscad|OpenSCAD]]''' (ninja)&lt;br /&gt;
* &amp;quot;Slicer&amp;quot; (logiciel de préparation d'impression 3D):&lt;br /&gt;
** '''[[Cura]]'''&lt;br /&gt;
* Visualisation d'objet 3D: '''[[Meshlab]]'''&lt;br /&gt;
* Dessin vectoriel: '''[[Inkscape]]'''&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; class=&amp;quot;mainpage_hubbox&amp;quot; |&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpage_hubtitle&amp;quot;&amp;gt;'''Liste des projets'''&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpage_boxcontents&amp;quot;&amp;gt;&lt;br /&gt;
[[Image:projets.svg|x80px|center|link=:Catégorie:Projets]]&lt;br /&gt;
&amp;lt;div id=&amp;quot;mf-devs&amp;quot; title=&amp;quot;Projets&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;strong class=&amp;quot;mainpage_boxcontents_title&amp;quot;&amp;gt;[[:Catégorie:Projets|PROJETS]]&amp;lt;/strong&amp;gt;&lt;br /&gt;
* '''[[MakiCade]]''' (en cours)&lt;br /&gt;
* '''[[CellarKare]]''' (en cours)&lt;br /&gt;
* '''[[GBE|Graham Bell Experiment]]''' (abandonné)&lt;br /&gt;
* '''[[Maquette d'architecture]]''' (finalisé)&lt;br /&gt;
* '''Micro-éolienne à axe horizontal imprimée en 3D''' ('''[[Micro-éolienne à axe horizontal imprimée en 3D|en français]]''' / '''[[3D-printed horizontal-axis micro wind turbine|in English]]''') (finalisé)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
{| role=&amp;quot;presentation&amp;quot; style=&amp;quot;border:0; margin: 0;&amp;quot; width=&amp;quot;100%&amp;quot; cellspacing=&amp;quot;10&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; class=&amp;quot;mainpage_hubbox&amp;quot; |&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpage_hubtitle&amp;quot;&amp;gt;'''Autres'''&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpage_boxcontents&amp;quot;&amp;gt;&lt;br /&gt;
[[Image:questionMark.svg|x80px|center|link=:Catégorie:Projets]]&lt;br /&gt;
&amp;lt;div id=&amp;quot;mf-devs&amp;quot; title=&amp;quot;Autres&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;strong class=&amp;quot;mainpage_boxcontents_title&amp;quot;&amp;gt;&amp;lt;/strong&amp;gt;&lt;br /&gt;
* [[Bibliothèques|Bibliothèques d'objets]]&lt;br /&gt;
* Kits [[Arduino]] disponibles au Makilab&lt;br /&gt;
* [[Coller un film vinyle (PVC) sur une surface en plastique]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Si vous désirez contribuer à ce wiki, n'hésitez pas à vous inscrire (pour des raisons de spams, nous avons désactivé l'inscription automatique, pour vous inscrire, il suffit de nous envoyer un [mailto:info@makilab.org mail] !&lt;br /&gt;
&lt;br /&gt;
Consultez le [//meta.wikimedia.org/wiki/Aide:Contenu Guide de l’utilisateur] pour plus d’informations sur l’utilisation de ce logiciel.&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=DecoupeLaser&amp;diff=3209</id>
		<title>DecoupeLaser</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=DecoupeLaser&amp;diff=3209"/>
		<updated>2018-02-01T10:00:57Z</updated>

		<summary type="html">&lt;p&gt;Quentin : /* Faire des boîtes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:DecoupeLaserML.png|La découpe laser|500px|thumb]]&lt;br /&gt;
La découpe laser permet de découper et/ou de graver divers matériaux (bois, certains plastiques, cartons, papier, cuir, etc.).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La machine du Makilab: &lt;br /&gt;
&lt;br /&gt;
'''Surface de travail''' de 60x40cm et le laser a une puissance de 80 W.&lt;br /&gt;
&lt;br /&gt;
'''Les formats d'entrée''' supportés sont : &lt;br /&gt;
* BMP&lt;br /&gt;
* PLT&lt;br /&gt;
* DST&lt;br /&gt;
* DXF&lt;br /&gt;
* AI&lt;br /&gt;
* CDR&lt;br /&gt;
Nous conseillons le '''BMP''' pour le travail matriciel (gravure) et le '''DXF''' pour le vectoriel (supporté par Inkscape). Lors de la sauvegarde en DXF, utiliser la version AutocadR14 de préférence (les nouvelles fonctionnalités du DXF sont parfois mal gérées).&lt;br /&gt;
&lt;br /&gt;
Si vous voulez avoir différents réglages (niveaux de gravure) pour le même travail, nous conseillons d'appliquer une couleur à chaque réglage ou alors, de faire autant de fichiers que de réglages.&lt;br /&gt;
&lt;br /&gt;
'''Matériaux supportés''': bois, acrylique, plexiglass (!!! Vérifier auprès de votre fournisseur que l'utilisation laser est bien appropriée !!!)&lt;br /&gt;
&lt;br /&gt;
'''Non supportés''': métaux&lt;br /&gt;
&lt;br /&gt;
Pour avoir une idée des bons paramètres (vitesse et puissance), voici un [http://www.rabbitlaserusa.com/manuals/speedsfeeds_RL.pdf petit tableaux (pdf)] (le site regorge d'infos : http://www.rabbitlaserusa.com/ManualsTutorials.html). Pour la gravure sur bois, nous conseillons de ne pas paramétrer une vitesse inférieure à 100 (un essai à 30 a donné un résultat carbonisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le logiciel utilisé pour contrôler la découpeuse est LaserCut ([http://makilab.org/sites/default/files/manuel_lasercut_francais.pdf Manuel], nous avons la version &amp;quot;universelle&amp;quot;)&amp;lt;ref&amp;gt;http://www.leetro.com/english/sale/manual.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Paramètres d'Inkscape ==&lt;br /&gt;
&lt;br /&gt;
Avant de sortir le travail, convertir tous les objects vers des chemins (Menu &amp;quot;Path&amp;quot; &amp;gt; Object to Path).&lt;br /&gt;
&lt;br /&gt;
Lors de la sauvegarde en DXF, ne pas sélectionner &amp;quot;use LWPOLYLINE type of line output&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Expériences == &lt;br /&gt;
Les essais laser de Monsieur Martin [http://wiki.makilab.org/index.php/EssaisLaser | Essai Laser]&lt;br /&gt;
&lt;br /&gt;
== Aller plus loin ==&lt;br /&gt;
&lt;br /&gt;
La présentation &amp;quot;avancée&amp;quot; répond à toutes une série de questions, [[Média:Formation_Laser_advanced_-_Makilab_-_11_oct_2015.pdf |  première édition donnée au Makilab le 11/10/2015)]].&lt;br /&gt;
&lt;br /&gt;
=== Faire des boîtes ===&lt;br /&gt;
&lt;br /&gt;
Il n'est pas nécessaire de dessiner toutes les dents à la main pour faire une boîte. Des logiciels peuvent le faire pour vous :&lt;br /&gt;
&lt;br /&gt;
* [http://www.twot.eu/111000/111000.html Plugin] pour [[Inkscape]]&lt;br /&gt;
* [http://boxmaker.connectionlab.org/ Boxmaker], un site pour obtenir les plans faire de boîtes &amp;quot;à tenons&amp;quot;&lt;br /&gt;
* [https://makeabox.io/ Make A Box], idem, pour des boîtes &amp;quot;à tenons&amp;quot;.&lt;br /&gt;
* [http://www.makercase.com/ MakeCase], avec pas mal d'options pour les tenons.&lt;br /&gt;
* [http://www.festi.info/boxes.py/ Boxes.py], la Rolls-Royce, avec pleins d'options (inclus les boîtes avec charnières flexibles)&lt;br /&gt;
* [http://www.packmage.com// PackMage], un autre site qui propose la même chose pour des boîtes en carton&lt;br /&gt;
&lt;br /&gt;
Et encore plus d'infos dans le [http://www.instructables.com/id/The-Ultimate-Guide-to-Laser-cut-Box-Generators/ &amp;quot;Guide Ultime des générateurs de boîtes découpées au laser&amp;quot;] sur Instructables (en anglais).&lt;br /&gt;
&lt;br /&gt;
=== Optimiser les chutes ===&lt;br /&gt;
&lt;br /&gt;
Il existe un site pour améliorer l'emboitement des pièces d'un travail : http://svgnest.com/ (il prend du SVG en entrée, comme son nom l'indique !)&lt;br /&gt;
&lt;br /&gt;
== Opération / maintenance ==&lt;br /&gt;
&lt;br /&gt;
[[Image:Plaque instructions lasercut.jpg|Instructions d'utilisation|500px|thumb]]&lt;br /&gt;
* Les instructions générales (aussi maffichées à côté de la machine ;-) sont reproduites ici: &lt;br /&gt;
* Ne pas utiliser la machine sans le lit en nid d'abeille sur des planches d'épaisseur &amp;lt; ~ 20mm. L'axe Z va arriver en fin de course matérielle lors de la calibration Z=0 et forcer sur les axes: il n'y a pas de switch de fin de course sur l'axe Z.&lt;br /&gt;
* Si la table n'est plus horizontale, la procédure pour la réaligner est décrite ici: [[DecoupeLaserMaintenanceHorizontalite]].&lt;br /&gt;
&lt;br /&gt;
== Règles de sécurité Découpe Laser ==&lt;br /&gt;
* Ne pas contourner le système de sécurité, la machine ne peut fonctionner qu'à capot fermer&lt;br /&gt;
* En cas de comportement anormal de la machine, pressez le bouton d'arrêt d'urgence&lt;br /&gt;
* Vérifiez que l'extracteur de fumée est allumé&lt;br /&gt;
* Ne laissez pas la machine sans surveillance&lt;br /&gt;
&lt;br /&gt;
== Voir aussi ==&lt;br /&gt;
* [http://www.mllaser-co2.com/ml-w640.ws Fiche descriptive de la machine]&lt;br /&gt;
* [https://wiki.makilab.org/images/8/8a/Certificat_CE_laser.pdf Certificat de conformité]&lt;br /&gt;
* [http://www.atxhackerspace.org/wiki/Laser_Cutter_Materials Description en anglais des materiaux pouvant être utilisés]&lt;br /&gt;
* [https://docs.google.com/document/d/1FBl1hGjOUD_eQzHXYJvKVGYDYi1p2eSAhRKZmqyRHRc/ Carnet de route de Russ Sadler à la découverte de la découpeuse laser, en anglais]&lt;br /&gt;
&lt;br /&gt;
== Références ==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Machines]]&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=DecoupeLaser&amp;diff=3208</id>
		<title>DecoupeLaser</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=DecoupeLaser&amp;diff=3208"/>
		<updated>2018-02-01T09:54:39Z</updated>

		<summary type="html">&lt;p&gt;Quentin : /* Faire des boîtes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:DecoupeLaserML.png|La découpe laser|500px|thumb]]&lt;br /&gt;
La découpe laser permet de découper et/ou de graver divers matériaux (bois, certains plastiques, cartons, papier, cuir, etc.).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La machine du Makilab: &lt;br /&gt;
&lt;br /&gt;
'''Surface de travail''' de 60x40cm et le laser a une puissance de 80 W.&lt;br /&gt;
&lt;br /&gt;
'''Les formats d'entrée''' supportés sont : &lt;br /&gt;
* BMP&lt;br /&gt;
* PLT&lt;br /&gt;
* DST&lt;br /&gt;
* DXF&lt;br /&gt;
* AI&lt;br /&gt;
* CDR&lt;br /&gt;
Nous conseillons le '''BMP''' pour le travail matriciel (gravure) et le '''DXF''' pour le vectoriel (supporté par Inkscape). Lors de la sauvegarde en DXF, utiliser la version AutocadR14 de préférence (les nouvelles fonctionnalités du DXF sont parfois mal gérées).&lt;br /&gt;
&lt;br /&gt;
Si vous voulez avoir différents réglages (niveaux de gravure) pour le même travail, nous conseillons d'appliquer une couleur à chaque réglage ou alors, de faire autant de fichiers que de réglages.&lt;br /&gt;
&lt;br /&gt;
'''Matériaux supportés''': bois, acrylique, plexiglass (!!! Vérifier auprès de votre fournisseur que l'utilisation laser est bien appropriée !!!)&lt;br /&gt;
&lt;br /&gt;
'''Non supportés''': métaux&lt;br /&gt;
&lt;br /&gt;
Pour avoir une idée des bons paramètres (vitesse et puissance), voici un [http://www.rabbitlaserusa.com/manuals/speedsfeeds_RL.pdf petit tableaux (pdf)] (le site regorge d'infos : http://www.rabbitlaserusa.com/ManualsTutorials.html). Pour la gravure sur bois, nous conseillons de ne pas paramétrer une vitesse inférieure à 100 (un essai à 30 a donné un résultat carbonisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le logiciel utilisé pour contrôler la découpeuse est LaserCut ([http://makilab.org/sites/default/files/manuel_lasercut_francais.pdf Manuel], nous avons la version &amp;quot;universelle&amp;quot;)&amp;lt;ref&amp;gt;http://www.leetro.com/english/sale/manual.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Paramètres d'Inkscape ==&lt;br /&gt;
&lt;br /&gt;
Avant de sortir le travail, convertir tous les objects vers des chemins (Menu &amp;quot;Path&amp;quot; &amp;gt; Object to Path).&lt;br /&gt;
&lt;br /&gt;
Lors de la sauvegarde en DXF, ne pas sélectionner &amp;quot;use LWPOLYLINE type of line output&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Expériences == &lt;br /&gt;
Les essais laser de Monsieur Martin [http://wiki.makilab.org/index.php/EssaisLaser | Essai Laser]&lt;br /&gt;
&lt;br /&gt;
== Aller plus loin ==&lt;br /&gt;
&lt;br /&gt;
La présentation &amp;quot;avancée&amp;quot; répond à toutes une série de questions, [[Média:Formation_Laser_advanced_-_Makilab_-_11_oct_2015.pdf |  première édition donnée au Makilab le 11/10/2015)]].&lt;br /&gt;
&lt;br /&gt;
=== Faire des boîtes ===&lt;br /&gt;
&lt;br /&gt;
Il n'est pas nécessaire de dessiner toutes les dents à la main pour faire une boîte. Des logiciels peuvent le faire pour vous :&lt;br /&gt;
&lt;br /&gt;
* [http://www.twot.eu/111000/111000.html Plugin] pour [[Inkscape]]&lt;br /&gt;
* [http://boxmaker.connectionlab.org/ Boxmaker], un site pour obtenir les plans faire de boîtes &amp;quot;à tenons&amp;quot;&lt;br /&gt;
* [https://makeabox.io/ Make A Box], idem, pour des boîtes &amp;quot;à tenons&amp;quot;.&lt;br /&gt;
* [http://www.makercase.com/ MakeCase], la Rolls, avec plein d'options pour les tenons.&lt;br /&gt;
* [http://www.packmage.com// PackMage], un autre site qui propose la même chose pour des boîtes en carton&lt;br /&gt;
&lt;br /&gt;
=== Optimiser les chutes ===&lt;br /&gt;
&lt;br /&gt;
Il existe un site pour améliorer l'emboitement des pièces d'un travail : http://svgnest.com/ (il prend du SVG en entrée, comme son nom l'indique !)&lt;br /&gt;
&lt;br /&gt;
== Opération / maintenance ==&lt;br /&gt;
&lt;br /&gt;
[[Image:Plaque instructions lasercut.jpg|Instructions d'utilisation|500px|thumb]]&lt;br /&gt;
* Les instructions générales (aussi maffichées à côté de la machine ;-) sont reproduites ici: &lt;br /&gt;
* Ne pas utiliser la machine sans le lit en nid d'abeille sur des planches d'épaisseur &amp;lt; ~ 20mm. L'axe Z va arriver en fin de course matérielle lors de la calibration Z=0 et forcer sur les axes: il n'y a pas de switch de fin de course sur l'axe Z.&lt;br /&gt;
* Si la table n'est plus horizontale, la procédure pour la réaligner est décrite ici: [[DecoupeLaserMaintenanceHorizontalite]].&lt;br /&gt;
&lt;br /&gt;
== Règles de sécurité Découpe Laser ==&lt;br /&gt;
* Ne pas contourner le système de sécurité, la machine ne peut fonctionner qu'à capot fermer&lt;br /&gt;
* En cas de comportement anormal de la machine, pressez le bouton d'arrêt d'urgence&lt;br /&gt;
* Vérifiez que l'extracteur de fumée est allumé&lt;br /&gt;
* Ne laissez pas la machine sans surveillance&lt;br /&gt;
&lt;br /&gt;
== Voir aussi ==&lt;br /&gt;
* [http://www.mllaser-co2.com/ml-w640.ws Fiche descriptive de la machine]&lt;br /&gt;
* [https://wiki.makilab.org/images/8/8a/Certificat_CE_laser.pdf Certificat de conformité]&lt;br /&gt;
* [http://www.atxhackerspace.org/wiki/Laser_Cutter_Materials Description en anglais des materiaux pouvant être utilisés]&lt;br /&gt;
* [https://docs.google.com/document/d/1FBl1hGjOUD_eQzHXYJvKVGYDYi1p2eSAhRKZmqyRHRc/ Carnet de route de Russ Sadler à la découverte de la découpeuse laser, en anglais]&lt;br /&gt;
&lt;br /&gt;
== Références ==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Machines]]&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=DecoupeLaserMaintenanceHorizontalite&amp;diff=3199</id>
		<title>DecoupeLaserMaintenanceHorizontalite</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=DecoupeLaserMaintenanceHorizontalite&amp;diff=3199"/>
		<updated>2018-01-04T08:30:28Z</updated>

		<summary type="html">&lt;p&gt;Quentin : /* Remontage de la courroie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Procédure d'alignement de la table de la découpe laser'''&lt;br /&gt;
[[Image:Mesure horizontalité table 1.jpg|Mesure de l'horizontalité (à répéter aux 4 coins)|350px|thumb]]&lt;br /&gt;
[[Image:Decoupe laser ouverture capots Z.jpg|Localisation actionnement axe Z|350px|thumb]]&lt;br /&gt;
[[Image:Decoupe laser pignons 1 et 2.jpg|Moteur, Tendeur, Pignon 1 et 2 (côté gauche)|350px|thumb]]&lt;br /&gt;
[[Image:Decoupe laser pignons 3 et 4.png|Pignons 3 et 4 (côté droit)|350px|thumb]]&lt;br /&gt;
&lt;br /&gt;
Cette procédure décrit comment réaligner la table horzontalement (en Z) par rapport au axes de découpe (en X et Y). Le désalignement de l'axe Z est très souvent une conséquence d'un &amp;quot;crash&amp;quot;, par exemple lors de la demande d'une calibration Z=0 sans plaque métallique sous le contacteur de la tête de découpe.&lt;br /&gt;
&lt;br /&gt;
= Matériel - Aspects sécurité =&lt;br /&gt;
&lt;br /&gt;
* '''Procédure à réaliser par un membre du Makilab uniquement'''&lt;br /&gt;
* Un jeu de clefs allen est nécessaire&lt;br /&gt;
* Condamner la machine (machine OFF plus bouton d'arrêt d'urgence enclenché) lors des opérations sur les vis de l'axe Z.&lt;br /&gt;
&lt;br /&gt;
= Vérification de l'alignement horizontal =&lt;br /&gt;
&lt;br /&gt;
* Vérifier que la table de la machine est réellement mal alignée par rapport au plan de découpe: faire la vérification ''sans'' la structure en nid d'abeille, cette structure n'étant pas parfaitement plane.&lt;br /&gt;
* Positionner une plaque plane à la place de la structure en nid d'abeille.&lt;br /&gt;
* Mesurer la hauteur de la table par rapport à la règle de découpe aux 4 coins du plan de découpe (au mètre) (déplacer la tête en X et Y pour prendre la mesure aux 4 coins).&lt;br /&gt;
&lt;br /&gt;
Ne pas poursuivre si les valeurs aux 4 coins sont identiques ;-)&lt;br /&gt;
&lt;br /&gt;
= Libération de l'axe Z =&lt;br /&gt;
&lt;br /&gt;
L'axe Z est entraîné par 4 vis, reliées par une couroie actionnée par un moteur, situés dans le bas du bâti. La courroie est maintenue sous tension (en contact avec les 4 pignons au pied des vis) par un tendeur (voir photos).&lt;br /&gt;
&lt;br /&gt;
* Condamner la machine (power off et arrêt d'urgence enclenché)&lt;br /&gt;
* Ouvrir les portes en façade avant et côté gauche&lt;br /&gt;
* Marquer la position du tendeur par rapport au bâti (crayon/indélébile).&lt;br /&gt;
* Libérer le tendeur en dévissant les 2 vis allen qui le fixe au fond du bâti (2 vis située à l'arrière). '''Attention''', ces vis sont sous-dimentionnées, faire attention à ne pas arracher les filets ou abîmer les têtes allen.&lt;br /&gt;
* Libérer la courroie des 4 pignons aux pieds des vis, et du moteur de l'axe Z.&lt;br /&gt;
&lt;br /&gt;
= Réglage de l'horizontalité =&lt;br /&gt;
&lt;br /&gt;
* Actionner à la main les vis pour arriver à remettre le plateau horizontal (faire la vérification aux 4 coins de la table).&lt;br /&gt;
* Cette partie peut se faire machine sous tension (après avoir bien vérifier que la courroie est totalement libre).&lt;br /&gt;
* Une fois l'horizontalité correcte, condamner à nouveau la machine (power off et arrêt d'urgence)&lt;br /&gt;
&lt;br /&gt;
= Remontage de la courroie =&lt;br /&gt;
&lt;br /&gt;
* Réengager la courroie dans les 4 pignons des vis (en séquence, donc en partant du moteur, pignons 3 et 4, puis 1 et 2). Bien tendre la courroie entre chaque pignon.&lt;br /&gt;
* Pousser le tendeur, vérifier que son pignon est bien engagé dans la courroie.&lt;br /&gt;
* Vérifier que le tendeur est revenus dans les marques réalisées sur le bâti.&lt;br /&gt;
* Revisser les 2 clefs allen du tendeur. '''Attention''', ces vis sont sous-dimentionnées, faire attention à ne pas arracher les filets ou abîmer les têtes allen.&lt;br /&gt;
&lt;br /&gt;
= Vérification =&lt;br /&gt;
&lt;br /&gt;
* Fermer les capots en face avant et côté gauche.&lt;br /&gt;
* Remettre la machine sous tension.&lt;br /&gt;
* Vérifier le fonctionnement de l'axe Z manuellement (PAS avec la calibration Z=0)&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=DecoupeLaserMaintenanceHorizontalite&amp;diff=3198</id>
		<title>DecoupeLaserMaintenanceHorizontalite</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=DecoupeLaserMaintenanceHorizontalite&amp;diff=3198"/>
		<updated>2018-01-04T08:30:06Z</updated>

		<summary type="html">&lt;p&gt;Quentin : /* Libération de l'axe Z */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Procédure d'alignement de la table de la découpe laser'''&lt;br /&gt;
[[Image:Mesure horizontalité table 1.jpg|Mesure de l'horizontalité (à répéter aux 4 coins)|350px|thumb]]&lt;br /&gt;
[[Image:Decoupe laser ouverture capots Z.jpg|Localisation actionnement axe Z|350px|thumb]]&lt;br /&gt;
[[Image:Decoupe laser pignons 1 et 2.jpg|Moteur, Tendeur, Pignon 1 et 2 (côté gauche)|350px|thumb]]&lt;br /&gt;
[[Image:Decoupe laser pignons 3 et 4.png|Pignons 3 et 4 (côté droit)|350px|thumb]]&lt;br /&gt;
&lt;br /&gt;
Cette procédure décrit comment réaligner la table horzontalement (en Z) par rapport au axes de découpe (en X et Y). Le désalignement de l'axe Z est très souvent une conséquence d'un &amp;quot;crash&amp;quot;, par exemple lors de la demande d'une calibration Z=0 sans plaque métallique sous le contacteur de la tête de découpe.&lt;br /&gt;
&lt;br /&gt;
= Matériel - Aspects sécurité =&lt;br /&gt;
&lt;br /&gt;
* '''Procédure à réaliser par un membre du Makilab uniquement'''&lt;br /&gt;
* Un jeu de clefs allen est nécessaire&lt;br /&gt;
* Condamner la machine (machine OFF plus bouton d'arrêt d'urgence enclenché) lors des opérations sur les vis de l'axe Z.&lt;br /&gt;
&lt;br /&gt;
= Vérification de l'alignement horizontal =&lt;br /&gt;
&lt;br /&gt;
* Vérifier que la table de la machine est réellement mal alignée par rapport au plan de découpe: faire la vérification ''sans'' la structure en nid d'abeille, cette structure n'étant pas parfaitement plane.&lt;br /&gt;
* Positionner une plaque plane à la place de la structure en nid d'abeille.&lt;br /&gt;
* Mesurer la hauteur de la table par rapport à la règle de découpe aux 4 coins du plan de découpe (au mètre) (déplacer la tête en X et Y pour prendre la mesure aux 4 coins).&lt;br /&gt;
&lt;br /&gt;
Ne pas poursuivre si les valeurs aux 4 coins sont identiques ;-)&lt;br /&gt;
&lt;br /&gt;
= Libération de l'axe Z =&lt;br /&gt;
&lt;br /&gt;
L'axe Z est entraîné par 4 vis, reliées par une couroie actionnée par un moteur, situés dans le bas du bâti. La courroie est maintenue sous tension (en contact avec les 4 pignons au pied des vis) par un tendeur (voir photos).&lt;br /&gt;
&lt;br /&gt;
* Condamner la machine (power off et arrêt d'urgence enclenché)&lt;br /&gt;
* Ouvrir les portes en façade avant et côté gauche&lt;br /&gt;
* Marquer la position du tendeur par rapport au bâti (crayon/indélébile).&lt;br /&gt;
* Libérer le tendeur en dévissant les 2 vis allen qui le fixe au fond du bâti (2 vis située à l'arrière). '''Attention''', ces vis sont sous-dimentionnées, faire attention à ne pas arracher les filets ou abîmer les têtes allen.&lt;br /&gt;
* Libérer la courroie des 4 pignons aux pieds des vis, et du moteur de l'axe Z.&lt;br /&gt;
&lt;br /&gt;
= Réglage de l'horizontalité =&lt;br /&gt;
&lt;br /&gt;
* Actionner à la main les vis pour arriver à remettre le plateau horizontal (faire la vérification aux 4 coins de la table).&lt;br /&gt;
* Cette partie peut se faire machine sous tension (après avoir bien vérifier que la courroie est totalement libre).&lt;br /&gt;
* Une fois l'horizontalité correcte, condamner à nouveau la machine (power off et arrêt d'urgence)&lt;br /&gt;
&lt;br /&gt;
= Remontage de la courroie =&lt;br /&gt;
&lt;br /&gt;
* Réengager la courroie dans les 4 pignons des vis (en séquence, donc en partant du moteur, pignons 3 et 4, puis 1 et 2). Bien tendre la courroie entre chaque pignon.&lt;br /&gt;
* Pousser le tendeur, vérifier que son pignon est bien engagé dans la courroie.&lt;br /&gt;
* Vérifier que le tendeur est revenus dans les marques réalisées sur le bâti.&lt;br /&gt;
* Revisser les 2 clefs allen du tendeur&lt;br /&gt;
&lt;br /&gt;
= Vérification =&lt;br /&gt;
&lt;br /&gt;
* Fermer les capots en face avant et côté gauche.&lt;br /&gt;
* Remettre la machine sous tension.&lt;br /&gt;
* Vérifier le fonctionnement de l'axe Z manuellement (PAS avec la calibration Z=0)&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=FreeCAD&amp;diff=3195</id>
		<title>FreeCAD</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=FreeCAD&amp;diff=3195"/>
		<updated>2017-10-23T07:35:06Z</updated>

		<summary type="html">&lt;p&gt;Quentin : /* Téléchargement */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Freecad.png|Freecad|200px|right]]&lt;br /&gt;
= Freecad =&lt;br /&gt;
== Présentation ==&lt;br /&gt;
FreeCAD est un logiciel de modélisation 3D libre pour la CAO, IAO, PLM, orientée vers le génie mécanique et le design de produits, mais qui vise également d'autres disciplines, telles que l'architecture ou d'autres branches de l'ingénierie. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
FreeCAD (à ne pas confondre avec freeCAD de Aik-Siong Koh) est un logiciel de modélisation 3D libre pour la CAO, IAO, PLM, orientée vers le génie mécanique et le design de produits, mais qui vise également d'autres disciplines, telles que l'architecture ou d'autres branches de l'ingénierie. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://fr.wikipedia.org/wiki/FreeCAD plus...]&lt;br /&gt;
== Téléchargement ==&lt;br /&gt;
Le logiciel est librement téléchargeable sur le site de &lt;br /&gt;
[https://www.freecadweb.org/?lang=fr FreeCad]&lt;br /&gt;
&lt;br /&gt;
== Tutoriel ==&lt;br /&gt;
Le site propose d'ailleurs toute une série de tutoriel à tester [http://www.freecadweb.org/wiki/index.php?title=Tutorials/fr ici]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Softwares]]&lt;br /&gt;
[[Catégorie:3D]]&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=Fusion360&amp;diff=3163</id>
		<title>Fusion360</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=Fusion360&amp;diff=3163"/>
		<updated>2016-10-20T09:13:39Z</updated>

		<summary type="html">&lt;p&gt;Quentin : /* Présentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:Fusion360.png|Fusion360|right]]&lt;br /&gt;
&lt;br /&gt;
== Présentation == &lt;br /&gt;
Fusion 360 est un outil complet de CAO (conception assistée par ordinateur) paramétrique développé par Autodesk. Ce n’est pas un logiciel libre, mais il possède de nombreuses qualités très utiles pour vos projets au Makilab. &amp;lt;br /&amp;gt;&lt;br /&gt;
Cet outil est destiné à dessiner et concevoir des pièces 3D aussi bien mécanique que design. Une solution CAM puissante est intégrée à l’outil pour piloter la CNC.&amp;lt;br /&amp;gt;&lt;br /&gt;
Nous considérons au Makilab que Fusion 360 est le logiciel de CAO un des logiciels les plus adaptés pour les hobbyistes sur le marché actuellement.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Avantages et fonctionnalités ==&lt;br /&gt;
Fusion 360 est gratuit pour les hobbyistes. Pour la très très grande majorité des besoins, cet outil est suffisant. Il fonctionne sous windows et mac.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*Découpe laser : On peut dessiner une esquisse et directement la sauver en DXF pour faire une découpe laser.&amp;lt;br /&amp;gt;&lt;br /&gt;
*Impression 3D : Après avoir dessiné votre pièce en 3D, il est possible de l’exporter en STL pour imprimer la pièce en 3D.&amp;lt;br /&amp;gt;&lt;br /&gt;
*CAM : Fusion 360 contient un mode CAM qui est puissant et gratuit. Il est possible de paramétrer les mouvements de la fraiseuse directement sur son modèle 3D et voir une simulation de la découpe (on voit la tête de la fraiseuse faire ses mouvements).&amp;lt;br /&amp;gt;&lt;br /&gt;
*Mode sculpt : C'est un mode qui se trouve entre le CAD et la DAO, mais avec les avantages de pouvoir passer de l'un à l’autre. Ce mode permet de dessiner des pièces design en tirant sur des surfaces pour leur donner la forme voulue.&lt;br /&gt;
*Assemblage : Si votre projet contient plusieurs pièces, vous pouvez les assembler directement dans Fusion 360. Il est possible de créer des assemblages fixes, mais également ajouter des degrés de libertés, vous pourrez donc voir le déplacement de vos pièces virtuellement.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Licences ==&lt;br /&gt;
Il existe des licences hobbyistes (gratuites) renouvelables chaque année. C’est une très bonne nouvelle pour nous, car des logiciels professionnels de cette catégorie sont généralement hors de prix.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Autodesk indique que la licence est gratuite pendant un an pour les hobbyistes et les start-up qui font moins de 100k$ par an. La licence est renouvelable chaque année aussi longtemps que vous le jugez nécessaire.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Comment installer Fusion 360 ==&lt;br /&gt;
[https://knowledge.autodesk.com/support/fusion-360/troubleshooting/caas/sfdcarticles/sfdcarticles/How-to-activate-start-up-or-educational-licensing-for-Fusion-360.html La page officielle Autodesk sur les licences hobbyistes].&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tutoriel ==&lt;br /&gt;
&lt;br /&gt;
[http://www.autodesk.com/products/fusion-360/learn-training-tutorials Cours en ligne sur le site Autodesk]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
N’hésitez pas à nous aider à compléter cette page en envoyant vos remarques par [mailto:info@makilab.org mail].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Softwares]]&lt;br /&gt;
[[Catégorie:3D]]&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=MediaWiki:Sidebar&amp;diff=3162</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=MediaWiki:Sidebar&amp;diff=3162"/>
		<updated>2016-10-20T09:12:49Z</updated>

		<summary type="html">&lt;p&gt;Quentin : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** help:aide|help&lt;br /&gt;
* Les Machines&lt;br /&gt;
** Imprimante3D|L'imprimante 3D BQ&lt;br /&gt;
** Imprimante3DUP|L'imprimante 3D UP mini&lt;br /&gt;
** DecoupeLaser|La découpe laser&lt;br /&gt;
** DecoupeVinyle|La découpe vinyle&lt;br /&gt;
** CNC | La fraiseuse numérique&lt;br /&gt;
* Les Softwares&lt;br /&gt;
** Blender|Blender&lt;br /&gt;
** Cura|Cura&lt;br /&gt;
** DesignSparkM | DesignSpark&lt;br /&gt;
** FreeCad | FreeCad&lt;br /&gt;
** Fusion360 | Fusion360&lt;br /&gt;
** Inkscape|Inkscape&lt;br /&gt;
** Meshlab | Meshlab&lt;br /&gt;
** Openscad | Openscad&lt;br /&gt;
* L'électronique&lt;br /&gt;
** Arduino|Arduino&lt;br /&gt;
** Pico | L'Oscilloscope USB&lt;br /&gt;
* Le monde des Makers&lt;br /&gt;
** Bibliothèques | Bibliothèques d'objets&lt;br /&gt;
** PlaceList| Maker Places in Belgium&lt;br /&gt;
&lt;br /&gt;
* Aspects pratiques&lt;br /&gt;
** ROI|ROI&lt;br /&gt;
** Tarifs|Tarifs&lt;br /&gt;
** Login| Login et mot de passe&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=MediaWiki:Sidebar&amp;diff=3161</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=MediaWiki:Sidebar&amp;diff=3161"/>
		<updated>2016-10-20T09:12:30Z</updated>

		<summary type="html">&lt;p&gt;Quentin : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** help:aide|help&lt;br /&gt;
* Les Machines&lt;br /&gt;
** Imprimante3D|L'imprimante 3D BQ&lt;br /&gt;
** Imprimante3DUP|L'imprimante 3D UP mini&lt;br /&gt;
** DecoupeLaser|La découpe laser&lt;br /&gt;
** DecoupeVinyle|La découpe vinyle&lt;br /&gt;
** CNC | La fraiseuse numérique&lt;br /&gt;
* Les Softwares&lt;br /&gt;
** Blender|Blender&lt;br /&gt;
** Cura|Cura&lt;br /&gt;
** DesignSparkM | DesignSpark&lt;br /&gt;
** FreeCad | FreeCad&lt;br /&gt;
** Fusion 360 | Fusion360&lt;br /&gt;
** Inkscape|Inkscape&lt;br /&gt;
** Meshlab | Meshlab&lt;br /&gt;
** Openscad | Openscad&lt;br /&gt;
* L'électronique&lt;br /&gt;
** Arduino|Arduino&lt;br /&gt;
** Pico | L'Oscilloscope USB&lt;br /&gt;
* Le monde des Makers&lt;br /&gt;
** Bibliothèques | Bibliothèques d'objets&lt;br /&gt;
** PlaceList| Maker Places in Belgium&lt;br /&gt;
&lt;br /&gt;
* Aspects pratiques&lt;br /&gt;
** ROI|ROI&lt;br /&gt;
** Tarifs|Tarifs&lt;br /&gt;
** Login| Login et mot de passe&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=DecoupeLaser&amp;diff=3033</id>
		<title>DecoupeLaser</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=DecoupeLaser&amp;diff=3033"/>
		<updated>2016-07-06T11:05:49Z</updated>

		<summary type="html">&lt;p&gt;Quentin : /* Faire des boîtes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:DecoupeLaserML.png|La découpe laser|500px|thumb]]&lt;br /&gt;
La découpe laser permet de découper et/ou de graver divers matériaux (bois, certains plastiques, cartons, papier, cuir, etc.).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La machine du Makilab: &lt;br /&gt;
&lt;br /&gt;
'''Surface de travail''' de 60x40cm et le laser a une puissance de 80 W.&lt;br /&gt;
&lt;br /&gt;
'''Les formats d'entrée''' supportés sont : &lt;br /&gt;
* BMP&lt;br /&gt;
* PLT&lt;br /&gt;
* DST&lt;br /&gt;
* DXF&lt;br /&gt;
* AI&lt;br /&gt;
* CDR&lt;br /&gt;
Nous conseillons le '''BMP''' pour le travail matriciel (gravure) et le '''DXF''' pour le vectoriel (supporté par Inkscape). Lors de la sauvegarde en DXF, utiliser la version AutocadR14 de préférence (les nouvelles fonctionnalités du DXF sont parfois mal gérées).&lt;br /&gt;
&lt;br /&gt;
Si vous voulez avoir différents réglages (niveaux de gravure) pour le même travail, nous conseillons d'appliquer une couleur à chaque réglage ou alors, de faire autant de fichiers que de réglages.&lt;br /&gt;
&lt;br /&gt;
'''Matériaux supportés''': bois, acrylique, plexiglass (!!! Vérifier auprès de votre fournisseur que l'utilisation laser est bien appropriée !!!)&lt;br /&gt;
&lt;br /&gt;
'''Non supportés''': métaux&lt;br /&gt;
&lt;br /&gt;
Pour avoir une idée des bons paramètres (vitesse et puissance), voici un [http://www.rabbitlaserusa.com/manuals/speedsfeeds_RL.pdf petit tableaux (pdf)] (le site regorge d'infos : http://www.rabbitlaserusa.com/ManualsTutorials.html). Pour la gravure sur bois, nous conseillons de ne pas paramétrer une vitesse inférieure à 100 (un essai à 30 a donné un résultat carbonisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le logiciel utilisé pour contrôler la découpeuse est LaserCut ([http://makilab.org/sites/default/files/manuel_lasercut_francais.pdf Manuel], nous avons la version &amp;quot;universelle&amp;quot;)&amp;lt;ref&amp;gt;http://www.leetro.com/english/sale/manual.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Paramètres d'Inkscape ==&lt;br /&gt;
&lt;br /&gt;
Avant de sortir le travail, convertir tous les objects vers des chemins (Menu &amp;quot;Path&amp;quot; &amp;gt; Object to Path).&lt;br /&gt;
&lt;br /&gt;
Lors de la sauvegarde en DXF, ne pas sélectionner &amp;quot;use LWPOLYLINE type of line output&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Expériences == &lt;br /&gt;
Les essais laser de Monsieur Martin [http://wiki.makilab.org/index.php/EssaisLaser | Essai Laser]&lt;br /&gt;
&lt;br /&gt;
== Aller plus loin ==&lt;br /&gt;
&lt;br /&gt;
La présentation &amp;quot;avancée&amp;quot; répond à toutes une série de questions, [[Média:Formation_Laser_advanced_-_Makilab_-_11_oct_2015.pdf |  première édition donnée au Makilab le 11/10/2015)]].&lt;br /&gt;
&lt;br /&gt;
=== Faire des boîtes ===&lt;br /&gt;
&lt;br /&gt;
Il n'est pas nécessaire de dessiner toutes les dents à la main pour faire une boîte. Des logiciels peuvent le faire pour vous :&lt;br /&gt;
&lt;br /&gt;
* [http://www.twot.eu/111000/111000.html Plugin] pour [[Inkscape]]&lt;br /&gt;
* [http://boxmaker.connectionlab.org/ Boxmaker], un site pour obtenir les plans faire de boîtes &amp;quot;à tenons&amp;quot;&lt;br /&gt;
* [http://www.packmage.com// PackMage], un autre site qui propose la même chose pour des boîtes en carton&lt;br /&gt;
&lt;br /&gt;
=== Optimiser les chutes ===&lt;br /&gt;
&lt;br /&gt;
Il existe un site pour améliorer l'emboitement des pièces d'un travail : http://svgnest.com/ (il prend du SVG en entrée, comme son nom l'indique !)&lt;br /&gt;
&lt;br /&gt;
== Opération / maintenance ==&lt;br /&gt;
&lt;br /&gt;
[[Image:Plaque instructions lasercut.jpg|Instructions d'utilisation|500px|thumb]]&lt;br /&gt;
* Les instructions générales (aussi maffichées à côté de la machine ;-) sont reproduites ici: &lt;br /&gt;
* Ne pas utiliser la machine sans le lit en nid d'abeille sur des planches d'épaisseur &amp;lt; ~ 20mm. L'axe Z va arriver en fin de course matérielle lors de la calibration Z=0 et forcer sur les axes: il n'y a pas de switch de fin de course sur l'axe Z.&lt;br /&gt;
* Si la table n'est plus horizontale, la procédure pour la réaligner est décrite ici: [[DecoupeLaserMaintenanceHorizontalite]].&lt;br /&gt;
&lt;br /&gt;
== Règles de sécurité Découpe Laser ==&lt;br /&gt;
* Ne pas contourner le système de sécurité, la machine ne peut fonctionner qu'à capot fermer&lt;br /&gt;
* En cas de comportement anormal de la machine, pressez le bouton d'arrêt d'urgence&lt;br /&gt;
* Vérifiez que l'extracteur de fumée est allumé&lt;br /&gt;
* Ne laissez pas la machine sans surveillance&lt;br /&gt;
&lt;br /&gt;
== Voir aussi ==&lt;br /&gt;
* [http://www.mllaser-co2.com/ml-w640.ws Fiche descriptive de la machine]&lt;br /&gt;
* [http://www.atxhackerspace.org/wiki/Laser_Cutter_Materials Description en anglais des materiaux pouvant être utilisés]&lt;br /&gt;
&lt;br /&gt;
== Références ==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Machines]]&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=CellarKare&amp;diff=2986</id>
		<title>CellarKare</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=CellarKare&amp;diff=2986"/>
		<updated>2015-10-28T21:08:42Z</updated>

		<summary type="html">&lt;p&gt;Quentin : /* All your data are belong to us */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Un projet lancé par --[[Utilisateur:Quentin|Quentin]] ([[Discussion utilisateur:Quentin|discussion]]) 14 juin 2015 à 19:58 (CEST)&lt;br /&gt;
&lt;br /&gt;
= En bref =&lt;br /&gt;
&lt;br /&gt;
Le projet est de créer une &amp;quot;station météo&amp;quot; pour une cave à vin, d'où le nom du projet un peu fumeux de CellarKare = Cellar + Care, le K c'est pour faire joli ;-)&lt;br /&gt;
Dans un premier temps, le but est d'afficher la température et le taux d'humidité (hygrométrie). Ça, c'est pour le but fonctionnel. Mes autres buts sont:&lt;br /&gt;
* Au niveau perso: réaliser un premier projet à forte composante électronique, dans la foulée de notre formation Arduino&lt;br /&gt;
* Utiliser un maximum toutes les techniques/machines du Makilab&lt;br /&gt;
* Documenter les différentes étapes (tutoriel), et fournir les fichiers sources nécessaires aux différentes étapes.&lt;br /&gt;
&lt;br /&gt;
= Mark (1): Le matos et un premier proto Arduino=&lt;br /&gt;
&lt;br /&gt;
Le premier prototype sera relativement simple: la station affichera la température et l'humidité ambiante sur un écran LCD, le tout piloté par un Arduino Uno.&lt;br /&gt;
&lt;br /&gt;
== T° et humidité: DHT22 / AM2303 ==&lt;br /&gt;
&lt;br /&gt;
Au niveau des capteurs, logiquement il en faut un pour lire la température, et un pour lire l'humidité. Les deux existent certainement séparément, mais une rapide recherche sur le net done des références de capteurs déjà calibrés et fournissant les deux pour pas trop cher. Au final, mon choix se porte sur un DHT22. Ce capteur s'appelle aussi AM2303 dans sa version câblée. Quelques liens et documentation utiles:&lt;br /&gt;
* [http://www.adafruit.com/datasheets/DHT22.pdf Les specs du DHT22 (anglais)];&lt;br /&gt;
* Pour acheter: [http://www.adafruit.com/products/385 ~10 $ chez AdaFruit] ou [http://shop.mchobby.be/senseurs/214-dht22-am2302-senseur-humidite-temperature--3232100002142.html ~17 € chez MCHobby], c'est un peu plus cher, mais ils sont belges et sympas;&lt;br /&gt;
* [http://playground.arduino.cc/Main/DHTLib Un tutoriel pour arduino sur Arduino.cc];&lt;br /&gt;
* [https://learn.adafruit.com/dht/using-a-dhtxx-sensor Un tutoriel pour arduino sur AdaFruit], et sa [http://mchobby.be/wiki/index.php?title=DHTxx version française];&lt;br /&gt;
&lt;br /&gt;
== L'affichage LCD: LCM1602 ==&lt;br /&gt;
&lt;br /&gt;
Pour l'affichage, le choix a été vite fait... J'ai pris ce que j'avais sous la main, soit le LCD fourni dans le starter kit arduino. Cet écran est très répandu, et fait partie de nombreux &amp;quot;kits de démarrage&amp;quot; en électronique. Au niveau fonctionnel, avec 2 lignes de 16 charactères, on devrait pouvoir s'en sortir pour afficher une température et un taux d'humidité ;-). Son contrôleur (hitachi HD44780) est lui aussi très répandu En vrac:&lt;br /&gt;
* [http://www.datasheetspdf.com/datasheet/LCM1602.html Les specs (chinois ou anglais)]&lt;br /&gt;
* Pour acheter: [http://www.ebay.com/sch/items/?_nkw=lcm1602&amp;amp;_sacat=&amp;amp;_ex_kw=&amp;amp;_mPrRngCbx=1&amp;amp;_udlo=&amp;amp;_udhi=&amp;amp;_sop=12&amp;amp;_fpos=&amp;amp;_fspt=1&amp;amp;_sadis=&amp;amp;LH_CAds=&amp;amp;rmvSB=true on en trouve plein sur ebay...]&lt;br /&gt;
* [http://www.arduino.cc/en/Tutorial/LiquidCrystal La librairie LiquidCrystal, qui permet de le contrôler sur Arduino]&lt;br /&gt;
&lt;br /&gt;
== Le montage ==&lt;br /&gt;
&lt;br /&gt;
Le montage est assez simple, et n'est finalement qu'une combinaison des différents tutoriel et exemple d'utilisation de l'écran et du capteur.&lt;br /&gt;
&lt;br /&gt;
Sur le schéma du capteur DHT, la résistance de 10K sert de [https://fr.wikipedia.org/wiki/R%C3%A9sistance_de_rappel &amp;quot;résistance pull-up&amp;quot;].&lt;br /&gt;
'''Cette résistance n'est pas nécessaire dans le cas du capteur AM2302''' (la version avec câble et boitier en plastique, comme sur la photo). Cette version [http://www.adafruit.com/product/393 intègre une résistance de 5.1K dans le boîtier], qui connecte déjà VCC et DATA, merci Patrick pour l'info ;-).&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Cellarkare mark1 bb.png|500px|thumb|left]]&lt;br /&gt;
[[Fichier:Cellarkare_mark1.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Le code ==&lt;br /&gt;
Au niveau programmation du micro-controlleur Arduino, là aussi c'est assez simple: toutes les 3 secondes, on lit les valeurs de t° et humidité, et on les affiches sur l'écran LCD. Les valeurs mesurées et des messages supplémentaires sont aussi envoyés sur la sortie série.&lt;br /&gt;
&lt;br /&gt;
Le code est aussi disponible (et éventuellement mis à jour) [https://gitlab.com/qberten/cellarkare/blob/master/mark1_arduino/cellarkare_arduino.ino sur gitlab]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
CellarKare - Mark #1&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Un projet de station de mesure de la température et l'humidité dans une cave à vin&lt;br /&gt;
Plus d'infos et schéma de montage sur http://wiki.makilab.org/index.php/CellarKare&lt;br /&gt;
Quentin Berten, 2015 - Domaine public, licence WTFPL v2, http://www.wtfpl.net/&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
// Bibliothèque LiquidCrystal, pour l'écran LCD. Installée de base avec l'IDE&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Bibliothèque DHT, pour le capteur de température. Installable directement depuis&lt;br /&gt;
// l'IDE, via Sketch -&amp;gt; Include LIbrary -&amp;gt; Manage Libraries -&amp;gt; DHT sensor Library &lt;br /&gt;
#include &amp;quot;DHT.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Définition l'écran LCD, en argument les pins d'interface, dans l'ordre&lt;br /&gt;
// (RS pin, LCD Enable, D4, D5, D6, D7)&lt;br /&gt;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);&lt;br /&gt;
&lt;br /&gt;
// Définition des pin et type pour le senseur de t° et humidité&lt;br /&gt;
#define DHTPIN 7         // senseur (fil data, en jaune), sur pin 7&lt;br /&gt;
#define DHTTYPE DHT22    // type DHT 22  (AM2302)&lt;br /&gt;
&lt;br /&gt;
// Définition du capteur DHT22, pour un Arduino &amp;quot;normal&amp;quot; à 16mhz, comme le Uno&lt;br /&gt;
DHT dht(DHTPIN, DHTTYPE);&lt;br /&gt;
// les variables associées qui vont lire les valeurs (température, ...)&lt;br /&gt;
float hum;&lt;br /&gt;
float tempC;&lt;br /&gt;
float tempF;&lt;br /&gt;
float indiceHum;&lt;br /&gt;
&lt;br /&gt;
// les variables qui permettent de gérer le temps,&lt;br /&gt;
// voir http://www.arduino.cc/en/pmwiki.php?n=Tutorial/BlinkWithoutDelay&lt;br /&gt;
long prevMillis = 0;           // enregistre le temps de la denière lecture DHT22&lt;br /&gt;
long dhtInterval = 3000;       // L'intervalle de lecture du DHT22: 3 secondes&lt;br /&gt;
&lt;br /&gt;
// la procédure d'initialisation arduino&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  // on ouvre une connection série (pour afficher un maxium d'info)&lt;br /&gt;
  Serial.begin(9600); &lt;br /&gt;
  Serial.println(&amp;quot;CellarKare Mark #1 Test&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // initialisation du capteur&lt;br /&gt;
  dht.begin();&lt;br /&gt;
  // initialisation de l'écran, 16 colonnes et 2 lignes&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// la boucle principale arduino&lt;br /&gt;
void loop() {&lt;br /&gt;
  unsigned long curMillis = millis();&lt;br /&gt;
  &lt;br /&gt;
  if(curMillis - prevMillis &amp;lt; dhtInterval) {&lt;br /&gt;
    goto end_loop;        // pas de lecture DHT, on va à la fin de la boucle loop()&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // on enregistre le dernier temps d'exécution de la lecture&lt;br /&gt;
  prevMillis = curMillis;   &lt;br /&gt;
  &lt;br /&gt;
  // la lecture de la t° et l'humidité prends environ 250 millisecondes&lt;br /&gt;
  // mais les lectures du capteur peuvent etre vieillies de 2 secondes&lt;br /&gt;
  // le capteur n'est pas rapide (d'où l'attente de 3 secondes pour etre&lt;br /&gt;
  // certain d'avoir des lectures correctes.&lt;br /&gt;
  // lecture de l'humidité&lt;br /&gt;
  hum = dht.readHumidity();&lt;br /&gt;
  // lecture de la température en degrés Celsius&lt;br /&gt;
  tempC = dht.readTemperature();&lt;br /&gt;
  // lecture de la température en degrés Fahreneit&lt;br /&gt;
  tempF = dht.readTemperature(true);&lt;br /&gt;
  &lt;br /&gt;
  // On vérifie que les lectures on bien été réalisées. Si pas, on quitte&lt;br /&gt;
  // la boucle pour ré-essayer&lt;br /&gt;
  if (isnan(hum) || isnan(tempC) || isnan(tempF)) {&lt;br /&gt;
    Serial.println(&amp;quot;Lecture sur le capteur DHT ratée&amp;quot;);&lt;br /&gt;
    goto end_loop;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Calcul de l'indice de chaleur (voir https://fr.wikipedia.org/wiki/Indice_de_chaleur )&lt;br /&gt;
  // La température doit etre fournie en degré Fahreneit&lt;br /&gt;
  indiceHum = dht.computeHeatIndex(tempF, hum);&lt;br /&gt;
&lt;br /&gt;
  // On affiche les valeurs sur la console série (n'est pas indispensable)&lt;br /&gt;
  Serial.print(&amp;quot;Humidite: &amp;quot;); &lt;br /&gt;
  Serial.print(hum);&lt;br /&gt;
  Serial.print(&amp;quot; %\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temperature: &amp;quot;); &lt;br /&gt;
  Serial.print(tempC);&lt;br /&gt;
  Serial.print(&amp;quot; *C &amp;quot;);&lt;br /&gt;
  Serial.print(tempF);&lt;br /&gt;
  Serial.print(&amp;quot; *F\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Indice de chaleur: &amp;quot;);&lt;br /&gt;
  Serial.print(indiceHum);&lt;br /&gt;
  Serial.println(&amp;quot; *F&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  // On affiche les valeurs sur l'écran LCD, curseur à (0,0)&lt;br /&gt;
  lcd.setCursor(0, 0);&lt;br /&gt;
  // print Temp in C°&lt;br /&gt;
  lcd.print(&amp;quot;deg C: &amp;quot;);&lt;br /&gt;
  lcd.print(tempC);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;hum %: &amp;quot;);&lt;br /&gt;
  lcd.print(hum);&lt;br /&gt;
&lt;br /&gt;
  // label pour goto&lt;br /&gt;
  end_loop:&lt;br /&gt;
  ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== La conclusion ==&lt;br /&gt;
Un premier prototype fonctionnel, qui a au moins le mérite de vérifier que le capteur DHT renvoie des valeurs réalistes.&lt;br /&gt;
La suite: la même chose avec un Raspberry pi, pour bénéficier de sa faciliter à se connecter au réseau. Ce serait quand même cool de pouvoir lire ces valeurs sur un smartphone ;-)&lt;br /&gt;
&lt;br /&gt;
= Mark (2): la même chose avec un Raspberry Pi =&lt;br /&gt;
Le but de cette nouvelle itération: réaliser un montage équivalent avec un [https://www.raspberrypi.org/ Raspberry Pi] (RPi en abrégé). Pourquoi un RPi ?&lt;br /&gt;
* Parce que j'en avais un sous la main ;-)&lt;br /&gt;
* Parce qu'il permet de se connecter rapidement et facilement à un réseau, via ethernet (câble) ou wifi (via un dongle usb)&lt;br /&gt;
* Parce qu'il permet de brancher facilement un module caméra (on y viendra au Mark 3)&lt;br /&gt;
&lt;br /&gt;
Il est certainement possible d'arriver au même résultat avec d'autres cartes (comme par exemple un [http://www.arduino.cc/en/Main/ArduinoBoardYun Arduino Yun]), c'est juste que c'est un RPi que j'avais sous la main... Dans mon cas un Raspberry Pi B+.&lt;br /&gt;
&lt;br /&gt;
En ce qui concerne le RPi, quelques ressources très utiles:&lt;br /&gt;
* [http://mchobby.be/wiki/index.php?title=RaspberryPi-Accueil#Tutoriels Les tutoriels réalisés/traduits par MC Hobby. Une mine d'or]&lt;br /&gt;
* [http://www.elektronique.fr/montages/raspberry-pi/ Des exemples de montages et réalisations électroniques avec RPi]&lt;br /&gt;
* [http://pi.gadgetoid.com/pinout La configuration des différentes PIN du RPi]&lt;br /&gt;
&lt;br /&gt;
== L'installation de l'OS ==&lt;br /&gt;
La principale différence entre une carte Arduino et le RPi, c'est le cœur de la carte:&lt;br /&gt;
* le cœur de l'Arduino est un microcontrôleur, qui va exécuter le programme qu'on lui injecte de manière bête et méchante. Chaque entrée/sortie va devoir être programmée directement, il n'y a pas de système de driver, ...&lt;br /&gt;
* le cœur du RPi est un microprocesseur (ARM, la même technologie que dans les smartphones). Il s'agit donc en fait d'un véritable &amp;quot;petit ordinateur&amp;quot;, avec un système d'exploitation, des drivers (pour l'usb, l'écran, le wifi, ...).&lt;br /&gt;
&lt;br /&gt;
Donc avant de pouvoir démarrer et utiliser le RPi, il va falloir installer un système d'exploitation (OS: Operating System). C'est exactement la même chose qu'installer Windows sur un PC, c'est juste que dans notre cas, ce ne sera pas Windows mais un système Linux. Il en existe [https://www.raspberrypi.org/downloads/ plusieurs], le standard de facto étant Raspbian (une distribution Debian adaptée pour le RPi), c'est celle-là [http://raspbian-france.fr/installer-raspbian-premier-demarrage-configuration/ que j'ai installée].&lt;br /&gt;
&lt;br /&gt;
Petit truc pour les distraits: écran/clavier/souris ne sont pas indispensables pour l'installation, il est tout à fait possible de se connecter via [https://fr.wikipedia.org/wiki/Secure_Shell SSH] au RPi une fois son premier démarrage exécuté, pour autant qu'il soit raccordé à votre réseau (via son câble ethernet). Le RPi se déclare automatiquement sur le réseau avec le nom raspberry.local, et un &amp;lt;code&amp;gt;ssh pi@raspberry.local&amp;lt;/code&amp;gt; à fait l'affaire (raspberry, c'est son &amp;quot;hostname&amp;quot; par défaut). Pour le mot de passe, c'est &amp;lt;code&amp;gt;raspberry&amp;lt;/code&amp;gt; par défaut. Ensuite &amp;lt;code&amp;gt;raspi-config&amp;lt;/code&amp;gt; permet de terminer la procédure d'installation.&lt;br /&gt;
&lt;br /&gt;
En ce qui me concerne, tout le reste de la configuration se fera donc en [https://fr.wikipedia.org/wiki/Shell_Unix ligne de commande (shell)] via SSH. [http://mchobby.be/wiki/index.php?title=PI-SSH Le wiki de MCHobby] détaille l'accès via SSH au RPi.&lt;br /&gt;
&lt;br /&gt;
'''Un dernier point important''': le RPi, c'est comme un &amp;quot;vrai&amp;quot; ordinateur... il vaut mieux l'éteindre proprement plutôt que le débrancher sauvagement. Donc on s'arrange pour faire un &amp;lt;code&amp;gt;sudo poweroff&amp;lt;/code&amp;gt; en ligne de commande avant de le débrancher. Le gros risque: corrompre le système de fichier sur le carte SD, ce qui empêche le démarrage suivant, et impose un reformatage et une réinstallation complète. Pas drôle en somme, je parle d'expérience :-(&lt;br /&gt;
&lt;br /&gt;
== Le wifi ==&lt;br /&gt;
Bien que le RPi ne soit pas équipé par défaut du wifi, il est compatible avec la majorité des clefs usb wifi. Dans mon cas, une vieille clef Hercules HWGUSB2-54. Un petit tour par les log (&amp;lt;code&amp;gt;sudo tail -f /var/log/syslog&amp;lt;/code&amp;gt;) pour vérifier qu'elle est reconnue correctement lors du branchement, et puis une configuration via l'édition de &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt; pour entrer les références du réseau wifi:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
auto wlan0&lt;br /&gt;
allow-hotplug wlan0&lt;br /&gt;
iface wlan0 inet dhcp&lt;br /&gt;
wpa-ssid &amp;quot;Le_nom_(SSID)_de_votre_wifi&amp;quot;&lt;br /&gt;
wpa-psk &amp;quot;Le_mot_de_passe_de_votre_wifi&amp;quot;&lt;br /&gt;
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Ensuite un redémmarrage de la carte avec &amp;lt;code&amp;gt;$ sudo ifdown wlan0&amp;lt;/code&amp;gt; suivi de &amp;lt;code&amp;gt;sudo ifup wlan0&amp;lt;/code&amp;gt; et ça devrait être OK. On peut maintenant se passer de câble ethernet!&lt;br /&gt;
&lt;br /&gt;
Si nécessaire: plus de détails sur la configuration réseau sur [http://mchobby.be/wiki/index.php?title=Rasp-Config-Reseau le wiki MC Hobby]&lt;br /&gt;
&lt;br /&gt;
== La température avec le DHT22 / AM2302 ==&lt;br /&gt;
Pour la lecture des température avec le capteur, les gars d'Adafruit ont déjà développé un bibliothèque de fonctions utilisables en ligne de commande ou en [https://fr.wikipedia.org/wiki/Python_%28langage%29 python]. Quelques ressources:&lt;br /&gt;
* [https://learn.adafruit.com/dht-humidity-sensing-on-raspberry-pi-with-gdocs-logging/overview La page d'Adafruit (en anglais) sur l'utilisation du DHT22 avec le RPi]&lt;br /&gt;
* [http://www.manuel-esteban.com/lire-une-sonde-dht22-avec-un-raspberry-pi/ Une ressource en français (un peu datée) sur l'utilisation DHT22 + RPi.]&lt;br /&gt;
* [http://pi.gadgetoid.com/pinout La table de référence des 40 pins GPIO du RPi]&lt;br /&gt;
Pour ma part, j'ai suivi la méthode Adafruit, ce qui donne en résumé, en ligne de commande:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
cd /home/pi&lt;br /&gt;
git clone https://github.com/adafruit/Adafruit_Python_DHT.git &lt;br /&gt;
cd Adafruit_Python_DHT&lt;br /&gt;
sudo apt-get install build-essential python-dev  &lt;br /&gt;
sudo python setup.py install&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Au niveau du montage, rien de nouveau: le capteur doit toujours être alimenté en 3.3V ou en 5V, et le câble de lecture à une pin d'entrée/sortie (GPIO: General Purpose Input Output), ce qui donne:&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Cellarkare mark2 bb.png|400px|thumb|left]]&lt;br /&gt;
[[Fichier:Cellarkare_mark2.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Un test en ligne de commande permet de vérifier qu'on a une lecture sur le capteur (dans mon cas un AM2302 raccordé sur la pin GPIO 4):&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
cd /home/pi/Adafruit_Python_DHT/examples/&lt;br /&gt;
sudo ./AdafruitDHT.py 2302 4&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Ce qui affiche &amp;lt;code&amp;gt;Temp=23.0*C  Humidity=53.8%&amp;lt;/code&amp;gt;, des valeurs censées pour une après-midi d'été ;-)&lt;br /&gt;
&lt;br /&gt;
== L'affichage LCD ==&lt;br /&gt;
L'écran LCD est toujours le même que pour la version &amp;quot;Mark 1&amp;quot; Arduino. Quelques resources:&lt;br /&gt;
* [https://learn.adafruit.com/drive-a-16x2-lcd-directly-with-a-raspberry-pi Un tutoriel (en anglais) sur Adafruit] ''Attention, le code source n'est plus tellement a jour, voir le dernier lien Github.''&lt;br /&gt;
* [http://mchobby.be/wiki/index.php?title=Rasp-Hack-Afficheur-LCD La version française, traduite par MC Hobby]&lt;br /&gt;
* [https://github.com/adafruit/Adafruit_Python_CharLCD Le code source de la librairie Adafruit pour le gestion du LCD sur GitHub] ''contient la dernière version de la librairie''.&lt;br /&gt;
&lt;br /&gt;
La logique de raccordement est strictement identique au circuit du Mark 1. La seule différence est que la résistance variable de 10K dans le circuit est supprimée, la bibliothèque Adafruit pour le LCD permettant le pilotage en [https://fr.wikipedia.org/wiki/Modulation_de_largeur_d%27impulsion modulation PWM].&lt;br /&gt;
&lt;br /&gt;
== Le montage ==&lt;br /&gt;
Au final, le montage a été fait pour gagner un maximum de place sur mon breadboard. La pin data du DHT a été déplacée sur la pin 5, et le reste des pin pour le LCD sont documentées dans le code.&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Cellarkare mark2_2 bb.png|500px|thumb|left]]&lt;br /&gt;
[[Fichier:Cellarkare_mark2_2.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Le code ==&lt;br /&gt;
&lt;br /&gt;
La logique du code est identique à la version mark 1 - arduino. Ce code est aussi disponible (et éventuellement mis à jour) [https://gitlab.com/qberten/cellarkare/blob/master/mark2_rpi/cellarkare_rpi.py sur gitlab]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
# coding=utf8&lt;br /&gt;
# CellarKare - Mark 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
# Un projet de station de mesure de la température et l'humidité dans une cave à vin&lt;br /&gt;
# Plus d'infos et schéma de montage sur http://wiki.makilab.org/index.php/CellarKare&lt;br /&gt;
# Quentin Berten, 2015 - Domaine public, licence WTFPL v2, http://www.wtfpl.net/&lt;br /&gt;
# quentin_#AT#_berten.me&lt;br /&gt;
&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
# Bibliothèque CharLCD d'Adafruit, voir https://github.com/adafruit/Adafruit_Python_CharLCD&lt;br /&gt;
# pour l'installation&lt;br /&gt;
import Adafruit_CharLCD as LCD&lt;br /&gt;
# Bibliothèque DHT d'AdaFruit, voir https://github.com/adafruit/Adafruit_Python_DHT&lt;br /&gt;
# pour l'installation&lt;br /&gt;
import Adafruit_DHT as DHT&lt;br /&gt;
&lt;br /&gt;
# Configuration de l'affichage LCD&lt;br /&gt;
lcd_rs        = 25      # RS sur pin 25&lt;br /&gt;
lcd_en        = 24      # EN sur pin 24&lt;br /&gt;
lcd_d4        = 23      # D4 sur pin 23&lt;br /&gt;
lcd_d5        = 12      # D5 sur pin 12&lt;br /&gt;
lcd_d6        = 20      # D6 sur pin 20&lt;br /&gt;
lcd_d7        = 16      # D7 sur pin 16&lt;br /&gt;
lcd_backlight = 18      # rétro éclairage sur pin 18&lt;br /&gt;
lcd_columns   = 16      # Affichage à 16 colonnes ...&lt;br /&gt;
# Initialisation du LCD avec les variables ci-dessus&lt;br /&gt;
lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, &lt;br /&gt;
		        	lcd_columns, lcd_rows, lcd_backlight)&lt;br /&gt;
# Configuration pour le capteur DHT, soit DHT11, DHT22 ou AM2302.&lt;br /&gt;
dht_sensor    = DHT.AM2302  # Type AM2302&lt;br /&gt;
dht_pin       = 5           # DHT data sur pin 5&lt;br /&gt;
&lt;br /&gt;
# les variables qui permettent de gérer le temps,&lt;br /&gt;
prevMillis = 0          # enregistre le temps de la denière lecture DHT22&lt;br /&gt;
secInterval = 1000      # Un intervalle d'une seconde&lt;br /&gt;
# L'intervalle de lecture du DHT22: 3 secondes, doit etre plus grand que secInterval&lt;br /&gt;
dhtInterval = 3000&lt;br /&gt;
&lt;br /&gt;
def read_and_print_dht():&lt;br /&gt;
    # On lit une valeur sur le senseur avec la fonction read. Attention, cette fonction&lt;br /&gt;
    # ne réessaie pas automatiquement en cas d'erreur, mais fournit les valeurs (None, None).&lt;br /&gt;
    hum, tempC  = DHT.read(dht_sensor, dht_pin)&lt;br /&gt;
&lt;br /&gt;
    # On vérifie que l'on a bien eu une lecture (Linux n'est pas un OS temps réel et ne&lt;br /&gt;
    # peut pas garantir le timing des lectures sur le capteur). Si ça arrive, on réessaie.&lt;br /&gt;
    # On affiche les valeurs sur la console (n'est pas indispensable)&lt;br /&gt;
    if hum is not None and tempC is not None:&lt;br /&gt;
    	print 'Temp={0:0.2f}*C  Humidity={1:0.2f}%'.format(tempC, hum)&lt;br /&gt;
        # On affiche les valeurs sur l'écran LCD&lt;br /&gt;
        lcd.clear()&lt;br /&gt;
        lcd.message('deg C: {0:0.2f}\nhum %: {1:0.2f}'.format(tempC, hum))&lt;br /&gt;
    else:&lt;br /&gt;
	print 'Lecture sur le capteur DHT ratée'&lt;br /&gt;
&lt;br /&gt;
# Boucle principale, l'équivalent de void loop() sur Arduino&lt;br /&gt;
while 1:&lt;br /&gt;
    # On lit le nombre de millisecondes courant&lt;br /&gt;
    curMillis = time.time()*1000&lt;br /&gt;
    if curMillis - prevMillis &amp;gt; dhtInterval:&lt;br /&gt;
        # On essaie de lire et afficher les valeurs du DHT&lt;br /&gt;
        read_and_print_dht()&lt;br /&gt;
        # on enregistre le dernier temps d'exécution de la lecture&lt;br /&gt;
        prevMillis = curMillis&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== La conclusion ==&lt;br /&gt;
En vrac:&lt;br /&gt;
* Pas de gros problème ou obstacles majeurs pour convertir le montage et le code Arduino en son équivalent RPi. Mais heureusement que l'équipe d'Adafruit a déjà programmé les bibliothèques Python qui vont bien!&lt;br /&gt;
* Au niveau du breadboard, ça commence à prendre de la place... Une solution: passer en [https://fr.wikipedia.org/wiki/I2C &amp;quot;I2C&amp;quot;] pour le capteur et le LCD, ce qui limite drastiquement le nombre de pins nécessaires pour le montage, et facilite la programmation. Merci Patrick pour les infos, ce sera sûrement utile pour le prochain montage ;-) !&lt;br /&gt;
** Par exemple, pour la température: un capteur I2C comme le [https://www.adafruit.com/products/1638 SHT15], et pour l'écran, [http://www.electrodragon.com/w/index.php?title=1602_LCD_I2C/SPI_Module la version I2C du même 1602].&lt;br /&gt;
** Par contre dans ce cas, il faut faire gaffe au fait que le passage en 3.3V pour la logique du RPi, le lcd reste en 5V et il faudra ajouter un [http://www.adafruit.com/products/757 convertisseurs de niveau] pour le bus si utilisé avec un capteur qui ne supporte pas 5V.&lt;br /&gt;
* le langage Python, c'est pas plus compliqué que le simili-C de l'Arduino une fois qu'on est rentré dedans.&lt;br /&gt;
&lt;br /&gt;
= Mark (3): Start, Stop, and say Cheese =&lt;br /&gt;
&lt;br /&gt;
== Sart/Stop ==&lt;br /&gt;
Un &amp;quot;problème&amp;quot; du RPi, c'est qu'il n'a pas de bouton ON/OFF simple, et par conséquent, l'éteindre proprement avec &amp;lt;code&amp;gt;sudo halt&amp;lt;/code&amp;gt; ou  &amp;lt;code&amp;gt;sudo poweroff&amp;lt;/code&amp;gt; est impossible sans un accès physique (clavier et écran connectés) ou une connection SSH (connection à distance). Pas pratique pour un boitier qui sera installé dans une cave à vin...&lt;br /&gt;
&lt;br /&gt;
Autrement dit, mes besoins:&lt;br /&gt;
# Le programme python d'affichage et monitoring des températures démarre automatiquement lorsque le RPi démarre.&lt;br /&gt;
# Un bouton OFF permet d'éteindre proprement le RPi avant de le débrancher de son alimentation.&lt;br /&gt;
# Un bouton ON permet de l'allumer une fois éteint sans débrancher/rebrancher son alimentation.&lt;br /&gt;
# Nec plus ultra: avoir un fonctionnement similaire à un bouton ON/OFF d'un laptop par exemple: si éteint, le bouton allume, si allumé, le bouton éteint proprement le RPi, et coupe l'alimentation USB.&lt;br /&gt;
&lt;br /&gt;
Bon après quelques recherches sur le net:&lt;br /&gt;
# C'est simple, il suffit de configurer le &amp;quot;init script&amp;quot; du RPi pour lancer automatiquement le programme python au démarrage&lt;br /&gt;
# Un montage simple permet d'écouter sur une des pins du GPIO, et de lancer la procédure propre d'arrêt (shutdown). Soit un bouton OFF&lt;br /&gt;
# Le RPi (à partir du modèle B rev2, soit Brev2, B+ et 2) possède un pinout &amp;quot;reset&amp;quot;, qui n'est pas soudé de base sur la carte. Si on raccorde ces deux pins, le RPi redémarre électriquement (hard reboot). Donc sans s'éteindre proprement. L'intérêt, c'est que si le RPi est éteint mais encore sous tension, ce bouton permet de le ré-allumer. Donc un bouton ON/RESET. Voir par exemple:&lt;br /&gt;
#* Un article assez complet en anglais sur [http://www.makeuseof.com/tag/add-reset-switch-raspberry-pi/ MakeUseOf.com]&lt;br /&gt;
# Le bouton combiné ON/OFF unique est possible, mais le montage est plus compliqué. Quelques exemples:&lt;br /&gt;
#* Un montage en français sur le site [http://forum.madeinfr.org/topic/43/raspower/ MadeInFR.org].&lt;br /&gt;
#* Un montage en anglais à base de micro contrôleur (pas simple donc) sur [http://www.instructables.com/id/Raspberry-Pi-Shutdown-Button/ Instructables]&lt;br /&gt;
#* Un article très complet en anglais reprenant toutes les options, dont un montage assez simple de bouton unique [http://www.raspberry-pi-geek.com/Archive/2013/01/Adding-an-On-Off-switch-to-your-Raspberry-Pi sur raspberry-pi-geek.com]&lt;br /&gt;
#* Des solutions commerciales toutes faites comme [https://www.pi-supply.com/product/pi-supply-raspberry-pi-power-switch/ PiSupply] ou [http://www.mausberrycircuits.com/collections/frontpage MausberryCircuits]&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, ce sera pour moi le choix suivant: un bouton OFF, qui lors d'un appui long éteint proprement le RPi. En gros la solution 2.&lt;br /&gt;
&lt;br /&gt;
Mais dans un premier temps, il faut configurer le RPi pour lancer le programme au démarrage...&lt;br /&gt;
&lt;br /&gt;
== Lancement du programme via initscript ==&lt;br /&gt;
&lt;br /&gt;
Il y a certainement 36 façons d'arriver au même résultat (après tout, le RPi tourne sous Linux ;-), mais dans mon cas, la solution qui me convient bien: un script d'init lance par défaut le script python localisé en &amp;lt;code&amp;gt;/usr/local/bin/pystartup.py&amp;lt;/code&amp;gt;. L'intérêt de la chose: &amp;lt;code&amp;gt;pystartup.py&amp;lt;/code&amp;gt; peut être un lien symbolique vers n'importe quel autre script.&lt;br /&gt;
&lt;br /&gt;
Pour éviter d'encombrer le wiki, je n'ai pas repris le script ici, mais il est dispo sur [https://gitlab.com/qberten/cellarkare/blob/master/mark3_camera/initscript_pystartup GitLab]. Pour l'installation, en ligne de commande (connecté sur le RPi):&lt;br /&gt;
&lt;br /&gt;
On télécharge le script, on le déplace au bon endroit et on le rend exécutable&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
wget https://gitlab.com/qberten/cellarkare/raw/master/mark3_camera/initscript_pystartup&lt;br /&gt;
sudo mv initscript_pystartup /etc/init.d/pystartup&lt;br /&gt;
sudo chmod a+x /etc/init.d/pystartup&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
On crée le lien symbolique qui va bien (remplacer /chemin/vers/... par la localisation du programme à lancer)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
ln -s /chemin/vers/votre/script/python.py /usr/local/bin/pystartup.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
On configure le système pour qu'il connaisse le nouveau script &amp;quot;pystartup&amp;quot;, et on lui demande de l'exécuter à chaque démarrage&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo update-rc.d pystartup defaults&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Il est ensuite possible de lancer son programme en arrière plan comme n'importe quel autre service avec &amp;lt;code&amp;gt;sudo service pystartup start&amp;lt;/code&amp;gt;, de l'arrêter avec &amp;lt;code&amp;gt;sudo service pystartup stop&amp;lt;/code&amp;gt;, etc&lt;br /&gt;
&lt;br /&gt;
== Pinout RESET ==&lt;br /&gt;
&lt;br /&gt;
Activer le &amp;quot;hard&amp;quot; reset sur le Rpi suppose un peu de soudure, mais rien de bien effrayant, 2 points suffisent. Un fois les connecteur pinout soudés, quand on raccorde les deux pins (par exemple avec un interrupteur), le RPi redémarre (&amp;quot;hard&amp;quot; reset, donc attention à la carte SD...), ou s'allume (si il était raccordé au secteur).&lt;br /&gt;
&lt;br /&gt;
J'ai soudé les 2 pins et testé la fonction, mais comme il s'agit d'un redémarrage &amp;quot;hard&amp;quot;, je n'ai finalement pas vraiment vu l'utilité dans ce projet: autant directement débrancher / rebrancher le câble d'alimentation dans ce cas.&lt;br /&gt;
&lt;br /&gt;
Mais à toutes fins utiles, les photos de l'opération, avant/après.&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Rpi_reset_before.jpg|500px|thumb|left]]&lt;br /&gt;
[[Fichier:Rpi_reset_after.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bouton OFF ==&lt;br /&gt;
&lt;br /&gt;
Rien de très compliqué: on raccorde le bouton à une entrée, on configure la résistance pull-up/down interne du Rpi, on s'assure de récupérer les évènements dans le code.&lt;br /&gt;
&lt;br /&gt;
Les parties utiles du code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# La fonction qui effectuer l'arrêt propre du RPi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def btn_proper_halt(pin):&lt;br /&gt;
    global off_state, cur_millis, off_millis&lt;br /&gt;
    # On lit le nombre de millisecondes courant&lt;br /&gt;
    cur_millis = time.time()*1000&lt;br /&gt;
    # Utilise la variable globale off_state&lt;br /&gt;
    off_state = not off_state&lt;br /&gt;
    # DEBUG&lt;br /&gt;
    logging.debug(&amp;quot;Bouton OFF_PIN pressé, son état est maintenant %s&amp;quot; % str(off_state))&lt;br /&gt;
    if off_state == True:&lt;br /&gt;
        off_millis = cur_millis   &lt;br /&gt;
    elif off_state == False: &lt;br /&gt;
        # DEBUG&lt;br /&gt;
        logging.debug(&amp;quot;Bouton OFF_PIN pressé pendant {0:0.0f} ms&amp;quot;.format(cur_millis - off_millis))&lt;br /&gt;
        if (cur_millis - off_millis) &amp;gt; OFF_INTERVAL:&lt;br /&gt;
            # On a relâché le bouton avec un écart long =&amp;gt; shutdown&lt;br /&gt;
            logging.debug(&amp;quot;Appui long sur le bouton OFF_PIN&amp;quot;)&lt;br /&gt;
            logging.info(&amp;quot;Arrêt du Raspberry PI, attendre encore 10 sec avant de débrancher&amp;quot;)&lt;br /&gt;
            subprocess.call('halt', shell=False)&lt;br /&gt;
        else:&lt;br /&gt;
            # Appuis court =&amp;gt; on ne fait rien&lt;br /&gt;
            logging.debug(&amp;quot;Appui court sur le bouton OFF_PIN&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Fonction de terminaison du programme (appelée lorsque le script est arrêté&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def terminate():&lt;br /&gt;
    logging.debug(&amp;quot;Terminate function started&amp;quot;)&lt;br /&gt;
    # efface l'écran LCD&lt;br /&gt;
    lcd_dim_backlight(0.0, 0.2)&lt;br /&gt;
    lcd.clear()&lt;br /&gt;
    logging.debug(&amp;quot;Terminate function ended&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Fonction d'initialisation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def initialize():&lt;br /&gt;
    global lcd&lt;br /&gt;
    logging.debug(&amp;quot;Initialize function started&amp;quot;)&lt;br /&gt;
    # Initialisation du LCD avec les variables ci-dessus&lt;br /&gt;
    lcd = LCD.Adafruit_CharLCD(LCD_RS, LCD_EN, LCD_D4, LCD_D5, LCD_D6, LCD_D7, &lt;br /&gt;
		        	LCD_COLUMNS, LCD_ROWS,&lt;br /&gt;
                                LCD_BACKLIGHT, invert_polarity = False, enable_pwm = True,&lt;br /&gt;
                                initial_backlight = lcd_backlight)&lt;br /&gt;
    # Initialisation des autres GPIO's&lt;br /&gt;
    GPIO.setmode(GPIO.BCM)        # On utilise la numérotation BCM pour les PIN&lt;br /&gt;
    # On définit la pin OFF_PIN comme entrée, et on active la résistance pull-down interne du RPi&lt;br /&gt;
    GPIO.setup(OFF_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)&lt;br /&gt;
    # Configure une interruption qui va détecter les mouvements up et down sur le bouton&lt;br /&gt;
    GPIO.add_event_detect(OFF_PIN, GPIO.BOTH, callback=btn_proper_halt, bouncetime=20)&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Say &amp;quot;cheese&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Cette partie du projet s'attache à pouvoir prendre rapidement et facilement un photos des étiquettes des bouteilles entrées ou sorties de la cave. Ben oui, j'ai pas forcément une bonne mémoire, et se donner les moyens d'enregistrer facilement et rapidement l'info est le meilleur moyen de suivre son stock ;-)&lt;br /&gt;
&lt;br /&gt;
Cette partie est super simple à réaliser avec le rpi: on raccorde la caméra, on s'assure qu'elle est activée avec &amp;lt;code&amp;gt;sudo raspi-config&amp;lt;/code&amp;gt;, et on peut ensuite l'utiliser en ligne de commande ou en python. Le site web [https://www.raspberrypi.org/documentation/usage/camera/README.md raspberrypi.org (en anglais)] explique cela très bien.&lt;br /&gt;
&lt;br /&gt;
On ajoute un deuxième bouton sur le breadboard, qui déclenche la prise d'une photo, et le prototype est maintenant fonctionnel. Les photos sont sauvegardées dans le répertoire courant du RPi, avec la date et l'heure pour nom de fichier.&lt;br /&gt;
&lt;br /&gt;
Au niveau du code, les parties utiles sont:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Fonction de prise d'une photo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def btn_take_picture(pin):&lt;br /&gt;
    # DEBUG&lt;br /&gt;
    logging.info(&amp;quot;Bouton CAM_PIN pressé, on prend un photo&amp;quot;)&lt;br /&gt;
    # Construction du chemin pour la photo&lt;br /&gt;
    now = datetime.datetime.now()&lt;br /&gt;
    pic_filename = &amp;quot;/home/qb/pic_&amp;quot; + str(now) + &amp;quot;.jpg&amp;quot;&lt;br /&gt;
    # Initialisation de la camera. On ne le fait pas dans initialize() pour éviter au maximum de la laisser&lt;br /&gt;
    # allumée (et consommer) en continu. En plus, une fois activée, les lectures sur le DHT sont beaucoup&lt;br /&gt;
    # plus souvent ratées.&lt;br /&gt;
    with PICAM.PiCamera() as cam:&lt;br /&gt;
        cam.capture(pic_filename)&lt;br /&gt;
        logging.debug(&amp;quot;Photos sauvée &amp;quot; + str(cam.resolution) + &amp;quot;  dans &amp;quot; + pic_filename)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pimp my screen ==&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est d'allumer ou éteindre l'écran, la bibliothèque CharLCD permet la modulation PWN du rétroéclairage. De quoi avoir un chouette effet de fondu au noir lorsque l'écran s'allume et s'éteint.&lt;br /&gt;
&lt;br /&gt;
Au niveau du code, la partie utile:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Module l'intensité du rétro éclairage de l'écran lcd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def lcd_dim_backlight(backlight_value, time_step):&lt;br /&gt;
    global lcd&lt;br /&gt;
    global lcd_backlight&lt;br /&gt;
    # calcule l'incrément à avoir entre lcd_backlight et backlight_value&lt;br /&gt;
    stp = (lcd_backlight &amp;gt; backlight_value) * -2 +1&lt;br /&gt;
    brightnesses = map(lambda x: x/10.0, range(int(lcd_backlight*10), int(backlight_value*10)+1, stp))&lt;br /&gt;
    for bright in brightnesses:&lt;br /&gt;
        lcd_backlight = bright&lt;br /&gt;
        logging.debug(&amp;quot;loop on bright= &amp;quot; + str(bright))&lt;br /&gt;
        lcd.set_backlight(bright)&lt;br /&gt;
        time.sleep(time_step)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Le code et le montage ==&lt;br /&gt;
&lt;br /&gt;
Le code source complet pour [https://gitlab.com/qberten/cellarkare/blob/master/mark3_camera/cellarkare_cam.py Mark 3 est disponible sur gitlab]. Pour ce qui est du montage, ben pas de schéma de raccordement disponible, j'ai oublié de le documenter en temps utile avant de passer à Mark 4! Donc il faudra attendre la suite...&lt;br /&gt;
&lt;br /&gt;
= Mark (4): We are (almost) done =&lt;br /&gt;
&lt;br /&gt;
== Pimp my screen, reloaded ==&lt;br /&gt;
Une dernière petite touche intéressante: l'appareil est destiné à être mis dans une cave à vin, endroit où il va faire noir la plupart du temps. En conséquence, l'écran LCD n'a pas vraiment besoin d'être allumé en permanence, pourquoi ne pas l'allumer automatiquement quand la lumière du local dépasse un certain seuil. Une photorésistance permet de réaliser rapidement la mesure d'une intensité lumineuse, pourquoi s'en priver... Oui mais... le RPi n'a pas d'entrée analogique, comment convertir simplement la mesure sur la photorésistance en une valeur analogique, alors que le RPi n'a que des entrées digitales.&lt;br /&gt;
&lt;br /&gt;
Après un peu de recherche, un montage simple à base d'une capacité dont le temps de charge sera directement proportionnel à la mesure sur la photo-résistance. Tout cela est expliqué ici (en anglais): [http://www.raspberrypi-spy.co.uk/2012/08/reading-analogue-sensors-with-one-gpio-pin/]&lt;br /&gt;
&lt;br /&gt;
(TODO - continuer la documentation)&lt;br /&gt;
&lt;br /&gt;
== Buttons, buttons, we want more ==&lt;br /&gt;
&lt;br /&gt;
Dernier petit détail, et non des moindre, Pour avoir un projet réellement fonctionnel, il va falloir travailler un peu l'interface homme-machine, et permettre un peu plus d'interaction avec le Rpi, pour par exemple permettre d'entrer le nombre de bouteilles couvertes par l'entrée ou la sortie photographiée, quitter/valider une action, ...&lt;br /&gt;
&lt;br /&gt;
(TODO - continuer la documentation)&lt;br /&gt;
&lt;br /&gt;
== We want leds ==&lt;br /&gt;
&lt;br /&gt;
Toujours dans l'optique d'améliorer l'interaction avec l'appareil, pourquoi ne pas intégrer une led de status sur l'appareil, pour indiquer visuellement différents états, comme par exemple: une température trop basse ou trop haute est enregistrée, il n'y a pas de connection réseau, ...&lt;br /&gt;
&lt;br /&gt;
(TODO - à implémenter tout court ;-)&lt;br /&gt;
&lt;br /&gt;
== All your data are belong to us ==&lt;br /&gt;
&lt;br /&gt;
Enfin, c'est bien beau d'afficher la température et l'humidité, c'est encore mieux de l'enregistrer quelque part pour pouvoir tracer l'historique, et intéragir plus facilement avec ces données. Après quelques investigations, c'est [http://thingspeak.com Thingspeak] qui a retenu mon attention.&lt;br /&gt;
&lt;br /&gt;
(TODO - à implémenter tout court ;-)&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Projets]]&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=CellarKare&amp;diff=2985</id>
		<title>CellarKare</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=CellarKare&amp;diff=2985"/>
		<updated>2015-10-28T21:08:17Z</updated>

		<summary type="html">&lt;p&gt;Quentin : /* Mark 4: We are (almost) done */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Un projet lancé par --[[Utilisateur:Quentin|Quentin]] ([[Discussion utilisateur:Quentin|discussion]]) 14 juin 2015 à 19:58 (CEST)&lt;br /&gt;
&lt;br /&gt;
= En bref =&lt;br /&gt;
&lt;br /&gt;
Le projet est de créer une &amp;quot;station météo&amp;quot; pour une cave à vin, d'où le nom du projet un peu fumeux de CellarKare = Cellar + Care, le K c'est pour faire joli ;-)&lt;br /&gt;
Dans un premier temps, le but est d'afficher la température et le taux d'humidité (hygrométrie). Ça, c'est pour le but fonctionnel. Mes autres buts sont:&lt;br /&gt;
* Au niveau perso: réaliser un premier projet à forte composante électronique, dans la foulée de notre formation Arduino&lt;br /&gt;
* Utiliser un maximum toutes les techniques/machines du Makilab&lt;br /&gt;
* Documenter les différentes étapes (tutoriel), et fournir les fichiers sources nécessaires aux différentes étapes.&lt;br /&gt;
&lt;br /&gt;
= Mark (1): Le matos et un premier proto Arduino=&lt;br /&gt;
&lt;br /&gt;
Le premier prototype sera relativement simple: la station affichera la température et l'humidité ambiante sur un écran LCD, le tout piloté par un Arduino Uno.&lt;br /&gt;
&lt;br /&gt;
== T° et humidité: DHT22 / AM2303 ==&lt;br /&gt;
&lt;br /&gt;
Au niveau des capteurs, logiquement il en faut un pour lire la température, et un pour lire l'humidité. Les deux existent certainement séparément, mais une rapide recherche sur le net done des références de capteurs déjà calibrés et fournissant les deux pour pas trop cher. Au final, mon choix se porte sur un DHT22. Ce capteur s'appelle aussi AM2303 dans sa version câblée. Quelques liens et documentation utiles:&lt;br /&gt;
* [http://www.adafruit.com/datasheets/DHT22.pdf Les specs du DHT22 (anglais)];&lt;br /&gt;
* Pour acheter: [http://www.adafruit.com/products/385 ~10 $ chez AdaFruit] ou [http://shop.mchobby.be/senseurs/214-dht22-am2302-senseur-humidite-temperature--3232100002142.html ~17 € chez MCHobby], c'est un peu plus cher, mais ils sont belges et sympas;&lt;br /&gt;
* [http://playground.arduino.cc/Main/DHTLib Un tutoriel pour arduino sur Arduino.cc];&lt;br /&gt;
* [https://learn.adafruit.com/dht/using-a-dhtxx-sensor Un tutoriel pour arduino sur AdaFruit], et sa [http://mchobby.be/wiki/index.php?title=DHTxx version française];&lt;br /&gt;
&lt;br /&gt;
== L'affichage LCD: LCM1602 ==&lt;br /&gt;
&lt;br /&gt;
Pour l'affichage, le choix a été vite fait... J'ai pris ce que j'avais sous la main, soit le LCD fourni dans le starter kit arduino. Cet écran est très répandu, et fait partie de nombreux &amp;quot;kits de démarrage&amp;quot; en électronique. Au niveau fonctionnel, avec 2 lignes de 16 charactères, on devrait pouvoir s'en sortir pour afficher une température et un taux d'humidité ;-). Son contrôleur (hitachi HD44780) est lui aussi très répandu En vrac:&lt;br /&gt;
* [http://www.datasheetspdf.com/datasheet/LCM1602.html Les specs (chinois ou anglais)]&lt;br /&gt;
* Pour acheter: [http://www.ebay.com/sch/items/?_nkw=lcm1602&amp;amp;_sacat=&amp;amp;_ex_kw=&amp;amp;_mPrRngCbx=1&amp;amp;_udlo=&amp;amp;_udhi=&amp;amp;_sop=12&amp;amp;_fpos=&amp;amp;_fspt=1&amp;amp;_sadis=&amp;amp;LH_CAds=&amp;amp;rmvSB=true on en trouve plein sur ebay...]&lt;br /&gt;
* [http://www.arduino.cc/en/Tutorial/LiquidCrystal La librairie LiquidCrystal, qui permet de le contrôler sur Arduino]&lt;br /&gt;
&lt;br /&gt;
== Le montage ==&lt;br /&gt;
&lt;br /&gt;
Le montage est assez simple, et n'est finalement qu'une combinaison des différents tutoriel et exemple d'utilisation de l'écran et du capteur.&lt;br /&gt;
&lt;br /&gt;
Sur le schéma du capteur DHT, la résistance de 10K sert de [https://fr.wikipedia.org/wiki/R%C3%A9sistance_de_rappel &amp;quot;résistance pull-up&amp;quot;].&lt;br /&gt;
'''Cette résistance n'est pas nécessaire dans le cas du capteur AM2302''' (la version avec câble et boitier en plastique, comme sur la photo). Cette version [http://www.adafruit.com/product/393 intègre une résistance de 5.1K dans le boîtier], qui connecte déjà VCC et DATA, merci Patrick pour l'info ;-).&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Cellarkare mark1 bb.png|500px|thumb|left]]&lt;br /&gt;
[[Fichier:Cellarkare_mark1.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Le code ==&lt;br /&gt;
Au niveau programmation du micro-controlleur Arduino, là aussi c'est assez simple: toutes les 3 secondes, on lit les valeurs de t° et humidité, et on les affiches sur l'écran LCD. Les valeurs mesurées et des messages supplémentaires sont aussi envoyés sur la sortie série.&lt;br /&gt;
&lt;br /&gt;
Le code est aussi disponible (et éventuellement mis à jour) [https://gitlab.com/qberten/cellarkare/blob/master/mark1_arduino/cellarkare_arduino.ino sur gitlab]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
CellarKare - Mark #1&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Un projet de station de mesure de la température et l'humidité dans une cave à vin&lt;br /&gt;
Plus d'infos et schéma de montage sur http://wiki.makilab.org/index.php/CellarKare&lt;br /&gt;
Quentin Berten, 2015 - Domaine public, licence WTFPL v2, http://www.wtfpl.net/&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
// Bibliothèque LiquidCrystal, pour l'écran LCD. Installée de base avec l'IDE&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Bibliothèque DHT, pour le capteur de température. Installable directement depuis&lt;br /&gt;
// l'IDE, via Sketch -&amp;gt; Include LIbrary -&amp;gt; Manage Libraries -&amp;gt; DHT sensor Library &lt;br /&gt;
#include &amp;quot;DHT.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Définition l'écran LCD, en argument les pins d'interface, dans l'ordre&lt;br /&gt;
// (RS pin, LCD Enable, D4, D5, D6, D7)&lt;br /&gt;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);&lt;br /&gt;
&lt;br /&gt;
// Définition des pin et type pour le senseur de t° et humidité&lt;br /&gt;
#define DHTPIN 7         // senseur (fil data, en jaune), sur pin 7&lt;br /&gt;
#define DHTTYPE DHT22    // type DHT 22  (AM2302)&lt;br /&gt;
&lt;br /&gt;
// Définition du capteur DHT22, pour un Arduino &amp;quot;normal&amp;quot; à 16mhz, comme le Uno&lt;br /&gt;
DHT dht(DHTPIN, DHTTYPE);&lt;br /&gt;
// les variables associées qui vont lire les valeurs (température, ...)&lt;br /&gt;
float hum;&lt;br /&gt;
float tempC;&lt;br /&gt;
float tempF;&lt;br /&gt;
float indiceHum;&lt;br /&gt;
&lt;br /&gt;
// les variables qui permettent de gérer le temps,&lt;br /&gt;
// voir http://www.arduino.cc/en/pmwiki.php?n=Tutorial/BlinkWithoutDelay&lt;br /&gt;
long prevMillis = 0;           // enregistre le temps de la denière lecture DHT22&lt;br /&gt;
long dhtInterval = 3000;       // L'intervalle de lecture du DHT22: 3 secondes&lt;br /&gt;
&lt;br /&gt;
// la procédure d'initialisation arduino&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  // on ouvre une connection série (pour afficher un maxium d'info)&lt;br /&gt;
  Serial.begin(9600); &lt;br /&gt;
  Serial.println(&amp;quot;CellarKare Mark #1 Test&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // initialisation du capteur&lt;br /&gt;
  dht.begin();&lt;br /&gt;
  // initialisation de l'écran, 16 colonnes et 2 lignes&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// la boucle principale arduino&lt;br /&gt;
void loop() {&lt;br /&gt;
  unsigned long curMillis = millis();&lt;br /&gt;
  &lt;br /&gt;
  if(curMillis - prevMillis &amp;lt; dhtInterval) {&lt;br /&gt;
    goto end_loop;        // pas de lecture DHT, on va à la fin de la boucle loop()&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // on enregistre le dernier temps d'exécution de la lecture&lt;br /&gt;
  prevMillis = curMillis;   &lt;br /&gt;
  &lt;br /&gt;
  // la lecture de la t° et l'humidité prends environ 250 millisecondes&lt;br /&gt;
  // mais les lectures du capteur peuvent etre vieillies de 2 secondes&lt;br /&gt;
  // le capteur n'est pas rapide (d'où l'attente de 3 secondes pour etre&lt;br /&gt;
  // certain d'avoir des lectures correctes.&lt;br /&gt;
  // lecture de l'humidité&lt;br /&gt;
  hum = dht.readHumidity();&lt;br /&gt;
  // lecture de la température en degrés Celsius&lt;br /&gt;
  tempC = dht.readTemperature();&lt;br /&gt;
  // lecture de la température en degrés Fahreneit&lt;br /&gt;
  tempF = dht.readTemperature(true);&lt;br /&gt;
  &lt;br /&gt;
  // On vérifie que les lectures on bien été réalisées. Si pas, on quitte&lt;br /&gt;
  // la boucle pour ré-essayer&lt;br /&gt;
  if (isnan(hum) || isnan(tempC) || isnan(tempF)) {&lt;br /&gt;
    Serial.println(&amp;quot;Lecture sur le capteur DHT ratée&amp;quot;);&lt;br /&gt;
    goto end_loop;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Calcul de l'indice de chaleur (voir https://fr.wikipedia.org/wiki/Indice_de_chaleur )&lt;br /&gt;
  // La température doit etre fournie en degré Fahreneit&lt;br /&gt;
  indiceHum = dht.computeHeatIndex(tempF, hum);&lt;br /&gt;
&lt;br /&gt;
  // On affiche les valeurs sur la console série (n'est pas indispensable)&lt;br /&gt;
  Serial.print(&amp;quot;Humidite: &amp;quot;); &lt;br /&gt;
  Serial.print(hum);&lt;br /&gt;
  Serial.print(&amp;quot; %\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temperature: &amp;quot;); &lt;br /&gt;
  Serial.print(tempC);&lt;br /&gt;
  Serial.print(&amp;quot; *C &amp;quot;);&lt;br /&gt;
  Serial.print(tempF);&lt;br /&gt;
  Serial.print(&amp;quot; *F\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Indice de chaleur: &amp;quot;);&lt;br /&gt;
  Serial.print(indiceHum);&lt;br /&gt;
  Serial.println(&amp;quot; *F&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  // On affiche les valeurs sur l'écran LCD, curseur à (0,0)&lt;br /&gt;
  lcd.setCursor(0, 0);&lt;br /&gt;
  // print Temp in C°&lt;br /&gt;
  lcd.print(&amp;quot;deg C: &amp;quot;);&lt;br /&gt;
  lcd.print(tempC);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;hum %: &amp;quot;);&lt;br /&gt;
  lcd.print(hum);&lt;br /&gt;
&lt;br /&gt;
  // label pour goto&lt;br /&gt;
  end_loop:&lt;br /&gt;
  ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== La conclusion ==&lt;br /&gt;
Un premier prototype fonctionnel, qui a au moins le mérite de vérifier que le capteur DHT renvoie des valeurs réalistes.&lt;br /&gt;
La suite: la même chose avec un Raspberry pi, pour bénéficier de sa faciliter à se connecter au réseau. Ce serait quand même cool de pouvoir lire ces valeurs sur un smartphone ;-)&lt;br /&gt;
&lt;br /&gt;
= Mark (2): la même chose avec un Raspberry Pi =&lt;br /&gt;
Le but de cette nouvelle itération: réaliser un montage équivalent avec un [https://www.raspberrypi.org/ Raspberry Pi] (RPi en abrégé). Pourquoi un RPi ?&lt;br /&gt;
* Parce que j'en avais un sous la main ;-)&lt;br /&gt;
* Parce qu'il permet de se connecter rapidement et facilement à un réseau, via ethernet (câble) ou wifi (via un dongle usb)&lt;br /&gt;
* Parce qu'il permet de brancher facilement un module caméra (on y viendra au Mark 3)&lt;br /&gt;
&lt;br /&gt;
Il est certainement possible d'arriver au même résultat avec d'autres cartes (comme par exemple un [http://www.arduino.cc/en/Main/ArduinoBoardYun Arduino Yun]), c'est juste que c'est un RPi que j'avais sous la main... Dans mon cas un Raspberry Pi B+.&lt;br /&gt;
&lt;br /&gt;
En ce qui concerne le RPi, quelques ressources très utiles:&lt;br /&gt;
* [http://mchobby.be/wiki/index.php?title=RaspberryPi-Accueil#Tutoriels Les tutoriels réalisés/traduits par MC Hobby. Une mine d'or]&lt;br /&gt;
* [http://www.elektronique.fr/montages/raspberry-pi/ Des exemples de montages et réalisations électroniques avec RPi]&lt;br /&gt;
* [http://pi.gadgetoid.com/pinout La configuration des différentes PIN du RPi]&lt;br /&gt;
&lt;br /&gt;
== L'installation de l'OS ==&lt;br /&gt;
La principale différence entre une carte Arduino et le RPi, c'est le cœur de la carte:&lt;br /&gt;
* le cœur de l'Arduino est un microcontrôleur, qui va exécuter le programme qu'on lui injecte de manière bête et méchante. Chaque entrée/sortie va devoir être programmée directement, il n'y a pas de système de driver, ...&lt;br /&gt;
* le cœur du RPi est un microprocesseur (ARM, la même technologie que dans les smartphones). Il s'agit donc en fait d'un véritable &amp;quot;petit ordinateur&amp;quot;, avec un système d'exploitation, des drivers (pour l'usb, l'écran, le wifi, ...).&lt;br /&gt;
&lt;br /&gt;
Donc avant de pouvoir démarrer et utiliser le RPi, il va falloir installer un système d'exploitation (OS: Operating System). C'est exactement la même chose qu'installer Windows sur un PC, c'est juste que dans notre cas, ce ne sera pas Windows mais un système Linux. Il en existe [https://www.raspberrypi.org/downloads/ plusieurs], le standard de facto étant Raspbian (une distribution Debian adaptée pour le RPi), c'est celle-là [http://raspbian-france.fr/installer-raspbian-premier-demarrage-configuration/ que j'ai installée].&lt;br /&gt;
&lt;br /&gt;
Petit truc pour les distraits: écran/clavier/souris ne sont pas indispensables pour l'installation, il est tout à fait possible de se connecter via [https://fr.wikipedia.org/wiki/Secure_Shell SSH] au RPi une fois son premier démarrage exécuté, pour autant qu'il soit raccordé à votre réseau (via son câble ethernet). Le RPi se déclare automatiquement sur le réseau avec le nom raspberry.local, et un &amp;lt;code&amp;gt;ssh pi@raspberry.local&amp;lt;/code&amp;gt; à fait l'affaire (raspberry, c'est son &amp;quot;hostname&amp;quot; par défaut). Pour le mot de passe, c'est &amp;lt;code&amp;gt;raspberry&amp;lt;/code&amp;gt; par défaut. Ensuite &amp;lt;code&amp;gt;raspi-config&amp;lt;/code&amp;gt; permet de terminer la procédure d'installation.&lt;br /&gt;
&lt;br /&gt;
En ce qui me concerne, tout le reste de la configuration se fera donc en [https://fr.wikipedia.org/wiki/Shell_Unix ligne de commande (shell)] via SSH. [http://mchobby.be/wiki/index.php?title=PI-SSH Le wiki de MCHobby] détaille l'accès via SSH au RPi.&lt;br /&gt;
&lt;br /&gt;
'''Un dernier point important''': le RPi, c'est comme un &amp;quot;vrai&amp;quot; ordinateur... il vaut mieux l'éteindre proprement plutôt que le débrancher sauvagement. Donc on s'arrange pour faire un &amp;lt;code&amp;gt;sudo poweroff&amp;lt;/code&amp;gt; en ligne de commande avant de le débrancher. Le gros risque: corrompre le système de fichier sur le carte SD, ce qui empêche le démarrage suivant, et impose un reformatage et une réinstallation complète. Pas drôle en somme, je parle d'expérience :-(&lt;br /&gt;
&lt;br /&gt;
== Le wifi ==&lt;br /&gt;
Bien que le RPi ne soit pas équipé par défaut du wifi, il est compatible avec la majorité des clefs usb wifi. Dans mon cas, une vieille clef Hercules HWGUSB2-54. Un petit tour par les log (&amp;lt;code&amp;gt;sudo tail -f /var/log/syslog&amp;lt;/code&amp;gt;) pour vérifier qu'elle est reconnue correctement lors du branchement, et puis une configuration via l'édition de &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt; pour entrer les références du réseau wifi:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
auto wlan0&lt;br /&gt;
allow-hotplug wlan0&lt;br /&gt;
iface wlan0 inet dhcp&lt;br /&gt;
wpa-ssid &amp;quot;Le_nom_(SSID)_de_votre_wifi&amp;quot;&lt;br /&gt;
wpa-psk &amp;quot;Le_mot_de_passe_de_votre_wifi&amp;quot;&lt;br /&gt;
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Ensuite un redémmarrage de la carte avec &amp;lt;code&amp;gt;$ sudo ifdown wlan0&amp;lt;/code&amp;gt; suivi de &amp;lt;code&amp;gt;sudo ifup wlan0&amp;lt;/code&amp;gt; et ça devrait être OK. On peut maintenant se passer de câble ethernet!&lt;br /&gt;
&lt;br /&gt;
Si nécessaire: plus de détails sur la configuration réseau sur [http://mchobby.be/wiki/index.php?title=Rasp-Config-Reseau le wiki MC Hobby]&lt;br /&gt;
&lt;br /&gt;
== La température avec le DHT22 / AM2302 ==&lt;br /&gt;
Pour la lecture des température avec le capteur, les gars d'Adafruit ont déjà développé un bibliothèque de fonctions utilisables en ligne de commande ou en [https://fr.wikipedia.org/wiki/Python_%28langage%29 python]. Quelques ressources:&lt;br /&gt;
* [https://learn.adafruit.com/dht-humidity-sensing-on-raspberry-pi-with-gdocs-logging/overview La page d'Adafruit (en anglais) sur l'utilisation du DHT22 avec le RPi]&lt;br /&gt;
* [http://www.manuel-esteban.com/lire-une-sonde-dht22-avec-un-raspberry-pi/ Une ressource en français (un peu datée) sur l'utilisation DHT22 + RPi.]&lt;br /&gt;
* [http://pi.gadgetoid.com/pinout La table de référence des 40 pins GPIO du RPi]&lt;br /&gt;
Pour ma part, j'ai suivi la méthode Adafruit, ce qui donne en résumé, en ligne de commande:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
cd /home/pi&lt;br /&gt;
git clone https://github.com/adafruit/Adafruit_Python_DHT.git &lt;br /&gt;
cd Adafruit_Python_DHT&lt;br /&gt;
sudo apt-get install build-essential python-dev  &lt;br /&gt;
sudo python setup.py install&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Au niveau du montage, rien de nouveau: le capteur doit toujours être alimenté en 3.3V ou en 5V, et le câble de lecture à une pin d'entrée/sortie (GPIO: General Purpose Input Output), ce qui donne:&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Cellarkare mark2 bb.png|400px|thumb|left]]&lt;br /&gt;
[[Fichier:Cellarkare_mark2.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Un test en ligne de commande permet de vérifier qu'on a une lecture sur le capteur (dans mon cas un AM2302 raccordé sur la pin GPIO 4):&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
cd /home/pi/Adafruit_Python_DHT/examples/&lt;br /&gt;
sudo ./AdafruitDHT.py 2302 4&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Ce qui affiche &amp;lt;code&amp;gt;Temp=23.0*C  Humidity=53.8%&amp;lt;/code&amp;gt;, des valeurs censées pour une après-midi d'été ;-)&lt;br /&gt;
&lt;br /&gt;
== L'affichage LCD ==&lt;br /&gt;
L'écran LCD est toujours le même que pour la version &amp;quot;Mark 1&amp;quot; Arduino. Quelques resources:&lt;br /&gt;
* [https://learn.adafruit.com/drive-a-16x2-lcd-directly-with-a-raspberry-pi Un tutoriel (en anglais) sur Adafruit] ''Attention, le code source n'est plus tellement a jour, voir le dernier lien Github.''&lt;br /&gt;
* [http://mchobby.be/wiki/index.php?title=Rasp-Hack-Afficheur-LCD La version française, traduite par MC Hobby]&lt;br /&gt;
* [https://github.com/adafruit/Adafruit_Python_CharLCD Le code source de la librairie Adafruit pour le gestion du LCD sur GitHub] ''contient la dernière version de la librairie''.&lt;br /&gt;
&lt;br /&gt;
La logique de raccordement est strictement identique au circuit du Mark 1. La seule différence est que la résistance variable de 10K dans le circuit est supprimée, la bibliothèque Adafruit pour le LCD permettant le pilotage en [https://fr.wikipedia.org/wiki/Modulation_de_largeur_d%27impulsion modulation PWM].&lt;br /&gt;
&lt;br /&gt;
== Le montage ==&lt;br /&gt;
Au final, le montage a été fait pour gagner un maximum de place sur mon breadboard. La pin data du DHT a été déplacée sur la pin 5, et le reste des pin pour le LCD sont documentées dans le code.&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Cellarkare mark2_2 bb.png|500px|thumb|left]]&lt;br /&gt;
[[Fichier:Cellarkare_mark2_2.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Le code ==&lt;br /&gt;
&lt;br /&gt;
La logique du code est identique à la version mark 1 - arduino. Ce code est aussi disponible (et éventuellement mis à jour) [https://gitlab.com/qberten/cellarkare/blob/master/mark2_rpi/cellarkare_rpi.py sur gitlab]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
# coding=utf8&lt;br /&gt;
# CellarKare - Mark 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
# Un projet de station de mesure de la température et l'humidité dans une cave à vin&lt;br /&gt;
# Plus d'infos et schéma de montage sur http://wiki.makilab.org/index.php/CellarKare&lt;br /&gt;
# Quentin Berten, 2015 - Domaine public, licence WTFPL v2, http://www.wtfpl.net/&lt;br /&gt;
# quentin_#AT#_berten.me&lt;br /&gt;
&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
# Bibliothèque CharLCD d'Adafruit, voir https://github.com/adafruit/Adafruit_Python_CharLCD&lt;br /&gt;
# pour l'installation&lt;br /&gt;
import Adafruit_CharLCD as LCD&lt;br /&gt;
# Bibliothèque DHT d'AdaFruit, voir https://github.com/adafruit/Adafruit_Python_DHT&lt;br /&gt;
# pour l'installation&lt;br /&gt;
import Adafruit_DHT as DHT&lt;br /&gt;
&lt;br /&gt;
# Configuration de l'affichage LCD&lt;br /&gt;
lcd_rs        = 25      # RS sur pin 25&lt;br /&gt;
lcd_en        = 24      # EN sur pin 24&lt;br /&gt;
lcd_d4        = 23      # D4 sur pin 23&lt;br /&gt;
lcd_d5        = 12      # D5 sur pin 12&lt;br /&gt;
lcd_d6        = 20      # D6 sur pin 20&lt;br /&gt;
lcd_d7        = 16      # D7 sur pin 16&lt;br /&gt;
lcd_backlight = 18      # rétro éclairage sur pin 18&lt;br /&gt;
lcd_columns   = 16      # Affichage à 16 colonnes ...&lt;br /&gt;
# Initialisation du LCD avec les variables ci-dessus&lt;br /&gt;
lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, &lt;br /&gt;
		        	lcd_columns, lcd_rows, lcd_backlight)&lt;br /&gt;
# Configuration pour le capteur DHT, soit DHT11, DHT22 ou AM2302.&lt;br /&gt;
dht_sensor    = DHT.AM2302  # Type AM2302&lt;br /&gt;
dht_pin       = 5           # DHT data sur pin 5&lt;br /&gt;
&lt;br /&gt;
# les variables qui permettent de gérer le temps,&lt;br /&gt;
prevMillis = 0          # enregistre le temps de la denière lecture DHT22&lt;br /&gt;
secInterval = 1000      # Un intervalle d'une seconde&lt;br /&gt;
# L'intervalle de lecture du DHT22: 3 secondes, doit etre plus grand que secInterval&lt;br /&gt;
dhtInterval = 3000&lt;br /&gt;
&lt;br /&gt;
def read_and_print_dht():&lt;br /&gt;
    # On lit une valeur sur le senseur avec la fonction read. Attention, cette fonction&lt;br /&gt;
    # ne réessaie pas automatiquement en cas d'erreur, mais fournit les valeurs (None, None).&lt;br /&gt;
    hum, tempC  = DHT.read(dht_sensor, dht_pin)&lt;br /&gt;
&lt;br /&gt;
    # On vérifie que l'on a bien eu une lecture (Linux n'est pas un OS temps réel et ne&lt;br /&gt;
    # peut pas garantir le timing des lectures sur le capteur). Si ça arrive, on réessaie.&lt;br /&gt;
    # On affiche les valeurs sur la console (n'est pas indispensable)&lt;br /&gt;
    if hum is not None and tempC is not None:&lt;br /&gt;
    	print 'Temp={0:0.2f}*C  Humidity={1:0.2f}%'.format(tempC, hum)&lt;br /&gt;
        # On affiche les valeurs sur l'écran LCD&lt;br /&gt;
        lcd.clear()&lt;br /&gt;
        lcd.message('deg C: {0:0.2f}\nhum %: {1:0.2f}'.format(tempC, hum))&lt;br /&gt;
    else:&lt;br /&gt;
	print 'Lecture sur le capteur DHT ratée'&lt;br /&gt;
&lt;br /&gt;
# Boucle principale, l'équivalent de void loop() sur Arduino&lt;br /&gt;
while 1:&lt;br /&gt;
    # On lit le nombre de millisecondes courant&lt;br /&gt;
    curMillis = time.time()*1000&lt;br /&gt;
    if curMillis - prevMillis &amp;gt; dhtInterval:&lt;br /&gt;
        # On essaie de lire et afficher les valeurs du DHT&lt;br /&gt;
        read_and_print_dht()&lt;br /&gt;
        # on enregistre le dernier temps d'exécution de la lecture&lt;br /&gt;
        prevMillis = curMillis&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== La conclusion ==&lt;br /&gt;
En vrac:&lt;br /&gt;
* Pas de gros problème ou obstacles majeurs pour convertir le montage et le code Arduino en son équivalent RPi. Mais heureusement que l'équipe d'Adafruit a déjà programmé les bibliothèques Python qui vont bien!&lt;br /&gt;
* Au niveau du breadboard, ça commence à prendre de la place... Une solution: passer en [https://fr.wikipedia.org/wiki/I2C &amp;quot;I2C&amp;quot;] pour le capteur et le LCD, ce qui limite drastiquement le nombre de pins nécessaires pour le montage, et facilite la programmation. Merci Patrick pour les infos, ce sera sûrement utile pour le prochain montage ;-) !&lt;br /&gt;
** Par exemple, pour la température: un capteur I2C comme le [https://www.adafruit.com/products/1638 SHT15], et pour l'écran, [http://www.electrodragon.com/w/index.php?title=1602_LCD_I2C/SPI_Module la version I2C du même 1602].&lt;br /&gt;
** Par contre dans ce cas, il faut faire gaffe au fait que le passage en 3.3V pour la logique du RPi, le lcd reste en 5V et il faudra ajouter un [http://www.adafruit.com/products/757 convertisseurs de niveau] pour le bus si utilisé avec un capteur qui ne supporte pas 5V.&lt;br /&gt;
* le langage Python, c'est pas plus compliqué que le simili-C de l'Arduino une fois qu'on est rentré dedans.&lt;br /&gt;
&lt;br /&gt;
= Mark (3): Start, Stop, and say Cheese =&lt;br /&gt;
&lt;br /&gt;
== Sart/Stop ==&lt;br /&gt;
Un &amp;quot;problème&amp;quot; du RPi, c'est qu'il n'a pas de bouton ON/OFF simple, et par conséquent, l'éteindre proprement avec &amp;lt;code&amp;gt;sudo halt&amp;lt;/code&amp;gt; ou  &amp;lt;code&amp;gt;sudo poweroff&amp;lt;/code&amp;gt; est impossible sans un accès physique (clavier et écran connectés) ou une connection SSH (connection à distance). Pas pratique pour un boitier qui sera installé dans une cave à vin...&lt;br /&gt;
&lt;br /&gt;
Autrement dit, mes besoins:&lt;br /&gt;
# Le programme python d'affichage et monitoring des températures démarre automatiquement lorsque le RPi démarre.&lt;br /&gt;
# Un bouton OFF permet d'éteindre proprement le RPi avant de le débrancher de son alimentation.&lt;br /&gt;
# Un bouton ON permet de l'allumer une fois éteint sans débrancher/rebrancher son alimentation.&lt;br /&gt;
# Nec plus ultra: avoir un fonctionnement similaire à un bouton ON/OFF d'un laptop par exemple: si éteint, le bouton allume, si allumé, le bouton éteint proprement le RPi, et coupe l'alimentation USB.&lt;br /&gt;
&lt;br /&gt;
Bon après quelques recherches sur le net:&lt;br /&gt;
# C'est simple, il suffit de configurer le &amp;quot;init script&amp;quot; du RPi pour lancer automatiquement le programme python au démarrage&lt;br /&gt;
# Un montage simple permet d'écouter sur une des pins du GPIO, et de lancer la procédure propre d'arrêt (shutdown). Soit un bouton OFF&lt;br /&gt;
# Le RPi (à partir du modèle B rev2, soit Brev2, B+ et 2) possède un pinout &amp;quot;reset&amp;quot;, qui n'est pas soudé de base sur la carte. Si on raccorde ces deux pins, le RPi redémarre électriquement (hard reboot). Donc sans s'éteindre proprement. L'intérêt, c'est que si le RPi est éteint mais encore sous tension, ce bouton permet de le ré-allumer. Donc un bouton ON/RESET. Voir par exemple:&lt;br /&gt;
#* Un article assez complet en anglais sur [http://www.makeuseof.com/tag/add-reset-switch-raspberry-pi/ MakeUseOf.com]&lt;br /&gt;
# Le bouton combiné ON/OFF unique est possible, mais le montage est plus compliqué. Quelques exemples:&lt;br /&gt;
#* Un montage en français sur le site [http://forum.madeinfr.org/topic/43/raspower/ MadeInFR.org].&lt;br /&gt;
#* Un montage en anglais à base de micro contrôleur (pas simple donc) sur [http://www.instructables.com/id/Raspberry-Pi-Shutdown-Button/ Instructables]&lt;br /&gt;
#* Un article très complet en anglais reprenant toutes les options, dont un montage assez simple de bouton unique [http://www.raspberry-pi-geek.com/Archive/2013/01/Adding-an-On-Off-switch-to-your-Raspberry-Pi sur raspberry-pi-geek.com]&lt;br /&gt;
#* Des solutions commerciales toutes faites comme [https://www.pi-supply.com/product/pi-supply-raspberry-pi-power-switch/ PiSupply] ou [http://www.mausberrycircuits.com/collections/frontpage MausberryCircuits]&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, ce sera pour moi le choix suivant: un bouton OFF, qui lors d'un appui long éteint proprement le RPi. En gros la solution 2.&lt;br /&gt;
&lt;br /&gt;
Mais dans un premier temps, il faut configurer le RPi pour lancer le programme au démarrage...&lt;br /&gt;
&lt;br /&gt;
== Lancement du programme via initscript ==&lt;br /&gt;
&lt;br /&gt;
Il y a certainement 36 façons d'arriver au même résultat (après tout, le RPi tourne sous Linux ;-), mais dans mon cas, la solution qui me convient bien: un script d'init lance par défaut le script python localisé en &amp;lt;code&amp;gt;/usr/local/bin/pystartup.py&amp;lt;/code&amp;gt;. L'intérêt de la chose: &amp;lt;code&amp;gt;pystartup.py&amp;lt;/code&amp;gt; peut être un lien symbolique vers n'importe quel autre script.&lt;br /&gt;
&lt;br /&gt;
Pour éviter d'encombrer le wiki, je n'ai pas repris le script ici, mais il est dispo sur [https://gitlab.com/qberten/cellarkare/blob/master/mark3_camera/initscript_pystartup GitLab]. Pour l'installation, en ligne de commande (connecté sur le RPi):&lt;br /&gt;
&lt;br /&gt;
On télécharge le script, on le déplace au bon endroit et on le rend exécutable&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
wget https://gitlab.com/qberten/cellarkare/raw/master/mark3_camera/initscript_pystartup&lt;br /&gt;
sudo mv initscript_pystartup /etc/init.d/pystartup&lt;br /&gt;
sudo chmod a+x /etc/init.d/pystartup&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
On crée le lien symbolique qui va bien (remplacer /chemin/vers/... par la localisation du programme à lancer)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
ln -s /chemin/vers/votre/script/python.py /usr/local/bin/pystartup.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
On configure le système pour qu'il connaisse le nouveau script &amp;quot;pystartup&amp;quot;, et on lui demande de l'exécuter à chaque démarrage&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo update-rc.d pystartup defaults&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Il est ensuite possible de lancer son programme en arrière plan comme n'importe quel autre service avec &amp;lt;code&amp;gt;sudo service pystartup start&amp;lt;/code&amp;gt;, de l'arrêter avec &amp;lt;code&amp;gt;sudo service pystartup stop&amp;lt;/code&amp;gt;, etc&lt;br /&gt;
&lt;br /&gt;
== Pinout RESET ==&lt;br /&gt;
&lt;br /&gt;
Activer le &amp;quot;hard&amp;quot; reset sur le Rpi suppose un peu de soudure, mais rien de bien effrayant, 2 points suffisent. Un fois les connecteur pinout soudés, quand on raccorde les deux pins (par exemple avec un interrupteur), le RPi redémarre (&amp;quot;hard&amp;quot; reset, donc attention à la carte SD...), ou s'allume (si il était raccordé au secteur).&lt;br /&gt;
&lt;br /&gt;
J'ai soudé les 2 pins et testé la fonction, mais comme il s'agit d'un redémarrage &amp;quot;hard&amp;quot;, je n'ai finalement pas vraiment vu l'utilité dans ce projet: autant directement débrancher / rebrancher le câble d'alimentation dans ce cas.&lt;br /&gt;
&lt;br /&gt;
Mais à toutes fins utiles, les photos de l'opération, avant/après.&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Rpi_reset_before.jpg|500px|thumb|left]]&lt;br /&gt;
[[Fichier:Rpi_reset_after.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bouton OFF ==&lt;br /&gt;
&lt;br /&gt;
Rien de très compliqué: on raccorde le bouton à une entrée, on configure la résistance pull-up/down interne du Rpi, on s'assure de récupérer les évènements dans le code.&lt;br /&gt;
&lt;br /&gt;
Les parties utiles du code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# La fonction qui effectuer l'arrêt propre du RPi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def btn_proper_halt(pin):&lt;br /&gt;
    global off_state, cur_millis, off_millis&lt;br /&gt;
    # On lit le nombre de millisecondes courant&lt;br /&gt;
    cur_millis = time.time()*1000&lt;br /&gt;
    # Utilise la variable globale off_state&lt;br /&gt;
    off_state = not off_state&lt;br /&gt;
    # DEBUG&lt;br /&gt;
    logging.debug(&amp;quot;Bouton OFF_PIN pressé, son état est maintenant %s&amp;quot; % str(off_state))&lt;br /&gt;
    if off_state == True:&lt;br /&gt;
        off_millis = cur_millis   &lt;br /&gt;
    elif off_state == False: &lt;br /&gt;
        # DEBUG&lt;br /&gt;
        logging.debug(&amp;quot;Bouton OFF_PIN pressé pendant {0:0.0f} ms&amp;quot;.format(cur_millis - off_millis))&lt;br /&gt;
        if (cur_millis - off_millis) &amp;gt; OFF_INTERVAL:&lt;br /&gt;
            # On a relâché le bouton avec un écart long =&amp;gt; shutdown&lt;br /&gt;
            logging.debug(&amp;quot;Appui long sur le bouton OFF_PIN&amp;quot;)&lt;br /&gt;
            logging.info(&amp;quot;Arrêt du Raspberry PI, attendre encore 10 sec avant de débrancher&amp;quot;)&lt;br /&gt;
            subprocess.call('halt', shell=False)&lt;br /&gt;
        else:&lt;br /&gt;
            # Appuis court =&amp;gt; on ne fait rien&lt;br /&gt;
            logging.debug(&amp;quot;Appui court sur le bouton OFF_PIN&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Fonction de terminaison du programme (appelée lorsque le script est arrêté&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def terminate():&lt;br /&gt;
    logging.debug(&amp;quot;Terminate function started&amp;quot;)&lt;br /&gt;
    # efface l'écran LCD&lt;br /&gt;
    lcd_dim_backlight(0.0, 0.2)&lt;br /&gt;
    lcd.clear()&lt;br /&gt;
    logging.debug(&amp;quot;Terminate function ended&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Fonction d'initialisation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def initialize():&lt;br /&gt;
    global lcd&lt;br /&gt;
    logging.debug(&amp;quot;Initialize function started&amp;quot;)&lt;br /&gt;
    # Initialisation du LCD avec les variables ci-dessus&lt;br /&gt;
    lcd = LCD.Adafruit_CharLCD(LCD_RS, LCD_EN, LCD_D4, LCD_D5, LCD_D6, LCD_D7, &lt;br /&gt;
		        	LCD_COLUMNS, LCD_ROWS,&lt;br /&gt;
                                LCD_BACKLIGHT, invert_polarity = False, enable_pwm = True,&lt;br /&gt;
                                initial_backlight = lcd_backlight)&lt;br /&gt;
    # Initialisation des autres GPIO's&lt;br /&gt;
    GPIO.setmode(GPIO.BCM)        # On utilise la numérotation BCM pour les PIN&lt;br /&gt;
    # On définit la pin OFF_PIN comme entrée, et on active la résistance pull-down interne du RPi&lt;br /&gt;
    GPIO.setup(OFF_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)&lt;br /&gt;
    # Configure une interruption qui va détecter les mouvements up et down sur le bouton&lt;br /&gt;
    GPIO.add_event_detect(OFF_PIN, GPIO.BOTH, callback=btn_proper_halt, bouncetime=20)&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Say &amp;quot;cheese&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Cette partie du projet s'attache à pouvoir prendre rapidement et facilement un photos des étiquettes des bouteilles entrées ou sorties de la cave. Ben oui, j'ai pas forcément une bonne mémoire, et se donner les moyens d'enregistrer facilement et rapidement l'info est le meilleur moyen de suivre son stock ;-)&lt;br /&gt;
&lt;br /&gt;
Cette partie est super simple à réaliser avec le rpi: on raccorde la caméra, on s'assure qu'elle est activée avec &amp;lt;code&amp;gt;sudo raspi-config&amp;lt;/code&amp;gt;, et on peut ensuite l'utiliser en ligne de commande ou en python. Le site web [https://www.raspberrypi.org/documentation/usage/camera/README.md raspberrypi.org (en anglais)] explique cela très bien.&lt;br /&gt;
&lt;br /&gt;
On ajoute un deuxième bouton sur le breadboard, qui déclenche la prise d'une photo, et le prototype est maintenant fonctionnel. Les photos sont sauvegardées dans le répertoire courant du RPi, avec la date et l'heure pour nom de fichier.&lt;br /&gt;
&lt;br /&gt;
Au niveau du code, les parties utiles sont:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Fonction de prise d'une photo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def btn_take_picture(pin):&lt;br /&gt;
    # DEBUG&lt;br /&gt;
    logging.info(&amp;quot;Bouton CAM_PIN pressé, on prend un photo&amp;quot;)&lt;br /&gt;
    # Construction du chemin pour la photo&lt;br /&gt;
    now = datetime.datetime.now()&lt;br /&gt;
    pic_filename = &amp;quot;/home/qb/pic_&amp;quot; + str(now) + &amp;quot;.jpg&amp;quot;&lt;br /&gt;
    # Initialisation de la camera. On ne le fait pas dans initialize() pour éviter au maximum de la laisser&lt;br /&gt;
    # allumée (et consommer) en continu. En plus, une fois activée, les lectures sur le DHT sont beaucoup&lt;br /&gt;
    # plus souvent ratées.&lt;br /&gt;
    with PICAM.PiCamera() as cam:&lt;br /&gt;
        cam.capture(pic_filename)&lt;br /&gt;
        logging.debug(&amp;quot;Photos sauvée &amp;quot; + str(cam.resolution) + &amp;quot;  dans &amp;quot; + pic_filename)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pimp my screen ==&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est d'allumer ou éteindre l'écran, la bibliothèque CharLCD permet la modulation PWN du rétroéclairage. De quoi avoir un chouette effet de fondu au noir lorsque l'écran s'allume et s'éteint.&lt;br /&gt;
&lt;br /&gt;
Au niveau du code, la partie utile:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Module l'intensité du rétro éclairage de l'écran lcd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def lcd_dim_backlight(backlight_value, time_step):&lt;br /&gt;
    global lcd&lt;br /&gt;
    global lcd_backlight&lt;br /&gt;
    # calcule l'incrément à avoir entre lcd_backlight et backlight_value&lt;br /&gt;
    stp = (lcd_backlight &amp;gt; backlight_value) * -2 +1&lt;br /&gt;
    brightnesses = map(lambda x: x/10.0, range(int(lcd_backlight*10), int(backlight_value*10)+1, stp))&lt;br /&gt;
    for bright in brightnesses:&lt;br /&gt;
        lcd_backlight = bright&lt;br /&gt;
        logging.debug(&amp;quot;loop on bright= &amp;quot; + str(bright))&lt;br /&gt;
        lcd.set_backlight(bright)&lt;br /&gt;
        time.sleep(time_step)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Le code et le montage ==&lt;br /&gt;
&lt;br /&gt;
Le code source complet pour [https://gitlab.com/qberten/cellarkare/blob/master/mark3_camera/cellarkare_cam.py Mark 3 est disponible sur gitlab]. Pour ce qui est du montage, ben pas de schéma de raccordement disponible, j'ai oublié de le documenter en temps utile avant de passer à Mark 4! Donc il faudra attendre la suite...&lt;br /&gt;
&lt;br /&gt;
= Mark (4): We are (almost) done =&lt;br /&gt;
&lt;br /&gt;
== Pimp my screen, reloaded ==&lt;br /&gt;
Une dernière petite touche intéressante: l'appareil est destiné à être mis dans une cave à vin, endroit où il va faire noir la plupart du temps. En conséquence, l'écran LCD n'a pas vraiment besoin d'être allumé en permanence, pourquoi ne pas l'allumer automatiquement quand la lumière du local dépasse un certain seuil. Une photorésistance permet de réaliser rapidement la mesure d'une intensité lumineuse, pourquoi s'en priver... Oui mais... le RPi n'a pas d'entrée analogique, comment convertir simplement la mesure sur la photorésistance en une valeur analogique, alors que le RPi n'a que des entrées digitales.&lt;br /&gt;
&lt;br /&gt;
Après un peu de recherche, un montage simple à base d'une capacité dont le temps de charge sera directement proportionnel à la mesure sur la photo-résistance. Tout cela est expliqué ici (en anglais): [http://www.raspberrypi-spy.co.uk/2012/08/reading-analogue-sensors-with-one-gpio-pin/]&lt;br /&gt;
&lt;br /&gt;
(TODO - continuer la documentation)&lt;br /&gt;
&lt;br /&gt;
== Buttons, buttons, we want more ==&lt;br /&gt;
&lt;br /&gt;
Dernier petit détail, et non des moindre, Pour avoir un projet réellement fonctionnel, il va falloir travailler un peu l'interface homme-machine, et permettre un peu plus d'interaction avec le Rpi, pour par exemple permettre d'entrer le nombre de bouteilles couvertes par l'entrée ou la sortie photographiée, quitter/valider une action, ...&lt;br /&gt;
&lt;br /&gt;
(TODO - continuer la documentation)&lt;br /&gt;
&lt;br /&gt;
== We want leds ==&lt;br /&gt;
&lt;br /&gt;
Toujours dans l'optique d'améliorer l'interaction avec l'appareil, pourquoi ne pas intégrer une led de status sur l'appareil, pour indiquer visuellement différents états, comme par exemple: une température trop basse ou trop haute est enregistrée, il n'y a pas de connection réseau, ...&lt;br /&gt;
&lt;br /&gt;
(TODO - à implémenter tout court ;-)&lt;br /&gt;
&lt;br /&gt;
== All your data are belong to us ==&lt;br /&gt;
&lt;br /&gt;
Enfin, c'est bien beau d'afficher la température et l'humidité, c'est encore mieux de l'enregistrer quelque part pour pouvoir tracer l'historique, et intéragir plus facilement avec ces données. Après quelques investigations, c'est [http://thingspeak.com] qui a retenu mon attention.&lt;br /&gt;
&lt;br /&gt;
(TODO - à implémenter tout court ;-)&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Projets]]&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=CellarKare&amp;diff=2984</id>
		<title>CellarKare</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=CellarKare&amp;diff=2984"/>
		<updated>2015-10-28T21:06:56Z</updated>

		<summary type="html">&lt;p&gt;Quentin : /* Mark 3: Start, Stop, and say Cheese */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Un projet lancé par --[[Utilisateur:Quentin|Quentin]] ([[Discussion utilisateur:Quentin|discussion]]) 14 juin 2015 à 19:58 (CEST)&lt;br /&gt;
&lt;br /&gt;
= En bref =&lt;br /&gt;
&lt;br /&gt;
Le projet est de créer une &amp;quot;station météo&amp;quot; pour une cave à vin, d'où le nom du projet un peu fumeux de CellarKare = Cellar + Care, le K c'est pour faire joli ;-)&lt;br /&gt;
Dans un premier temps, le but est d'afficher la température et le taux d'humidité (hygrométrie). Ça, c'est pour le but fonctionnel. Mes autres buts sont:&lt;br /&gt;
* Au niveau perso: réaliser un premier projet à forte composante électronique, dans la foulée de notre formation Arduino&lt;br /&gt;
* Utiliser un maximum toutes les techniques/machines du Makilab&lt;br /&gt;
* Documenter les différentes étapes (tutoriel), et fournir les fichiers sources nécessaires aux différentes étapes.&lt;br /&gt;
&lt;br /&gt;
= Mark (1): Le matos et un premier proto Arduino=&lt;br /&gt;
&lt;br /&gt;
Le premier prototype sera relativement simple: la station affichera la température et l'humidité ambiante sur un écran LCD, le tout piloté par un Arduino Uno.&lt;br /&gt;
&lt;br /&gt;
== T° et humidité: DHT22 / AM2303 ==&lt;br /&gt;
&lt;br /&gt;
Au niveau des capteurs, logiquement il en faut un pour lire la température, et un pour lire l'humidité. Les deux existent certainement séparément, mais une rapide recherche sur le net done des références de capteurs déjà calibrés et fournissant les deux pour pas trop cher. Au final, mon choix se porte sur un DHT22. Ce capteur s'appelle aussi AM2303 dans sa version câblée. Quelques liens et documentation utiles:&lt;br /&gt;
* [http://www.adafruit.com/datasheets/DHT22.pdf Les specs du DHT22 (anglais)];&lt;br /&gt;
* Pour acheter: [http://www.adafruit.com/products/385 ~10 $ chez AdaFruit] ou [http://shop.mchobby.be/senseurs/214-dht22-am2302-senseur-humidite-temperature--3232100002142.html ~17 € chez MCHobby], c'est un peu plus cher, mais ils sont belges et sympas;&lt;br /&gt;
* [http://playground.arduino.cc/Main/DHTLib Un tutoriel pour arduino sur Arduino.cc];&lt;br /&gt;
* [https://learn.adafruit.com/dht/using-a-dhtxx-sensor Un tutoriel pour arduino sur AdaFruit], et sa [http://mchobby.be/wiki/index.php?title=DHTxx version française];&lt;br /&gt;
&lt;br /&gt;
== L'affichage LCD: LCM1602 ==&lt;br /&gt;
&lt;br /&gt;
Pour l'affichage, le choix a été vite fait... J'ai pris ce que j'avais sous la main, soit le LCD fourni dans le starter kit arduino. Cet écran est très répandu, et fait partie de nombreux &amp;quot;kits de démarrage&amp;quot; en électronique. Au niveau fonctionnel, avec 2 lignes de 16 charactères, on devrait pouvoir s'en sortir pour afficher une température et un taux d'humidité ;-). Son contrôleur (hitachi HD44780) est lui aussi très répandu En vrac:&lt;br /&gt;
* [http://www.datasheetspdf.com/datasheet/LCM1602.html Les specs (chinois ou anglais)]&lt;br /&gt;
* Pour acheter: [http://www.ebay.com/sch/items/?_nkw=lcm1602&amp;amp;_sacat=&amp;amp;_ex_kw=&amp;amp;_mPrRngCbx=1&amp;amp;_udlo=&amp;amp;_udhi=&amp;amp;_sop=12&amp;amp;_fpos=&amp;amp;_fspt=1&amp;amp;_sadis=&amp;amp;LH_CAds=&amp;amp;rmvSB=true on en trouve plein sur ebay...]&lt;br /&gt;
* [http://www.arduino.cc/en/Tutorial/LiquidCrystal La librairie LiquidCrystal, qui permet de le contrôler sur Arduino]&lt;br /&gt;
&lt;br /&gt;
== Le montage ==&lt;br /&gt;
&lt;br /&gt;
Le montage est assez simple, et n'est finalement qu'une combinaison des différents tutoriel et exemple d'utilisation de l'écran et du capteur.&lt;br /&gt;
&lt;br /&gt;
Sur le schéma du capteur DHT, la résistance de 10K sert de [https://fr.wikipedia.org/wiki/R%C3%A9sistance_de_rappel &amp;quot;résistance pull-up&amp;quot;].&lt;br /&gt;
'''Cette résistance n'est pas nécessaire dans le cas du capteur AM2302''' (la version avec câble et boitier en plastique, comme sur la photo). Cette version [http://www.adafruit.com/product/393 intègre une résistance de 5.1K dans le boîtier], qui connecte déjà VCC et DATA, merci Patrick pour l'info ;-).&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Cellarkare mark1 bb.png|500px|thumb|left]]&lt;br /&gt;
[[Fichier:Cellarkare_mark1.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Le code ==&lt;br /&gt;
Au niveau programmation du micro-controlleur Arduino, là aussi c'est assez simple: toutes les 3 secondes, on lit les valeurs de t° et humidité, et on les affiches sur l'écran LCD. Les valeurs mesurées et des messages supplémentaires sont aussi envoyés sur la sortie série.&lt;br /&gt;
&lt;br /&gt;
Le code est aussi disponible (et éventuellement mis à jour) [https://gitlab.com/qberten/cellarkare/blob/master/mark1_arduino/cellarkare_arduino.ino sur gitlab]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
CellarKare - Mark #1&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Un projet de station de mesure de la température et l'humidité dans une cave à vin&lt;br /&gt;
Plus d'infos et schéma de montage sur http://wiki.makilab.org/index.php/CellarKare&lt;br /&gt;
Quentin Berten, 2015 - Domaine public, licence WTFPL v2, http://www.wtfpl.net/&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
// Bibliothèque LiquidCrystal, pour l'écran LCD. Installée de base avec l'IDE&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Bibliothèque DHT, pour le capteur de température. Installable directement depuis&lt;br /&gt;
// l'IDE, via Sketch -&amp;gt; Include LIbrary -&amp;gt; Manage Libraries -&amp;gt; DHT sensor Library &lt;br /&gt;
#include &amp;quot;DHT.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Définition l'écran LCD, en argument les pins d'interface, dans l'ordre&lt;br /&gt;
// (RS pin, LCD Enable, D4, D5, D6, D7)&lt;br /&gt;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);&lt;br /&gt;
&lt;br /&gt;
// Définition des pin et type pour le senseur de t° et humidité&lt;br /&gt;
#define DHTPIN 7         // senseur (fil data, en jaune), sur pin 7&lt;br /&gt;
#define DHTTYPE DHT22    // type DHT 22  (AM2302)&lt;br /&gt;
&lt;br /&gt;
// Définition du capteur DHT22, pour un Arduino &amp;quot;normal&amp;quot; à 16mhz, comme le Uno&lt;br /&gt;
DHT dht(DHTPIN, DHTTYPE);&lt;br /&gt;
// les variables associées qui vont lire les valeurs (température, ...)&lt;br /&gt;
float hum;&lt;br /&gt;
float tempC;&lt;br /&gt;
float tempF;&lt;br /&gt;
float indiceHum;&lt;br /&gt;
&lt;br /&gt;
// les variables qui permettent de gérer le temps,&lt;br /&gt;
// voir http://www.arduino.cc/en/pmwiki.php?n=Tutorial/BlinkWithoutDelay&lt;br /&gt;
long prevMillis = 0;           // enregistre le temps de la denière lecture DHT22&lt;br /&gt;
long dhtInterval = 3000;       // L'intervalle de lecture du DHT22: 3 secondes&lt;br /&gt;
&lt;br /&gt;
// la procédure d'initialisation arduino&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  // on ouvre une connection série (pour afficher un maxium d'info)&lt;br /&gt;
  Serial.begin(9600); &lt;br /&gt;
  Serial.println(&amp;quot;CellarKare Mark #1 Test&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // initialisation du capteur&lt;br /&gt;
  dht.begin();&lt;br /&gt;
  // initialisation de l'écran, 16 colonnes et 2 lignes&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// la boucle principale arduino&lt;br /&gt;
void loop() {&lt;br /&gt;
  unsigned long curMillis = millis();&lt;br /&gt;
  &lt;br /&gt;
  if(curMillis - prevMillis &amp;lt; dhtInterval) {&lt;br /&gt;
    goto end_loop;        // pas de lecture DHT, on va à la fin de la boucle loop()&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // on enregistre le dernier temps d'exécution de la lecture&lt;br /&gt;
  prevMillis = curMillis;   &lt;br /&gt;
  &lt;br /&gt;
  // la lecture de la t° et l'humidité prends environ 250 millisecondes&lt;br /&gt;
  // mais les lectures du capteur peuvent etre vieillies de 2 secondes&lt;br /&gt;
  // le capteur n'est pas rapide (d'où l'attente de 3 secondes pour etre&lt;br /&gt;
  // certain d'avoir des lectures correctes.&lt;br /&gt;
  // lecture de l'humidité&lt;br /&gt;
  hum = dht.readHumidity();&lt;br /&gt;
  // lecture de la température en degrés Celsius&lt;br /&gt;
  tempC = dht.readTemperature();&lt;br /&gt;
  // lecture de la température en degrés Fahreneit&lt;br /&gt;
  tempF = dht.readTemperature(true);&lt;br /&gt;
  &lt;br /&gt;
  // On vérifie que les lectures on bien été réalisées. Si pas, on quitte&lt;br /&gt;
  // la boucle pour ré-essayer&lt;br /&gt;
  if (isnan(hum) || isnan(tempC) || isnan(tempF)) {&lt;br /&gt;
    Serial.println(&amp;quot;Lecture sur le capteur DHT ratée&amp;quot;);&lt;br /&gt;
    goto end_loop;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Calcul de l'indice de chaleur (voir https://fr.wikipedia.org/wiki/Indice_de_chaleur )&lt;br /&gt;
  // La température doit etre fournie en degré Fahreneit&lt;br /&gt;
  indiceHum = dht.computeHeatIndex(tempF, hum);&lt;br /&gt;
&lt;br /&gt;
  // On affiche les valeurs sur la console série (n'est pas indispensable)&lt;br /&gt;
  Serial.print(&amp;quot;Humidite: &amp;quot;); &lt;br /&gt;
  Serial.print(hum);&lt;br /&gt;
  Serial.print(&amp;quot; %\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temperature: &amp;quot;); &lt;br /&gt;
  Serial.print(tempC);&lt;br /&gt;
  Serial.print(&amp;quot; *C &amp;quot;);&lt;br /&gt;
  Serial.print(tempF);&lt;br /&gt;
  Serial.print(&amp;quot; *F\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Indice de chaleur: &amp;quot;);&lt;br /&gt;
  Serial.print(indiceHum);&lt;br /&gt;
  Serial.println(&amp;quot; *F&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  // On affiche les valeurs sur l'écran LCD, curseur à (0,0)&lt;br /&gt;
  lcd.setCursor(0, 0);&lt;br /&gt;
  // print Temp in C°&lt;br /&gt;
  lcd.print(&amp;quot;deg C: &amp;quot;);&lt;br /&gt;
  lcd.print(tempC);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;hum %: &amp;quot;);&lt;br /&gt;
  lcd.print(hum);&lt;br /&gt;
&lt;br /&gt;
  // label pour goto&lt;br /&gt;
  end_loop:&lt;br /&gt;
  ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== La conclusion ==&lt;br /&gt;
Un premier prototype fonctionnel, qui a au moins le mérite de vérifier que le capteur DHT renvoie des valeurs réalistes.&lt;br /&gt;
La suite: la même chose avec un Raspberry pi, pour bénéficier de sa faciliter à se connecter au réseau. Ce serait quand même cool de pouvoir lire ces valeurs sur un smartphone ;-)&lt;br /&gt;
&lt;br /&gt;
= Mark (2): la même chose avec un Raspberry Pi =&lt;br /&gt;
Le but de cette nouvelle itération: réaliser un montage équivalent avec un [https://www.raspberrypi.org/ Raspberry Pi] (RPi en abrégé). Pourquoi un RPi ?&lt;br /&gt;
* Parce que j'en avais un sous la main ;-)&lt;br /&gt;
* Parce qu'il permet de se connecter rapidement et facilement à un réseau, via ethernet (câble) ou wifi (via un dongle usb)&lt;br /&gt;
* Parce qu'il permet de brancher facilement un module caméra (on y viendra au Mark 3)&lt;br /&gt;
&lt;br /&gt;
Il est certainement possible d'arriver au même résultat avec d'autres cartes (comme par exemple un [http://www.arduino.cc/en/Main/ArduinoBoardYun Arduino Yun]), c'est juste que c'est un RPi que j'avais sous la main... Dans mon cas un Raspberry Pi B+.&lt;br /&gt;
&lt;br /&gt;
En ce qui concerne le RPi, quelques ressources très utiles:&lt;br /&gt;
* [http://mchobby.be/wiki/index.php?title=RaspberryPi-Accueil#Tutoriels Les tutoriels réalisés/traduits par MC Hobby. Une mine d'or]&lt;br /&gt;
* [http://www.elektronique.fr/montages/raspberry-pi/ Des exemples de montages et réalisations électroniques avec RPi]&lt;br /&gt;
* [http://pi.gadgetoid.com/pinout La configuration des différentes PIN du RPi]&lt;br /&gt;
&lt;br /&gt;
== L'installation de l'OS ==&lt;br /&gt;
La principale différence entre une carte Arduino et le RPi, c'est le cœur de la carte:&lt;br /&gt;
* le cœur de l'Arduino est un microcontrôleur, qui va exécuter le programme qu'on lui injecte de manière bête et méchante. Chaque entrée/sortie va devoir être programmée directement, il n'y a pas de système de driver, ...&lt;br /&gt;
* le cœur du RPi est un microprocesseur (ARM, la même technologie que dans les smartphones). Il s'agit donc en fait d'un véritable &amp;quot;petit ordinateur&amp;quot;, avec un système d'exploitation, des drivers (pour l'usb, l'écran, le wifi, ...).&lt;br /&gt;
&lt;br /&gt;
Donc avant de pouvoir démarrer et utiliser le RPi, il va falloir installer un système d'exploitation (OS: Operating System). C'est exactement la même chose qu'installer Windows sur un PC, c'est juste que dans notre cas, ce ne sera pas Windows mais un système Linux. Il en existe [https://www.raspberrypi.org/downloads/ plusieurs], le standard de facto étant Raspbian (une distribution Debian adaptée pour le RPi), c'est celle-là [http://raspbian-france.fr/installer-raspbian-premier-demarrage-configuration/ que j'ai installée].&lt;br /&gt;
&lt;br /&gt;
Petit truc pour les distraits: écran/clavier/souris ne sont pas indispensables pour l'installation, il est tout à fait possible de se connecter via [https://fr.wikipedia.org/wiki/Secure_Shell SSH] au RPi une fois son premier démarrage exécuté, pour autant qu'il soit raccordé à votre réseau (via son câble ethernet). Le RPi se déclare automatiquement sur le réseau avec le nom raspberry.local, et un &amp;lt;code&amp;gt;ssh pi@raspberry.local&amp;lt;/code&amp;gt; à fait l'affaire (raspberry, c'est son &amp;quot;hostname&amp;quot; par défaut). Pour le mot de passe, c'est &amp;lt;code&amp;gt;raspberry&amp;lt;/code&amp;gt; par défaut. Ensuite &amp;lt;code&amp;gt;raspi-config&amp;lt;/code&amp;gt; permet de terminer la procédure d'installation.&lt;br /&gt;
&lt;br /&gt;
En ce qui me concerne, tout le reste de la configuration se fera donc en [https://fr.wikipedia.org/wiki/Shell_Unix ligne de commande (shell)] via SSH. [http://mchobby.be/wiki/index.php?title=PI-SSH Le wiki de MCHobby] détaille l'accès via SSH au RPi.&lt;br /&gt;
&lt;br /&gt;
'''Un dernier point important''': le RPi, c'est comme un &amp;quot;vrai&amp;quot; ordinateur... il vaut mieux l'éteindre proprement plutôt que le débrancher sauvagement. Donc on s'arrange pour faire un &amp;lt;code&amp;gt;sudo poweroff&amp;lt;/code&amp;gt; en ligne de commande avant de le débrancher. Le gros risque: corrompre le système de fichier sur le carte SD, ce qui empêche le démarrage suivant, et impose un reformatage et une réinstallation complète. Pas drôle en somme, je parle d'expérience :-(&lt;br /&gt;
&lt;br /&gt;
== Le wifi ==&lt;br /&gt;
Bien que le RPi ne soit pas équipé par défaut du wifi, il est compatible avec la majorité des clefs usb wifi. Dans mon cas, une vieille clef Hercules HWGUSB2-54. Un petit tour par les log (&amp;lt;code&amp;gt;sudo tail -f /var/log/syslog&amp;lt;/code&amp;gt;) pour vérifier qu'elle est reconnue correctement lors du branchement, et puis une configuration via l'édition de &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt; pour entrer les références du réseau wifi:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
auto wlan0&lt;br /&gt;
allow-hotplug wlan0&lt;br /&gt;
iface wlan0 inet dhcp&lt;br /&gt;
wpa-ssid &amp;quot;Le_nom_(SSID)_de_votre_wifi&amp;quot;&lt;br /&gt;
wpa-psk &amp;quot;Le_mot_de_passe_de_votre_wifi&amp;quot;&lt;br /&gt;
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Ensuite un redémmarrage de la carte avec &amp;lt;code&amp;gt;$ sudo ifdown wlan0&amp;lt;/code&amp;gt; suivi de &amp;lt;code&amp;gt;sudo ifup wlan0&amp;lt;/code&amp;gt; et ça devrait être OK. On peut maintenant se passer de câble ethernet!&lt;br /&gt;
&lt;br /&gt;
Si nécessaire: plus de détails sur la configuration réseau sur [http://mchobby.be/wiki/index.php?title=Rasp-Config-Reseau le wiki MC Hobby]&lt;br /&gt;
&lt;br /&gt;
== La température avec le DHT22 / AM2302 ==&lt;br /&gt;
Pour la lecture des température avec le capteur, les gars d'Adafruit ont déjà développé un bibliothèque de fonctions utilisables en ligne de commande ou en [https://fr.wikipedia.org/wiki/Python_%28langage%29 python]. Quelques ressources:&lt;br /&gt;
* [https://learn.adafruit.com/dht-humidity-sensing-on-raspberry-pi-with-gdocs-logging/overview La page d'Adafruit (en anglais) sur l'utilisation du DHT22 avec le RPi]&lt;br /&gt;
* [http://www.manuel-esteban.com/lire-une-sonde-dht22-avec-un-raspberry-pi/ Une ressource en français (un peu datée) sur l'utilisation DHT22 + RPi.]&lt;br /&gt;
* [http://pi.gadgetoid.com/pinout La table de référence des 40 pins GPIO du RPi]&lt;br /&gt;
Pour ma part, j'ai suivi la méthode Adafruit, ce qui donne en résumé, en ligne de commande:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
cd /home/pi&lt;br /&gt;
git clone https://github.com/adafruit/Adafruit_Python_DHT.git &lt;br /&gt;
cd Adafruit_Python_DHT&lt;br /&gt;
sudo apt-get install build-essential python-dev  &lt;br /&gt;
sudo python setup.py install&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Au niveau du montage, rien de nouveau: le capteur doit toujours être alimenté en 3.3V ou en 5V, et le câble de lecture à une pin d'entrée/sortie (GPIO: General Purpose Input Output), ce qui donne:&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Cellarkare mark2 bb.png|400px|thumb|left]]&lt;br /&gt;
[[Fichier:Cellarkare_mark2.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Un test en ligne de commande permet de vérifier qu'on a une lecture sur le capteur (dans mon cas un AM2302 raccordé sur la pin GPIO 4):&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
cd /home/pi/Adafruit_Python_DHT/examples/&lt;br /&gt;
sudo ./AdafruitDHT.py 2302 4&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Ce qui affiche &amp;lt;code&amp;gt;Temp=23.0*C  Humidity=53.8%&amp;lt;/code&amp;gt;, des valeurs censées pour une après-midi d'été ;-)&lt;br /&gt;
&lt;br /&gt;
== L'affichage LCD ==&lt;br /&gt;
L'écran LCD est toujours le même que pour la version &amp;quot;Mark 1&amp;quot; Arduino. Quelques resources:&lt;br /&gt;
* [https://learn.adafruit.com/drive-a-16x2-lcd-directly-with-a-raspberry-pi Un tutoriel (en anglais) sur Adafruit] ''Attention, le code source n'est plus tellement a jour, voir le dernier lien Github.''&lt;br /&gt;
* [http://mchobby.be/wiki/index.php?title=Rasp-Hack-Afficheur-LCD La version française, traduite par MC Hobby]&lt;br /&gt;
* [https://github.com/adafruit/Adafruit_Python_CharLCD Le code source de la librairie Adafruit pour le gestion du LCD sur GitHub] ''contient la dernière version de la librairie''.&lt;br /&gt;
&lt;br /&gt;
La logique de raccordement est strictement identique au circuit du Mark 1. La seule différence est que la résistance variable de 10K dans le circuit est supprimée, la bibliothèque Adafruit pour le LCD permettant le pilotage en [https://fr.wikipedia.org/wiki/Modulation_de_largeur_d%27impulsion modulation PWM].&lt;br /&gt;
&lt;br /&gt;
== Le montage ==&lt;br /&gt;
Au final, le montage a été fait pour gagner un maximum de place sur mon breadboard. La pin data du DHT a été déplacée sur la pin 5, et le reste des pin pour le LCD sont documentées dans le code.&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Cellarkare mark2_2 bb.png|500px|thumb|left]]&lt;br /&gt;
[[Fichier:Cellarkare_mark2_2.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Le code ==&lt;br /&gt;
&lt;br /&gt;
La logique du code est identique à la version mark 1 - arduino. Ce code est aussi disponible (et éventuellement mis à jour) [https://gitlab.com/qberten/cellarkare/blob/master/mark2_rpi/cellarkare_rpi.py sur gitlab]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
# coding=utf8&lt;br /&gt;
# CellarKare - Mark 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
# Un projet de station de mesure de la température et l'humidité dans une cave à vin&lt;br /&gt;
# Plus d'infos et schéma de montage sur http://wiki.makilab.org/index.php/CellarKare&lt;br /&gt;
# Quentin Berten, 2015 - Domaine public, licence WTFPL v2, http://www.wtfpl.net/&lt;br /&gt;
# quentin_#AT#_berten.me&lt;br /&gt;
&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
# Bibliothèque CharLCD d'Adafruit, voir https://github.com/adafruit/Adafruit_Python_CharLCD&lt;br /&gt;
# pour l'installation&lt;br /&gt;
import Adafruit_CharLCD as LCD&lt;br /&gt;
# Bibliothèque DHT d'AdaFruit, voir https://github.com/adafruit/Adafruit_Python_DHT&lt;br /&gt;
# pour l'installation&lt;br /&gt;
import Adafruit_DHT as DHT&lt;br /&gt;
&lt;br /&gt;
# Configuration de l'affichage LCD&lt;br /&gt;
lcd_rs        = 25      # RS sur pin 25&lt;br /&gt;
lcd_en        = 24      # EN sur pin 24&lt;br /&gt;
lcd_d4        = 23      # D4 sur pin 23&lt;br /&gt;
lcd_d5        = 12      # D5 sur pin 12&lt;br /&gt;
lcd_d6        = 20      # D6 sur pin 20&lt;br /&gt;
lcd_d7        = 16      # D7 sur pin 16&lt;br /&gt;
lcd_backlight = 18      # rétro éclairage sur pin 18&lt;br /&gt;
lcd_columns   = 16      # Affichage à 16 colonnes ...&lt;br /&gt;
# Initialisation du LCD avec les variables ci-dessus&lt;br /&gt;
lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, &lt;br /&gt;
		        	lcd_columns, lcd_rows, lcd_backlight)&lt;br /&gt;
# Configuration pour le capteur DHT, soit DHT11, DHT22 ou AM2302.&lt;br /&gt;
dht_sensor    = DHT.AM2302  # Type AM2302&lt;br /&gt;
dht_pin       = 5           # DHT data sur pin 5&lt;br /&gt;
&lt;br /&gt;
# les variables qui permettent de gérer le temps,&lt;br /&gt;
prevMillis = 0          # enregistre le temps de la denière lecture DHT22&lt;br /&gt;
secInterval = 1000      # Un intervalle d'une seconde&lt;br /&gt;
# L'intervalle de lecture du DHT22: 3 secondes, doit etre plus grand que secInterval&lt;br /&gt;
dhtInterval = 3000&lt;br /&gt;
&lt;br /&gt;
def read_and_print_dht():&lt;br /&gt;
    # On lit une valeur sur le senseur avec la fonction read. Attention, cette fonction&lt;br /&gt;
    # ne réessaie pas automatiquement en cas d'erreur, mais fournit les valeurs (None, None).&lt;br /&gt;
    hum, tempC  = DHT.read(dht_sensor, dht_pin)&lt;br /&gt;
&lt;br /&gt;
    # On vérifie que l'on a bien eu une lecture (Linux n'est pas un OS temps réel et ne&lt;br /&gt;
    # peut pas garantir le timing des lectures sur le capteur). Si ça arrive, on réessaie.&lt;br /&gt;
    # On affiche les valeurs sur la console (n'est pas indispensable)&lt;br /&gt;
    if hum is not None and tempC is not None:&lt;br /&gt;
    	print 'Temp={0:0.2f}*C  Humidity={1:0.2f}%'.format(tempC, hum)&lt;br /&gt;
        # On affiche les valeurs sur l'écran LCD&lt;br /&gt;
        lcd.clear()&lt;br /&gt;
        lcd.message('deg C: {0:0.2f}\nhum %: {1:0.2f}'.format(tempC, hum))&lt;br /&gt;
    else:&lt;br /&gt;
	print 'Lecture sur le capteur DHT ratée'&lt;br /&gt;
&lt;br /&gt;
# Boucle principale, l'équivalent de void loop() sur Arduino&lt;br /&gt;
while 1:&lt;br /&gt;
    # On lit le nombre de millisecondes courant&lt;br /&gt;
    curMillis = time.time()*1000&lt;br /&gt;
    if curMillis - prevMillis &amp;gt; dhtInterval:&lt;br /&gt;
        # On essaie de lire et afficher les valeurs du DHT&lt;br /&gt;
        read_and_print_dht()&lt;br /&gt;
        # on enregistre le dernier temps d'exécution de la lecture&lt;br /&gt;
        prevMillis = curMillis&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== La conclusion ==&lt;br /&gt;
En vrac:&lt;br /&gt;
* Pas de gros problème ou obstacles majeurs pour convertir le montage et le code Arduino en son équivalent RPi. Mais heureusement que l'équipe d'Adafruit a déjà programmé les bibliothèques Python qui vont bien!&lt;br /&gt;
* Au niveau du breadboard, ça commence à prendre de la place... Une solution: passer en [https://fr.wikipedia.org/wiki/I2C &amp;quot;I2C&amp;quot;] pour le capteur et le LCD, ce qui limite drastiquement le nombre de pins nécessaires pour le montage, et facilite la programmation. Merci Patrick pour les infos, ce sera sûrement utile pour le prochain montage ;-) !&lt;br /&gt;
** Par exemple, pour la température: un capteur I2C comme le [https://www.adafruit.com/products/1638 SHT15], et pour l'écran, [http://www.electrodragon.com/w/index.php?title=1602_LCD_I2C/SPI_Module la version I2C du même 1602].&lt;br /&gt;
** Par contre dans ce cas, il faut faire gaffe au fait que le passage en 3.3V pour la logique du RPi, le lcd reste en 5V et il faudra ajouter un [http://www.adafruit.com/products/757 convertisseurs de niveau] pour le bus si utilisé avec un capteur qui ne supporte pas 5V.&lt;br /&gt;
* le langage Python, c'est pas plus compliqué que le simili-C de l'Arduino une fois qu'on est rentré dedans.&lt;br /&gt;
&lt;br /&gt;
= Mark (3): Start, Stop, and say Cheese =&lt;br /&gt;
&lt;br /&gt;
== Sart/Stop ==&lt;br /&gt;
Un &amp;quot;problème&amp;quot; du RPi, c'est qu'il n'a pas de bouton ON/OFF simple, et par conséquent, l'éteindre proprement avec &amp;lt;code&amp;gt;sudo halt&amp;lt;/code&amp;gt; ou  &amp;lt;code&amp;gt;sudo poweroff&amp;lt;/code&amp;gt; est impossible sans un accès physique (clavier et écran connectés) ou une connection SSH (connection à distance). Pas pratique pour un boitier qui sera installé dans une cave à vin...&lt;br /&gt;
&lt;br /&gt;
Autrement dit, mes besoins:&lt;br /&gt;
# Le programme python d'affichage et monitoring des températures démarre automatiquement lorsque le RPi démarre.&lt;br /&gt;
# Un bouton OFF permet d'éteindre proprement le RPi avant de le débrancher de son alimentation.&lt;br /&gt;
# Un bouton ON permet de l'allumer une fois éteint sans débrancher/rebrancher son alimentation.&lt;br /&gt;
# Nec plus ultra: avoir un fonctionnement similaire à un bouton ON/OFF d'un laptop par exemple: si éteint, le bouton allume, si allumé, le bouton éteint proprement le RPi, et coupe l'alimentation USB.&lt;br /&gt;
&lt;br /&gt;
Bon après quelques recherches sur le net:&lt;br /&gt;
# C'est simple, il suffit de configurer le &amp;quot;init script&amp;quot; du RPi pour lancer automatiquement le programme python au démarrage&lt;br /&gt;
# Un montage simple permet d'écouter sur une des pins du GPIO, et de lancer la procédure propre d'arrêt (shutdown). Soit un bouton OFF&lt;br /&gt;
# Le RPi (à partir du modèle B rev2, soit Brev2, B+ et 2) possède un pinout &amp;quot;reset&amp;quot;, qui n'est pas soudé de base sur la carte. Si on raccorde ces deux pins, le RPi redémarre électriquement (hard reboot). Donc sans s'éteindre proprement. L'intérêt, c'est que si le RPi est éteint mais encore sous tension, ce bouton permet de le ré-allumer. Donc un bouton ON/RESET. Voir par exemple:&lt;br /&gt;
#* Un article assez complet en anglais sur [http://www.makeuseof.com/tag/add-reset-switch-raspberry-pi/ MakeUseOf.com]&lt;br /&gt;
# Le bouton combiné ON/OFF unique est possible, mais le montage est plus compliqué. Quelques exemples:&lt;br /&gt;
#* Un montage en français sur le site [http://forum.madeinfr.org/topic/43/raspower/ MadeInFR.org].&lt;br /&gt;
#* Un montage en anglais à base de micro contrôleur (pas simple donc) sur [http://www.instructables.com/id/Raspberry-Pi-Shutdown-Button/ Instructables]&lt;br /&gt;
#* Un article très complet en anglais reprenant toutes les options, dont un montage assez simple de bouton unique [http://www.raspberry-pi-geek.com/Archive/2013/01/Adding-an-On-Off-switch-to-your-Raspberry-Pi sur raspberry-pi-geek.com]&lt;br /&gt;
#* Des solutions commerciales toutes faites comme [https://www.pi-supply.com/product/pi-supply-raspberry-pi-power-switch/ PiSupply] ou [http://www.mausberrycircuits.com/collections/frontpage MausberryCircuits]&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, ce sera pour moi le choix suivant: un bouton OFF, qui lors d'un appui long éteint proprement le RPi. En gros la solution 2.&lt;br /&gt;
&lt;br /&gt;
Mais dans un premier temps, il faut configurer le RPi pour lancer le programme au démarrage...&lt;br /&gt;
&lt;br /&gt;
== Lancement du programme via initscript ==&lt;br /&gt;
&lt;br /&gt;
Il y a certainement 36 façons d'arriver au même résultat (après tout, le RPi tourne sous Linux ;-), mais dans mon cas, la solution qui me convient bien: un script d'init lance par défaut le script python localisé en &amp;lt;code&amp;gt;/usr/local/bin/pystartup.py&amp;lt;/code&amp;gt;. L'intérêt de la chose: &amp;lt;code&amp;gt;pystartup.py&amp;lt;/code&amp;gt; peut être un lien symbolique vers n'importe quel autre script.&lt;br /&gt;
&lt;br /&gt;
Pour éviter d'encombrer le wiki, je n'ai pas repris le script ici, mais il est dispo sur [https://gitlab.com/qberten/cellarkare/blob/master/mark3_camera/initscript_pystartup GitLab]. Pour l'installation, en ligne de commande (connecté sur le RPi):&lt;br /&gt;
&lt;br /&gt;
On télécharge le script, on le déplace au bon endroit et on le rend exécutable&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
wget https://gitlab.com/qberten/cellarkare/raw/master/mark3_camera/initscript_pystartup&lt;br /&gt;
sudo mv initscript_pystartup /etc/init.d/pystartup&lt;br /&gt;
sudo chmod a+x /etc/init.d/pystartup&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
On crée le lien symbolique qui va bien (remplacer /chemin/vers/... par la localisation du programme à lancer)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
ln -s /chemin/vers/votre/script/python.py /usr/local/bin/pystartup.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
On configure le système pour qu'il connaisse le nouveau script &amp;quot;pystartup&amp;quot;, et on lui demande de l'exécuter à chaque démarrage&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo update-rc.d pystartup defaults&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Il est ensuite possible de lancer son programme en arrière plan comme n'importe quel autre service avec &amp;lt;code&amp;gt;sudo service pystartup start&amp;lt;/code&amp;gt;, de l'arrêter avec &amp;lt;code&amp;gt;sudo service pystartup stop&amp;lt;/code&amp;gt;, etc&lt;br /&gt;
&lt;br /&gt;
== Pinout RESET ==&lt;br /&gt;
&lt;br /&gt;
Activer le &amp;quot;hard&amp;quot; reset sur le Rpi suppose un peu de soudure, mais rien de bien effrayant, 2 points suffisent. Un fois les connecteur pinout soudés, quand on raccorde les deux pins (par exemple avec un interrupteur), le RPi redémarre (&amp;quot;hard&amp;quot; reset, donc attention à la carte SD...), ou s'allume (si il était raccordé au secteur).&lt;br /&gt;
&lt;br /&gt;
J'ai soudé les 2 pins et testé la fonction, mais comme il s'agit d'un redémarrage &amp;quot;hard&amp;quot;, je n'ai finalement pas vraiment vu l'utilité dans ce projet: autant directement débrancher / rebrancher le câble d'alimentation dans ce cas.&lt;br /&gt;
&lt;br /&gt;
Mais à toutes fins utiles, les photos de l'opération, avant/après.&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Rpi_reset_before.jpg|500px|thumb|left]]&lt;br /&gt;
[[Fichier:Rpi_reset_after.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bouton OFF ==&lt;br /&gt;
&lt;br /&gt;
Rien de très compliqué: on raccorde le bouton à une entrée, on configure la résistance pull-up/down interne du Rpi, on s'assure de récupérer les évènements dans le code.&lt;br /&gt;
&lt;br /&gt;
Les parties utiles du code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# La fonction qui effectuer l'arrêt propre du RPi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def btn_proper_halt(pin):&lt;br /&gt;
    global off_state, cur_millis, off_millis&lt;br /&gt;
    # On lit le nombre de millisecondes courant&lt;br /&gt;
    cur_millis = time.time()*1000&lt;br /&gt;
    # Utilise la variable globale off_state&lt;br /&gt;
    off_state = not off_state&lt;br /&gt;
    # DEBUG&lt;br /&gt;
    logging.debug(&amp;quot;Bouton OFF_PIN pressé, son état est maintenant %s&amp;quot; % str(off_state))&lt;br /&gt;
    if off_state == True:&lt;br /&gt;
        off_millis = cur_millis   &lt;br /&gt;
    elif off_state == False: &lt;br /&gt;
        # DEBUG&lt;br /&gt;
        logging.debug(&amp;quot;Bouton OFF_PIN pressé pendant {0:0.0f} ms&amp;quot;.format(cur_millis - off_millis))&lt;br /&gt;
        if (cur_millis - off_millis) &amp;gt; OFF_INTERVAL:&lt;br /&gt;
            # On a relâché le bouton avec un écart long =&amp;gt; shutdown&lt;br /&gt;
            logging.debug(&amp;quot;Appui long sur le bouton OFF_PIN&amp;quot;)&lt;br /&gt;
            logging.info(&amp;quot;Arrêt du Raspberry PI, attendre encore 10 sec avant de débrancher&amp;quot;)&lt;br /&gt;
            subprocess.call('halt', shell=False)&lt;br /&gt;
        else:&lt;br /&gt;
            # Appuis court =&amp;gt; on ne fait rien&lt;br /&gt;
            logging.debug(&amp;quot;Appui court sur le bouton OFF_PIN&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Fonction de terminaison du programme (appelée lorsque le script est arrêté&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def terminate():&lt;br /&gt;
    logging.debug(&amp;quot;Terminate function started&amp;quot;)&lt;br /&gt;
    # efface l'écran LCD&lt;br /&gt;
    lcd_dim_backlight(0.0, 0.2)&lt;br /&gt;
    lcd.clear()&lt;br /&gt;
    logging.debug(&amp;quot;Terminate function ended&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Fonction d'initialisation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def initialize():&lt;br /&gt;
    global lcd&lt;br /&gt;
    logging.debug(&amp;quot;Initialize function started&amp;quot;)&lt;br /&gt;
    # Initialisation du LCD avec les variables ci-dessus&lt;br /&gt;
    lcd = LCD.Adafruit_CharLCD(LCD_RS, LCD_EN, LCD_D4, LCD_D5, LCD_D6, LCD_D7, &lt;br /&gt;
		        	LCD_COLUMNS, LCD_ROWS,&lt;br /&gt;
                                LCD_BACKLIGHT, invert_polarity = False, enable_pwm = True,&lt;br /&gt;
                                initial_backlight = lcd_backlight)&lt;br /&gt;
    # Initialisation des autres GPIO's&lt;br /&gt;
    GPIO.setmode(GPIO.BCM)        # On utilise la numérotation BCM pour les PIN&lt;br /&gt;
    # On définit la pin OFF_PIN comme entrée, et on active la résistance pull-down interne du RPi&lt;br /&gt;
    GPIO.setup(OFF_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)&lt;br /&gt;
    # Configure une interruption qui va détecter les mouvements up et down sur le bouton&lt;br /&gt;
    GPIO.add_event_detect(OFF_PIN, GPIO.BOTH, callback=btn_proper_halt, bouncetime=20)&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Say &amp;quot;cheese&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Cette partie du projet s'attache à pouvoir prendre rapidement et facilement un photos des étiquettes des bouteilles entrées ou sorties de la cave. Ben oui, j'ai pas forcément une bonne mémoire, et se donner les moyens d'enregistrer facilement et rapidement l'info est le meilleur moyen de suivre son stock ;-)&lt;br /&gt;
&lt;br /&gt;
Cette partie est super simple à réaliser avec le rpi: on raccorde la caméra, on s'assure qu'elle est activée avec &amp;lt;code&amp;gt;sudo raspi-config&amp;lt;/code&amp;gt;, et on peut ensuite l'utiliser en ligne de commande ou en python. Le site web [https://www.raspberrypi.org/documentation/usage/camera/README.md raspberrypi.org (en anglais)] explique cela très bien.&lt;br /&gt;
&lt;br /&gt;
On ajoute un deuxième bouton sur le breadboard, qui déclenche la prise d'une photo, et le prototype est maintenant fonctionnel. Les photos sont sauvegardées dans le répertoire courant du RPi, avec la date et l'heure pour nom de fichier.&lt;br /&gt;
&lt;br /&gt;
Au niveau du code, les parties utiles sont:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Fonction de prise d'une photo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def btn_take_picture(pin):&lt;br /&gt;
    # DEBUG&lt;br /&gt;
    logging.info(&amp;quot;Bouton CAM_PIN pressé, on prend un photo&amp;quot;)&lt;br /&gt;
    # Construction du chemin pour la photo&lt;br /&gt;
    now = datetime.datetime.now()&lt;br /&gt;
    pic_filename = &amp;quot;/home/qb/pic_&amp;quot; + str(now) + &amp;quot;.jpg&amp;quot;&lt;br /&gt;
    # Initialisation de la camera. On ne le fait pas dans initialize() pour éviter au maximum de la laisser&lt;br /&gt;
    # allumée (et consommer) en continu. En plus, une fois activée, les lectures sur le DHT sont beaucoup&lt;br /&gt;
    # plus souvent ratées.&lt;br /&gt;
    with PICAM.PiCamera() as cam:&lt;br /&gt;
        cam.capture(pic_filename)&lt;br /&gt;
        logging.debug(&amp;quot;Photos sauvée &amp;quot; + str(cam.resolution) + &amp;quot;  dans &amp;quot; + pic_filename)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pimp my screen ==&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est d'allumer ou éteindre l'écran, la bibliothèque CharLCD permet la modulation PWN du rétroéclairage. De quoi avoir un chouette effet de fondu au noir lorsque l'écran s'allume et s'éteint.&lt;br /&gt;
&lt;br /&gt;
Au niveau du code, la partie utile:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Module l'intensité du rétro éclairage de l'écran lcd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def lcd_dim_backlight(backlight_value, time_step):&lt;br /&gt;
    global lcd&lt;br /&gt;
    global lcd_backlight&lt;br /&gt;
    # calcule l'incrément à avoir entre lcd_backlight et backlight_value&lt;br /&gt;
    stp = (lcd_backlight &amp;gt; backlight_value) * -2 +1&lt;br /&gt;
    brightnesses = map(lambda x: x/10.0, range(int(lcd_backlight*10), int(backlight_value*10)+1, stp))&lt;br /&gt;
    for bright in brightnesses:&lt;br /&gt;
        lcd_backlight = bright&lt;br /&gt;
        logging.debug(&amp;quot;loop on bright= &amp;quot; + str(bright))&lt;br /&gt;
        lcd.set_backlight(bright)&lt;br /&gt;
        time.sleep(time_step)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Le code et le montage ==&lt;br /&gt;
&lt;br /&gt;
Le code source complet pour [https://gitlab.com/qberten/cellarkare/blob/master/mark3_camera/cellarkare_cam.py Mark 3 est disponible sur gitlab]. Pour ce qui est du montage, ben pas de schéma de raccordement disponible, j'ai oublié de le documenter en temps utile avant de passer à Mark 4! Donc il faudra attendre la suite...&lt;br /&gt;
&lt;br /&gt;
= Mark 4: We are (almost) done =&lt;br /&gt;
&lt;br /&gt;
== Pimp my screen, reloaded ==&lt;br /&gt;
Une dernière petite touche intéressante: l'appareil est destiné à être mis dans une cave à vin, endroit où il va faire noir la plupart du temps. En conséquence, l'écran LCD n'a pas vraiment besoin d'être allumé en permanence, pourquoi ne pas l'allumer automatiquement quand la lumière du local dépasse un certain seuil. Une photorésistance permet de réaliser rapidement la mesure d'une intensité lumineuse, pourquoi s'en priver... Oui mais... le RPi n'a pas d'entrée analogique, comment convertir simplement la mesure sur la photorésistance en une valeur analogique, alors que le RPi n'a que des entrées digitales.&lt;br /&gt;
&lt;br /&gt;
Après un peu de recherche, un montage simple à base d'une capacité dont le temps de charge sera directement proportionnel à la mesure sur la photo-résistance. Tout cela est expliqué ici (en anglais): [http://www.raspberrypi-spy.co.uk/2012/08/reading-analogue-sensors-with-one-gpio-pin/]&lt;br /&gt;
&lt;br /&gt;
(TODO - continuer la documentation)&lt;br /&gt;
&lt;br /&gt;
== Buttons, buttons, we want more ==&lt;br /&gt;
&lt;br /&gt;
Dernier petit détail, et non des moindre, Pour avoir un projet réellement fonctionnel, il va falloir travailler un peu l'interface homme-machine, et permettre un peu plus d'interaction avec le Rpi, pour par exemple permettre d'entrer le nombre de bouteilles couvertes par l'entrée ou la sortie photographiée, quitter/valider une action, ...&lt;br /&gt;
&lt;br /&gt;
(TODO - continuer la documentation)&lt;br /&gt;
&lt;br /&gt;
== we want leds ==&lt;br /&gt;
&lt;br /&gt;
Toujours dans l'optique d'améliorer l'interaction avec l'appareil, pourquoi ne pas intégrer une led de status sur l'appareil, pour indiquer visuellement différents états, comme par exemple: une température trop basse ou trop haute est enregistrée, il n'y a pas de connection réseau, ...&lt;br /&gt;
&lt;br /&gt;
(TODO - à implémenter tout court ;-)&lt;br /&gt;
&lt;br /&gt;
== all your data are belong to us ==&lt;br /&gt;
&lt;br /&gt;
Enfin, c'est bien beau d'afficher la température et l'humidité, c'est encore mieux de l'enregistrer quelque part pour pouvoir tracer l'historique, et intéragir plus facilement avec ces données.&lt;br /&gt;
&lt;br /&gt;
(TODO - à implémenter tout court ;-)&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Projets]]&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=CellarKare&amp;diff=2983</id>
		<title>CellarKare</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=CellarKare&amp;diff=2983"/>
		<updated>2015-10-28T21:06:35Z</updated>

		<summary type="html">&lt;p&gt;Quentin : /* Mark 2: la même chose avec un Raspberry Pi */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Un projet lancé par --[[Utilisateur:Quentin|Quentin]] ([[Discussion utilisateur:Quentin|discussion]]) 14 juin 2015 à 19:58 (CEST)&lt;br /&gt;
&lt;br /&gt;
= En bref =&lt;br /&gt;
&lt;br /&gt;
Le projet est de créer une &amp;quot;station météo&amp;quot; pour une cave à vin, d'où le nom du projet un peu fumeux de CellarKare = Cellar + Care, le K c'est pour faire joli ;-)&lt;br /&gt;
Dans un premier temps, le but est d'afficher la température et le taux d'humidité (hygrométrie). Ça, c'est pour le but fonctionnel. Mes autres buts sont:&lt;br /&gt;
* Au niveau perso: réaliser un premier projet à forte composante électronique, dans la foulée de notre formation Arduino&lt;br /&gt;
* Utiliser un maximum toutes les techniques/machines du Makilab&lt;br /&gt;
* Documenter les différentes étapes (tutoriel), et fournir les fichiers sources nécessaires aux différentes étapes.&lt;br /&gt;
&lt;br /&gt;
= Mark (1): Le matos et un premier proto Arduino=&lt;br /&gt;
&lt;br /&gt;
Le premier prototype sera relativement simple: la station affichera la température et l'humidité ambiante sur un écran LCD, le tout piloté par un Arduino Uno.&lt;br /&gt;
&lt;br /&gt;
== T° et humidité: DHT22 / AM2303 ==&lt;br /&gt;
&lt;br /&gt;
Au niveau des capteurs, logiquement il en faut un pour lire la température, et un pour lire l'humidité. Les deux existent certainement séparément, mais une rapide recherche sur le net done des références de capteurs déjà calibrés et fournissant les deux pour pas trop cher. Au final, mon choix se porte sur un DHT22. Ce capteur s'appelle aussi AM2303 dans sa version câblée. Quelques liens et documentation utiles:&lt;br /&gt;
* [http://www.adafruit.com/datasheets/DHT22.pdf Les specs du DHT22 (anglais)];&lt;br /&gt;
* Pour acheter: [http://www.adafruit.com/products/385 ~10 $ chez AdaFruit] ou [http://shop.mchobby.be/senseurs/214-dht22-am2302-senseur-humidite-temperature--3232100002142.html ~17 € chez MCHobby], c'est un peu plus cher, mais ils sont belges et sympas;&lt;br /&gt;
* [http://playground.arduino.cc/Main/DHTLib Un tutoriel pour arduino sur Arduino.cc];&lt;br /&gt;
* [https://learn.adafruit.com/dht/using-a-dhtxx-sensor Un tutoriel pour arduino sur AdaFruit], et sa [http://mchobby.be/wiki/index.php?title=DHTxx version française];&lt;br /&gt;
&lt;br /&gt;
== L'affichage LCD: LCM1602 ==&lt;br /&gt;
&lt;br /&gt;
Pour l'affichage, le choix a été vite fait... J'ai pris ce que j'avais sous la main, soit le LCD fourni dans le starter kit arduino. Cet écran est très répandu, et fait partie de nombreux &amp;quot;kits de démarrage&amp;quot; en électronique. Au niveau fonctionnel, avec 2 lignes de 16 charactères, on devrait pouvoir s'en sortir pour afficher une température et un taux d'humidité ;-). Son contrôleur (hitachi HD44780) est lui aussi très répandu En vrac:&lt;br /&gt;
* [http://www.datasheetspdf.com/datasheet/LCM1602.html Les specs (chinois ou anglais)]&lt;br /&gt;
* Pour acheter: [http://www.ebay.com/sch/items/?_nkw=lcm1602&amp;amp;_sacat=&amp;amp;_ex_kw=&amp;amp;_mPrRngCbx=1&amp;amp;_udlo=&amp;amp;_udhi=&amp;amp;_sop=12&amp;amp;_fpos=&amp;amp;_fspt=1&amp;amp;_sadis=&amp;amp;LH_CAds=&amp;amp;rmvSB=true on en trouve plein sur ebay...]&lt;br /&gt;
* [http://www.arduino.cc/en/Tutorial/LiquidCrystal La librairie LiquidCrystal, qui permet de le contrôler sur Arduino]&lt;br /&gt;
&lt;br /&gt;
== Le montage ==&lt;br /&gt;
&lt;br /&gt;
Le montage est assez simple, et n'est finalement qu'une combinaison des différents tutoriel et exemple d'utilisation de l'écran et du capteur.&lt;br /&gt;
&lt;br /&gt;
Sur le schéma du capteur DHT, la résistance de 10K sert de [https://fr.wikipedia.org/wiki/R%C3%A9sistance_de_rappel &amp;quot;résistance pull-up&amp;quot;].&lt;br /&gt;
'''Cette résistance n'est pas nécessaire dans le cas du capteur AM2302''' (la version avec câble et boitier en plastique, comme sur la photo). Cette version [http://www.adafruit.com/product/393 intègre une résistance de 5.1K dans le boîtier], qui connecte déjà VCC et DATA, merci Patrick pour l'info ;-).&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Cellarkare mark1 bb.png|500px|thumb|left]]&lt;br /&gt;
[[Fichier:Cellarkare_mark1.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Le code ==&lt;br /&gt;
Au niveau programmation du micro-controlleur Arduino, là aussi c'est assez simple: toutes les 3 secondes, on lit les valeurs de t° et humidité, et on les affiches sur l'écran LCD. Les valeurs mesurées et des messages supplémentaires sont aussi envoyés sur la sortie série.&lt;br /&gt;
&lt;br /&gt;
Le code est aussi disponible (et éventuellement mis à jour) [https://gitlab.com/qberten/cellarkare/blob/master/mark1_arduino/cellarkare_arduino.ino sur gitlab]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
CellarKare - Mark #1&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Un projet de station de mesure de la température et l'humidité dans une cave à vin&lt;br /&gt;
Plus d'infos et schéma de montage sur http://wiki.makilab.org/index.php/CellarKare&lt;br /&gt;
Quentin Berten, 2015 - Domaine public, licence WTFPL v2, http://www.wtfpl.net/&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
// Bibliothèque LiquidCrystal, pour l'écran LCD. Installée de base avec l'IDE&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Bibliothèque DHT, pour le capteur de température. Installable directement depuis&lt;br /&gt;
// l'IDE, via Sketch -&amp;gt; Include LIbrary -&amp;gt; Manage Libraries -&amp;gt; DHT sensor Library &lt;br /&gt;
#include &amp;quot;DHT.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Définition l'écran LCD, en argument les pins d'interface, dans l'ordre&lt;br /&gt;
// (RS pin, LCD Enable, D4, D5, D6, D7)&lt;br /&gt;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);&lt;br /&gt;
&lt;br /&gt;
// Définition des pin et type pour le senseur de t° et humidité&lt;br /&gt;
#define DHTPIN 7         // senseur (fil data, en jaune), sur pin 7&lt;br /&gt;
#define DHTTYPE DHT22    // type DHT 22  (AM2302)&lt;br /&gt;
&lt;br /&gt;
// Définition du capteur DHT22, pour un Arduino &amp;quot;normal&amp;quot; à 16mhz, comme le Uno&lt;br /&gt;
DHT dht(DHTPIN, DHTTYPE);&lt;br /&gt;
// les variables associées qui vont lire les valeurs (température, ...)&lt;br /&gt;
float hum;&lt;br /&gt;
float tempC;&lt;br /&gt;
float tempF;&lt;br /&gt;
float indiceHum;&lt;br /&gt;
&lt;br /&gt;
// les variables qui permettent de gérer le temps,&lt;br /&gt;
// voir http://www.arduino.cc/en/pmwiki.php?n=Tutorial/BlinkWithoutDelay&lt;br /&gt;
long prevMillis = 0;           // enregistre le temps de la denière lecture DHT22&lt;br /&gt;
long dhtInterval = 3000;       // L'intervalle de lecture du DHT22: 3 secondes&lt;br /&gt;
&lt;br /&gt;
// la procédure d'initialisation arduino&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  // on ouvre une connection série (pour afficher un maxium d'info)&lt;br /&gt;
  Serial.begin(9600); &lt;br /&gt;
  Serial.println(&amp;quot;CellarKare Mark #1 Test&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // initialisation du capteur&lt;br /&gt;
  dht.begin();&lt;br /&gt;
  // initialisation de l'écran, 16 colonnes et 2 lignes&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// la boucle principale arduino&lt;br /&gt;
void loop() {&lt;br /&gt;
  unsigned long curMillis = millis();&lt;br /&gt;
  &lt;br /&gt;
  if(curMillis - prevMillis &amp;lt; dhtInterval) {&lt;br /&gt;
    goto end_loop;        // pas de lecture DHT, on va à la fin de la boucle loop()&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // on enregistre le dernier temps d'exécution de la lecture&lt;br /&gt;
  prevMillis = curMillis;   &lt;br /&gt;
  &lt;br /&gt;
  // la lecture de la t° et l'humidité prends environ 250 millisecondes&lt;br /&gt;
  // mais les lectures du capteur peuvent etre vieillies de 2 secondes&lt;br /&gt;
  // le capteur n'est pas rapide (d'où l'attente de 3 secondes pour etre&lt;br /&gt;
  // certain d'avoir des lectures correctes.&lt;br /&gt;
  // lecture de l'humidité&lt;br /&gt;
  hum = dht.readHumidity();&lt;br /&gt;
  // lecture de la température en degrés Celsius&lt;br /&gt;
  tempC = dht.readTemperature();&lt;br /&gt;
  // lecture de la température en degrés Fahreneit&lt;br /&gt;
  tempF = dht.readTemperature(true);&lt;br /&gt;
  &lt;br /&gt;
  // On vérifie que les lectures on bien été réalisées. Si pas, on quitte&lt;br /&gt;
  // la boucle pour ré-essayer&lt;br /&gt;
  if (isnan(hum) || isnan(tempC) || isnan(tempF)) {&lt;br /&gt;
    Serial.println(&amp;quot;Lecture sur le capteur DHT ratée&amp;quot;);&lt;br /&gt;
    goto end_loop;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Calcul de l'indice de chaleur (voir https://fr.wikipedia.org/wiki/Indice_de_chaleur )&lt;br /&gt;
  // La température doit etre fournie en degré Fahreneit&lt;br /&gt;
  indiceHum = dht.computeHeatIndex(tempF, hum);&lt;br /&gt;
&lt;br /&gt;
  // On affiche les valeurs sur la console série (n'est pas indispensable)&lt;br /&gt;
  Serial.print(&amp;quot;Humidite: &amp;quot;); &lt;br /&gt;
  Serial.print(hum);&lt;br /&gt;
  Serial.print(&amp;quot; %\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temperature: &amp;quot;); &lt;br /&gt;
  Serial.print(tempC);&lt;br /&gt;
  Serial.print(&amp;quot; *C &amp;quot;);&lt;br /&gt;
  Serial.print(tempF);&lt;br /&gt;
  Serial.print(&amp;quot; *F\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Indice de chaleur: &amp;quot;);&lt;br /&gt;
  Serial.print(indiceHum);&lt;br /&gt;
  Serial.println(&amp;quot; *F&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  // On affiche les valeurs sur l'écran LCD, curseur à (0,0)&lt;br /&gt;
  lcd.setCursor(0, 0);&lt;br /&gt;
  // print Temp in C°&lt;br /&gt;
  lcd.print(&amp;quot;deg C: &amp;quot;);&lt;br /&gt;
  lcd.print(tempC);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;hum %: &amp;quot;);&lt;br /&gt;
  lcd.print(hum);&lt;br /&gt;
&lt;br /&gt;
  // label pour goto&lt;br /&gt;
  end_loop:&lt;br /&gt;
  ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== La conclusion ==&lt;br /&gt;
Un premier prototype fonctionnel, qui a au moins le mérite de vérifier que le capteur DHT renvoie des valeurs réalistes.&lt;br /&gt;
La suite: la même chose avec un Raspberry pi, pour bénéficier de sa faciliter à se connecter au réseau. Ce serait quand même cool de pouvoir lire ces valeurs sur un smartphone ;-)&lt;br /&gt;
&lt;br /&gt;
= Mark (2): la même chose avec un Raspberry Pi =&lt;br /&gt;
Le but de cette nouvelle itération: réaliser un montage équivalent avec un [https://www.raspberrypi.org/ Raspberry Pi] (RPi en abrégé). Pourquoi un RPi ?&lt;br /&gt;
* Parce que j'en avais un sous la main ;-)&lt;br /&gt;
* Parce qu'il permet de se connecter rapidement et facilement à un réseau, via ethernet (câble) ou wifi (via un dongle usb)&lt;br /&gt;
* Parce qu'il permet de brancher facilement un module caméra (on y viendra au Mark 3)&lt;br /&gt;
&lt;br /&gt;
Il est certainement possible d'arriver au même résultat avec d'autres cartes (comme par exemple un [http://www.arduino.cc/en/Main/ArduinoBoardYun Arduino Yun]), c'est juste que c'est un RPi que j'avais sous la main... Dans mon cas un Raspberry Pi B+.&lt;br /&gt;
&lt;br /&gt;
En ce qui concerne le RPi, quelques ressources très utiles:&lt;br /&gt;
* [http://mchobby.be/wiki/index.php?title=RaspberryPi-Accueil#Tutoriels Les tutoriels réalisés/traduits par MC Hobby. Une mine d'or]&lt;br /&gt;
* [http://www.elektronique.fr/montages/raspberry-pi/ Des exemples de montages et réalisations électroniques avec RPi]&lt;br /&gt;
* [http://pi.gadgetoid.com/pinout La configuration des différentes PIN du RPi]&lt;br /&gt;
&lt;br /&gt;
== L'installation de l'OS ==&lt;br /&gt;
La principale différence entre une carte Arduino et le RPi, c'est le cœur de la carte:&lt;br /&gt;
* le cœur de l'Arduino est un microcontrôleur, qui va exécuter le programme qu'on lui injecte de manière bête et méchante. Chaque entrée/sortie va devoir être programmée directement, il n'y a pas de système de driver, ...&lt;br /&gt;
* le cœur du RPi est un microprocesseur (ARM, la même technologie que dans les smartphones). Il s'agit donc en fait d'un véritable &amp;quot;petit ordinateur&amp;quot;, avec un système d'exploitation, des drivers (pour l'usb, l'écran, le wifi, ...).&lt;br /&gt;
&lt;br /&gt;
Donc avant de pouvoir démarrer et utiliser le RPi, il va falloir installer un système d'exploitation (OS: Operating System). C'est exactement la même chose qu'installer Windows sur un PC, c'est juste que dans notre cas, ce ne sera pas Windows mais un système Linux. Il en existe [https://www.raspberrypi.org/downloads/ plusieurs], le standard de facto étant Raspbian (une distribution Debian adaptée pour le RPi), c'est celle-là [http://raspbian-france.fr/installer-raspbian-premier-demarrage-configuration/ que j'ai installée].&lt;br /&gt;
&lt;br /&gt;
Petit truc pour les distraits: écran/clavier/souris ne sont pas indispensables pour l'installation, il est tout à fait possible de se connecter via [https://fr.wikipedia.org/wiki/Secure_Shell SSH] au RPi une fois son premier démarrage exécuté, pour autant qu'il soit raccordé à votre réseau (via son câble ethernet). Le RPi se déclare automatiquement sur le réseau avec le nom raspberry.local, et un &amp;lt;code&amp;gt;ssh pi@raspberry.local&amp;lt;/code&amp;gt; à fait l'affaire (raspberry, c'est son &amp;quot;hostname&amp;quot; par défaut). Pour le mot de passe, c'est &amp;lt;code&amp;gt;raspberry&amp;lt;/code&amp;gt; par défaut. Ensuite &amp;lt;code&amp;gt;raspi-config&amp;lt;/code&amp;gt; permet de terminer la procédure d'installation.&lt;br /&gt;
&lt;br /&gt;
En ce qui me concerne, tout le reste de la configuration se fera donc en [https://fr.wikipedia.org/wiki/Shell_Unix ligne de commande (shell)] via SSH. [http://mchobby.be/wiki/index.php?title=PI-SSH Le wiki de MCHobby] détaille l'accès via SSH au RPi.&lt;br /&gt;
&lt;br /&gt;
'''Un dernier point important''': le RPi, c'est comme un &amp;quot;vrai&amp;quot; ordinateur... il vaut mieux l'éteindre proprement plutôt que le débrancher sauvagement. Donc on s'arrange pour faire un &amp;lt;code&amp;gt;sudo poweroff&amp;lt;/code&amp;gt; en ligne de commande avant de le débrancher. Le gros risque: corrompre le système de fichier sur le carte SD, ce qui empêche le démarrage suivant, et impose un reformatage et une réinstallation complète. Pas drôle en somme, je parle d'expérience :-(&lt;br /&gt;
&lt;br /&gt;
== Le wifi ==&lt;br /&gt;
Bien que le RPi ne soit pas équipé par défaut du wifi, il est compatible avec la majorité des clefs usb wifi. Dans mon cas, une vieille clef Hercules HWGUSB2-54. Un petit tour par les log (&amp;lt;code&amp;gt;sudo tail -f /var/log/syslog&amp;lt;/code&amp;gt;) pour vérifier qu'elle est reconnue correctement lors du branchement, et puis une configuration via l'édition de &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt; pour entrer les références du réseau wifi:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
auto wlan0&lt;br /&gt;
allow-hotplug wlan0&lt;br /&gt;
iface wlan0 inet dhcp&lt;br /&gt;
wpa-ssid &amp;quot;Le_nom_(SSID)_de_votre_wifi&amp;quot;&lt;br /&gt;
wpa-psk &amp;quot;Le_mot_de_passe_de_votre_wifi&amp;quot;&lt;br /&gt;
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Ensuite un redémmarrage de la carte avec &amp;lt;code&amp;gt;$ sudo ifdown wlan0&amp;lt;/code&amp;gt; suivi de &amp;lt;code&amp;gt;sudo ifup wlan0&amp;lt;/code&amp;gt; et ça devrait être OK. On peut maintenant se passer de câble ethernet!&lt;br /&gt;
&lt;br /&gt;
Si nécessaire: plus de détails sur la configuration réseau sur [http://mchobby.be/wiki/index.php?title=Rasp-Config-Reseau le wiki MC Hobby]&lt;br /&gt;
&lt;br /&gt;
== La température avec le DHT22 / AM2302 ==&lt;br /&gt;
Pour la lecture des température avec le capteur, les gars d'Adafruit ont déjà développé un bibliothèque de fonctions utilisables en ligne de commande ou en [https://fr.wikipedia.org/wiki/Python_%28langage%29 python]. Quelques ressources:&lt;br /&gt;
* [https://learn.adafruit.com/dht-humidity-sensing-on-raspberry-pi-with-gdocs-logging/overview La page d'Adafruit (en anglais) sur l'utilisation du DHT22 avec le RPi]&lt;br /&gt;
* [http://www.manuel-esteban.com/lire-une-sonde-dht22-avec-un-raspberry-pi/ Une ressource en français (un peu datée) sur l'utilisation DHT22 + RPi.]&lt;br /&gt;
* [http://pi.gadgetoid.com/pinout La table de référence des 40 pins GPIO du RPi]&lt;br /&gt;
Pour ma part, j'ai suivi la méthode Adafruit, ce qui donne en résumé, en ligne de commande:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
cd /home/pi&lt;br /&gt;
git clone https://github.com/adafruit/Adafruit_Python_DHT.git &lt;br /&gt;
cd Adafruit_Python_DHT&lt;br /&gt;
sudo apt-get install build-essential python-dev  &lt;br /&gt;
sudo python setup.py install&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Au niveau du montage, rien de nouveau: le capteur doit toujours être alimenté en 3.3V ou en 5V, et le câble de lecture à une pin d'entrée/sortie (GPIO: General Purpose Input Output), ce qui donne:&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Cellarkare mark2 bb.png|400px|thumb|left]]&lt;br /&gt;
[[Fichier:Cellarkare_mark2.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Un test en ligne de commande permet de vérifier qu'on a une lecture sur le capteur (dans mon cas un AM2302 raccordé sur la pin GPIO 4):&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
cd /home/pi/Adafruit_Python_DHT/examples/&lt;br /&gt;
sudo ./AdafruitDHT.py 2302 4&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Ce qui affiche &amp;lt;code&amp;gt;Temp=23.0*C  Humidity=53.8%&amp;lt;/code&amp;gt;, des valeurs censées pour une après-midi d'été ;-)&lt;br /&gt;
&lt;br /&gt;
== L'affichage LCD ==&lt;br /&gt;
L'écran LCD est toujours le même que pour la version &amp;quot;Mark 1&amp;quot; Arduino. Quelques resources:&lt;br /&gt;
* [https://learn.adafruit.com/drive-a-16x2-lcd-directly-with-a-raspberry-pi Un tutoriel (en anglais) sur Adafruit] ''Attention, le code source n'est plus tellement a jour, voir le dernier lien Github.''&lt;br /&gt;
* [http://mchobby.be/wiki/index.php?title=Rasp-Hack-Afficheur-LCD La version française, traduite par MC Hobby]&lt;br /&gt;
* [https://github.com/adafruit/Adafruit_Python_CharLCD Le code source de la librairie Adafruit pour le gestion du LCD sur GitHub] ''contient la dernière version de la librairie''.&lt;br /&gt;
&lt;br /&gt;
La logique de raccordement est strictement identique au circuit du Mark 1. La seule différence est que la résistance variable de 10K dans le circuit est supprimée, la bibliothèque Adafruit pour le LCD permettant le pilotage en [https://fr.wikipedia.org/wiki/Modulation_de_largeur_d%27impulsion modulation PWM].&lt;br /&gt;
&lt;br /&gt;
== Le montage ==&lt;br /&gt;
Au final, le montage a été fait pour gagner un maximum de place sur mon breadboard. La pin data du DHT a été déplacée sur la pin 5, et le reste des pin pour le LCD sont documentées dans le code.&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Cellarkare mark2_2 bb.png|500px|thumb|left]]&lt;br /&gt;
[[Fichier:Cellarkare_mark2_2.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Le code ==&lt;br /&gt;
&lt;br /&gt;
La logique du code est identique à la version mark 1 - arduino. Ce code est aussi disponible (et éventuellement mis à jour) [https://gitlab.com/qberten/cellarkare/blob/master/mark2_rpi/cellarkare_rpi.py sur gitlab]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
# coding=utf8&lt;br /&gt;
# CellarKare - Mark 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
# Un projet de station de mesure de la température et l'humidité dans une cave à vin&lt;br /&gt;
# Plus d'infos et schéma de montage sur http://wiki.makilab.org/index.php/CellarKare&lt;br /&gt;
# Quentin Berten, 2015 - Domaine public, licence WTFPL v2, http://www.wtfpl.net/&lt;br /&gt;
# quentin_#AT#_berten.me&lt;br /&gt;
&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
# Bibliothèque CharLCD d'Adafruit, voir https://github.com/adafruit/Adafruit_Python_CharLCD&lt;br /&gt;
# pour l'installation&lt;br /&gt;
import Adafruit_CharLCD as LCD&lt;br /&gt;
# Bibliothèque DHT d'AdaFruit, voir https://github.com/adafruit/Adafruit_Python_DHT&lt;br /&gt;
# pour l'installation&lt;br /&gt;
import Adafruit_DHT as DHT&lt;br /&gt;
&lt;br /&gt;
# Configuration de l'affichage LCD&lt;br /&gt;
lcd_rs        = 25      # RS sur pin 25&lt;br /&gt;
lcd_en        = 24      # EN sur pin 24&lt;br /&gt;
lcd_d4        = 23      # D4 sur pin 23&lt;br /&gt;
lcd_d5        = 12      # D5 sur pin 12&lt;br /&gt;
lcd_d6        = 20      # D6 sur pin 20&lt;br /&gt;
lcd_d7        = 16      # D7 sur pin 16&lt;br /&gt;
lcd_backlight = 18      # rétro éclairage sur pin 18&lt;br /&gt;
lcd_columns   = 16      # Affichage à 16 colonnes ...&lt;br /&gt;
# Initialisation du LCD avec les variables ci-dessus&lt;br /&gt;
lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, &lt;br /&gt;
		        	lcd_columns, lcd_rows, lcd_backlight)&lt;br /&gt;
# Configuration pour le capteur DHT, soit DHT11, DHT22 ou AM2302.&lt;br /&gt;
dht_sensor    = DHT.AM2302  # Type AM2302&lt;br /&gt;
dht_pin       = 5           # DHT data sur pin 5&lt;br /&gt;
&lt;br /&gt;
# les variables qui permettent de gérer le temps,&lt;br /&gt;
prevMillis = 0          # enregistre le temps de la denière lecture DHT22&lt;br /&gt;
secInterval = 1000      # Un intervalle d'une seconde&lt;br /&gt;
# L'intervalle de lecture du DHT22: 3 secondes, doit etre plus grand que secInterval&lt;br /&gt;
dhtInterval = 3000&lt;br /&gt;
&lt;br /&gt;
def read_and_print_dht():&lt;br /&gt;
    # On lit une valeur sur le senseur avec la fonction read. Attention, cette fonction&lt;br /&gt;
    # ne réessaie pas automatiquement en cas d'erreur, mais fournit les valeurs (None, None).&lt;br /&gt;
    hum, tempC  = DHT.read(dht_sensor, dht_pin)&lt;br /&gt;
&lt;br /&gt;
    # On vérifie que l'on a bien eu une lecture (Linux n'est pas un OS temps réel et ne&lt;br /&gt;
    # peut pas garantir le timing des lectures sur le capteur). Si ça arrive, on réessaie.&lt;br /&gt;
    # On affiche les valeurs sur la console (n'est pas indispensable)&lt;br /&gt;
    if hum is not None and tempC is not None:&lt;br /&gt;
    	print 'Temp={0:0.2f}*C  Humidity={1:0.2f}%'.format(tempC, hum)&lt;br /&gt;
        # On affiche les valeurs sur l'écran LCD&lt;br /&gt;
        lcd.clear()&lt;br /&gt;
        lcd.message('deg C: {0:0.2f}\nhum %: {1:0.2f}'.format(tempC, hum))&lt;br /&gt;
    else:&lt;br /&gt;
	print 'Lecture sur le capteur DHT ratée'&lt;br /&gt;
&lt;br /&gt;
# Boucle principale, l'équivalent de void loop() sur Arduino&lt;br /&gt;
while 1:&lt;br /&gt;
    # On lit le nombre de millisecondes courant&lt;br /&gt;
    curMillis = time.time()*1000&lt;br /&gt;
    if curMillis - prevMillis &amp;gt; dhtInterval:&lt;br /&gt;
        # On essaie de lire et afficher les valeurs du DHT&lt;br /&gt;
        read_and_print_dht()&lt;br /&gt;
        # on enregistre le dernier temps d'exécution de la lecture&lt;br /&gt;
        prevMillis = curMillis&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== La conclusion ==&lt;br /&gt;
En vrac:&lt;br /&gt;
* Pas de gros problème ou obstacles majeurs pour convertir le montage et le code Arduino en son équivalent RPi. Mais heureusement que l'équipe d'Adafruit a déjà programmé les bibliothèques Python qui vont bien!&lt;br /&gt;
* Au niveau du breadboard, ça commence à prendre de la place... Une solution: passer en [https://fr.wikipedia.org/wiki/I2C &amp;quot;I2C&amp;quot;] pour le capteur et le LCD, ce qui limite drastiquement le nombre de pins nécessaires pour le montage, et facilite la programmation. Merci Patrick pour les infos, ce sera sûrement utile pour le prochain montage ;-) !&lt;br /&gt;
** Par exemple, pour la température: un capteur I2C comme le [https://www.adafruit.com/products/1638 SHT15], et pour l'écran, [http://www.electrodragon.com/w/index.php?title=1602_LCD_I2C/SPI_Module la version I2C du même 1602].&lt;br /&gt;
** Par contre dans ce cas, il faut faire gaffe au fait que le passage en 3.3V pour la logique du RPi, le lcd reste en 5V et il faudra ajouter un [http://www.adafruit.com/products/757 convertisseurs de niveau] pour le bus si utilisé avec un capteur qui ne supporte pas 5V.&lt;br /&gt;
* le langage Python, c'est pas plus compliqué que le simili-C de l'Arduino une fois qu'on est rentré dedans.&lt;br /&gt;
&lt;br /&gt;
= Mark 3: Start, Stop, and say Cheese =&lt;br /&gt;
&lt;br /&gt;
== Sart/Stop ==&lt;br /&gt;
Un &amp;quot;problème&amp;quot; du RPi, c'est qu'il n'a pas de bouton ON/OFF simple, et par conséquent, l'éteindre proprement avec &amp;lt;code&amp;gt;sudo halt&amp;lt;/code&amp;gt; ou  &amp;lt;code&amp;gt;sudo poweroff&amp;lt;/code&amp;gt; est impossible sans un accès physique (clavier et écran connectés) ou une connection SSH (connection à distance). Pas pratique pour un boitier qui sera installé dans une cave à vin...&lt;br /&gt;
&lt;br /&gt;
Autrement dit, mes besoins:&lt;br /&gt;
# Le programme python d'affichage et monitoring des températures démarre automatiquement lorsque le RPi démarre.&lt;br /&gt;
# Un bouton OFF permet d'éteindre proprement le RPi avant de le débrancher de son alimentation.&lt;br /&gt;
# Un bouton ON permet de l'allumer une fois éteint sans débrancher/rebrancher son alimentation.&lt;br /&gt;
# Nec plus ultra: avoir un fonctionnement similaire à un bouton ON/OFF d'un laptop par exemple: si éteint, le bouton allume, si allumé, le bouton éteint proprement le RPi, et coupe l'alimentation USB.&lt;br /&gt;
&lt;br /&gt;
Bon après quelques recherches sur le net:&lt;br /&gt;
# C'est simple, il suffit de configurer le &amp;quot;init script&amp;quot; du RPi pour lancer automatiquement le programme python au démarrage&lt;br /&gt;
# Un montage simple permet d'écouter sur une des pins du GPIO, et de lancer la procédure propre d'arrêt (shutdown). Soit un bouton OFF&lt;br /&gt;
# Le RPi (à partir du modèle B rev2, soit Brev2, B+ et 2) possède un pinout &amp;quot;reset&amp;quot;, qui n'est pas soudé de base sur la carte. Si on raccorde ces deux pins, le RPi redémarre électriquement (hard reboot). Donc sans s'éteindre proprement. L'intérêt, c'est que si le RPi est éteint mais encore sous tension, ce bouton permet de le ré-allumer. Donc un bouton ON/RESET. Voir par exemple:&lt;br /&gt;
#* Un article assez complet en anglais sur [http://www.makeuseof.com/tag/add-reset-switch-raspberry-pi/ MakeUseOf.com]&lt;br /&gt;
# Le bouton combiné ON/OFF unique est possible, mais le montage est plus compliqué. Quelques exemples:&lt;br /&gt;
#* Un montage en français sur le site [http://forum.madeinfr.org/topic/43/raspower/ MadeInFR.org].&lt;br /&gt;
#* Un montage en anglais à base de micro contrôleur (pas simple donc) sur [http://www.instructables.com/id/Raspberry-Pi-Shutdown-Button/ Instructables]&lt;br /&gt;
#* Un article très complet en anglais reprenant toutes les options, dont un montage assez simple de bouton unique [http://www.raspberry-pi-geek.com/Archive/2013/01/Adding-an-On-Off-switch-to-your-Raspberry-Pi sur raspberry-pi-geek.com]&lt;br /&gt;
#* Des solutions commerciales toutes faites comme [https://www.pi-supply.com/product/pi-supply-raspberry-pi-power-switch/ PiSupply] ou [http://www.mausberrycircuits.com/collections/frontpage MausberryCircuits]&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, ce sera pour moi le choix suivant: un bouton OFF, qui lors d'un appui long éteint proprement le RPi. En gros la solution 2.&lt;br /&gt;
&lt;br /&gt;
Mais dans un premier temps, il faut configurer le RPi pour lancer le programme au démarrage...&lt;br /&gt;
&lt;br /&gt;
== Lancement du programme via initscript ==&lt;br /&gt;
&lt;br /&gt;
Il y a certainement 36 façons d'arriver au même résultat (après tout, le RPi tourne sous Linux ;-), mais dans mon cas, la solution qui me convient bien: un script d'init lance par défaut le script python localisé en &amp;lt;code&amp;gt;/usr/local/bin/pystartup.py&amp;lt;/code&amp;gt;. L'intérêt de la chose: &amp;lt;code&amp;gt;pystartup.py&amp;lt;/code&amp;gt; peut être un lien symbolique vers n'importe quel autre script.&lt;br /&gt;
&lt;br /&gt;
Pour éviter d'encombrer le wiki, je n'ai pas repris le script ici, mais il est dispo sur [https://gitlab.com/qberten/cellarkare/blob/master/mark3_camera/initscript_pystartup GitLab]. Pour l'installation, en ligne de commande (connecté sur le RPi):&lt;br /&gt;
&lt;br /&gt;
On télécharge le script, on le déplace au bon endroit et on le rend exécutable&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
wget https://gitlab.com/qberten/cellarkare/raw/master/mark3_camera/initscript_pystartup&lt;br /&gt;
sudo mv initscript_pystartup /etc/init.d/pystartup&lt;br /&gt;
sudo chmod a+x /etc/init.d/pystartup&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
On crée le lien symbolique qui va bien (remplacer /chemin/vers/... par la localisation du programme à lancer)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
ln -s /chemin/vers/votre/script/python.py /usr/local/bin/pystartup.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
On configure le système pour qu'il connaisse le nouveau script &amp;quot;pystartup&amp;quot;, et on lui demande de l'exécuter à chaque démarrage&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo update-rc.d pystartup defaults&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Il est ensuite possible de lancer son programme en arrière plan comme n'importe quel autre service avec &amp;lt;code&amp;gt;sudo service pystartup start&amp;lt;/code&amp;gt;, de l'arrêter avec &amp;lt;code&amp;gt;sudo service pystartup stop&amp;lt;/code&amp;gt;, etc&lt;br /&gt;
&lt;br /&gt;
== Pinout RESET ==&lt;br /&gt;
&lt;br /&gt;
Activer le &amp;quot;hard&amp;quot; reset sur le Rpi suppose un peu de soudure, mais rien de bien effrayant, 2 points suffisent. Un fois les connecteur pinout soudés, quand on raccorde les deux pins (par exemple avec un interrupteur), le RPi redémarre (&amp;quot;hard&amp;quot; reset, donc attention à la carte SD...), ou s'allume (si il était raccordé au secteur).&lt;br /&gt;
&lt;br /&gt;
J'ai soudé les 2 pins et testé la fonction, mais comme il s'agit d'un redémarrage &amp;quot;hard&amp;quot;, je n'ai finalement pas vraiment vu l'utilité dans ce projet: autant directement débrancher / rebrancher le câble d'alimentation dans ce cas.&lt;br /&gt;
&lt;br /&gt;
Mais à toutes fins utiles, les photos de l'opération, avant/après.&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Rpi_reset_before.jpg|500px|thumb|left]]&lt;br /&gt;
[[Fichier:Rpi_reset_after.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bouton OFF ==&lt;br /&gt;
&lt;br /&gt;
Rien de très compliqué: on raccorde le bouton à une entrée, on configure la résistance pull-up/down interne du Rpi, on s'assure de récupérer les évènements dans le code.&lt;br /&gt;
&lt;br /&gt;
Les parties utiles du code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# La fonction qui effectuer l'arrêt propre du RPi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def btn_proper_halt(pin):&lt;br /&gt;
    global off_state, cur_millis, off_millis&lt;br /&gt;
    # On lit le nombre de millisecondes courant&lt;br /&gt;
    cur_millis = time.time()*1000&lt;br /&gt;
    # Utilise la variable globale off_state&lt;br /&gt;
    off_state = not off_state&lt;br /&gt;
    # DEBUG&lt;br /&gt;
    logging.debug(&amp;quot;Bouton OFF_PIN pressé, son état est maintenant %s&amp;quot; % str(off_state))&lt;br /&gt;
    if off_state == True:&lt;br /&gt;
        off_millis = cur_millis   &lt;br /&gt;
    elif off_state == False: &lt;br /&gt;
        # DEBUG&lt;br /&gt;
        logging.debug(&amp;quot;Bouton OFF_PIN pressé pendant {0:0.0f} ms&amp;quot;.format(cur_millis - off_millis))&lt;br /&gt;
        if (cur_millis - off_millis) &amp;gt; OFF_INTERVAL:&lt;br /&gt;
            # On a relâché le bouton avec un écart long =&amp;gt; shutdown&lt;br /&gt;
            logging.debug(&amp;quot;Appui long sur le bouton OFF_PIN&amp;quot;)&lt;br /&gt;
            logging.info(&amp;quot;Arrêt du Raspberry PI, attendre encore 10 sec avant de débrancher&amp;quot;)&lt;br /&gt;
            subprocess.call('halt', shell=False)&lt;br /&gt;
        else:&lt;br /&gt;
            # Appuis court =&amp;gt; on ne fait rien&lt;br /&gt;
            logging.debug(&amp;quot;Appui court sur le bouton OFF_PIN&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Fonction de terminaison du programme (appelée lorsque le script est arrêté&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def terminate():&lt;br /&gt;
    logging.debug(&amp;quot;Terminate function started&amp;quot;)&lt;br /&gt;
    # efface l'écran LCD&lt;br /&gt;
    lcd_dim_backlight(0.0, 0.2)&lt;br /&gt;
    lcd.clear()&lt;br /&gt;
    logging.debug(&amp;quot;Terminate function ended&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Fonction d'initialisation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def initialize():&lt;br /&gt;
    global lcd&lt;br /&gt;
    logging.debug(&amp;quot;Initialize function started&amp;quot;)&lt;br /&gt;
    # Initialisation du LCD avec les variables ci-dessus&lt;br /&gt;
    lcd = LCD.Adafruit_CharLCD(LCD_RS, LCD_EN, LCD_D4, LCD_D5, LCD_D6, LCD_D7, &lt;br /&gt;
		        	LCD_COLUMNS, LCD_ROWS,&lt;br /&gt;
                                LCD_BACKLIGHT, invert_polarity = False, enable_pwm = True,&lt;br /&gt;
                                initial_backlight = lcd_backlight)&lt;br /&gt;
    # Initialisation des autres GPIO's&lt;br /&gt;
    GPIO.setmode(GPIO.BCM)        # On utilise la numérotation BCM pour les PIN&lt;br /&gt;
    # On définit la pin OFF_PIN comme entrée, et on active la résistance pull-down interne du RPi&lt;br /&gt;
    GPIO.setup(OFF_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)&lt;br /&gt;
    # Configure une interruption qui va détecter les mouvements up et down sur le bouton&lt;br /&gt;
    GPIO.add_event_detect(OFF_PIN, GPIO.BOTH, callback=btn_proper_halt, bouncetime=20)&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Say &amp;quot;cheese&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Cette partie du projet s'attache à pouvoir prendre rapidement et facilement un photos des étiquettes des bouteilles entrées ou sorties de la cave. Ben oui, j'ai pas forcément une bonne mémoire, et se donner les moyens d'enregistrer facilement et rapidement l'info est le meilleur moyen de suivre son stock ;-)&lt;br /&gt;
&lt;br /&gt;
Cette partie est super simple à réaliser avec le rpi: on raccorde la caméra, on s'assure qu'elle est activée avec &amp;lt;code&amp;gt;sudo raspi-config&amp;lt;/code&amp;gt;, et on peut ensuite l'utiliser en ligne de commande ou en python. Le site web [https://www.raspberrypi.org/documentation/usage/camera/README.md raspberrypi.org (en anglais)] explique cela très bien.&lt;br /&gt;
&lt;br /&gt;
On ajoute un deuxième bouton sur le breadboard, qui déclenche la prise d'une photo, et le prototype est maintenant fonctionnel. Les photos sont sauvegardées dans le répertoire courant du RPi, avec la date et l'heure pour nom de fichier.&lt;br /&gt;
&lt;br /&gt;
Au niveau du code, les parties utiles sont:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Fonction de prise d'une photo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def btn_take_picture(pin):&lt;br /&gt;
    # DEBUG&lt;br /&gt;
    logging.info(&amp;quot;Bouton CAM_PIN pressé, on prend un photo&amp;quot;)&lt;br /&gt;
    # Construction du chemin pour la photo&lt;br /&gt;
    now = datetime.datetime.now()&lt;br /&gt;
    pic_filename = &amp;quot;/home/qb/pic_&amp;quot; + str(now) + &amp;quot;.jpg&amp;quot;&lt;br /&gt;
    # Initialisation de la camera. On ne le fait pas dans initialize() pour éviter au maximum de la laisser&lt;br /&gt;
    # allumée (et consommer) en continu. En plus, une fois activée, les lectures sur le DHT sont beaucoup&lt;br /&gt;
    # plus souvent ratées.&lt;br /&gt;
    with PICAM.PiCamera() as cam:&lt;br /&gt;
        cam.capture(pic_filename)&lt;br /&gt;
        logging.debug(&amp;quot;Photos sauvée &amp;quot; + str(cam.resolution) + &amp;quot;  dans &amp;quot; + pic_filename)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pimp my screen ==&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est d'allumer ou éteindre l'écran, la bibliothèque CharLCD permet la modulation PWN du rétroéclairage. De quoi avoir un chouette effet de fondu au noir lorsque l'écran s'allume et s'éteint.&lt;br /&gt;
&lt;br /&gt;
Au niveau du code, la partie utile:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Module l'intensité du rétro éclairage de l'écran lcd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def lcd_dim_backlight(backlight_value, time_step):&lt;br /&gt;
    global lcd&lt;br /&gt;
    global lcd_backlight&lt;br /&gt;
    # calcule l'incrément à avoir entre lcd_backlight et backlight_value&lt;br /&gt;
    stp = (lcd_backlight &amp;gt; backlight_value) * -2 +1&lt;br /&gt;
    brightnesses = map(lambda x: x/10.0, range(int(lcd_backlight*10), int(backlight_value*10)+1, stp))&lt;br /&gt;
    for bright in brightnesses:&lt;br /&gt;
        lcd_backlight = bright&lt;br /&gt;
        logging.debug(&amp;quot;loop on bright= &amp;quot; + str(bright))&lt;br /&gt;
        lcd.set_backlight(bright)&lt;br /&gt;
        time.sleep(time_step)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Le code et le montage ==&lt;br /&gt;
&lt;br /&gt;
Le code source complet pour [https://gitlab.com/qberten/cellarkare/blob/master/mark3_camera/cellarkare_cam.py Mark 3 est disponible sur gitlab]. Pour ce qui est du montage, ben pas de schéma de raccordement disponible, j'ai oublié de le documenter en temps utile avant de passer à Mark 4! Donc il faudra attendre la suite...&lt;br /&gt;
&lt;br /&gt;
= Mark 4: We are (almost) done =&lt;br /&gt;
&lt;br /&gt;
== Pimp my screen, reloaded ==&lt;br /&gt;
Une dernière petite touche intéressante: l'appareil est destiné à être mis dans une cave à vin, endroit où il va faire noir la plupart du temps. En conséquence, l'écran LCD n'a pas vraiment besoin d'être allumé en permanence, pourquoi ne pas l'allumer automatiquement quand la lumière du local dépasse un certain seuil. Une photorésistance permet de réaliser rapidement la mesure d'une intensité lumineuse, pourquoi s'en priver... Oui mais... le RPi n'a pas d'entrée analogique, comment convertir simplement la mesure sur la photorésistance en une valeur analogique, alors que le RPi n'a que des entrées digitales.&lt;br /&gt;
&lt;br /&gt;
Après un peu de recherche, un montage simple à base d'une capacité dont le temps de charge sera directement proportionnel à la mesure sur la photo-résistance. Tout cela est expliqué ici (en anglais): [http://www.raspberrypi-spy.co.uk/2012/08/reading-analogue-sensors-with-one-gpio-pin/]&lt;br /&gt;
&lt;br /&gt;
(TODO - continuer la documentation)&lt;br /&gt;
&lt;br /&gt;
== Buttons, buttons, we want more ==&lt;br /&gt;
&lt;br /&gt;
Dernier petit détail, et non des moindre, Pour avoir un projet réellement fonctionnel, il va falloir travailler un peu l'interface homme-machine, et permettre un peu plus d'interaction avec le Rpi, pour par exemple permettre d'entrer le nombre de bouteilles couvertes par l'entrée ou la sortie photographiée, quitter/valider une action, ...&lt;br /&gt;
&lt;br /&gt;
(TODO - continuer la documentation)&lt;br /&gt;
&lt;br /&gt;
== we want leds ==&lt;br /&gt;
&lt;br /&gt;
Toujours dans l'optique d'améliorer l'interaction avec l'appareil, pourquoi ne pas intégrer une led de status sur l'appareil, pour indiquer visuellement différents états, comme par exemple: une température trop basse ou trop haute est enregistrée, il n'y a pas de connection réseau, ...&lt;br /&gt;
&lt;br /&gt;
(TODO - à implémenter tout court ;-)&lt;br /&gt;
&lt;br /&gt;
== all your data are belong to us ==&lt;br /&gt;
&lt;br /&gt;
Enfin, c'est bien beau d'afficher la température et l'humidité, c'est encore mieux de l'enregistrer quelque part pour pouvoir tracer l'historique, et intéragir plus facilement avec ces données.&lt;br /&gt;
&lt;br /&gt;
(TODO - à implémenter tout court ;-)&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Projets]]&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=CellarKare&amp;diff=2982</id>
		<title>CellarKare</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=CellarKare&amp;diff=2982"/>
		<updated>2015-10-28T21:06:17Z</updated>

		<summary type="html">&lt;p&gt;Quentin : /* Mark 1: Le matos et un premier proto Arduino */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Un projet lancé par --[[Utilisateur:Quentin|Quentin]] ([[Discussion utilisateur:Quentin|discussion]]) 14 juin 2015 à 19:58 (CEST)&lt;br /&gt;
&lt;br /&gt;
= En bref =&lt;br /&gt;
&lt;br /&gt;
Le projet est de créer une &amp;quot;station météo&amp;quot; pour une cave à vin, d'où le nom du projet un peu fumeux de CellarKare = Cellar + Care, le K c'est pour faire joli ;-)&lt;br /&gt;
Dans un premier temps, le but est d'afficher la température et le taux d'humidité (hygrométrie). Ça, c'est pour le but fonctionnel. Mes autres buts sont:&lt;br /&gt;
* Au niveau perso: réaliser un premier projet à forte composante électronique, dans la foulée de notre formation Arduino&lt;br /&gt;
* Utiliser un maximum toutes les techniques/machines du Makilab&lt;br /&gt;
* Documenter les différentes étapes (tutoriel), et fournir les fichiers sources nécessaires aux différentes étapes.&lt;br /&gt;
&lt;br /&gt;
= Mark (1): Le matos et un premier proto Arduino=&lt;br /&gt;
&lt;br /&gt;
Le premier prototype sera relativement simple: la station affichera la température et l'humidité ambiante sur un écran LCD, le tout piloté par un Arduino Uno.&lt;br /&gt;
&lt;br /&gt;
== T° et humidité: DHT22 / AM2303 ==&lt;br /&gt;
&lt;br /&gt;
Au niveau des capteurs, logiquement il en faut un pour lire la température, et un pour lire l'humidité. Les deux existent certainement séparément, mais une rapide recherche sur le net done des références de capteurs déjà calibrés et fournissant les deux pour pas trop cher. Au final, mon choix se porte sur un DHT22. Ce capteur s'appelle aussi AM2303 dans sa version câblée. Quelques liens et documentation utiles:&lt;br /&gt;
* [http://www.adafruit.com/datasheets/DHT22.pdf Les specs du DHT22 (anglais)];&lt;br /&gt;
* Pour acheter: [http://www.adafruit.com/products/385 ~10 $ chez AdaFruit] ou [http://shop.mchobby.be/senseurs/214-dht22-am2302-senseur-humidite-temperature--3232100002142.html ~17 € chez MCHobby], c'est un peu plus cher, mais ils sont belges et sympas;&lt;br /&gt;
* [http://playground.arduino.cc/Main/DHTLib Un tutoriel pour arduino sur Arduino.cc];&lt;br /&gt;
* [https://learn.adafruit.com/dht/using-a-dhtxx-sensor Un tutoriel pour arduino sur AdaFruit], et sa [http://mchobby.be/wiki/index.php?title=DHTxx version française];&lt;br /&gt;
&lt;br /&gt;
== L'affichage LCD: LCM1602 ==&lt;br /&gt;
&lt;br /&gt;
Pour l'affichage, le choix a été vite fait... J'ai pris ce que j'avais sous la main, soit le LCD fourni dans le starter kit arduino. Cet écran est très répandu, et fait partie de nombreux &amp;quot;kits de démarrage&amp;quot; en électronique. Au niveau fonctionnel, avec 2 lignes de 16 charactères, on devrait pouvoir s'en sortir pour afficher une température et un taux d'humidité ;-). Son contrôleur (hitachi HD44780) est lui aussi très répandu En vrac:&lt;br /&gt;
* [http://www.datasheetspdf.com/datasheet/LCM1602.html Les specs (chinois ou anglais)]&lt;br /&gt;
* Pour acheter: [http://www.ebay.com/sch/items/?_nkw=lcm1602&amp;amp;_sacat=&amp;amp;_ex_kw=&amp;amp;_mPrRngCbx=1&amp;amp;_udlo=&amp;amp;_udhi=&amp;amp;_sop=12&amp;amp;_fpos=&amp;amp;_fspt=1&amp;amp;_sadis=&amp;amp;LH_CAds=&amp;amp;rmvSB=true on en trouve plein sur ebay...]&lt;br /&gt;
* [http://www.arduino.cc/en/Tutorial/LiquidCrystal La librairie LiquidCrystal, qui permet de le contrôler sur Arduino]&lt;br /&gt;
&lt;br /&gt;
== Le montage ==&lt;br /&gt;
&lt;br /&gt;
Le montage est assez simple, et n'est finalement qu'une combinaison des différents tutoriel et exemple d'utilisation de l'écran et du capteur.&lt;br /&gt;
&lt;br /&gt;
Sur le schéma du capteur DHT, la résistance de 10K sert de [https://fr.wikipedia.org/wiki/R%C3%A9sistance_de_rappel &amp;quot;résistance pull-up&amp;quot;].&lt;br /&gt;
'''Cette résistance n'est pas nécessaire dans le cas du capteur AM2302''' (la version avec câble et boitier en plastique, comme sur la photo). Cette version [http://www.adafruit.com/product/393 intègre une résistance de 5.1K dans le boîtier], qui connecte déjà VCC et DATA, merci Patrick pour l'info ;-).&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Cellarkare mark1 bb.png|500px|thumb|left]]&lt;br /&gt;
[[Fichier:Cellarkare_mark1.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Le code ==&lt;br /&gt;
Au niveau programmation du micro-controlleur Arduino, là aussi c'est assez simple: toutes les 3 secondes, on lit les valeurs de t° et humidité, et on les affiches sur l'écran LCD. Les valeurs mesurées et des messages supplémentaires sont aussi envoyés sur la sortie série.&lt;br /&gt;
&lt;br /&gt;
Le code est aussi disponible (et éventuellement mis à jour) [https://gitlab.com/qberten/cellarkare/blob/master/mark1_arduino/cellarkare_arduino.ino sur gitlab]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
CellarKare - Mark #1&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Un projet de station de mesure de la température et l'humidité dans une cave à vin&lt;br /&gt;
Plus d'infos et schéma de montage sur http://wiki.makilab.org/index.php/CellarKare&lt;br /&gt;
Quentin Berten, 2015 - Domaine public, licence WTFPL v2, http://www.wtfpl.net/&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
// Bibliothèque LiquidCrystal, pour l'écran LCD. Installée de base avec l'IDE&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Bibliothèque DHT, pour le capteur de température. Installable directement depuis&lt;br /&gt;
// l'IDE, via Sketch -&amp;gt; Include LIbrary -&amp;gt; Manage Libraries -&amp;gt; DHT sensor Library &lt;br /&gt;
#include &amp;quot;DHT.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Définition l'écran LCD, en argument les pins d'interface, dans l'ordre&lt;br /&gt;
// (RS pin, LCD Enable, D4, D5, D6, D7)&lt;br /&gt;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);&lt;br /&gt;
&lt;br /&gt;
// Définition des pin et type pour le senseur de t° et humidité&lt;br /&gt;
#define DHTPIN 7         // senseur (fil data, en jaune), sur pin 7&lt;br /&gt;
#define DHTTYPE DHT22    // type DHT 22  (AM2302)&lt;br /&gt;
&lt;br /&gt;
// Définition du capteur DHT22, pour un Arduino &amp;quot;normal&amp;quot; à 16mhz, comme le Uno&lt;br /&gt;
DHT dht(DHTPIN, DHTTYPE);&lt;br /&gt;
// les variables associées qui vont lire les valeurs (température, ...)&lt;br /&gt;
float hum;&lt;br /&gt;
float tempC;&lt;br /&gt;
float tempF;&lt;br /&gt;
float indiceHum;&lt;br /&gt;
&lt;br /&gt;
// les variables qui permettent de gérer le temps,&lt;br /&gt;
// voir http://www.arduino.cc/en/pmwiki.php?n=Tutorial/BlinkWithoutDelay&lt;br /&gt;
long prevMillis = 0;           // enregistre le temps de la denière lecture DHT22&lt;br /&gt;
long dhtInterval = 3000;       // L'intervalle de lecture du DHT22: 3 secondes&lt;br /&gt;
&lt;br /&gt;
// la procédure d'initialisation arduino&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  // on ouvre une connection série (pour afficher un maxium d'info)&lt;br /&gt;
  Serial.begin(9600); &lt;br /&gt;
  Serial.println(&amp;quot;CellarKare Mark #1 Test&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // initialisation du capteur&lt;br /&gt;
  dht.begin();&lt;br /&gt;
  // initialisation de l'écran, 16 colonnes et 2 lignes&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// la boucle principale arduino&lt;br /&gt;
void loop() {&lt;br /&gt;
  unsigned long curMillis = millis();&lt;br /&gt;
  &lt;br /&gt;
  if(curMillis - prevMillis &amp;lt; dhtInterval) {&lt;br /&gt;
    goto end_loop;        // pas de lecture DHT, on va à la fin de la boucle loop()&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // on enregistre le dernier temps d'exécution de la lecture&lt;br /&gt;
  prevMillis = curMillis;   &lt;br /&gt;
  &lt;br /&gt;
  // la lecture de la t° et l'humidité prends environ 250 millisecondes&lt;br /&gt;
  // mais les lectures du capteur peuvent etre vieillies de 2 secondes&lt;br /&gt;
  // le capteur n'est pas rapide (d'où l'attente de 3 secondes pour etre&lt;br /&gt;
  // certain d'avoir des lectures correctes.&lt;br /&gt;
  // lecture de l'humidité&lt;br /&gt;
  hum = dht.readHumidity();&lt;br /&gt;
  // lecture de la température en degrés Celsius&lt;br /&gt;
  tempC = dht.readTemperature();&lt;br /&gt;
  // lecture de la température en degrés Fahreneit&lt;br /&gt;
  tempF = dht.readTemperature(true);&lt;br /&gt;
  &lt;br /&gt;
  // On vérifie que les lectures on bien été réalisées. Si pas, on quitte&lt;br /&gt;
  // la boucle pour ré-essayer&lt;br /&gt;
  if (isnan(hum) || isnan(tempC) || isnan(tempF)) {&lt;br /&gt;
    Serial.println(&amp;quot;Lecture sur le capteur DHT ratée&amp;quot;);&lt;br /&gt;
    goto end_loop;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Calcul de l'indice de chaleur (voir https://fr.wikipedia.org/wiki/Indice_de_chaleur )&lt;br /&gt;
  // La température doit etre fournie en degré Fahreneit&lt;br /&gt;
  indiceHum = dht.computeHeatIndex(tempF, hum);&lt;br /&gt;
&lt;br /&gt;
  // On affiche les valeurs sur la console série (n'est pas indispensable)&lt;br /&gt;
  Serial.print(&amp;quot;Humidite: &amp;quot;); &lt;br /&gt;
  Serial.print(hum);&lt;br /&gt;
  Serial.print(&amp;quot; %\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temperature: &amp;quot;); &lt;br /&gt;
  Serial.print(tempC);&lt;br /&gt;
  Serial.print(&amp;quot; *C &amp;quot;);&lt;br /&gt;
  Serial.print(tempF);&lt;br /&gt;
  Serial.print(&amp;quot; *F\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Indice de chaleur: &amp;quot;);&lt;br /&gt;
  Serial.print(indiceHum);&lt;br /&gt;
  Serial.println(&amp;quot; *F&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  // On affiche les valeurs sur l'écran LCD, curseur à (0,0)&lt;br /&gt;
  lcd.setCursor(0, 0);&lt;br /&gt;
  // print Temp in C°&lt;br /&gt;
  lcd.print(&amp;quot;deg C: &amp;quot;);&lt;br /&gt;
  lcd.print(tempC);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;hum %: &amp;quot;);&lt;br /&gt;
  lcd.print(hum);&lt;br /&gt;
&lt;br /&gt;
  // label pour goto&lt;br /&gt;
  end_loop:&lt;br /&gt;
  ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== La conclusion ==&lt;br /&gt;
Un premier prototype fonctionnel, qui a au moins le mérite de vérifier que le capteur DHT renvoie des valeurs réalistes.&lt;br /&gt;
La suite: la même chose avec un Raspberry pi, pour bénéficier de sa faciliter à se connecter au réseau. Ce serait quand même cool de pouvoir lire ces valeurs sur un smartphone ;-)&lt;br /&gt;
&lt;br /&gt;
= Mark 2: la même chose avec un Raspberry Pi =&lt;br /&gt;
Le but de cette nouvelle itération: réaliser un montage équivalent avec un [https://www.raspberrypi.org/ Raspberry Pi] (RPi en abrégé). Pourquoi un RPi ?&lt;br /&gt;
* Parce que j'en avais un sous la main ;-)&lt;br /&gt;
* Parce qu'il permet de se connecter rapidement et facilement à un réseau, via ethernet (câble) ou wifi (via un dongle usb)&lt;br /&gt;
* Parce qu'il permet de brancher facilement un module caméra (on y viendra au Mark 3)&lt;br /&gt;
&lt;br /&gt;
Il est certainement possible d'arriver au même résultat avec d'autres cartes (comme par exemple un [http://www.arduino.cc/en/Main/ArduinoBoardYun Arduino Yun]), c'est juste que c'est un RPi que j'avais sous la main... Dans mon cas un Raspberry Pi B+.&lt;br /&gt;
&lt;br /&gt;
En ce qui concerne le RPi, quelques ressources très utiles:&lt;br /&gt;
* [http://mchobby.be/wiki/index.php?title=RaspberryPi-Accueil#Tutoriels Les tutoriels réalisés/traduits par MC Hobby. Une mine d'or]&lt;br /&gt;
* [http://www.elektronique.fr/montages/raspberry-pi/ Des exemples de montages et réalisations électroniques avec RPi]&lt;br /&gt;
* [http://pi.gadgetoid.com/pinout La configuration des différentes PIN du RPi]&lt;br /&gt;
&lt;br /&gt;
== L'installation de l'OS ==&lt;br /&gt;
La principale différence entre une carte Arduino et le RPi, c'est le cœur de la carte:&lt;br /&gt;
* le cœur de l'Arduino est un microcontrôleur, qui va exécuter le programme qu'on lui injecte de manière bête et méchante. Chaque entrée/sortie va devoir être programmée directement, il n'y a pas de système de driver, ...&lt;br /&gt;
* le cœur du RPi est un microprocesseur (ARM, la même technologie que dans les smartphones). Il s'agit donc en fait d'un véritable &amp;quot;petit ordinateur&amp;quot;, avec un système d'exploitation, des drivers (pour l'usb, l'écran, le wifi, ...).&lt;br /&gt;
&lt;br /&gt;
Donc avant de pouvoir démarrer et utiliser le RPi, il va falloir installer un système d'exploitation (OS: Operating System). C'est exactement la même chose qu'installer Windows sur un PC, c'est juste que dans notre cas, ce ne sera pas Windows mais un système Linux. Il en existe [https://www.raspberrypi.org/downloads/ plusieurs], le standard de facto étant Raspbian (une distribution Debian adaptée pour le RPi), c'est celle-là [http://raspbian-france.fr/installer-raspbian-premier-demarrage-configuration/ que j'ai installée].&lt;br /&gt;
&lt;br /&gt;
Petit truc pour les distraits: écran/clavier/souris ne sont pas indispensables pour l'installation, il est tout à fait possible de se connecter via [https://fr.wikipedia.org/wiki/Secure_Shell SSH] au RPi une fois son premier démarrage exécuté, pour autant qu'il soit raccordé à votre réseau (via son câble ethernet). Le RPi se déclare automatiquement sur le réseau avec le nom raspberry.local, et un &amp;lt;code&amp;gt;ssh pi@raspberry.local&amp;lt;/code&amp;gt; à fait l'affaire (raspberry, c'est son &amp;quot;hostname&amp;quot; par défaut). Pour le mot de passe, c'est &amp;lt;code&amp;gt;raspberry&amp;lt;/code&amp;gt; par défaut. Ensuite &amp;lt;code&amp;gt;raspi-config&amp;lt;/code&amp;gt; permet de terminer la procédure d'installation.&lt;br /&gt;
&lt;br /&gt;
En ce qui me concerne, tout le reste de la configuration se fera donc en [https://fr.wikipedia.org/wiki/Shell_Unix ligne de commande (shell)] via SSH. [http://mchobby.be/wiki/index.php?title=PI-SSH Le wiki de MCHobby] détaille l'accès via SSH au RPi.&lt;br /&gt;
&lt;br /&gt;
'''Un dernier point important''': le RPi, c'est comme un &amp;quot;vrai&amp;quot; ordinateur... il vaut mieux l'éteindre proprement plutôt que le débrancher sauvagement. Donc on s'arrange pour faire un &amp;lt;code&amp;gt;sudo poweroff&amp;lt;/code&amp;gt; en ligne de commande avant de le débrancher. Le gros risque: corrompre le système de fichier sur le carte SD, ce qui empêche le démarrage suivant, et impose un reformatage et une réinstallation complète. Pas drôle en somme, je parle d'expérience :-(&lt;br /&gt;
&lt;br /&gt;
== Le wifi ==&lt;br /&gt;
Bien que le RPi ne soit pas équipé par défaut du wifi, il est compatible avec la majorité des clefs usb wifi. Dans mon cas, une vieille clef Hercules HWGUSB2-54. Un petit tour par les log (&amp;lt;code&amp;gt;sudo tail -f /var/log/syslog&amp;lt;/code&amp;gt;) pour vérifier qu'elle est reconnue correctement lors du branchement, et puis une configuration via l'édition de &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt; pour entrer les références du réseau wifi:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
auto wlan0&lt;br /&gt;
allow-hotplug wlan0&lt;br /&gt;
iface wlan0 inet dhcp&lt;br /&gt;
wpa-ssid &amp;quot;Le_nom_(SSID)_de_votre_wifi&amp;quot;&lt;br /&gt;
wpa-psk &amp;quot;Le_mot_de_passe_de_votre_wifi&amp;quot;&lt;br /&gt;
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Ensuite un redémmarrage de la carte avec &amp;lt;code&amp;gt;$ sudo ifdown wlan0&amp;lt;/code&amp;gt; suivi de &amp;lt;code&amp;gt;sudo ifup wlan0&amp;lt;/code&amp;gt; et ça devrait être OK. On peut maintenant se passer de câble ethernet!&lt;br /&gt;
&lt;br /&gt;
Si nécessaire: plus de détails sur la configuration réseau sur [http://mchobby.be/wiki/index.php?title=Rasp-Config-Reseau le wiki MC Hobby]&lt;br /&gt;
&lt;br /&gt;
== La température avec le DHT22 / AM2302 ==&lt;br /&gt;
Pour la lecture des température avec le capteur, les gars d'Adafruit ont déjà développé un bibliothèque de fonctions utilisables en ligne de commande ou en [https://fr.wikipedia.org/wiki/Python_%28langage%29 python]. Quelques ressources:&lt;br /&gt;
* [https://learn.adafruit.com/dht-humidity-sensing-on-raspberry-pi-with-gdocs-logging/overview La page d'Adafruit (en anglais) sur l'utilisation du DHT22 avec le RPi]&lt;br /&gt;
* [http://www.manuel-esteban.com/lire-une-sonde-dht22-avec-un-raspberry-pi/ Une ressource en français (un peu datée) sur l'utilisation DHT22 + RPi.]&lt;br /&gt;
* [http://pi.gadgetoid.com/pinout La table de référence des 40 pins GPIO du RPi]&lt;br /&gt;
Pour ma part, j'ai suivi la méthode Adafruit, ce qui donne en résumé, en ligne de commande:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
cd /home/pi&lt;br /&gt;
git clone https://github.com/adafruit/Adafruit_Python_DHT.git &lt;br /&gt;
cd Adafruit_Python_DHT&lt;br /&gt;
sudo apt-get install build-essential python-dev  &lt;br /&gt;
sudo python setup.py install&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Au niveau du montage, rien de nouveau: le capteur doit toujours être alimenté en 3.3V ou en 5V, et le câble de lecture à une pin d'entrée/sortie (GPIO: General Purpose Input Output), ce qui donne:&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Cellarkare mark2 bb.png|400px|thumb|left]]&lt;br /&gt;
[[Fichier:Cellarkare_mark2.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Un test en ligne de commande permet de vérifier qu'on a une lecture sur le capteur (dans mon cas un AM2302 raccordé sur la pin GPIO 4):&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
cd /home/pi/Adafruit_Python_DHT/examples/&lt;br /&gt;
sudo ./AdafruitDHT.py 2302 4&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Ce qui affiche &amp;lt;code&amp;gt;Temp=23.0*C  Humidity=53.8%&amp;lt;/code&amp;gt;, des valeurs censées pour une après-midi d'été ;-)&lt;br /&gt;
&lt;br /&gt;
== L'affichage LCD ==&lt;br /&gt;
L'écran LCD est toujours le même que pour la version &amp;quot;Mark 1&amp;quot; Arduino. Quelques resources:&lt;br /&gt;
* [https://learn.adafruit.com/drive-a-16x2-lcd-directly-with-a-raspberry-pi Un tutoriel (en anglais) sur Adafruit] ''Attention, le code source n'est plus tellement a jour, voir le dernier lien Github.''&lt;br /&gt;
* [http://mchobby.be/wiki/index.php?title=Rasp-Hack-Afficheur-LCD La version française, traduite par MC Hobby]&lt;br /&gt;
* [https://github.com/adafruit/Adafruit_Python_CharLCD Le code source de la librairie Adafruit pour le gestion du LCD sur GitHub] ''contient la dernière version de la librairie''.&lt;br /&gt;
&lt;br /&gt;
La logique de raccordement est strictement identique au circuit du Mark 1. La seule différence est que la résistance variable de 10K dans le circuit est supprimée, la bibliothèque Adafruit pour le LCD permettant le pilotage en [https://fr.wikipedia.org/wiki/Modulation_de_largeur_d%27impulsion modulation PWM].&lt;br /&gt;
&lt;br /&gt;
== Le montage ==&lt;br /&gt;
Au final, le montage a été fait pour gagner un maximum de place sur mon breadboard. La pin data du DHT a été déplacée sur la pin 5, et le reste des pin pour le LCD sont documentées dans le code.&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Cellarkare mark2_2 bb.png|500px|thumb|left]]&lt;br /&gt;
[[Fichier:Cellarkare_mark2_2.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Le code ==&lt;br /&gt;
&lt;br /&gt;
La logique du code est identique à la version mark 1 - arduino. Ce code est aussi disponible (et éventuellement mis à jour) [https://gitlab.com/qberten/cellarkare/blob/master/mark2_rpi/cellarkare_rpi.py sur gitlab]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
# coding=utf8&lt;br /&gt;
# CellarKare - Mark 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
# Un projet de station de mesure de la température et l'humidité dans une cave à vin&lt;br /&gt;
# Plus d'infos et schéma de montage sur http://wiki.makilab.org/index.php/CellarKare&lt;br /&gt;
# Quentin Berten, 2015 - Domaine public, licence WTFPL v2, http://www.wtfpl.net/&lt;br /&gt;
# quentin_#AT#_berten.me&lt;br /&gt;
&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
# Bibliothèque CharLCD d'Adafruit, voir https://github.com/adafruit/Adafruit_Python_CharLCD&lt;br /&gt;
# pour l'installation&lt;br /&gt;
import Adafruit_CharLCD as LCD&lt;br /&gt;
# Bibliothèque DHT d'AdaFruit, voir https://github.com/adafruit/Adafruit_Python_DHT&lt;br /&gt;
# pour l'installation&lt;br /&gt;
import Adafruit_DHT as DHT&lt;br /&gt;
&lt;br /&gt;
# Configuration de l'affichage LCD&lt;br /&gt;
lcd_rs        = 25      # RS sur pin 25&lt;br /&gt;
lcd_en        = 24      # EN sur pin 24&lt;br /&gt;
lcd_d4        = 23      # D4 sur pin 23&lt;br /&gt;
lcd_d5        = 12      # D5 sur pin 12&lt;br /&gt;
lcd_d6        = 20      # D6 sur pin 20&lt;br /&gt;
lcd_d7        = 16      # D7 sur pin 16&lt;br /&gt;
lcd_backlight = 18      # rétro éclairage sur pin 18&lt;br /&gt;
lcd_columns   = 16      # Affichage à 16 colonnes ...&lt;br /&gt;
# Initialisation du LCD avec les variables ci-dessus&lt;br /&gt;
lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, &lt;br /&gt;
		        	lcd_columns, lcd_rows, lcd_backlight)&lt;br /&gt;
# Configuration pour le capteur DHT, soit DHT11, DHT22 ou AM2302.&lt;br /&gt;
dht_sensor    = DHT.AM2302  # Type AM2302&lt;br /&gt;
dht_pin       = 5           # DHT data sur pin 5&lt;br /&gt;
&lt;br /&gt;
# les variables qui permettent de gérer le temps,&lt;br /&gt;
prevMillis = 0          # enregistre le temps de la denière lecture DHT22&lt;br /&gt;
secInterval = 1000      # Un intervalle d'une seconde&lt;br /&gt;
# L'intervalle de lecture du DHT22: 3 secondes, doit etre plus grand que secInterval&lt;br /&gt;
dhtInterval = 3000&lt;br /&gt;
&lt;br /&gt;
def read_and_print_dht():&lt;br /&gt;
    # On lit une valeur sur le senseur avec la fonction read. Attention, cette fonction&lt;br /&gt;
    # ne réessaie pas automatiquement en cas d'erreur, mais fournit les valeurs (None, None).&lt;br /&gt;
    hum, tempC  = DHT.read(dht_sensor, dht_pin)&lt;br /&gt;
&lt;br /&gt;
    # On vérifie que l'on a bien eu une lecture (Linux n'est pas un OS temps réel et ne&lt;br /&gt;
    # peut pas garantir le timing des lectures sur le capteur). Si ça arrive, on réessaie.&lt;br /&gt;
    # On affiche les valeurs sur la console (n'est pas indispensable)&lt;br /&gt;
    if hum is not None and tempC is not None:&lt;br /&gt;
    	print 'Temp={0:0.2f}*C  Humidity={1:0.2f}%'.format(tempC, hum)&lt;br /&gt;
        # On affiche les valeurs sur l'écran LCD&lt;br /&gt;
        lcd.clear()&lt;br /&gt;
        lcd.message('deg C: {0:0.2f}\nhum %: {1:0.2f}'.format(tempC, hum))&lt;br /&gt;
    else:&lt;br /&gt;
	print 'Lecture sur le capteur DHT ratée'&lt;br /&gt;
&lt;br /&gt;
# Boucle principale, l'équivalent de void loop() sur Arduino&lt;br /&gt;
while 1:&lt;br /&gt;
    # On lit le nombre de millisecondes courant&lt;br /&gt;
    curMillis = time.time()*1000&lt;br /&gt;
    if curMillis - prevMillis &amp;gt; dhtInterval:&lt;br /&gt;
        # On essaie de lire et afficher les valeurs du DHT&lt;br /&gt;
        read_and_print_dht()&lt;br /&gt;
        # on enregistre le dernier temps d'exécution de la lecture&lt;br /&gt;
        prevMillis = curMillis&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== La conclusion ==&lt;br /&gt;
En vrac:&lt;br /&gt;
* Pas de gros problème ou obstacles majeurs pour convertir le montage et le code Arduino en son équivalent RPi. Mais heureusement que l'équipe d'Adafruit a déjà programmé les bibliothèques Python qui vont bien!&lt;br /&gt;
* Au niveau du breadboard, ça commence à prendre de la place... Une solution: passer en [https://fr.wikipedia.org/wiki/I2C &amp;quot;I2C&amp;quot;] pour le capteur et le LCD, ce qui limite drastiquement le nombre de pins nécessaires pour le montage, et facilite la programmation. Merci Patrick pour les infos, ce sera sûrement utile pour le prochain montage ;-) !&lt;br /&gt;
** Par exemple, pour la température: un capteur I2C comme le [https://www.adafruit.com/products/1638 SHT15], et pour l'écran, [http://www.electrodragon.com/w/index.php?title=1602_LCD_I2C/SPI_Module la version I2C du même 1602].&lt;br /&gt;
** Par contre dans ce cas, il faut faire gaffe au fait que le passage en 3.3V pour la logique du RPi, le lcd reste en 5V et il faudra ajouter un [http://www.adafruit.com/products/757 convertisseurs de niveau] pour le bus si utilisé avec un capteur qui ne supporte pas 5V.&lt;br /&gt;
* le langage Python, c'est pas plus compliqué que le simili-C de l'Arduino une fois qu'on est rentré dedans.&lt;br /&gt;
&lt;br /&gt;
= Mark 3: Start, Stop, and say Cheese =&lt;br /&gt;
&lt;br /&gt;
== Sart/Stop ==&lt;br /&gt;
Un &amp;quot;problème&amp;quot; du RPi, c'est qu'il n'a pas de bouton ON/OFF simple, et par conséquent, l'éteindre proprement avec &amp;lt;code&amp;gt;sudo halt&amp;lt;/code&amp;gt; ou  &amp;lt;code&amp;gt;sudo poweroff&amp;lt;/code&amp;gt; est impossible sans un accès physique (clavier et écran connectés) ou une connection SSH (connection à distance). Pas pratique pour un boitier qui sera installé dans une cave à vin...&lt;br /&gt;
&lt;br /&gt;
Autrement dit, mes besoins:&lt;br /&gt;
# Le programme python d'affichage et monitoring des températures démarre automatiquement lorsque le RPi démarre.&lt;br /&gt;
# Un bouton OFF permet d'éteindre proprement le RPi avant de le débrancher de son alimentation.&lt;br /&gt;
# Un bouton ON permet de l'allumer une fois éteint sans débrancher/rebrancher son alimentation.&lt;br /&gt;
# Nec plus ultra: avoir un fonctionnement similaire à un bouton ON/OFF d'un laptop par exemple: si éteint, le bouton allume, si allumé, le bouton éteint proprement le RPi, et coupe l'alimentation USB.&lt;br /&gt;
&lt;br /&gt;
Bon après quelques recherches sur le net:&lt;br /&gt;
# C'est simple, il suffit de configurer le &amp;quot;init script&amp;quot; du RPi pour lancer automatiquement le programme python au démarrage&lt;br /&gt;
# Un montage simple permet d'écouter sur une des pins du GPIO, et de lancer la procédure propre d'arrêt (shutdown). Soit un bouton OFF&lt;br /&gt;
# Le RPi (à partir du modèle B rev2, soit Brev2, B+ et 2) possède un pinout &amp;quot;reset&amp;quot;, qui n'est pas soudé de base sur la carte. Si on raccorde ces deux pins, le RPi redémarre électriquement (hard reboot). Donc sans s'éteindre proprement. L'intérêt, c'est que si le RPi est éteint mais encore sous tension, ce bouton permet de le ré-allumer. Donc un bouton ON/RESET. Voir par exemple:&lt;br /&gt;
#* Un article assez complet en anglais sur [http://www.makeuseof.com/tag/add-reset-switch-raspberry-pi/ MakeUseOf.com]&lt;br /&gt;
# Le bouton combiné ON/OFF unique est possible, mais le montage est plus compliqué. Quelques exemples:&lt;br /&gt;
#* Un montage en français sur le site [http://forum.madeinfr.org/topic/43/raspower/ MadeInFR.org].&lt;br /&gt;
#* Un montage en anglais à base de micro contrôleur (pas simple donc) sur [http://www.instructables.com/id/Raspberry-Pi-Shutdown-Button/ Instructables]&lt;br /&gt;
#* Un article très complet en anglais reprenant toutes les options, dont un montage assez simple de bouton unique [http://www.raspberry-pi-geek.com/Archive/2013/01/Adding-an-On-Off-switch-to-your-Raspberry-Pi sur raspberry-pi-geek.com]&lt;br /&gt;
#* Des solutions commerciales toutes faites comme [https://www.pi-supply.com/product/pi-supply-raspberry-pi-power-switch/ PiSupply] ou [http://www.mausberrycircuits.com/collections/frontpage MausberryCircuits]&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, ce sera pour moi le choix suivant: un bouton OFF, qui lors d'un appui long éteint proprement le RPi. En gros la solution 2.&lt;br /&gt;
&lt;br /&gt;
Mais dans un premier temps, il faut configurer le RPi pour lancer le programme au démarrage...&lt;br /&gt;
&lt;br /&gt;
== Lancement du programme via initscript ==&lt;br /&gt;
&lt;br /&gt;
Il y a certainement 36 façons d'arriver au même résultat (après tout, le RPi tourne sous Linux ;-), mais dans mon cas, la solution qui me convient bien: un script d'init lance par défaut le script python localisé en &amp;lt;code&amp;gt;/usr/local/bin/pystartup.py&amp;lt;/code&amp;gt;. L'intérêt de la chose: &amp;lt;code&amp;gt;pystartup.py&amp;lt;/code&amp;gt; peut être un lien symbolique vers n'importe quel autre script.&lt;br /&gt;
&lt;br /&gt;
Pour éviter d'encombrer le wiki, je n'ai pas repris le script ici, mais il est dispo sur [https://gitlab.com/qberten/cellarkare/blob/master/mark3_camera/initscript_pystartup GitLab]. Pour l'installation, en ligne de commande (connecté sur le RPi):&lt;br /&gt;
&lt;br /&gt;
On télécharge le script, on le déplace au bon endroit et on le rend exécutable&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
wget https://gitlab.com/qberten/cellarkare/raw/master/mark3_camera/initscript_pystartup&lt;br /&gt;
sudo mv initscript_pystartup /etc/init.d/pystartup&lt;br /&gt;
sudo chmod a+x /etc/init.d/pystartup&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
On crée le lien symbolique qui va bien (remplacer /chemin/vers/... par la localisation du programme à lancer)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
ln -s /chemin/vers/votre/script/python.py /usr/local/bin/pystartup.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
On configure le système pour qu'il connaisse le nouveau script &amp;quot;pystartup&amp;quot;, et on lui demande de l'exécuter à chaque démarrage&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo update-rc.d pystartup defaults&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Il est ensuite possible de lancer son programme en arrière plan comme n'importe quel autre service avec &amp;lt;code&amp;gt;sudo service pystartup start&amp;lt;/code&amp;gt;, de l'arrêter avec &amp;lt;code&amp;gt;sudo service pystartup stop&amp;lt;/code&amp;gt;, etc&lt;br /&gt;
&lt;br /&gt;
== Pinout RESET ==&lt;br /&gt;
&lt;br /&gt;
Activer le &amp;quot;hard&amp;quot; reset sur le Rpi suppose un peu de soudure, mais rien de bien effrayant, 2 points suffisent. Un fois les connecteur pinout soudés, quand on raccorde les deux pins (par exemple avec un interrupteur), le RPi redémarre (&amp;quot;hard&amp;quot; reset, donc attention à la carte SD...), ou s'allume (si il était raccordé au secteur).&lt;br /&gt;
&lt;br /&gt;
J'ai soudé les 2 pins et testé la fonction, mais comme il s'agit d'un redémarrage &amp;quot;hard&amp;quot;, je n'ai finalement pas vraiment vu l'utilité dans ce projet: autant directement débrancher / rebrancher le câble d'alimentation dans ce cas.&lt;br /&gt;
&lt;br /&gt;
Mais à toutes fins utiles, les photos de l'opération, avant/après.&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Rpi_reset_before.jpg|500px|thumb|left]]&lt;br /&gt;
[[Fichier:Rpi_reset_after.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bouton OFF ==&lt;br /&gt;
&lt;br /&gt;
Rien de très compliqué: on raccorde le bouton à une entrée, on configure la résistance pull-up/down interne du Rpi, on s'assure de récupérer les évènements dans le code.&lt;br /&gt;
&lt;br /&gt;
Les parties utiles du code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# La fonction qui effectuer l'arrêt propre du RPi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def btn_proper_halt(pin):&lt;br /&gt;
    global off_state, cur_millis, off_millis&lt;br /&gt;
    # On lit le nombre de millisecondes courant&lt;br /&gt;
    cur_millis = time.time()*1000&lt;br /&gt;
    # Utilise la variable globale off_state&lt;br /&gt;
    off_state = not off_state&lt;br /&gt;
    # DEBUG&lt;br /&gt;
    logging.debug(&amp;quot;Bouton OFF_PIN pressé, son état est maintenant %s&amp;quot; % str(off_state))&lt;br /&gt;
    if off_state == True:&lt;br /&gt;
        off_millis = cur_millis   &lt;br /&gt;
    elif off_state == False: &lt;br /&gt;
        # DEBUG&lt;br /&gt;
        logging.debug(&amp;quot;Bouton OFF_PIN pressé pendant {0:0.0f} ms&amp;quot;.format(cur_millis - off_millis))&lt;br /&gt;
        if (cur_millis - off_millis) &amp;gt; OFF_INTERVAL:&lt;br /&gt;
            # On a relâché le bouton avec un écart long =&amp;gt; shutdown&lt;br /&gt;
            logging.debug(&amp;quot;Appui long sur le bouton OFF_PIN&amp;quot;)&lt;br /&gt;
            logging.info(&amp;quot;Arrêt du Raspberry PI, attendre encore 10 sec avant de débrancher&amp;quot;)&lt;br /&gt;
            subprocess.call('halt', shell=False)&lt;br /&gt;
        else:&lt;br /&gt;
            # Appuis court =&amp;gt; on ne fait rien&lt;br /&gt;
            logging.debug(&amp;quot;Appui court sur le bouton OFF_PIN&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Fonction de terminaison du programme (appelée lorsque le script est arrêté&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def terminate():&lt;br /&gt;
    logging.debug(&amp;quot;Terminate function started&amp;quot;)&lt;br /&gt;
    # efface l'écran LCD&lt;br /&gt;
    lcd_dim_backlight(0.0, 0.2)&lt;br /&gt;
    lcd.clear()&lt;br /&gt;
    logging.debug(&amp;quot;Terminate function ended&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Fonction d'initialisation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def initialize():&lt;br /&gt;
    global lcd&lt;br /&gt;
    logging.debug(&amp;quot;Initialize function started&amp;quot;)&lt;br /&gt;
    # Initialisation du LCD avec les variables ci-dessus&lt;br /&gt;
    lcd = LCD.Adafruit_CharLCD(LCD_RS, LCD_EN, LCD_D4, LCD_D5, LCD_D6, LCD_D7, &lt;br /&gt;
		        	LCD_COLUMNS, LCD_ROWS,&lt;br /&gt;
                                LCD_BACKLIGHT, invert_polarity = False, enable_pwm = True,&lt;br /&gt;
                                initial_backlight = lcd_backlight)&lt;br /&gt;
    # Initialisation des autres GPIO's&lt;br /&gt;
    GPIO.setmode(GPIO.BCM)        # On utilise la numérotation BCM pour les PIN&lt;br /&gt;
    # On définit la pin OFF_PIN comme entrée, et on active la résistance pull-down interne du RPi&lt;br /&gt;
    GPIO.setup(OFF_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)&lt;br /&gt;
    # Configure une interruption qui va détecter les mouvements up et down sur le bouton&lt;br /&gt;
    GPIO.add_event_detect(OFF_PIN, GPIO.BOTH, callback=btn_proper_halt, bouncetime=20)&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Say &amp;quot;cheese&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Cette partie du projet s'attache à pouvoir prendre rapidement et facilement un photos des étiquettes des bouteilles entrées ou sorties de la cave. Ben oui, j'ai pas forcément une bonne mémoire, et se donner les moyens d'enregistrer facilement et rapidement l'info est le meilleur moyen de suivre son stock ;-)&lt;br /&gt;
&lt;br /&gt;
Cette partie est super simple à réaliser avec le rpi: on raccorde la caméra, on s'assure qu'elle est activée avec &amp;lt;code&amp;gt;sudo raspi-config&amp;lt;/code&amp;gt;, et on peut ensuite l'utiliser en ligne de commande ou en python. Le site web [https://www.raspberrypi.org/documentation/usage/camera/README.md raspberrypi.org (en anglais)] explique cela très bien.&lt;br /&gt;
&lt;br /&gt;
On ajoute un deuxième bouton sur le breadboard, qui déclenche la prise d'une photo, et le prototype est maintenant fonctionnel. Les photos sont sauvegardées dans le répertoire courant du RPi, avec la date et l'heure pour nom de fichier.&lt;br /&gt;
&lt;br /&gt;
Au niveau du code, les parties utiles sont:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Fonction de prise d'une photo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def btn_take_picture(pin):&lt;br /&gt;
    # DEBUG&lt;br /&gt;
    logging.info(&amp;quot;Bouton CAM_PIN pressé, on prend un photo&amp;quot;)&lt;br /&gt;
    # Construction du chemin pour la photo&lt;br /&gt;
    now = datetime.datetime.now()&lt;br /&gt;
    pic_filename = &amp;quot;/home/qb/pic_&amp;quot; + str(now) + &amp;quot;.jpg&amp;quot;&lt;br /&gt;
    # Initialisation de la camera. On ne le fait pas dans initialize() pour éviter au maximum de la laisser&lt;br /&gt;
    # allumée (et consommer) en continu. En plus, une fois activée, les lectures sur le DHT sont beaucoup&lt;br /&gt;
    # plus souvent ratées.&lt;br /&gt;
    with PICAM.PiCamera() as cam:&lt;br /&gt;
        cam.capture(pic_filename)&lt;br /&gt;
        logging.debug(&amp;quot;Photos sauvée &amp;quot; + str(cam.resolution) + &amp;quot;  dans &amp;quot; + pic_filename)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pimp my screen ==&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est d'allumer ou éteindre l'écran, la bibliothèque CharLCD permet la modulation PWN du rétroéclairage. De quoi avoir un chouette effet de fondu au noir lorsque l'écran s'allume et s'éteint.&lt;br /&gt;
&lt;br /&gt;
Au niveau du code, la partie utile:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Module l'intensité du rétro éclairage de l'écran lcd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def lcd_dim_backlight(backlight_value, time_step):&lt;br /&gt;
    global lcd&lt;br /&gt;
    global lcd_backlight&lt;br /&gt;
    # calcule l'incrément à avoir entre lcd_backlight et backlight_value&lt;br /&gt;
    stp = (lcd_backlight &amp;gt; backlight_value) * -2 +1&lt;br /&gt;
    brightnesses = map(lambda x: x/10.0, range(int(lcd_backlight*10), int(backlight_value*10)+1, stp))&lt;br /&gt;
    for bright in brightnesses:&lt;br /&gt;
        lcd_backlight = bright&lt;br /&gt;
        logging.debug(&amp;quot;loop on bright= &amp;quot; + str(bright))&lt;br /&gt;
        lcd.set_backlight(bright)&lt;br /&gt;
        time.sleep(time_step)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Le code et le montage ==&lt;br /&gt;
&lt;br /&gt;
Le code source complet pour [https://gitlab.com/qberten/cellarkare/blob/master/mark3_camera/cellarkare_cam.py Mark 3 est disponible sur gitlab]. Pour ce qui est du montage, ben pas de schéma de raccordement disponible, j'ai oublié de le documenter en temps utile avant de passer à Mark 4! Donc il faudra attendre la suite...&lt;br /&gt;
&lt;br /&gt;
= Mark 4: We are (almost) done =&lt;br /&gt;
&lt;br /&gt;
== Pimp my screen, reloaded ==&lt;br /&gt;
Une dernière petite touche intéressante: l'appareil est destiné à être mis dans une cave à vin, endroit où il va faire noir la plupart du temps. En conséquence, l'écran LCD n'a pas vraiment besoin d'être allumé en permanence, pourquoi ne pas l'allumer automatiquement quand la lumière du local dépasse un certain seuil. Une photorésistance permet de réaliser rapidement la mesure d'une intensité lumineuse, pourquoi s'en priver... Oui mais... le RPi n'a pas d'entrée analogique, comment convertir simplement la mesure sur la photorésistance en une valeur analogique, alors que le RPi n'a que des entrées digitales.&lt;br /&gt;
&lt;br /&gt;
Après un peu de recherche, un montage simple à base d'une capacité dont le temps de charge sera directement proportionnel à la mesure sur la photo-résistance. Tout cela est expliqué ici (en anglais): [http://www.raspberrypi-spy.co.uk/2012/08/reading-analogue-sensors-with-one-gpio-pin/]&lt;br /&gt;
&lt;br /&gt;
(TODO - continuer la documentation)&lt;br /&gt;
&lt;br /&gt;
== Buttons, buttons, we want more ==&lt;br /&gt;
&lt;br /&gt;
Dernier petit détail, et non des moindre, Pour avoir un projet réellement fonctionnel, il va falloir travailler un peu l'interface homme-machine, et permettre un peu plus d'interaction avec le Rpi, pour par exemple permettre d'entrer le nombre de bouteilles couvertes par l'entrée ou la sortie photographiée, quitter/valider une action, ...&lt;br /&gt;
&lt;br /&gt;
(TODO - continuer la documentation)&lt;br /&gt;
&lt;br /&gt;
== we want leds ==&lt;br /&gt;
&lt;br /&gt;
Toujours dans l'optique d'améliorer l'interaction avec l'appareil, pourquoi ne pas intégrer une led de status sur l'appareil, pour indiquer visuellement différents états, comme par exemple: une température trop basse ou trop haute est enregistrée, il n'y a pas de connection réseau, ...&lt;br /&gt;
&lt;br /&gt;
(TODO - à implémenter tout court ;-)&lt;br /&gt;
&lt;br /&gt;
== all your data are belong to us ==&lt;br /&gt;
&lt;br /&gt;
Enfin, c'est bien beau d'afficher la température et l'humidité, c'est encore mieux de l'enregistrer quelque part pour pouvoir tracer l'historique, et intéragir plus facilement avec ces données.&lt;br /&gt;
&lt;br /&gt;
(TODO - à implémenter tout court ;-)&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Projets]]&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=CellarKare&amp;diff=2981</id>
		<title>CellarKare</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=CellarKare&amp;diff=2981"/>
		<updated>2015-10-28T21:05:47Z</updated>

		<summary type="html">&lt;p&gt;Quentin : /* Le code et le montage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Un projet lancé par --[[Utilisateur:Quentin|Quentin]] ([[Discussion utilisateur:Quentin|discussion]]) 14 juin 2015 à 19:58 (CEST)&lt;br /&gt;
&lt;br /&gt;
= En bref =&lt;br /&gt;
&lt;br /&gt;
Le projet est de créer une &amp;quot;station météo&amp;quot; pour une cave à vin, d'où le nom du projet un peu fumeux de CellarKare = Cellar + Care, le K c'est pour faire joli ;-)&lt;br /&gt;
Dans un premier temps, le but est d'afficher la température et le taux d'humidité (hygrométrie). Ça, c'est pour le but fonctionnel. Mes autres buts sont:&lt;br /&gt;
* Au niveau perso: réaliser un premier projet à forte composante électronique, dans la foulée de notre formation Arduino&lt;br /&gt;
* Utiliser un maximum toutes les techniques/machines du Makilab&lt;br /&gt;
* Documenter les différentes étapes (tutoriel), et fournir les fichiers sources nécessaires aux différentes étapes.&lt;br /&gt;
&lt;br /&gt;
= Mark 1: Le matos et un premier proto Arduino=&lt;br /&gt;
&lt;br /&gt;
Le premier prototype sera relativement simple: la station affichera la température et l'humidité ambiante sur un écran LCD, le tout piloté par un Arduino Uno.&lt;br /&gt;
&lt;br /&gt;
== T° et humidité: DHT22 / AM2303 ==&lt;br /&gt;
&lt;br /&gt;
Au niveau des capteurs, logiquement il en faut un pour lire la température, et un pour lire l'humidité. Les deux existent certainement séparément, mais une rapide recherche sur le net done des références de capteurs déjà calibrés et fournissant les deux pour pas trop cher. Au final, mon choix se porte sur un DHT22. Ce capteur s'appelle aussi AM2303 dans sa version câblée. Quelques liens et documentation utiles:&lt;br /&gt;
* [http://www.adafruit.com/datasheets/DHT22.pdf Les specs du DHT22 (anglais)];&lt;br /&gt;
* Pour acheter: [http://www.adafruit.com/products/385 ~10 $ chez AdaFruit] ou [http://shop.mchobby.be/senseurs/214-dht22-am2302-senseur-humidite-temperature--3232100002142.html ~17 € chez MCHobby], c'est un peu plus cher, mais ils sont belges et sympas;&lt;br /&gt;
* [http://playground.arduino.cc/Main/DHTLib Un tutoriel pour arduino sur Arduino.cc];&lt;br /&gt;
* [https://learn.adafruit.com/dht/using-a-dhtxx-sensor Un tutoriel pour arduino sur AdaFruit], et sa [http://mchobby.be/wiki/index.php?title=DHTxx version française];&lt;br /&gt;
&lt;br /&gt;
== L'affichage LCD: LCM1602 ==&lt;br /&gt;
&lt;br /&gt;
Pour l'affichage, le choix a été vite fait... J'ai pris ce que j'avais sous la main, soit le LCD fourni dans le starter kit arduino. Cet écran est très répandu, et fait partie de nombreux &amp;quot;kits de démarrage&amp;quot; en électronique. Au niveau fonctionnel, avec 2 lignes de 16 charactères, on devrait pouvoir s'en sortir pour afficher une température et un taux d'humidité ;-). Son contrôleur (hitachi HD44780) est lui aussi très répandu En vrac:&lt;br /&gt;
* [http://www.datasheetspdf.com/datasheet/LCM1602.html Les specs (chinois ou anglais)]&lt;br /&gt;
* Pour acheter: [http://www.ebay.com/sch/items/?_nkw=lcm1602&amp;amp;_sacat=&amp;amp;_ex_kw=&amp;amp;_mPrRngCbx=1&amp;amp;_udlo=&amp;amp;_udhi=&amp;amp;_sop=12&amp;amp;_fpos=&amp;amp;_fspt=1&amp;amp;_sadis=&amp;amp;LH_CAds=&amp;amp;rmvSB=true on en trouve plein sur ebay...]&lt;br /&gt;
* [http://www.arduino.cc/en/Tutorial/LiquidCrystal La librairie LiquidCrystal, qui permet de le contrôler sur Arduino]&lt;br /&gt;
&lt;br /&gt;
== Le montage ==&lt;br /&gt;
&lt;br /&gt;
Le montage est assez simple, et n'est finalement qu'une combinaison des différents tutoriel et exemple d'utilisation de l'écran et du capteur.&lt;br /&gt;
&lt;br /&gt;
Sur le schéma du capteur DHT, la résistance de 10K sert de [https://fr.wikipedia.org/wiki/R%C3%A9sistance_de_rappel &amp;quot;résistance pull-up&amp;quot;].&lt;br /&gt;
'''Cette résistance n'est pas nécessaire dans le cas du capteur AM2302''' (la version avec câble et boitier en plastique, comme sur la photo). Cette version [http://www.adafruit.com/product/393 intègre une résistance de 5.1K dans le boîtier], qui connecte déjà VCC et DATA, merci Patrick pour l'info ;-).&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Cellarkare mark1 bb.png|500px|thumb|left]]&lt;br /&gt;
[[Fichier:Cellarkare_mark1.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Le code ==&lt;br /&gt;
Au niveau programmation du micro-controlleur Arduino, là aussi c'est assez simple: toutes les 3 secondes, on lit les valeurs de t° et humidité, et on les affiches sur l'écran LCD. Les valeurs mesurées et des messages supplémentaires sont aussi envoyés sur la sortie série.&lt;br /&gt;
&lt;br /&gt;
Le code est aussi disponible (et éventuellement mis à jour) [https://gitlab.com/qberten/cellarkare/blob/master/mark1_arduino/cellarkare_arduino.ino sur gitlab]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
CellarKare - Mark #1&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Un projet de station de mesure de la température et l'humidité dans une cave à vin&lt;br /&gt;
Plus d'infos et schéma de montage sur http://wiki.makilab.org/index.php/CellarKare&lt;br /&gt;
Quentin Berten, 2015 - Domaine public, licence WTFPL v2, http://www.wtfpl.net/&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
// Bibliothèque LiquidCrystal, pour l'écran LCD. Installée de base avec l'IDE&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Bibliothèque DHT, pour le capteur de température. Installable directement depuis&lt;br /&gt;
// l'IDE, via Sketch -&amp;gt; Include LIbrary -&amp;gt; Manage Libraries -&amp;gt; DHT sensor Library &lt;br /&gt;
#include &amp;quot;DHT.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Définition l'écran LCD, en argument les pins d'interface, dans l'ordre&lt;br /&gt;
// (RS pin, LCD Enable, D4, D5, D6, D7)&lt;br /&gt;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);&lt;br /&gt;
&lt;br /&gt;
// Définition des pin et type pour le senseur de t° et humidité&lt;br /&gt;
#define DHTPIN 7         // senseur (fil data, en jaune), sur pin 7&lt;br /&gt;
#define DHTTYPE DHT22    // type DHT 22  (AM2302)&lt;br /&gt;
&lt;br /&gt;
// Définition du capteur DHT22, pour un Arduino &amp;quot;normal&amp;quot; à 16mhz, comme le Uno&lt;br /&gt;
DHT dht(DHTPIN, DHTTYPE);&lt;br /&gt;
// les variables associées qui vont lire les valeurs (température, ...)&lt;br /&gt;
float hum;&lt;br /&gt;
float tempC;&lt;br /&gt;
float tempF;&lt;br /&gt;
float indiceHum;&lt;br /&gt;
&lt;br /&gt;
// les variables qui permettent de gérer le temps,&lt;br /&gt;
// voir http://www.arduino.cc/en/pmwiki.php?n=Tutorial/BlinkWithoutDelay&lt;br /&gt;
long prevMillis = 0;           // enregistre le temps de la denière lecture DHT22&lt;br /&gt;
long dhtInterval = 3000;       // L'intervalle de lecture du DHT22: 3 secondes&lt;br /&gt;
&lt;br /&gt;
// la procédure d'initialisation arduino&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  // on ouvre une connection série (pour afficher un maxium d'info)&lt;br /&gt;
  Serial.begin(9600); &lt;br /&gt;
  Serial.println(&amp;quot;CellarKare Mark #1 Test&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // initialisation du capteur&lt;br /&gt;
  dht.begin();&lt;br /&gt;
  // initialisation de l'écran, 16 colonnes et 2 lignes&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// la boucle principale arduino&lt;br /&gt;
void loop() {&lt;br /&gt;
  unsigned long curMillis = millis();&lt;br /&gt;
  &lt;br /&gt;
  if(curMillis - prevMillis &amp;lt; dhtInterval) {&lt;br /&gt;
    goto end_loop;        // pas de lecture DHT, on va à la fin de la boucle loop()&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // on enregistre le dernier temps d'exécution de la lecture&lt;br /&gt;
  prevMillis = curMillis;   &lt;br /&gt;
  &lt;br /&gt;
  // la lecture de la t° et l'humidité prends environ 250 millisecondes&lt;br /&gt;
  // mais les lectures du capteur peuvent etre vieillies de 2 secondes&lt;br /&gt;
  // le capteur n'est pas rapide (d'où l'attente de 3 secondes pour etre&lt;br /&gt;
  // certain d'avoir des lectures correctes.&lt;br /&gt;
  // lecture de l'humidité&lt;br /&gt;
  hum = dht.readHumidity();&lt;br /&gt;
  // lecture de la température en degrés Celsius&lt;br /&gt;
  tempC = dht.readTemperature();&lt;br /&gt;
  // lecture de la température en degrés Fahreneit&lt;br /&gt;
  tempF = dht.readTemperature(true);&lt;br /&gt;
  &lt;br /&gt;
  // On vérifie que les lectures on bien été réalisées. Si pas, on quitte&lt;br /&gt;
  // la boucle pour ré-essayer&lt;br /&gt;
  if (isnan(hum) || isnan(tempC) || isnan(tempF)) {&lt;br /&gt;
    Serial.println(&amp;quot;Lecture sur le capteur DHT ratée&amp;quot;);&lt;br /&gt;
    goto end_loop;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Calcul de l'indice de chaleur (voir https://fr.wikipedia.org/wiki/Indice_de_chaleur )&lt;br /&gt;
  // La température doit etre fournie en degré Fahreneit&lt;br /&gt;
  indiceHum = dht.computeHeatIndex(tempF, hum);&lt;br /&gt;
&lt;br /&gt;
  // On affiche les valeurs sur la console série (n'est pas indispensable)&lt;br /&gt;
  Serial.print(&amp;quot;Humidite: &amp;quot;); &lt;br /&gt;
  Serial.print(hum);&lt;br /&gt;
  Serial.print(&amp;quot; %\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temperature: &amp;quot;); &lt;br /&gt;
  Serial.print(tempC);&lt;br /&gt;
  Serial.print(&amp;quot; *C &amp;quot;);&lt;br /&gt;
  Serial.print(tempF);&lt;br /&gt;
  Serial.print(&amp;quot; *F\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Indice de chaleur: &amp;quot;);&lt;br /&gt;
  Serial.print(indiceHum);&lt;br /&gt;
  Serial.println(&amp;quot; *F&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  // On affiche les valeurs sur l'écran LCD, curseur à (0,0)&lt;br /&gt;
  lcd.setCursor(0, 0);&lt;br /&gt;
  // print Temp in C°&lt;br /&gt;
  lcd.print(&amp;quot;deg C: &amp;quot;);&lt;br /&gt;
  lcd.print(tempC);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;hum %: &amp;quot;);&lt;br /&gt;
  lcd.print(hum);&lt;br /&gt;
&lt;br /&gt;
  // label pour goto&lt;br /&gt;
  end_loop:&lt;br /&gt;
  ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== La conclusion ==&lt;br /&gt;
Un premier prototype fonctionnel, qui a au moins le mérite de vérifier que le capteur DHT renvoie des valeurs réalistes.&lt;br /&gt;
La suite: la même chose avec un Raspberry pi, pour bénéficier de sa faciliter à se connecter au réseau. Ce serait quand même cool de pouvoir lire ces valeurs sur un smartphone ;-)&lt;br /&gt;
&lt;br /&gt;
= Mark 2: la même chose avec un Raspberry Pi =&lt;br /&gt;
Le but de cette nouvelle itération: réaliser un montage équivalent avec un [https://www.raspberrypi.org/ Raspberry Pi] (RPi en abrégé). Pourquoi un RPi ?&lt;br /&gt;
* Parce que j'en avais un sous la main ;-)&lt;br /&gt;
* Parce qu'il permet de se connecter rapidement et facilement à un réseau, via ethernet (câble) ou wifi (via un dongle usb)&lt;br /&gt;
* Parce qu'il permet de brancher facilement un module caméra (on y viendra au Mark 3)&lt;br /&gt;
&lt;br /&gt;
Il est certainement possible d'arriver au même résultat avec d'autres cartes (comme par exemple un [http://www.arduino.cc/en/Main/ArduinoBoardYun Arduino Yun]), c'est juste que c'est un RPi que j'avais sous la main... Dans mon cas un Raspberry Pi B+.&lt;br /&gt;
&lt;br /&gt;
En ce qui concerne le RPi, quelques ressources très utiles:&lt;br /&gt;
* [http://mchobby.be/wiki/index.php?title=RaspberryPi-Accueil#Tutoriels Les tutoriels réalisés/traduits par MC Hobby. Une mine d'or]&lt;br /&gt;
* [http://www.elektronique.fr/montages/raspberry-pi/ Des exemples de montages et réalisations électroniques avec RPi]&lt;br /&gt;
* [http://pi.gadgetoid.com/pinout La configuration des différentes PIN du RPi]&lt;br /&gt;
&lt;br /&gt;
== L'installation de l'OS ==&lt;br /&gt;
La principale différence entre une carte Arduino et le RPi, c'est le cœur de la carte:&lt;br /&gt;
* le cœur de l'Arduino est un microcontrôleur, qui va exécuter le programme qu'on lui injecte de manière bête et méchante. Chaque entrée/sortie va devoir être programmée directement, il n'y a pas de système de driver, ...&lt;br /&gt;
* le cœur du RPi est un microprocesseur (ARM, la même technologie que dans les smartphones). Il s'agit donc en fait d'un véritable &amp;quot;petit ordinateur&amp;quot;, avec un système d'exploitation, des drivers (pour l'usb, l'écran, le wifi, ...).&lt;br /&gt;
&lt;br /&gt;
Donc avant de pouvoir démarrer et utiliser le RPi, il va falloir installer un système d'exploitation (OS: Operating System). C'est exactement la même chose qu'installer Windows sur un PC, c'est juste que dans notre cas, ce ne sera pas Windows mais un système Linux. Il en existe [https://www.raspberrypi.org/downloads/ plusieurs], le standard de facto étant Raspbian (une distribution Debian adaptée pour le RPi), c'est celle-là [http://raspbian-france.fr/installer-raspbian-premier-demarrage-configuration/ que j'ai installée].&lt;br /&gt;
&lt;br /&gt;
Petit truc pour les distraits: écran/clavier/souris ne sont pas indispensables pour l'installation, il est tout à fait possible de se connecter via [https://fr.wikipedia.org/wiki/Secure_Shell SSH] au RPi une fois son premier démarrage exécuté, pour autant qu'il soit raccordé à votre réseau (via son câble ethernet). Le RPi se déclare automatiquement sur le réseau avec le nom raspberry.local, et un &amp;lt;code&amp;gt;ssh pi@raspberry.local&amp;lt;/code&amp;gt; à fait l'affaire (raspberry, c'est son &amp;quot;hostname&amp;quot; par défaut). Pour le mot de passe, c'est &amp;lt;code&amp;gt;raspberry&amp;lt;/code&amp;gt; par défaut. Ensuite &amp;lt;code&amp;gt;raspi-config&amp;lt;/code&amp;gt; permet de terminer la procédure d'installation.&lt;br /&gt;
&lt;br /&gt;
En ce qui me concerne, tout le reste de la configuration se fera donc en [https://fr.wikipedia.org/wiki/Shell_Unix ligne de commande (shell)] via SSH. [http://mchobby.be/wiki/index.php?title=PI-SSH Le wiki de MCHobby] détaille l'accès via SSH au RPi.&lt;br /&gt;
&lt;br /&gt;
'''Un dernier point important''': le RPi, c'est comme un &amp;quot;vrai&amp;quot; ordinateur... il vaut mieux l'éteindre proprement plutôt que le débrancher sauvagement. Donc on s'arrange pour faire un &amp;lt;code&amp;gt;sudo poweroff&amp;lt;/code&amp;gt; en ligne de commande avant de le débrancher. Le gros risque: corrompre le système de fichier sur le carte SD, ce qui empêche le démarrage suivant, et impose un reformatage et une réinstallation complète. Pas drôle en somme, je parle d'expérience :-(&lt;br /&gt;
&lt;br /&gt;
== Le wifi ==&lt;br /&gt;
Bien que le RPi ne soit pas équipé par défaut du wifi, il est compatible avec la majorité des clefs usb wifi. Dans mon cas, une vieille clef Hercules HWGUSB2-54. Un petit tour par les log (&amp;lt;code&amp;gt;sudo tail -f /var/log/syslog&amp;lt;/code&amp;gt;) pour vérifier qu'elle est reconnue correctement lors du branchement, et puis une configuration via l'édition de &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt; pour entrer les références du réseau wifi:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
auto wlan0&lt;br /&gt;
allow-hotplug wlan0&lt;br /&gt;
iface wlan0 inet dhcp&lt;br /&gt;
wpa-ssid &amp;quot;Le_nom_(SSID)_de_votre_wifi&amp;quot;&lt;br /&gt;
wpa-psk &amp;quot;Le_mot_de_passe_de_votre_wifi&amp;quot;&lt;br /&gt;
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Ensuite un redémmarrage de la carte avec &amp;lt;code&amp;gt;$ sudo ifdown wlan0&amp;lt;/code&amp;gt; suivi de &amp;lt;code&amp;gt;sudo ifup wlan0&amp;lt;/code&amp;gt; et ça devrait être OK. On peut maintenant se passer de câble ethernet!&lt;br /&gt;
&lt;br /&gt;
Si nécessaire: plus de détails sur la configuration réseau sur [http://mchobby.be/wiki/index.php?title=Rasp-Config-Reseau le wiki MC Hobby]&lt;br /&gt;
&lt;br /&gt;
== La température avec le DHT22 / AM2302 ==&lt;br /&gt;
Pour la lecture des température avec le capteur, les gars d'Adafruit ont déjà développé un bibliothèque de fonctions utilisables en ligne de commande ou en [https://fr.wikipedia.org/wiki/Python_%28langage%29 python]. Quelques ressources:&lt;br /&gt;
* [https://learn.adafruit.com/dht-humidity-sensing-on-raspberry-pi-with-gdocs-logging/overview La page d'Adafruit (en anglais) sur l'utilisation du DHT22 avec le RPi]&lt;br /&gt;
* [http://www.manuel-esteban.com/lire-une-sonde-dht22-avec-un-raspberry-pi/ Une ressource en français (un peu datée) sur l'utilisation DHT22 + RPi.]&lt;br /&gt;
* [http://pi.gadgetoid.com/pinout La table de référence des 40 pins GPIO du RPi]&lt;br /&gt;
Pour ma part, j'ai suivi la méthode Adafruit, ce qui donne en résumé, en ligne de commande:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
cd /home/pi&lt;br /&gt;
git clone https://github.com/adafruit/Adafruit_Python_DHT.git &lt;br /&gt;
cd Adafruit_Python_DHT&lt;br /&gt;
sudo apt-get install build-essential python-dev  &lt;br /&gt;
sudo python setup.py install&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Au niveau du montage, rien de nouveau: le capteur doit toujours être alimenté en 3.3V ou en 5V, et le câble de lecture à une pin d'entrée/sortie (GPIO: General Purpose Input Output), ce qui donne:&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Cellarkare mark2 bb.png|400px|thumb|left]]&lt;br /&gt;
[[Fichier:Cellarkare_mark2.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Un test en ligne de commande permet de vérifier qu'on a une lecture sur le capteur (dans mon cas un AM2302 raccordé sur la pin GPIO 4):&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
cd /home/pi/Adafruit_Python_DHT/examples/&lt;br /&gt;
sudo ./AdafruitDHT.py 2302 4&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Ce qui affiche &amp;lt;code&amp;gt;Temp=23.0*C  Humidity=53.8%&amp;lt;/code&amp;gt;, des valeurs censées pour une après-midi d'été ;-)&lt;br /&gt;
&lt;br /&gt;
== L'affichage LCD ==&lt;br /&gt;
L'écran LCD est toujours le même que pour la version &amp;quot;Mark 1&amp;quot; Arduino. Quelques resources:&lt;br /&gt;
* [https://learn.adafruit.com/drive-a-16x2-lcd-directly-with-a-raspberry-pi Un tutoriel (en anglais) sur Adafruit] ''Attention, le code source n'est plus tellement a jour, voir le dernier lien Github.''&lt;br /&gt;
* [http://mchobby.be/wiki/index.php?title=Rasp-Hack-Afficheur-LCD La version française, traduite par MC Hobby]&lt;br /&gt;
* [https://github.com/adafruit/Adafruit_Python_CharLCD Le code source de la librairie Adafruit pour le gestion du LCD sur GitHub] ''contient la dernière version de la librairie''.&lt;br /&gt;
&lt;br /&gt;
La logique de raccordement est strictement identique au circuit du Mark 1. La seule différence est que la résistance variable de 10K dans le circuit est supprimée, la bibliothèque Adafruit pour le LCD permettant le pilotage en [https://fr.wikipedia.org/wiki/Modulation_de_largeur_d%27impulsion modulation PWM].&lt;br /&gt;
&lt;br /&gt;
== Le montage ==&lt;br /&gt;
Au final, le montage a été fait pour gagner un maximum de place sur mon breadboard. La pin data du DHT a été déplacée sur la pin 5, et le reste des pin pour le LCD sont documentées dans le code.&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Cellarkare mark2_2 bb.png|500px|thumb|left]]&lt;br /&gt;
[[Fichier:Cellarkare_mark2_2.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Le code ==&lt;br /&gt;
&lt;br /&gt;
La logique du code est identique à la version mark 1 - arduino. Ce code est aussi disponible (et éventuellement mis à jour) [https://gitlab.com/qberten/cellarkare/blob/master/mark2_rpi/cellarkare_rpi.py sur gitlab]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
# coding=utf8&lt;br /&gt;
# CellarKare - Mark 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
# Un projet de station de mesure de la température et l'humidité dans une cave à vin&lt;br /&gt;
# Plus d'infos et schéma de montage sur http://wiki.makilab.org/index.php/CellarKare&lt;br /&gt;
# Quentin Berten, 2015 - Domaine public, licence WTFPL v2, http://www.wtfpl.net/&lt;br /&gt;
# quentin_#AT#_berten.me&lt;br /&gt;
&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
# Bibliothèque CharLCD d'Adafruit, voir https://github.com/adafruit/Adafruit_Python_CharLCD&lt;br /&gt;
# pour l'installation&lt;br /&gt;
import Adafruit_CharLCD as LCD&lt;br /&gt;
# Bibliothèque DHT d'AdaFruit, voir https://github.com/adafruit/Adafruit_Python_DHT&lt;br /&gt;
# pour l'installation&lt;br /&gt;
import Adafruit_DHT as DHT&lt;br /&gt;
&lt;br /&gt;
# Configuration de l'affichage LCD&lt;br /&gt;
lcd_rs        = 25      # RS sur pin 25&lt;br /&gt;
lcd_en        = 24      # EN sur pin 24&lt;br /&gt;
lcd_d4        = 23      # D4 sur pin 23&lt;br /&gt;
lcd_d5        = 12      # D5 sur pin 12&lt;br /&gt;
lcd_d6        = 20      # D6 sur pin 20&lt;br /&gt;
lcd_d7        = 16      # D7 sur pin 16&lt;br /&gt;
lcd_backlight = 18      # rétro éclairage sur pin 18&lt;br /&gt;
lcd_columns   = 16      # Affichage à 16 colonnes ...&lt;br /&gt;
# Initialisation du LCD avec les variables ci-dessus&lt;br /&gt;
lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, &lt;br /&gt;
		        	lcd_columns, lcd_rows, lcd_backlight)&lt;br /&gt;
# Configuration pour le capteur DHT, soit DHT11, DHT22 ou AM2302.&lt;br /&gt;
dht_sensor    = DHT.AM2302  # Type AM2302&lt;br /&gt;
dht_pin       = 5           # DHT data sur pin 5&lt;br /&gt;
&lt;br /&gt;
# les variables qui permettent de gérer le temps,&lt;br /&gt;
prevMillis = 0          # enregistre le temps de la denière lecture DHT22&lt;br /&gt;
secInterval = 1000      # Un intervalle d'une seconde&lt;br /&gt;
# L'intervalle de lecture du DHT22: 3 secondes, doit etre plus grand que secInterval&lt;br /&gt;
dhtInterval = 3000&lt;br /&gt;
&lt;br /&gt;
def read_and_print_dht():&lt;br /&gt;
    # On lit une valeur sur le senseur avec la fonction read. Attention, cette fonction&lt;br /&gt;
    # ne réessaie pas automatiquement en cas d'erreur, mais fournit les valeurs (None, None).&lt;br /&gt;
    hum, tempC  = DHT.read(dht_sensor, dht_pin)&lt;br /&gt;
&lt;br /&gt;
    # On vérifie que l'on a bien eu une lecture (Linux n'est pas un OS temps réel et ne&lt;br /&gt;
    # peut pas garantir le timing des lectures sur le capteur). Si ça arrive, on réessaie.&lt;br /&gt;
    # On affiche les valeurs sur la console (n'est pas indispensable)&lt;br /&gt;
    if hum is not None and tempC is not None:&lt;br /&gt;
    	print 'Temp={0:0.2f}*C  Humidity={1:0.2f}%'.format(tempC, hum)&lt;br /&gt;
        # On affiche les valeurs sur l'écran LCD&lt;br /&gt;
        lcd.clear()&lt;br /&gt;
        lcd.message('deg C: {0:0.2f}\nhum %: {1:0.2f}'.format(tempC, hum))&lt;br /&gt;
    else:&lt;br /&gt;
	print 'Lecture sur le capteur DHT ratée'&lt;br /&gt;
&lt;br /&gt;
# Boucle principale, l'équivalent de void loop() sur Arduino&lt;br /&gt;
while 1:&lt;br /&gt;
    # On lit le nombre de millisecondes courant&lt;br /&gt;
    curMillis = time.time()*1000&lt;br /&gt;
    if curMillis - prevMillis &amp;gt; dhtInterval:&lt;br /&gt;
        # On essaie de lire et afficher les valeurs du DHT&lt;br /&gt;
        read_and_print_dht()&lt;br /&gt;
        # on enregistre le dernier temps d'exécution de la lecture&lt;br /&gt;
        prevMillis = curMillis&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== La conclusion ==&lt;br /&gt;
En vrac:&lt;br /&gt;
* Pas de gros problème ou obstacles majeurs pour convertir le montage et le code Arduino en son équivalent RPi. Mais heureusement que l'équipe d'Adafruit a déjà programmé les bibliothèques Python qui vont bien!&lt;br /&gt;
* Au niveau du breadboard, ça commence à prendre de la place... Une solution: passer en [https://fr.wikipedia.org/wiki/I2C &amp;quot;I2C&amp;quot;] pour le capteur et le LCD, ce qui limite drastiquement le nombre de pins nécessaires pour le montage, et facilite la programmation. Merci Patrick pour les infos, ce sera sûrement utile pour le prochain montage ;-) !&lt;br /&gt;
** Par exemple, pour la température: un capteur I2C comme le [https://www.adafruit.com/products/1638 SHT15], et pour l'écran, [http://www.electrodragon.com/w/index.php?title=1602_LCD_I2C/SPI_Module la version I2C du même 1602].&lt;br /&gt;
** Par contre dans ce cas, il faut faire gaffe au fait que le passage en 3.3V pour la logique du RPi, le lcd reste en 5V et il faudra ajouter un [http://www.adafruit.com/products/757 convertisseurs de niveau] pour le bus si utilisé avec un capteur qui ne supporte pas 5V.&lt;br /&gt;
* le langage Python, c'est pas plus compliqué que le simili-C de l'Arduino une fois qu'on est rentré dedans.&lt;br /&gt;
&lt;br /&gt;
= Mark 3: Start, Stop, and say Cheese =&lt;br /&gt;
&lt;br /&gt;
== Sart/Stop ==&lt;br /&gt;
Un &amp;quot;problème&amp;quot; du RPi, c'est qu'il n'a pas de bouton ON/OFF simple, et par conséquent, l'éteindre proprement avec &amp;lt;code&amp;gt;sudo halt&amp;lt;/code&amp;gt; ou  &amp;lt;code&amp;gt;sudo poweroff&amp;lt;/code&amp;gt; est impossible sans un accès physique (clavier et écran connectés) ou une connection SSH (connection à distance). Pas pratique pour un boitier qui sera installé dans une cave à vin...&lt;br /&gt;
&lt;br /&gt;
Autrement dit, mes besoins:&lt;br /&gt;
# Le programme python d'affichage et monitoring des températures démarre automatiquement lorsque le RPi démarre.&lt;br /&gt;
# Un bouton OFF permet d'éteindre proprement le RPi avant de le débrancher de son alimentation.&lt;br /&gt;
# Un bouton ON permet de l'allumer une fois éteint sans débrancher/rebrancher son alimentation.&lt;br /&gt;
# Nec plus ultra: avoir un fonctionnement similaire à un bouton ON/OFF d'un laptop par exemple: si éteint, le bouton allume, si allumé, le bouton éteint proprement le RPi, et coupe l'alimentation USB.&lt;br /&gt;
&lt;br /&gt;
Bon après quelques recherches sur le net:&lt;br /&gt;
# C'est simple, il suffit de configurer le &amp;quot;init script&amp;quot; du RPi pour lancer automatiquement le programme python au démarrage&lt;br /&gt;
# Un montage simple permet d'écouter sur une des pins du GPIO, et de lancer la procédure propre d'arrêt (shutdown). Soit un bouton OFF&lt;br /&gt;
# Le RPi (à partir du modèle B rev2, soit Brev2, B+ et 2) possède un pinout &amp;quot;reset&amp;quot;, qui n'est pas soudé de base sur la carte. Si on raccorde ces deux pins, le RPi redémarre électriquement (hard reboot). Donc sans s'éteindre proprement. L'intérêt, c'est que si le RPi est éteint mais encore sous tension, ce bouton permet de le ré-allumer. Donc un bouton ON/RESET. Voir par exemple:&lt;br /&gt;
#* Un article assez complet en anglais sur [http://www.makeuseof.com/tag/add-reset-switch-raspberry-pi/ MakeUseOf.com]&lt;br /&gt;
# Le bouton combiné ON/OFF unique est possible, mais le montage est plus compliqué. Quelques exemples:&lt;br /&gt;
#* Un montage en français sur le site [http://forum.madeinfr.org/topic/43/raspower/ MadeInFR.org].&lt;br /&gt;
#* Un montage en anglais à base de micro contrôleur (pas simple donc) sur [http://www.instructables.com/id/Raspberry-Pi-Shutdown-Button/ Instructables]&lt;br /&gt;
#* Un article très complet en anglais reprenant toutes les options, dont un montage assez simple de bouton unique [http://www.raspberry-pi-geek.com/Archive/2013/01/Adding-an-On-Off-switch-to-your-Raspberry-Pi sur raspberry-pi-geek.com]&lt;br /&gt;
#* Des solutions commerciales toutes faites comme [https://www.pi-supply.com/product/pi-supply-raspberry-pi-power-switch/ PiSupply] ou [http://www.mausberrycircuits.com/collections/frontpage MausberryCircuits]&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, ce sera pour moi le choix suivant: un bouton OFF, qui lors d'un appui long éteint proprement le RPi. En gros la solution 2.&lt;br /&gt;
&lt;br /&gt;
Mais dans un premier temps, il faut configurer le RPi pour lancer le programme au démarrage...&lt;br /&gt;
&lt;br /&gt;
== Lancement du programme via initscript ==&lt;br /&gt;
&lt;br /&gt;
Il y a certainement 36 façons d'arriver au même résultat (après tout, le RPi tourne sous Linux ;-), mais dans mon cas, la solution qui me convient bien: un script d'init lance par défaut le script python localisé en &amp;lt;code&amp;gt;/usr/local/bin/pystartup.py&amp;lt;/code&amp;gt;. L'intérêt de la chose: &amp;lt;code&amp;gt;pystartup.py&amp;lt;/code&amp;gt; peut être un lien symbolique vers n'importe quel autre script.&lt;br /&gt;
&lt;br /&gt;
Pour éviter d'encombrer le wiki, je n'ai pas repris le script ici, mais il est dispo sur [https://gitlab.com/qberten/cellarkare/blob/master/mark3_camera/initscript_pystartup GitLab]. Pour l'installation, en ligne de commande (connecté sur le RPi):&lt;br /&gt;
&lt;br /&gt;
On télécharge le script, on le déplace au bon endroit et on le rend exécutable&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
wget https://gitlab.com/qberten/cellarkare/raw/master/mark3_camera/initscript_pystartup&lt;br /&gt;
sudo mv initscript_pystartup /etc/init.d/pystartup&lt;br /&gt;
sudo chmod a+x /etc/init.d/pystartup&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
On crée le lien symbolique qui va bien (remplacer /chemin/vers/... par la localisation du programme à lancer)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
ln -s /chemin/vers/votre/script/python.py /usr/local/bin/pystartup.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
On configure le système pour qu'il connaisse le nouveau script &amp;quot;pystartup&amp;quot;, et on lui demande de l'exécuter à chaque démarrage&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo update-rc.d pystartup defaults&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Il est ensuite possible de lancer son programme en arrière plan comme n'importe quel autre service avec &amp;lt;code&amp;gt;sudo service pystartup start&amp;lt;/code&amp;gt;, de l'arrêter avec &amp;lt;code&amp;gt;sudo service pystartup stop&amp;lt;/code&amp;gt;, etc&lt;br /&gt;
&lt;br /&gt;
== Pinout RESET ==&lt;br /&gt;
&lt;br /&gt;
Activer le &amp;quot;hard&amp;quot; reset sur le Rpi suppose un peu de soudure, mais rien de bien effrayant, 2 points suffisent. Un fois les connecteur pinout soudés, quand on raccorde les deux pins (par exemple avec un interrupteur), le RPi redémarre (&amp;quot;hard&amp;quot; reset, donc attention à la carte SD...), ou s'allume (si il était raccordé au secteur).&lt;br /&gt;
&lt;br /&gt;
J'ai soudé les 2 pins et testé la fonction, mais comme il s'agit d'un redémarrage &amp;quot;hard&amp;quot;, je n'ai finalement pas vraiment vu l'utilité dans ce projet: autant directement débrancher / rebrancher le câble d'alimentation dans ce cas.&lt;br /&gt;
&lt;br /&gt;
Mais à toutes fins utiles, les photos de l'opération, avant/après.&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Rpi_reset_before.jpg|500px|thumb|left]]&lt;br /&gt;
[[Fichier:Rpi_reset_after.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bouton OFF ==&lt;br /&gt;
&lt;br /&gt;
Rien de très compliqué: on raccorde le bouton à une entrée, on configure la résistance pull-up/down interne du Rpi, on s'assure de récupérer les évènements dans le code.&lt;br /&gt;
&lt;br /&gt;
Les parties utiles du code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# La fonction qui effectuer l'arrêt propre du RPi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def btn_proper_halt(pin):&lt;br /&gt;
    global off_state, cur_millis, off_millis&lt;br /&gt;
    # On lit le nombre de millisecondes courant&lt;br /&gt;
    cur_millis = time.time()*1000&lt;br /&gt;
    # Utilise la variable globale off_state&lt;br /&gt;
    off_state = not off_state&lt;br /&gt;
    # DEBUG&lt;br /&gt;
    logging.debug(&amp;quot;Bouton OFF_PIN pressé, son état est maintenant %s&amp;quot; % str(off_state))&lt;br /&gt;
    if off_state == True:&lt;br /&gt;
        off_millis = cur_millis   &lt;br /&gt;
    elif off_state == False: &lt;br /&gt;
        # DEBUG&lt;br /&gt;
        logging.debug(&amp;quot;Bouton OFF_PIN pressé pendant {0:0.0f} ms&amp;quot;.format(cur_millis - off_millis))&lt;br /&gt;
        if (cur_millis - off_millis) &amp;gt; OFF_INTERVAL:&lt;br /&gt;
            # On a relâché le bouton avec un écart long =&amp;gt; shutdown&lt;br /&gt;
            logging.debug(&amp;quot;Appui long sur le bouton OFF_PIN&amp;quot;)&lt;br /&gt;
            logging.info(&amp;quot;Arrêt du Raspberry PI, attendre encore 10 sec avant de débrancher&amp;quot;)&lt;br /&gt;
            subprocess.call('halt', shell=False)&lt;br /&gt;
        else:&lt;br /&gt;
            # Appuis court =&amp;gt; on ne fait rien&lt;br /&gt;
            logging.debug(&amp;quot;Appui court sur le bouton OFF_PIN&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Fonction de terminaison du programme (appelée lorsque le script est arrêté&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def terminate():&lt;br /&gt;
    logging.debug(&amp;quot;Terminate function started&amp;quot;)&lt;br /&gt;
    # efface l'écran LCD&lt;br /&gt;
    lcd_dim_backlight(0.0, 0.2)&lt;br /&gt;
    lcd.clear()&lt;br /&gt;
    logging.debug(&amp;quot;Terminate function ended&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Fonction d'initialisation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def initialize():&lt;br /&gt;
    global lcd&lt;br /&gt;
    logging.debug(&amp;quot;Initialize function started&amp;quot;)&lt;br /&gt;
    # Initialisation du LCD avec les variables ci-dessus&lt;br /&gt;
    lcd = LCD.Adafruit_CharLCD(LCD_RS, LCD_EN, LCD_D4, LCD_D5, LCD_D6, LCD_D7, &lt;br /&gt;
		        	LCD_COLUMNS, LCD_ROWS,&lt;br /&gt;
                                LCD_BACKLIGHT, invert_polarity = False, enable_pwm = True,&lt;br /&gt;
                                initial_backlight = lcd_backlight)&lt;br /&gt;
    # Initialisation des autres GPIO's&lt;br /&gt;
    GPIO.setmode(GPIO.BCM)        # On utilise la numérotation BCM pour les PIN&lt;br /&gt;
    # On définit la pin OFF_PIN comme entrée, et on active la résistance pull-down interne du RPi&lt;br /&gt;
    GPIO.setup(OFF_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)&lt;br /&gt;
    # Configure une interruption qui va détecter les mouvements up et down sur le bouton&lt;br /&gt;
    GPIO.add_event_detect(OFF_PIN, GPIO.BOTH, callback=btn_proper_halt, bouncetime=20)&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Say &amp;quot;cheese&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Cette partie du projet s'attache à pouvoir prendre rapidement et facilement un photos des étiquettes des bouteilles entrées ou sorties de la cave. Ben oui, j'ai pas forcément une bonne mémoire, et se donner les moyens d'enregistrer facilement et rapidement l'info est le meilleur moyen de suivre son stock ;-)&lt;br /&gt;
&lt;br /&gt;
Cette partie est super simple à réaliser avec le rpi: on raccorde la caméra, on s'assure qu'elle est activée avec &amp;lt;code&amp;gt;sudo raspi-config&amp;lt;/code&amp;gt;, et on peut ensuite l'utiliser en ligne de commande ou en python. Le site web [https://www.raspberrypi.org/documentation/usage/camera/README.md raspberrypi.org (en anglais)] explique cela très bien.&lt;br /&gt;
&lt;br /&gt;
On ajoute un deuxième bouton sur le breadboard, qui déclenche la prise d'une photo, et le prototype est maintenant fonctionnel. Les photos sont sauvegardées dans le répertoire courant du RPi, avec la date et l'heure pour nom de fichier.&lt;br /&gt;
&lt;br /&gt;
Au niveau du code, les parties utiles sont:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Fonction de prise d'une photo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def btn_take_picture(pin):&lt;br /&gt;
    # DEBUG&lt;br /&gt;
    logging.info(&amp;quot;Bouton CAM_PIN pressé, on prend un photo&amp;quot;)&lt;br /&gt;
    # Construction du chemin pour la photo&lt;br /&gt;
    now = datetime.datetime.now()&lt;br /&gt;
    pic_filename = &amp;quot;/home/qb/pic_&amp;quot; + str(now) + &amp;quot;.jpg&amp;quot;&lt;br /&gt;
    # Initialisation de la camera. On ne le fait pas dans initialize() pour éviter au maximum de la laisser&lt;br /&gt;
    # allumée (et consommer) en continu. En plus, une fois activée, les lectures sur le DHT sont beaucoup&lt;br /&gt;
    # plus souvent ratées.&lt;br /&gt;
    with PICAM.PiCamera() as cam:&lt;br /&gt;
        cam.capture(pic_filename)&lt;br /&gt;
        logging.debug(&amp;quot;Photos sauvée &amp;quot; + str(cam.resolution) + &amp;quot;  dans &amp;quot; + pic_filename)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pimp my screen ==&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est d'allumer ou éteindre l'écran, la bibliothèque CharLCD permet la modulation PWN du rétroéclairage. De quoi avoir un chouette effet de fondu au noir lorsque l'écran s'allume et s'éteint.&lt;br /&gt;
&lt;br /&gt;
Au niveau du code, la partie utile:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Module l'intensité du rétro éclairage de l'écran lcd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def lcd_dim_backlight(backlight_value, time_step):&lt;br /&gt;
    global lcd&lt;br /&gt;
    global lcd_backlight&lt;br /&gt;
    # calcule l'incrément à avoir entre lcd_backlight et backlight_value&lt;br /&gt;
    stp = (lcd_backlight &amp;gt; backlight_value) * -2 +1&lt;br /&gt;
    brightnesses = map(lambda x: x/10.0, range(int(lcd_backlight*10), int(backlight_value*10)+1, stp))&lt;br /&gt;
    for bright in brightnesses:&lt;br /&gt;
        lcd_backlight = bright&lt;br /&gt;
        logging.debug(&amp;quot;loop on bright= &amp;quot; + str(bright))&lt;br /&gt;
        lcd.set_backlight(bright)&lt;br /&gt;
        time.sleep(time_step)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Le code et le montage ==&lt;br /&gt;
&lt;br /&gt;
Le code source complet pour [https://gitlab.com/qberten/cellarkare/blob/master/mark3_camera/cellarkare_cam.py Mark 3 est disponible sur gitlab]. Pour ce qui est du montage, ben pas de schéma de raccordement disponible, j'ai oublié de le documenter en temps utile avant de passer à Mark 4! Donc il faudra attendre la suite...&lt;br /&gt;
&lt;br /&gt;
= Mark 4: We are (almost) done =&lt;br /&gt;
&lt;br /&gt;
== Pimp my screen, reloaded ==&lt;br /&gt;
Une dernière petite touche intéressante: l'appareil est destiné à être mis dans une cave à vin, endroit où il va faire noir la plupart du temps. En conséquence, l'écran LCD n'a pas vraiment besoin d'être allumé en permanence, pourquoi ne pas l'allumer automatiquement quand la lumière du local dépasse un certain seuil. Une photorésistance permet de réaliser rapidement la mesure d'une intensité lumineuse, pourquoi s'en priver... Oui mais... le RPi n'a pas d'entrée analogique, comment convertir simplement la mesure sur la photorésistance en une valeur analogique, alors que le RPi n'a que des entrées digitales.&lt;br /&gt;
&lt;br /&gt;
Après un peu de recherche, un montage simple à base d'une capacité dont le temps de charge sera directement proportionnel à la mesure sur la photo-résistance. Tout cela est expliqué ici (en anglais): [http://www.raspberrypi-spy.co.uk/2012/08/reading-analogue-sensors-with-one-gpio-pin/]&lt;br /&gt;
&lt;br /&gt;
(TODO - continuer la documentation)&lt;br /&gt;
&lt;br /&gt;
== Buttons, buttons, we want more ==&lt;br /&gt;
&lt;br /&gt;
Dernier petit détail, et non des moindre, Pour avoir un projet réellement fonctionnel, il va falloir travailler un peu l'interface homme-machine, et permettre un peu plus d'interaction avec le Rpi, pour par exemple permettre d'entrer le nombre de bouteilles couvertes par l'entrée ou la sortie photographiée, quitter/valider une action, ...&lt;br /&gt;
&lt;br /&gt;
(TODO - continuer la documentation)&lt;br /&gt;
&lt;br /&gt;
== we want leds ==&lt;br /&gt;
&lt;br /&gt;
Toujours dans l'optique d'améliorer l'interaction avec l'appareil, pourquoi ne pas intégrer une led de status sur l'appareil, pour indiquer visuellement différents états, comme par exemple: une température trop basse ou trop haute est enregistrée, il n'y a pas de connection réseau, ...&lt;br /&gt;
&lt;br /&gt;
(TODO - à implémenter tout court ;-)&lt;br /&gt;
&lt;br /&gt;
== all your data are belong to us ==&lt;br /&gt;
&lt;br /&gt;
Enfin, c'est bien beau d'afficher la température et l'humidité, c'est encore mieux de l'enregistrer quelque part pour pouvoir tracer l'historique, et intéragir plus facilement avec ces données.&lt;br /&gt;
&lt;br /&gt;
(TODO - à implémenter tout court ;-)&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Projets]]&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=CellarKare&amp;diff=2980</id>
		<title>CellarKare</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=CellarKare&amp;diff=2980"/>
		<updated>2015-10-28T21:04:53Z</updated>

		<summary type="html">&lt;p&gt;Quentin : /* Mark 3: Start, Stop, and say Cheese */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Un projet lancé par --[[Utilisateur:Quentin|Quentin]] ([[Discussion utilisateur:Quentin|discussion]]) 14 juin 2015 à 19:58 (CEST)&lt;br /&gt;
&lt;br /&gt;
= En bref =&lt;br /&gt;
&lt;br /&gt;
Le projet est de créer une &amp;quot;station météo&amp;quot; pour une cave à vin, d'où le nom du projet un peu fumeux de CellarKare = Cellar + Care, le K c'est pour faire joli ;-)&lt;br /&gt;
Dans un premier temps, le but est d'afficher la température et le taux d'humidité (hygrométrie). Ça, c'est pour le but fonctionnel. Mes autres buts sont:&lt;br /&gt;
* Au niveau perso: réaliser un premier projet à forte composante électronique, dans la foulée de notre formation Arduino&lt;br /&gt;
* Utiliser un maximum toutes les techniques/machines du Makilab&lt;br /&gt;
* Documenter les différentes étapes (tutoriel), et fournir les fichiers sources nécessaires aux différentes étapes.&lt;br /&gt;
&lt;br /&gt;
= Mark 1: Le matos et un premier proto Arduino=&lt;br /&gt;
&lt;br /&gt;
Le premier prototype sera relativement simple: la station affichera la température et l'humidité ambiante sur un écran LCD, le tout piloté par un Arduino Uno.&lt;br /&gt;
&lt;br /&gt;
== T° et humidité: DHT22 / AM2303 ==&lt;br /&gt;
&lt;br /&gt;
Au niveau des capteurs, logiquement il en faut un pour lire la température, et un pour lire l'humidité. Les deux existent certainement séparément, mais une rapide recherche sur le net done des références de capteurs déjà calibrés et fournissant les deux pour pas trop cher. Au final, mon choix se porte sur un DHT22. Ce capteur s'appelle aussi AM2303 dans sa version câblée. Quelques liens et documentation utiles:&lt;br /&gt;
* [http://www.adafruit.com/datasheets/DHT22.pdf Les specs du DHT22 (anglais)];&lt;br /&gt;
* Pour acheter: [http://www.adafruit.com/products/385 ~10 $ chez AdaFruit] ou [http://shop.mchobby.be/senseurs/214-dht22-am2302-senseur-humidite-temperature--3232100002142.html ~17 € chez MCHobby], c'est un peu plus cher, mais ils sont belges et sympas;&lt;br /&gt;
* [http://playground.arduino.cc/Main/DHTLib Un tutoriel pour arduino sur Arduino.cc];&lt;br /&gt;
* [https://learn.adafruit.com/dht/using-a-dhtxx-sensor Un tutoriel pour arduino sur AdaFruit], et sa [http://mchobby.be/wiki/index.php?title=DHTxx version française];&lt;br /&gt;
&lt;br /&gt;
== L'affichage LCD: LCM1602 ==&lt;br /&gt;
&lt;br /&gt;
Pour l'affichage, le choix a été vite fait... J'ai pris ce que j'avais sous la main, soit le LCD fourni dans le starter kit arduino. Cet écran est très répandu, et fait partie de nombreux &amp;quot;kits de démarrage&amp;quot; en électronique. Au niveau fonctionnel, avec 2 lignes de 16 charactères, on devrait pouvoir s'en sortir pour afficher une température et un taux d'humidité ;-). Son contrôleur (hitachi HD44780) est lui aussi très répandu En vrac:&lt;br /&gt;
* [http://www.datasheetspdf.com/datasheet/LCM1602.html Les specs (chinois ou anglais)]&lt;br /&gt;
* Pour acheter: [http://www.ebay.com/sch/items/?_nkw=lcm1602&amp;amp;_sacat=&amp;amp;_ex_kw=&amp;amp;_mPrRngCbx=1&amp;amp;_udlo=&amp;amp;_udhi=&amp;amp;_sop=12&amp;amp;_fpos=&amp;amp;_fspt=1&amp;amp;_sadis=&amp;amp;LH_CAds=&amp;amp;rmvSB=true on en trouve plein sur ebay...]&lt;br /&gt;
* [http://www.arduino.cc/en/Tutorial/LiquidCrystal La librairie LiquidCrystal, qui permet de le contrôler sur Arduino]&lt;br /&gt;
&lt;br /&gt;
== Le montage ==&lt;br /&gt;
&lt;br /&gt;
Le montage est assez simple, et n'est finalement qu'une combinaison des différents tutoriel et exemple d'utilisation de l'écran et du capteur.&lt;br /&gt;
&lt;br /&gt;
Sur le schéma du capteur DHT, la résistance de 10K sert de [https://fr.wikipedia.org/wiki/R%C3%A9sistance_de_rappel &amp;quot;résistance pull-up&amp;quot;].&lt;br /&gt;
'''Cette résistance n'est pas nécessaire dans le cas du capteur AM2302''' (la version avec câble et boitier en plastique, comme sur la photo). Cette version [http://www.adafruit.com/product/393 intègre une résistance de 5.1K dans le boîtier], qui connecte déjà VCC et DATA, merci Patrick pour l'info ;-).&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Cellarkare mark1 bb.png|500px|thumb|left]]&lt;br /&gt;
[[Fichier:Cellarkare_mark1.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Le code ==&lt;br /&gt;
Au niveau programmation du micro-controlleur Arduino, là aussi c'est assez simple: toutes les 3 secondes, on lit les valeurs de t° et humidité, et on les affiches sur l'écran LCD. Les valeurs mesurées et des messages supplémentaires sont aussi envoyés sur la sortie série.&lt;br /&gt;
&lt;br /&gt;
Le code est aussi disponible (et éventuellement mis à jour) [https://gitlab.com/qberten/cellarkare/blob/master/mark1_arduino/cellarkare_arduino.ino sur gitlab]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
CellarKare - Mark #1&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Un projet de station de mesure de la température et l'humidité dans une cave à vin&lt;br /&gt;
Plus d'infos et schéma de montage sur http://wiki.makilab.org/index.php/CellarKare&lt;br /&gt;
Quentin Berten, 2015 - Domaine public, licence WTFPL v2, http://www.wtfpl.net/&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
// Bibliothèque LiquidCrystal, pour l'écran LCD. Installée de base avec l'IDE&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Bibliothèque DHT, pour le capteur de température. Installable directement depuis&lt;br /&gt;
// l'IDE, via Sketch -&amp;gt; Include LIbrary -&amp;gt; Manage Libraries -&amp;gt; DHT sensor Library &lt;br /&gt;
#include &amp;quot;DHT.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Définition l'écran LCD, en argument les pins d'interface, dans l'ordre&lt;br /&gt;
// (RS pin, LCD Enable, D4, D5, D6, D7)&lt;br /&gt;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);&lt;br /&gt;
&lt;br /&gt;
// Définition des pin et type pour le senseur de t° et humidité&lt;br /&gt;
#define DHTPIN 7         // senseur (fil data, en jaune), sur pin 7&lt;br /&gt;
#define DHTTYPE DHT22    // type DHT 22  (AM2302)&lt;br /&gt;
&lt;br /&gt;
// Définition du capteur DHT22, pour un Arduino &amp;quot;normal&amp;quot; à 16mhz, comme le Uno&lt;br /&gt;
DHT dht(DHTPIN, DHTTYPE);&lt;br /&gt;
// les variables associées qui vont lire les valeurs (température, ...)&lt;br /&gt;
float hum;&lt;br /&gt;
float tempC;&lt;br /&gt;
float tempF;&lt;br /&gt;
float indiceHum;&lt;br /&gt;
&lt;br /&gt;
// les variables qui permettent de gérer le temps,&lt;br /&gt;
// voir http://www.arduino.cc/en/pmwiki.php?n=Tutorial/BlinkWithoutDelay&lt;br /&gt;
long prevMillis = 0;           // enregistre le temps de la denière lecture DHT22&lt;br /&gt;
long dhtInterval = 3000;       // L'intervalle de lecture du DHT22: 3 secondes&lt;br /&gt;
&lt;br /&gt;
// la procédure d'initialisation arduino&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  // on ouvre une connection série (pour afficher un maxium d'info)&lt;br /&gt;
  Serial.begin(9600); &lt;br /&gt;
  Serial.println(&amp;quot;CellarKare Mark #1 Test&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // initialisation du capteur&lt;br /&gt;
  dht.begin();&lt;br /&gt;
  // initialisation de l'écran, 16 colonnes et 2 lignes&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// la boucle principale arduino&lt;br /&gt;
void loop() {&lt;br /&gt;
  unsigned long curMillis = millis();&lt;br /&gt;
  &lt;br /&gt;
  if(curMillis - prevMillis &amp;lt; dhtInterval) {&lt;br /&gt;
    goto end_loop;        // pas de lecture DHT, on va à la fin de la boucle loop()&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // on enregistre le dernier temps d'exécution de la lecture&lt;br /&gt;
  prevMillis = curMillis;   &lt;br /&gt;
  &lt;br /&gt;
  // la lecture de la t° et l'humidité prends environ 250 millisecondes&lt;br /&gt;
  // mais les lectures du capteur peuvent etre vieillies de 2 secondes&lt;br /&gt;
  // le capteur n'est pas rapide (d'où l'attente de 3 secondes pour etre&lt;br /&gt;
  // certain d'avoir des lectures correctes.&lt;br /&gt;
  // lecture de l'humidité&lt;br /&gt;
  hum = dht.readHumidity();&lt;br /&gt;
  // lecture de la température en degrés Celsius&lt;br /&gt;
  tempC = dht.readTemperature();&lt;br /&gt;
  // lecture de la température en degrés Fahreneit&lt;br /&gt;
  tempF = dht.readTemperature(true);&lt;br /&gt;
  &lt;br /&gt;
  // On vérifie que les lectures on bien été réalisées. Si pas, on quitte&lt;br /&gt;
  // la boucle pour ré-essayer&lt;br /&gt;
  if (isnan(hum) || isnan(tempC) || isnan(tempF)) {&lt;br /&gt;
    Serial.println(&amp;quot;Lecture sur le capteur DHT ratée&amp;quot;);&lt;br /&gt;
    goto end_loop;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Calcul de l'indice de chaleur (voir https://fr.wikipedia.org/wiki/Indice_de_chaleur )&lt;br /&gt;
  // La température doit etre fournie en degré Fahreneit&lt;br /&gt;
  indiceHum = dht.computeHeatIndex(tempF, hum);&lt;br /&gt;
&lt;br /&gt;
  // On affiche les valeurs sur la console série (n'est pas indispensable)&lt;br /&gt;
  Serial.print(&amp;quot;Humidite: &amp;quot;); &lt;br /&gt;
  Serial.print(hum);&lt;br /&gt;
  Serial.print(&amp;quot; %\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temperature: &amp;quot;); &lt;br /&gt;
  Serial.print(tempC);&lt;br /&gt;
  Serial.print(&amp;quot; *C &amp;quot;);&lt;br /&gt;
  Serial.print(tempF);&lt;br /&gt;
  Serial.print(&amp;quot; *F\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Indice de chaleur: &amp;quot;);&lt;br /&gt;
  Serial.print(indiceHum);&lt;br /&gt;
  Serial.println(&amp;quot; *F&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  // On affiche les valeurs sur l'écran LCD, curseur à (0,0)&lt;br /&gt;
  lcd.setCursor(0, 0);&lt;br /&gt;
  // print Temp in C°&lt;br /&gt;
  lcd.print(&amp;quot;deg C: &amp;quot;);&lt;br /&gt;
  lcd.print(tempC);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;hum %: &amp;quot;);&lt;br /&gt;
  lcd.print(hum);&lt;br /&gt;
&lt;br /&gt;
  // label pour goto&lt;br /&gt;
  end_loop:&lt;br /&gt;
  ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== La conclusion ==&lt;br /&gt;
Un premier prototype fonctionnel, qui a au moins le mérite de vérifier que le capteur DHT renvoie des valeurs réalistes.&lt;br /&gt;
La suite: la même chose avec un Raspberry pi, pour bénéficier de sa faciliter à se connecter au réseau. Ce serait quand même cool de pouvoir lire ces valeurs sur un smartphone ;-)&lt;br /&gt;
&lt;br /&gt;
= Mark 2: la même chose avec un Raspberry Pi =&lt;br /&gt;
Le but de cette nouvelle itération: réaliser un montage équivalent avec un [https://www.raspberrypi.org/ Raspberry Pi] (RPi en abrégé). Pourquoi un RPi ?&lt;br /&gt;
* Parce que j'en avais un sous la main ;-)&lt;br /&gt;
* Parce qu'il permet de se connecter rapidement et facilement à un réseau, via ethernet (câble) ou wifi (via un dongle usb)&lt;br /&gt;
* Parce qu'il permet de brancher facilement un module caméra (on y viendra au Mark 3)&lt;br /&gt;
&lt;br /&gt;
Il est certainement possible d'arriver au même résultat avec d'autres cartes (comme par exemple un [http://www.arduino.cc/en/Main/ArduinoBoardYun Arduino Yun]), c'est juste que c'est un RPi que j'avais sous la main... Dans mon cas un Raspberry Pi B+.&lt;br /&gt;
&lt;br /&gt;
En ce qui concerne le RPi, quelques ressources très utiles:&lt;br /&gt;
* [http://mchobby.be/wiki/index.php?title=RaspberryPi-Accueil#Tutoriels Les tutoriels réalisés/traduits par MC Hobby. Une mine d'or]&lt;br /&gt;
* [http://www.elektronique.fr/montages/raspberry-pi/ Des exemples de montages et réalisations électroniques avec RPi]&lt;br /&gt;
* [http://pi.gadgetoid.com/pinout La configuration des différentes PIN du RPi]&lt;br /&gt;
&lt;br /&gt;
== L'installation de l'OS ==&lt;br /&gt;
La principale différence entre une carte Arduino et le RPi, c'est le cœur de la carte:&lt;br /&gt;
* le cœur de l'Arduino est un microcontrôleur, qui va exécuter le programme qu'on lui injecte de manière bête et méchante. Chaque entrée/sortie va devoir être programmée directement, il n'y a pas de système de driver, ...&lt;br /&gt;
* le cœur du RPi est un microprocesseur (ARM, la même technologie que dans les smartphones). Il s'agit donc en fait d'un véritable &amp;quot;petit ordinateur&amp;quot;, avec un système d'exploitation, des drivers (pour l'usb, l'écran, le wifi, ...).&lt;br /&gt;
&lt;br /&gt;
Donc avant de pouvoir démarrer et utiliser le RPi, il va falloir installer un système d'exploitation (OS: Operating System). C'est exactement la même chose qu'installer Windows sur un PC, c'est juste que dans notre cas, ce ne sera pas Windows mais un système Linux. Il en existe [https://www.raspberrypi.org/downloads/ plusieurs], le standard de facto étant Raspbian (une distribution Debian adaptée pour le RPi), c'est celle-là [http://raspbian-france.fr/installer-raspbian-premier-demarrage-configuration/ que j'ai installée].&lt;br /&gt;
&lt;br /&gt;
Petit truc pour les distraits: écran/clavier/souris ne sont pas indispensables pour l'installation, il est tout à fait possible de se connecter via [https://fr.wikipedia.org/wiki/Secure_Shell SSH] au RPi une fois son premier démarrage exécuté, pour autant qu'il soit raccordé à votre réseau (via son câble ethernet). Le RPi se déclare automatiquement sur le réseau avec le nom raspberry.local, et un &amp;lt;code&amp;gt;ssh pi@raspberry.local&amp;lt;/code&amp;gt; à fait l'affaire (raspberry, c'est son &amp;quot;hostname&amp;quot; par défaut). Pour le mot de passe, c'est &amp;lt;code&amp;gt;raspberry&amp;lt;/code&amp;gt; par défaut. Ensuite &amp;lt;code&amp;gt;raspi-config&amp;lt;/code&amp;gt; permet de terminer la procédure d'installation.&lt;br /&gt;
&lt;br /&gt;
En ce qui me concerne, tout le reste de la configuration se fera donc en [https://fr.wikipedia.org/wiki/Shell_Unix ligne de commande (shell)] via SSH. [http://mchobby.be/wiki/index.php?title=PI-SSH Le wiki de MCHobby] détaille l'accès via SSH au RPi.&lt;br /&gt;
&lt;br /&gt;
'''Un dernier point important''': le RPi, c'est comme un &amp;quot;vrai&amp;quot; ordinateur... il vaut mieux l'éteindre proprement plutôt que le débrancher sauvagement. Donc on s'arrange pour faire un &amp;lt;code&amp;gt;sudo poweroff&amp;lt;/code&amp;gt; en ligne de commande avant de le débrancher. Le gros risque: corrompre le système de fichier sur le carte SD, ce qui empêche le démarrage suivant, et impose un reformatage et une réinstallation complète. Pas drôle en somme, je parle d'expérience :-(&lt;br /&gt;
&lt;br /&gt;
== Le wifi ==&lt;br /&gt;
Bien que le RPi ne soit pas équipé par défaut du wifi, il est compatible avec la majorité des clefs usb wifi. Dans mon cas, une vieille clef Hercules HWGUSB2-54. Un petit tour par les log (&amp;lt;code&amp;gt;sudo tail -f /var/log/syslog&amp;lt;/code&amp;gt;) pour vérifier qu'elle est reconnue correctement lors du branchement, et puis une configuration via l'édition de &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt; pour entrer les références du réseau wifi:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
auto wlan0&lt;br /&gt;
allow-hotplug wlan0&lt;br /&gt;
iface wlan0 inet dhcp&lt;br /&gt;
wpa-ssid &amp;quot;Le_nom_(SSID)_de_votre_wifi&amp;quot;&lt;br /&gt;
wpa-psk &amp;quot;Le_mot_de_passe_de_votre_wifi&amp;quot;&lt;br /&gt;
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Ensuite un redémmarrage de la carte avec &amp;lt;code&amp;gt;$ sudo ifdown wlan0&amp;lt;/code&amp;gt; suivi de &amp;lt;code&amp;gt;sudo ifup wlan0&amp;lt;/code&amp;gt; et ça devrait être OK. On peut maintenant se passer de câble ethernet!&lt;br /&gt;
&lt;br /&gt;
Si nécessaire: plus de détails sur la configuration réseau sur [http://mchobby.be/wiki/index.php?title=Rasp-Config-Reseau le wiki MC Hobby]&lt;br /&gt;
&lt;br /&gt;
== La température avec le DHT22 / AM2302 ==&lt;br /&gt;
Pour la lecture des température avec le capteur, les gars d'Adafruit ont déjà développé un bibliothèque de fonctions utilisables en ligne de commande ou en [https://fr.wikipedia.org/wiki/Python_%28langage%29 python]. Quelques ressources:&lt;br /&gt;
* [https://learn.adafruit.com/dht-humidity-sensing-on-raspberry-pi-with-gdocs-logging/overview La page d'Adafruit (en anglais) sur l'utilisation du DHT22 avec le RPi]&lt;br /&gt;
* [http://www.manuel-esteban.com/lire-une-sonde-dht22-avec-un-raspberry-pi/ Une ressource en français (un peu datée) sur l'utilisation DHT22 + RPi.]&lt;br /&gt;
* [http://pi.gadgetoid.com/pinout La table de référence des 40 pins GPIO du RPi]&lt;br /&gt;
Pour ma part, j'ai suivi la méthode Adafruit, ce qui donne en résumé, en ligne de commande:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
cd /home/pi&lt;br /&gt;
git clone https://github.com/adafruit/Adafruit_Python_DHT.git &lt;br /&gt;
cd Adafruit_Python_DHT&lt;br /&gt;
sudo apt-get install build-essential python-dev  &lt;br /&gt;
sudo python setup.py install&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Au niveau du montage, rien de nouveau: le capteur doit toujours être alimenté en 3.3V ou en 5V, et le câble de lecture à une pin d'entrée/sortie (GPIO: General Purpose Input Output), ce qui donne:&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Cellarkare mark2 bb.png|400px|thumb|left]]&lt;br /&gt;
[[Fichier:Cellarkare_mark2.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Un test en ligne de commande permet de vérifier qu'on a une lecture sur le capteur (dans mon cas un AM2302 raccordé sur la pin GPIO 4):&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
cd /home/pi/Adafruit_Python_DHT/examples/&lt;br /&gt;
sudo ./AdafruitDHT.py 2302 4&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Ce qui affiche &amp;lt;code&amp;gt;Temp=23.0*C  Humidity=53.8%&amp;lt;/code&amp;gt;, des valeurs censées pour une après-midi d'été ;-)&lt;br /&gt;
&lt;br /&gt;
== L'affichage LCD ==&lt;br /&gt;
L'écran LCD est toujours le même que pour la version &amp;quot;Mark 1&amp;quot; Arduino. Quelques resources:&lt;br /&gt;
* [https://learn.adafruit.com/drive-a-16x2-lcd-directly-with-a-raspberry-pi Un tutoriel (en anglais) sur Adafruit] ''Attention, le code source n'est plus tellement a jour, voir le dernier lien Github.''&lt;br /&gt;
* [http://mchobby.be/wiki/index.php?title=Rasp-Hack-Afficheur-LCD La version française, traduite par MC Hobby]&lt;br /&gt;
* [https://github.com/adafruit/Adafruit_Python_CharLCD Le code source de la librairie Adafruit pour le gestion du LCD sur GitHub] ''contient la dernière version de la librairie''.&lt;br /&gt;
&lt;br /&gt;
La logique de raccordement est strictement identique au circuit du Mark 1. La seule différence est que la résistance variable de 10K dans le circuit est supprimée, la bibliothèque Adafruit pour le LCD permettant le pilotage en [https://fr.wikipedia.org/wiki/Modulation_de_largeur_d%27impulsion modulation PWM].&lt;br /&gt;
&lt;br /&gt;
== Le montage ==&lt;br /&gt;
Au final, le montage a été fait pour gagner un maximum de place sur mon breadboard. La pin data du DHT a été déplacée sur la pin 5, et le reste des pin pour le LCD sont documentées dans le code.&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Cellarkare mark2_2 bb.png|500px|thumb|left]]&lt;br /&gt;
[[Fichier:Cellarkare_mark2_2.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Le code ==&lt;br /&gt;
&lt;br /&gt;
La logique du code est identique à la version mark 1 - arduino. Ce code est aussi disponible (et éventuellement mis à jour) [https://gitlab.com/qberten/cellarkare/blob/master/mark2_rpi/cellarkare_rpi.py sur gitlab]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
# coding=utf8&lt;br /&gt;
# CellarKare - Mark 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
# Un projet de station de mesure de la température et l'humidité dans une cave à vin&lt;br /&gt;
# Plus d'infos et schéma de montage sur http://wiki.makilab.org/index.php/CellarKare&lt;br /&gt;
# Quentin Berten, 2015 - Domaine public, licence WTFPL v2, http://www.wtfpl.net/&lt;br /&gt;
# quentin_#AT#_berten.me&lt;br /&gt;
&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
# Bibliothèque CharLCD d'Adafruit, voir https://github.com/adafruit/Adafruit_Python_CharLCD&lt;br /&gt;
# pour l'installation&lt;br /&gt;
import Adafruit_CharLCD as LCD&lt;br /&gt;
# Bibliothèque DHT d'AdaFruit, voir https://github.com/adafruit/Adafruit_Python_DHT&lt;br /&gt;
# pour l'installation&lt;br /&gt;
import Adafruit_DHT as DHT&lt;br /&gt;
&lt;br /&gt;
# Configuration de l'affichage LCD&lt;br /&gt;
lcd_rs        = 25      # RS sur pin 25&lt;br /&gt;
lcd_en        = 24      # EN sur pin 24&lt;br /&gt;
lcd_d4        = 23      # D4 sur pin 23&lt;br /&gt;
lcd_d5        = 12      # D5 sur pin 12&lt;br /&gt;
lcd_d6        = 20      # D6 sur pin 20&lt;br /&gt;
lcd_d7        = 16      # D7 sur pin 16&lt;br /&gt;
lcd_backlight = 18      # rétro éclairage sur pin 18&lt;br /&gt;
lcd_columns   = 16      # Affichage à 16 colonnes ...&lt;br /&gt;
# Initialisation du LCD avec les variables ci-dessus&lt;br /&gt;
lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, &lt;br /&gt;
		        	lcd_columns, lcd_rows, lcd_backlight)&lt;br /&gt;
# Configuration pour le capteur DHT, soit DHT11, DHT22 ou AM2302.&lt;br /&gt;
dht_sensor    = DHT.AM2302  # Type AM2302&lt;br /&gt;
dht_pin       = 5           # DHT data sur pin 5&lt;br /&gt;
&lt;br /&gt;
# les variables qui permettent de gérer le temps,&lt;br /&gt;
prevMillis = 0          # enregistre le temps de la denière lecture DHT22&lt;br /&gt;
secInterval = 1000      # Un intervalle d'une seconde&lt;br /&gt;
# L'intervalle de lecture du DHT22: 3 secondes, doit etre plus grand que secInterval&lt;br /&gt;
dhtInterval = 3000&lt;br /&gt;
&lt;br /&gt;
def read_and_print_dht():&lt;br /&gt;
    # On lit une valeur sur le senseur avec la fonction read. Attention, cette fonction&lt;br /&gt;
    # ne réessaie pas automatiquement en cas d'erreur, mais fournit les valeurs (None, None).&lt;br /&gt;
    hum, tempC  = DHT.read(dht_sensor, dht_pin)&lt;br /&gt;
&lt;br /&gt;
    # On vérifie que l'on a bien eu une lecture (Linux n'est pas un OS temps réel et ne&lt;br /&gt;
    # peut pas garantir le timing des lectures sur le capteur). Si ça arrive, on réessaie.&lt;br /&gt;
    # On affiche les valeurs sur la console (n'est pas indispensable)&lt;br /&gt;
    if hum is not None and tempC is not None:&lt;br /&gt;
    	print 'Temp={0:0.2f}*C  Humidity={1:0.2f}%'.format(tempC, hum)&lt;br /&gt;
        # On affiche les valeurs sur l'écran LCD&lt;br /&gt;
        lcd.clear()&lt;br /&gt;
        lcd.message('deg C: {0:0.2f}\nhum %: {1:0.2f}'.format(tempC, hum))&lt;br /&gt;
    else:&lt;br /&gt;
	print 'Lecture sur le capteur DHT ratée'&lt;br /&gt;
&lt;br /&gt;
# Boucle principale, l'équivalent de void loop() sur Arduino&lt;br /&gt;
while 1:&lt;br /&gt;
    # On lit le nombre de millisecondes courant&lt;br /&gt;
    curMillis = time.time()*1000&lt;br /&gt;
    if curMillis - prevMillis &amp;gt; dhtInterval:&lt;br /&gt;
        # On essaie de lire et afficher les valeurs du DHT&lt;br /&gt;
        read_and_print_dht()&lt;br /&gt;
        # on enregistre le dernier temps d'exécution de la lecture&lt;br /&gt;
        prevMillis = curMillis&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== La conclusion ==&lt;br /&gt;
En vrac:&lt;br /&gt;
* Pas de gros problème ou obstacles majeurs pour convertir le montage et le code Arduino en son équivalent RPi. Mais heureusement que l'équipe d'Adafruit a déjà programmé les bibliothèques Python qui vont bien!&lt;br /&gt;
* Au niveau du breadboard, ça commence à prendre de la place... Une solution: passer en [https://fr.wikipedia.org/wiki/I2C &amp;quot;I2C&amp;quot;] pour le capteur et le LCD, ce qui limite drastiquement le nombre de pins nécessaires pour le montage, et facilite la programmation. Merci Patrick pour les infos, ce sera sûrement utile pour le prochain montage ;-) !&lt;br /&gt;
** Par exemple, pour la température: un capteur I2C comme le [https://www.adafruit.com/products/1638 SHT15], et pour l'écran, [http://www.electrodragon.com/w/index.php?title=1602_LCD_I2C/SPI_Module la version I2C du même 1602].&lt;br /&gt;
** Par contre dans ce cas, il faut faire gaffe au fait que le passage en 3.3V pour la logique du RPi, le lcd reste en 5V et il faudra ajouter un [http://www.adafruit.com/products/757 convertisseurs de niveau] pour le bus si utilisé avec un capteur qui ne supporte pas 5V.&lt;br /&gt;
* le langage Python, c'est pas plus compliqué que le simili-C de l'Arduino une fois qu'on est rentré dedans.&lt;br /&gt;
&lt;br /&gt;
= Mark 3: Start, Stop, and say Cheese =&lt;br /&gt;
&lt;br /&gt;
== Sart/Stop ==&lt;br /&gt;
Un &amp;quot;problème&amp;quot; du RPi, c'est qu'il n'a pas de bouton ON/OFF simple, et par conséquent, l'éteindre proprement avec &amp;lt;code&amp;gt;sudo halt&amp;lt;/code&amp;gt; ou  &amp;lt;code&amp;gt;sudo poweroff&amp;lt;/code&amp;gt; est impossible sans un accès physique (clavier et écran connectés) ou une connection SSH (connection à distance). Pas pratique pour un boitier qui sera installé dans une cave à vin...&lt;br /&gt;
&lt;br /&gt;
Autrement dit, mes besoins:&lt;br /&gt;
# Le programme python d'affichage et monitoring des températures démarre automatiquement lorsque le RPi démarre.&lt;br /&gt;
# Un bouton OFF permet d'éteindre proprement le RPi avant de le débrancher de son alimentation.&lt;br /&gt;
# Un bouton ON permet de l'allumer une fois éteint sans débrancher/rebrancher son alimentation.&lt;br /&gt;
# Nec plus ultra: avoir un fonctionnement similaire à un bouton ON/OFF d'un laptop par exemple: si éteint, le bouton allume, si allumé, le bouton éteint proprement le RPi, et coupe l'alimentation USB.&lt;br /&gt;
&lt;br /&gt;
Bon après quelques recherches sur le net:&lt;br /&gt;
# C'est simple, il suffit de configurer le &amp;quot;init script&amp;quot; du RPi pour lancer automatiquement le programme python au démarrage&lt;br /&gt;
# Un montage simple permet d'écouter sur une des pins du GPIO, et de lancer la procédure propre d'arrêt (shutdown). Soit un bouton OFF&lt;br /&gt;
# Le RPi (à partir du modèle B rev2, soit Brev2, B+ et 2) possède un pinout &amp;quot;reset&amp;quot;, qui n'est pas soudé de base sur la carte. Si on raccorde ces deux pins, le RPi redémarre électriquement (hard reboot). Donc sans s'éteindre proprement. L'intérêt, c'est que si le RPi est éteint mais encore sous tension, ce bouton permet de le ré-allumer. Donc un bouton ON/RESET. Voir par exemple:&lt;br /&gt;
#* Un article assez complet en anglais sur [http://www.makeuseof.com/tag/add-reset-switch-raspberry-pi/ MakeUseOf.com]&lt;br /&gt;
# Le bouton combiné ON/OFF unique est possible, mais le montage est plus compliqué. Quelques exemples:&lt;br /&gt;
#* Un montage en français sur le site [http://forum.madeinfr.org/topic/43/raspower/ MadeInFR.org].&lt;br /&gt;
#* Un montage en anglais à base de micro contrôleur (pas simple donc) sur [http://www.instructables.com/id/Raspberry-Pi-Shutdown-Button/ Instructables]&lt;br /&gt;
#* Un article très complet en anglais reprenant toutes les options, dont un montage assez simple de bouton unique [http://www.raspberry-pi-geek.com/Archive/2013/01/Adding-an-On-Off-switch-to-your-Raspberry-Pi sur raspberry-pi-geek.com]&lt;br /&gt;
#* Des solutions commerciales toutes faites comme [https://www.pi-supply.com/product/pi-supply-raspberry-pi-power-switch/ PiSupply] ou [http://www.mausberrycircuits.com/collections/frontpage MausberryCircuits]&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, ce sera pour moi le choix suivant: un bouton OFF, qui lors d'un appui long éteint proprement le RPi. En gros la solution 2.&lt;br /&gt;
&lt;br /&gt;
Mais dans un premier temps, il faut configurer le RPi pour lancer le programme au démarrage...&lt;br /&gt;
&lt;br /&gt;
== Lancement du programme via initscript ==&lt;br /&gt;
&lt;br /&gt;
Il y a certainement 36 façons d'arriver au même résultat (après tout, le RPi tourne sous Linux ;-), mais dans mon cas, la solution qui me convient bien: un script d'init lance par défaut le script python localisé en &amp;lt;code&amp;gt;/usr/local/bin/pystartup.py&amp;lt;/code&amp;gt;. L'intérêt de la chose: &amp;lt;code&amp;gt;pystartup.py&amp;lt;/code&amp;gt; peut être un lien symbolique vers n'importe quel autre script.&lt;br /&gt;
&lt;br /&gt;
Pour éviter d'encombrer le wiki, je n'ai pas repris le script ici, mais il est dispo sur [https://gitlab.com/qberten/cellarkare/blob/master/mark3_camera/initscript_pystartup GitLab]. Pour l'installation, en ligne de commande (connecté sur le RPi):&lt;br /&gt;
&lt;br /&gt;
On télécharge le script, on le déplace au bon endroit et on le rend exécutable&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
wget https://gitlab.com/qberten/cellarkare/raw/master/mark3_camera/initscript_pystartup&lt;br /&gt;
sudo mv initscript_pystartup /etc/init.d/pystartup&lt;br /&gt;
sudo chmod a+x /etc/init.d/pystartup&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
On crée le lien symbolique qui va bien (remplacer /chemin/vers/... par la localisation du programme à lancer)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
ln -s /chemin/vers/votre/script/python.py /usr/local/bin/pystartup.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
On configure le système pour qu'il connaisse le nouveau script &amp;quot;pystartup&amp;quot;, et on lui demande de l'exécuter à chaque démarrage&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo update-rc.d pystartup defaults&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Il est ensuite possible de lancer son programme en arrière plan comme n'importe quel autre service avec &amp;lt;code&amp;gt;sudo service pystartup start&amp;lt;/code&amp;gt;, de l'arrêter avec &amp;lt;code&amp;gt;sudo service pystartup stop&amp;lt;/code&amp;gt;, etc&lt;br /&gt;
&lt;br /&gt;
== Pinout RESET ==&lt;br /&gt;
&lt;br /&gt;
Activer le &amp;quot;hard&amp;quot; reset sur le Rpi suppose un peu de soudure, mais rien de bien effrayant, 2 points suffisent. Un fois les connecteur pinout soudés, quand on raccorde les deux pins (par exemple avec un interrupteur), le RPi redémarre (&amp;quot;hard&amp;quot; reset, donc attention à la carte SD...), ou s'allume (si il était raccordé au secteur).&lt;br /&gt;
&lt;br /&gt;
J'ai soudé les 2 pins et testé la fonction, mais comme il s'agit d'un redémarrage &amp;quot;hard&amp;quot;, je n'ai finalement pas vraiment vu l'utilité dans ce projet: autant directement débrancher / rebrancher le câble d'alimentation dans ce cas.&lt;br /&gt;
&lt;br /&gt;
Mais à toutes fins utiles, les photos de l'opération, avant/après.&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Rpi_reset_before.jpg|500px|thumb|left]]&lt;br /&gt;
[[Fichier:Rpi_reset_after.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bouton OFF ==&lt;br /&gt;
&lt;br /&gt;
Rien de très compliqué: on raccorde le bouton à une entrée, on configure la résistance pull-up/down interne du Rpi, on s'assure de récupérer les évènements dans le code.&lt;br /&gt;
&lt;br /&gt;
Les parties utiles du code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# La fonction qui effectuer l'arrêt propre du RPi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def btn_proper_halt(pin):&lt;br /&gt;
    global off_state, cur_millis, off_millis&lt;br /&gt;
    # On lit le nombre de millisecondes courant&lt;br /&gt;
    cur_millis = time.time()*1000&lt;br /&gt;
    # Utilise la variable globale off_state&lt;br /&gt;
    off_state = not off_state&lt;br /&gt;
    # DEBUG&lt;br /&gt;
    logging.debug(&amp;quot;Bouton OFF_PIN pressé, son état est maintenant %s&amp;quot; % str(off_state))&lt;br /&gt;
    if off_state == True:&lt;br /&gt;
        off_millis = cur_millis   &lt;br /&gt;
    elif off_state == False: &lt;br /&gt;
        # DEBUG&lt;br /&gt;
        logging.debug(&amp;quot;Bouton OFF_PIN pressé pendant {0:0.0f} ms&amp;quot;.format(cur_millis - off_millis))&lt;br /&gt;
        if (cur_millis - off_millis) &amp;gt; OFF_INTERVAL:&lt;br /&gt;
            # On a relâché le bouton avec un écart long =&amp;gt; shutdown&lt;br /&gt;
            logging.debug(&amp;quot;Appui long sur le bouton OFF_PIN&amp;quot;)&lt;br /&gt;
            logging.info(&amp;quot;Arrêt du Raspberry PI, attendre encore 10 sec avant de débrancher&amp;quot;)&lt;br /&gt;
            subprocess.call('halt', shell=False)&lt;br /&gt;
        else:&lt;br /&gt;
            # Appuis court =&amp;gt; on ne fait rien&lt;br /&gt;
            logging.debug(&amp;quot;Appui court sur le bouton OFF_PIN&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Fonction de terminaison du programme (appelée lorsque le script est arrêté&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def terminate():&lt;br /&gt;
    logging.debug(&amp;quot;Terminate function started&amp;quot;)&lt;br /&gt;
    # efface l'écran LCD&lt;br /&gt;
    lcd_dim_backlight(0.0, 0.2)&lt;br /&gt;
    lcd.clear()&lt;br /&gt;
    logging.debug(&amp;quot;Terminate function ended&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Fonction d'initialisation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def initialize():&lt;br /&gt;
    global lcd&lt;br /&gt;
    logging.debug(&amp;quot;Initialize function started&amp;quot;)&lt;br /&gt;
    # Initialisation du LCD avec les variables ci-dessus&lt;br /&gt;
    lcd = LCD.Adafruit_CharLCD(LCD_RS, LCD_EN, LCD_D4, LCD_D5, LCD_D6, LCD_D7, &lt;br /&gt;
		        	LCD_COLUMNS, LCD_ROWS,&lt;br /&gt;
                                LCD_BACKLIGHT, invert_polarity = False, enable_pwm = True,&lt;br /&gt;
                                initial_backlight = lcd_backlight)&lt;br /&gt;
    # Initialisation des autres GPIO's&lt;br /&gt;
    GPIO.setmode(GPIO.BCM)        # On utilise la numérotation BCM pour les PIN&lt;br /&gt;
    # On définit la pin OFF_PIN comme entrée, et on active la résistance pull-down interne du RPi&lt;br /&gt;
    GPIO.setup(OFF_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)&lt;br /&gt;
    # Configure une interruption qui va détecter les mouvements up et down sur le bouton&lt;br /&gt;
    GPIO.add_event_detect(OFF_PIN, GPIO.BOTH, callback=btn_proper_halt, bouncetime=20)&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Say &amp;quot;cheese&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Cette partie du projet s'attache à pouvoir prendre rapidement et facilement un photos des étiquettes des bouteilles entrées ou sorties de la cave. Ben oui, j'ai pas forcément une bonne mémoire, et se donner les moyens d'enregistrer facilement et rapidement l'info est le meilleur moyen de suivre son stock ;-)&lt;br /&gt;
&lt;br /&gt;
Cette partie est super simple à réaliser avec le rpi: on raccorde la caméra, on s'assure qu'elle est activée avec &amp;lt;code&amp;gt;sudo raspi-config&amp;lt;/code&amp;gt;, et on peut ensuite l'utiliser en ligne de commande ou en python. Le site web [https://www.raspberrypi.org/documentation/usage/camera/README.md raspberrypi.org (en anglais)] explique cela très bien.&lt;br /&gt;
&lt;br /&gt;
On ajoute un deuxième bouton sur le breadboard, qui déclenche la prise d'une photo, et le prototype est maintenant fonctionnel. Les photos sont sauvegardées dans le répertoire courant du RPi, avec la date et l'heure pour nom de fichier.&lt;br /&gt;
&lt;br /&gt;
Au niveau du code, les parties utiles sont:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Fonction de prise d'une photo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def btn_take_picture(pin):&lt;br /&gt;
    # DEBUG&lt;br /&gt;
    logging.info(&amp;quot;Bouton CAM_PIN pressé, on prend un photo&amp;quot;)&lt;br /&gt;
    # Construction du chemin pour la photo&lt;br /&gt;
    now = datetime.datetime.now()&lt;br /&gt;
    pic_filename = &amp;quot;/home/qb/pic_&amp;quot; + str(now) + &amp;quot;.jpg&amp;quot;&lt;br /&gt;
    # Initialisation de la camera. On ne le fait pas dans initialize() pour éviter au maximum de la laisser&lt;br /&gt;
    # allumée (et consommer) en continu. En plus, une fois activée, les lectures sur le DHT sont beaucoup&lt;br /&gt;
    # plus souvent ratées.&lt;br /&gt;
    with PICAM.PiCamera() as cam:&lt;br /&gt;
        cam.capture(pic_filename)&lt;br /&gt;
        logging.debug(&amp;quot;Photos sauvée &amp;quot; + str(cam.resolution) + &amp;quot;  dans &amp;quot; + pic_filename)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pimp my screen ==&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est d'allumer ou éteindre l'écran, la bibliothèque CharLCD permet la modulation PWN du rétroéclairage. De quoi avoir un chouette effet de fondu au noir lorsque l'écran s'allume et s'éteint.&lt;br /&gt;
&lt;br /&gt;
Au niveau du code, la partie utile:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Module l'intensité du rétro éclairage de l'écran lcd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def lcd_dim_backlight(backlight_value, time_step):&lt;br /&gt;
    global lcd&lt;br /&gt;
    global lcd_backlight&lt;br /&gt;
    # calcule l'incrément à avoir entre lcd_backlight et backlight_value&lt;br /&gt;
    stp = (lcd_backlight &amp;gt; backlight_value) * -2 +1&lt;br /&gt;
    brightnesses = map(lambda x: x/10.0, range(int(lcd_backlight*10), int(backlight_value*10)+1, stp))&lt;br /&gt;
    for bright in brightnesses:&lt;br /&gt;
        lcd_backlight = bright&lt;br /&gt;
        logging.debug(&amp;quot;loop on bright= &amp;quot; + str(bright))&lt;br /&gt;
        lcd.set_backlight(bright)&lt;br /&gt;
        time.sleep(time_step)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Le code et le montage ==&lt;br /&gt;
&lt;br /&gt;
Le code source complet pour [Mark 3 est disponible sur gitlab | https://gitlab.com/qberten/cellarkare/blob/master/mark3_camera/cellarkare_cam.py]. Pour ce qui est du montage, ben pas de schéma de raccordement disponible, j'ai oublié de le documenter en temps utile avant de passer à Mark 4! Donc il faudra attendre la suite...&lt;br /&gt;
&lt;br /&gt;
= Mark 4: We are (almost) done =&lt;br /&gt;
&lt;br /&gt;
== Pimp my screen, reloaded ==&lt;br /&gt;
Une dernière petite touche intéressante: l'appareil est destiné à être mis dans une cave à vin, endroit où il va faire noir la plupart du temps. En conséquence, l'écran LCD n'a pas vraiment besoin d'être allumé en permanence, pourquoi ne pas l'allumer automatiquement quand la lumière du local dépasse un certain seuil. Une photorésistance permet de réaliser rapidement la mesure d'une intensité lumineuse, pourquoi s'en priver... Oui mais... le RPi n'a pas d'entrée analogique, comment convertir simplement la mesure sur la photorésistance en une valeur analogique, alors que le RPi n'a que des entrées digitales.&lt;br /&gt;
&lt;br /&gt;
Après un peu de recherche, un montage simple à base d'une capacité dont le temps de charge sera directement proportionnel à la mesure sur la photo-résistance. Tout cela est expliqué ici (en anglais): [http://www.raspberrypi-spy.co.uk/2012/08/reading-analogue-sensors-with-one-gpio-pin/]&lt;br /&gt;
&lt;br /&gt;
(TODO - continuer la documentation)&lt;br /&gt;
&lt;br /&gt;
== Buttons, buttons, we want more ==&lt;br /&gt;
&lt;br /&gt;
Dernier petit détail, et non des moindre, Pour avoir un projet réellement fonctionnel, il va falloir travailler un peu l'interface homme-machine, et permettre un peu plus d'interaction avec le Rpi, pour par exemple permettre d'entrer le nombre de bouteilles couvertes par l'entrée ou la sortie photographiée, quitter/valider une action, ...&lt;br /&gt;
&lt;br /&gt;
(TODO - continuer la documentation)&lt;br /&gt;
&lt;br /&gt;
== we want leds ==&lt;br /&gt;
&lt;br /&gt;
Toujours dans l'optique d'améliorer l'interaction avec l'appareil, pourquoi ne pas intégrer une led de status sur l'appareil, pour indiquer visuellement différents états, comme par exemple: une température trop basse ou trop haute est enregistrée, il n'y a pas de connection réseau, ...&lt;br /&gt;
&lt;br /&gt;
(TODO - à implémenter tout court ;-)&lt;br /&gt;
&lt;br /&gt;
== all your data are belong to us ==&lt;br /&gt;
&lt;br /&gt;
Enfin, c'est bien beau d'afficher la température et l'humidité, c'est encore mieux de l'enregistrer quelque part pour pouvoir tracer l'historique, et intéragir plus facilement avec ces données.&lt;br /&gt;
&lt;br /&gt;
(TODO - à implémenter tout court ;-)&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Projets]]&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=CellarKare&amp;diff=2979</id>
		<title>CellarKare</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=CellarKare&amp;diff=2979"/>
		<updated>2015-10-28T21:01:29Z</updated>

		<summary type="html">&lt;p&gt;Quentin : /* Mark 3: Start, Stop, and say Cheese */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Un projet lancé par --[[Utilisateur:Quentin|Quentin]] ([[Discussion utilisateur:Quentin|discussion]]) 14 juin 2015 à 19:58 (CEST)&lt;br /&gt;
&lt;br /&gt;
= En bref =&lt;br /&gt;
&lt;br /&gt;
Le projet est de créer une &amp;quot;station météo&amp;quot; pour une cave à vin, d'où le nom du projet un peu fumeux de CellarKare = Cellar + Care, le K c'est pour faire joli ;-)&lt;br /&gt;
Dans un premier temps, le but est d'afficher la température et le taux d'humidité (hygrométrie). Ça, c'est pour le but fonctionnel. Mes autres buts sont:&lt;br /&gt;
* Au niveau perso: réaliser un premier projet à forte composante électronique, dans la foulée de notre formation Arduino&lt;br /&gt;
* Utiliser un maximum toutes les techniques/machines du Makilab&lt;br /&gt;
* Documenter les différentes étapes (tutoriel), et fournir les fichiers sources nécessaires aux différentes étapes.&lt;br /&gt;
&lt;br /&gt;
= Mark 1: Le matos et un premier proto Arduino=&lt;br /&gt;
&lt;br /&gt;
Le premier prototype sera relativement simple: la station affichera la température et l'humidité ambiante sur un écran LCD, le tout piloté par un Arduino Uno.&lt;br /&gt;
&lt;br /&gt;
== T° et humidité: DHT22 / AM2303 ==&lt;br /&gt;
&lt;br /&gt;
Au niveau des capteurs, logiquement il en faut un pour lire la température, et un pour lire l'humidité. Les deux existent certainement séparément, mais une rapide recherche sur le net done des références de capteurs déjà calibrés et fournissant les deux pour pas trop cher. Au final, mon choix se porte sur un DHT22. Ce capteur s'appelle aussi AM2303 dans sa version câblée. Quelques liens et documentation utiles:&lt;br /&gt;
* [http://www.adafruit.com/datasheets/DHT22.pdf Les specs du DHT22 (anglais)];&lt;br /&gt;
* Pour acheter: [http://www.adafruit.com/products/385 ~10 $ chez AdaFruit] ou [http://shop.mchobby.be/senseurs/214-dht22-am2302-senseur-humidite-temperature--3232100002142.html ~17 € chez MCHobby], c'est un peu plus cher, mais ils sont belges et sympas;&lt;br /&gt;
* [http://playground.arduino.cc/Main/DHTLib Un tutoriel pour arduino sur Arduino.cc];&lt;br /&gt;
* [https://learn.adafruit.com/dht/using-a-dhtxx-sensor Un tutoriel pour arduino sur AdaFruit], et sa [http://mchobby.be/wiki/index.php?title=DHTxx version française];&lt;br /&gt;
&lt;br /&gt;
== L'affichage LCD: LCM1602 ==&lt;br /&gt;
&lt;br /&gt;
Pour l'affichage, le choix a été vite fait... J'ai pris ce que j'avais sous la main, soit le LCD fourni dans le starter kit arduino. Cet écran est très répandu, et fait partie de nombreux &amp;quot;kits de démarrage&amp;quot; en électronique. Au niveau fonctionnel, avec 2 lignes de 16 charactères, on devrait pouvoir s'en sortir pour afficher une température et un taux d'humidité ;-). Son contrôleur (hitachi HD44780) est lui aussi très répandu En vrac:&lt;br /&gt;
* [http://www.datasheetspdf.com/datasheet/LCM1602.html Les specs (chinois ou anglais)]&lt;br /&gt;
* Pour acheter: [http://www.ebay.com/sch/items/?_nkw=lcm1602&amp;amp;_sacat=&amp;amp;_ex_kw=&amp;amp;_mPrRngCbx=1&amp;amp;_udlo=&amp;amp;_udhi=&amp;amp;_sop=12&amp;amp;_fpos=&amp;amp;_fspt=1&amp;amp;_sadis=&amp;amp;LH_CAds=&amp;amp;rmvSB=true on en trouve plein sur ebay...]&lt;br /&gt;
* [http://www.arduino.cc/en/Tutorial/LiquidCrystal La librairie LiquidCrystal, qui permet de le contrôler sur Arduino]&lt;br /&gt;
&lt;br /&gt;
== Le montage ==&lt;br /&gt;
&lt;br /&gt;
Le montage est assez simple, et n'est finalement qu'une combinaison des différents tutoriel et exemple d'utilisation de l'écran et du capteur.&lt;br /&gt;
&lt;br /&gt;
Sur le schéma du capteur DHT, la résistance de 10K sert de [https://fr.wikipedia.org/wiki/R%C3%A9sistance_de_rappel &amp;quot;résistance pull-up&amp;quot;].&lt;br /&gt;
'''Cette résistance n'est pas nécessaire dans le cas du capteur AM2302''' (la version avec câble et boitier en plastique, comme sur la photo). Cette version [http://www.adafruit.com/product/393 intègre une résistance de 5.1K dans le boîtier], qui connecte déjà VCC et DATA, merci Patrick pour l'info ;-).&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Cellarkare mark1 bb.png|500px|thumb|left]]&lt;br /&gt;
[[Fichier:Cellarkare_mark1.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Le code ==&lt;br /&gt;
Au niveau programmation du micro-controlleur Arduino, là aussi c'est assez simple: toutes les 3 secondes, on lit les valeurs de t° et humidité, et on les affiches sur l'écran LCD. Les valeurs mesurées et des messages supplémentaires sont aussi envoyés sur la sortie série.&lt;br /&gt;
&lt;br /&gt;
Le code est aussi disponible (et éventuellement mis à jour) [https://gitlab.com/qberten/cellarkare/blob/master/mark1_arduino/cellarkare_arduino.ino sur gitlab]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
CellarKare - Mark #1&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Un projet de station de mesure de la température et l'humidité dans une cave à vin&lt;br /&gt;
Plus d'infos et schéma de montage sur http://wiki.makilab.org/index.php/CellarKare&lt;br /&gt;
Quentin Berten, 2015 - Domaine public, licence WTFPL v2, http://www.wtfpl.net/&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
// Bibliothèque LiquidCrystal, pour l'écran LCD. Installée de base avec l'IDE&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Bibliothèque DHT, pour le capteur de température. Installable directement depuis&lt;br /&gt;
// l'IDE, via Sketch -&amp;gt; Include LIbrary -&amp;gt; Manage Libraries -&amp;gt; DHT sensor Library &lt;br /&gt;
#include &amp;quot;DHT.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Définition l'écran LCD, en argument les pins d'interface, dans l'ordre&lt;br /&gt;
// (RS pin, LCD Enable, D4, D5, D6, D7)&lt;br /&gt;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);&lt;br /&gt;
&lt;br /&gt;
// Définition des pin et type pour le senseur de t° et humidité&lt;br /&gt;
#define DHTPIN 7         // senseur (fil data, en jaune), sur pin 7&lt;br /&gt;
#define DHTTYPE DHT22    // type DHT 22  (AM2302)&lt;br /&gt;
&lt;br /&gt;
// Définition du capteur DHT22, pour un Arduino &amp;quot;normal&amp;quot; à 16mhz, comme le Uno&lt;br /&gt;
DHT dht(DHTPIN, DHTTYPE);&lt;br /&gt;
// les variables associées qui vont lire les valeurs (température, ...)&lt;br /&gt;
float hum;&lt;br /&gt;
float tempC;&lt;br /&gt;
float tempF;&lt;br /&gt;
float indiceHum;&lt;br /&gt;
&lt;br /&gt;
// les variables qui permettent de gérer le temps,&lt;br /&gt;
// voir http://www.arduino.cc/en/pmwiki.php?n=Tutorial/BlinkWithoutDelay&lt;br /&gt;
long prevMillis = 0;           // enregistre le temps de la denière lecture DHT22&lt;br /&gt;
long dhtInterval = 3000;       // L'intervalle de lecture du DHT22: 3 secondes&lt;br /&gt;
&lt;br /&gt;
// la procédure d'initialisation arduino&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  // on ouvre une connection série (pour afficher un maxium d'info)&lt;br /&gt;
  Serial.begin(9600); &lt;br /&gt;
  Serial.println(&amp;quot;CellarKare Mark #1 Test&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // initialisation du capteur&lt;br /&gt;
  dht.begin();&lt;br /&gt;
  // initialisation de l'écran, 16 colonnes et 2 lignes&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// la boucle principale arduino&lt;br /&gt;
void loop() {&lt;br /&gt;
  unsigned long curMillis = millis();&lt;br /&gt;
  &lt;br /&gt;
  if(curMillis - prevMillis &amp;lt; dhtInterval) {&lt;br /&gt;
    goto end_loop;        // pas de lecture DHT, on va à la fin de la boucle loop()&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // on enregistre le dernier temps d'exécution de la lecture&lt;br /&gt;
  prevMillis = curMillis;   &lt;br /&gt;
  &lt;br /&gt;
  // la lecture de la t° et l'humidité prends environ 250 millisecondes&lt;br /&gt;
  // mais les lectures du capteur peuvent etre vieillies de 2 secondes&lt;br /&gt;
  // le capteur n'est pas rapide (d'où l'attente de 3 secondes pour etre&lt;br /&gt;
  // certain d'avoir des lectures correctes.&lt;br /&gt;
  // lecture de l'humidité&lt;br /&gt;
  hum = dht.readHumidity();&lt;br /&gt;
  // lecture de la température en degrés Celsius&lt;br /&gt;
  tempC = dht.readTemperature();&lt;br /&gt;
  // lecture de la température en degrés Fahreneit&lt;br /&gt;
  tempF = dht.readTemperature(true);&lt;br /&gt;
  &lt;br /&gt;
  // On vérifie que les lectures on bien été réalisées. Si pas, on quitte&lt;br /&gt;
  // la boucle pour ré-essayer&lt;br /&gt;
  if (isnan(hum) || isnan(tempC) || isnan(tempF)) {&lt;br /&gt;
    Serial.println(&amp;quot;Lecture sur le capteur DHT ratée&amp;quot;);&lt;br /&gt;
    goto end_loop;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Calcul de l'indice de chaleur (voir https://fr.wikipedia.org/wiki/Indice_de_chaleur )&lt;br /&gt;
  // La température doit etre fournie en degré Fahreneit&lt;br /&gt;
  indiceHum = dht.computeHeatIndex(tempF, hum);&lt;br /&gt;
&lt;br /&gt;
  // On affiche les valeurs sur la console série (n'est pas indispensable)&lt;br /&gt;
  Serial.print(&amp;quot;Humidite: &amp;quot;); &lt;br /&gt;
  Serial.print(hum);&lt;br /&gt;
  Serial.print(&amp;quot; %\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temperature: &amp;quot;); &lt;br /&gt;
  Serial.print(tempC);&lt;br /&gt;
  Serial.print(&amp;quot; *C &amp;quot;);&lt;br /&gt;
  Serial.print(tempF);&lt;br /&gt;
  Serial.print(&amp;quot; *F\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Indice de chaleur: &amp;quot;);&lt;br /&gt;
  Serial.print(indiceHum);&lt;br /&gt;
  Serial.println(&amp;quot; *F&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  // On affiche les valeurs sur l'écran LCD, curseur à (0,0)&lt;br /&gt;
  lcd.setCursor(0, 0);&lt;br /&gt;
  // print Temp in C°&lt;br /&gt;
  lcd.print(&amp;quot;deg C: &amp;quot;);&lt;br /&gt;
  lcd.print(tempC);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;hum %: &amp;quot;);&lt;br /&gt;
  lcd.print(hum);&lt;br /&gt;
&lt;br /&gt;
  // label pour goto&lt;br /&gt;
  end_loop:&lt;br /&gt;
  ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== La conclusion ==&lt;br /&gt;
Un premier prototype fonctionnel, qui a au moins le mérite de vérifier que le capteur DHT renvoie des valeurs réalistes.&lt;br /&gt;
La suite: la même chose avec un Raspberry pi, pour bénéficier de sa faciliter à se connecter au réseau. Ce serait quand même cool de pouvoir lire ces valeurs sur un smartphone ;-)&lt;br /&gt;
&lt;br /&gt;
= Mark 2: la même chose avec un Raspberry Pi =&lt;br /&gt;
Le but de cette nouvelle itération: réaliser un montage équivalent avec un [https://www.raspberrypi.org/ Raspberry Pi] (RPi en abrégé). Pourquoi un RPi ?&lt;br /&gt;
* Parce que j'en avais un sous la main ;-)&lt;br /&gt;
* Parce qu'il permet de se connecter rapidement et facilement à un réseau, via ethernet (câble) ou wifi (via un dongle usb)&lt;br /&gt;
* Parce qu'il permet de brancher facilement un module caméra (on y viendra au Mark 3)&lt;br /&gt;
&lt;br /&gt;
Il est certainement possible d'arriver au même résultat avec d'autres cartes (comme par exemple un [http://www.arduino.cc/en/Main/ArduinoBoardYun Arduino Yun]), c'est juste que c'est un RPi que j'avais sous la main... Dans mon cas un Raspberry Pi B+.&lt;br /&gt;
&lt;br /&gt;
En ce qui concerne le RPi, quelques ressources très utiles:&lt;br /&gt;
* [http://mchobby.be/wiki/index.php?title=RaspberryPi-Accueil#Tutoriels Les tutoriels réalisés/traduits par MC Hobby. Une mine d'or]&lt;br /&gt;
* [http://www.elektronique.fr/montages/raspberry-pi/ Des exemples de montages et réalisations électroniques avec RPi]&lt;br /&gt;
* [http://pi.gadgetoid.com/pinout La configuration des différentes PIN du RPi]&lt;br /&gt;
&lt;br /&gt;
== L'installation de l'OS ==&lt;br /&gt;
La principale différence entre une carte Arduino et le RPi, c'est le cœur de la carte:&lt;br /&gt;
* le cœur de l'Arduino est un microcontrôleur, qui va exécuter le programme qu'on lui injecte de manière bête et méchante. Chaque entrée/sortie va devoir être programmée directement, il n'y a pas de système de driver, ...&lt;br /&gt;
* le cœur du RPi est un microprocesseur (ARM, la même technologie que dans les smartphones). Il s'agit donc en fait d'un véritable &amp;quot;petit ordinateur&amp;quot;, avec un système d'exploitation, des drivers (pour l'usb, l'écran, le wifi, ...).&lt;br /&gt;
&lt;br /&gt;
Donc avant de pouvoir démarrer et utiliser le RPi, il va falloir installer un système d'exploitation (OS: Operating System). C'est exactement la même chose qu'installer Windows sur un PC, c'est juste que dans notre cas, ce ne sera pas Windows mais un système Linux. Il en existe [https://www.raspberrypi.org/downloads/ plusieurs], le standard de facto étant Raspbian (une distribution Debian adaptée pour le RPi), c'est celle-là [http://raspbian-france.fr/installer-raspbian-premier-demarrage-configuration/ que j'ai installée].&lt;br /&gt;
&lt;br /&gt;
Petit truc pour les distraits: écran/clavier/souris ne sont pas indispensables pour l'installation, il est tout à fait possible de se connecter via [https://fr.wikipedia.org/wiki/Secure_Shell SSH] au RPi une fois son premier démarrage exécuté, pour autant qu'il soit raccordé à votre réseau (via son câble ethernet). Le RPi se déclare automatiquement sur le réseau avec le nom raspberry.local, et un &amp;lt;code&amp;gt;ssh pi@raspberry.local&amp;lt;/code&amp;gt; à fait l'affaire (raspberry, c'est son &amp;quot;hostname&amp;quot; par défaut). Pour le mot de passe, c'est &amp;lt;code&amp;gt;raspberry&amp;lt;/code&amp;gt; par défaut. Ensuite &amp;lt;code&amp;gt;raspi-config&amp;lt;/code&amp;gt; permet de terminer la procédure d'installation.&lt;br /&gt;
&lt;br /&gt;
En ce qui me concerne, tout le reste de la configuration se fera donc en [https://fr.wikipedia.org/wiki/Shell_Unix ligne de commande (shell)] via SSH. [http://mchobby.be/wiki/index.php?title=PI-SSH Le wiki de MCHobby] détaille l'accès via SSH au RPi.&lt;br /&gt;
&lt;br /&gt;
'''Un dernier point important''': le RPi, c'est comme un &amp;quot;vrai&amp;quot; ordinateur... il vaut mieux l'éteindre proprement plutôt que le débrancher sauvagement. Donc on s'arrange pour faire un &amp;lt;code&amp;gt;sudo poweroff&amp;lt;/code&amp;gt; en ligne de commande avant de le débrancher. Le gros risque: corrompre le système de fichier sur le carte SD, ce qui empêche le démarrage suivant, et impose un reformatage et une réinstallation complète. Pas drôle en somme, je parle d'expérience :-(&lt;br /&gt;
&lt;br /&gt;
== Le wifi ==&lt;br /&gt;
Bien que le RPi ne soit pas équipé par défaut du wifi, il est compatible avec la majorité des clefs usb wifi. Dans mon cas, une vieille clef Hercules HWGUSB2-54. Un petit tour par les log (&amp;lt;code&amp;gt;sudo tail -f /var/log/syslog&amp;lt;/code&amp;gt;) pour vérifier qu'elle est reconnue correctement lors du branchement, et puis une configuration via l'édition de &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt; pour entrer les références du réseau wifi:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
auto wlan0&lt;br /&gt;
allow-hotplug wlan0&lt;br /&gt;
iface wlan0 inet dhcp&lt;br /&gt;
wpa-ssid &amp;quot;Le_nom_(SSID)_de_votre_wifi&amp;quot;&lt;br /&gt;
wpa-psk &amp;quot;Le_mot_de_passe_de_votre_wifi&amp;quot;&lt;br /&gt;
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Ensuite un redémmarrage de la carte avec &amp;lt;code&amp;gt;$ sudo ifdown wlan0&amp;lt;/code&amp;gt; suivi de &amp;lt;code&amp;gt;sudo ifup wlan0&amp;lt;/code&amp;gt; et ça devrait être OK. On peut maintenant se passer de câble ethernet!&lt;br /&gt;
&lt;br /&gt;
Si nécessaire: plus de détails sur la configuration réseau sur [http://mchobby.be/wiki/index.php?title=Rasp-Config-Reseau le wiki MC Hobby]&lt;br /&gt;
&lt;br /&gt;
== La température avec le DHT22 / AM2302 ==&lt;br /&gt;
Pour la lecture des température avec le capteur, les gars d'Adafruit ont déjà développé un bibliothèque de fonctions utilisables en ligne de commande ou en [https://fr.wikipedia.org/wiki/Python_%28langage%29 python]. Quelques ressources:&lt;br /&gt;
* [https://learn.adafruit.com/dht-humidity-sensing-on-raspberry-pi-with-gdocs-logging/overview La page d'Adafruit (en anglais) sur l'utilisation du DHT22 avec le RPi]&lt;br /&gt;
* [http://www.manuel-esteban.com/lire-une-sonde-dht22-avec-un-raspberry-pi/ Une ressource en français (un peu datée) sur l'utilisation DHT22 + RPi.]&lt;br /&gt;
* [http://pi.gadgetoid.com/pinout La table de référence des 40 pins GPIO du RPi]&lt;br /&gt;
Pour ma part, j'ai suivi la méthode Adafruit, ce qui donne en résumé, en ligne de commande:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
cd /home/pi&lt;br /&gt;
git clone https://github.com/adafruit/Adafruit_Python_DHT.git &lt;br /&gt;
cd Adafruit_Python_DHT&lt;br /&gt;
sudo apt-get install build-essential python-dev  &lt;br /&gt;
sudo python setup.py install&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Au niveau du montage, rien de nouveau: le capteur doit toujours être alimenté en 3.3V ou en 5V, et le câble de lecture à une pin d'entrée/sortie (GPIO: General Purpose Input Output), ce qui donne:&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Cellarkare mark2 bb.png|400px|thumb|left]]&lt;br /&gt;
[[Fichier:Cellarkare_mark2.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Un test en ligne de commande permet de vérifier qu'on a une lecture sur le capteur (dans mon cas un AM2302 raccordé sur la pin GPIO 4):&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
cd /home/pi/Adafruit_Python_DHT/examples/&lt;br /&gt;
sudo ./AdafruitDHT.py 2302 4&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Ce qui affiche &amp;lt;code&amp;gt;Temp=23.0*C  Humidity=53.8%&amp;lt;/code&amp;gt;, des valeurs censées pour une après-midi d'été ;-)&lt;br /&gt;
&lt;br /&gt;
== L'affichage LCD ==&lt;br /&gt;
L'écran LCD est toujours le même que pour la version &amp;quot;Mark 1&amp;quot; Arduino. Quelques resources:&lt;br /&gt;
* [https://learn.adafruit.com/drive-a-16x2-lcd-directly-with-a-raspberry-pi Un tutoriel (en anglais) sur Adafruit] ''Attention, le code source n'est plus tellement a jour, voir le dernier lien Github.''&lt;br /&gt;
* [http://mchobby.be/wiki/index.php?title=Rasp-Hack-Afficheur-LCD La version française, traduite par MC Hobby]&lt;br /&gt;
* [https://github.com/adafruit/Adafruit_Python_CharLCD Le code source de la librairie Adafruit pour le gestion du LCD sur GitHub] ''contient la dernière version de la librairie''.&lt;br /&gt;
&lt;br /&gt;
La logique de raccordement est strictement identique au circuit du Mark 1. La seule différence est que la résistance variable de 10K dans le circuit est supprimée, la bibliothèque Adafruit pour le LCD permettant le pilotage en [https://fr.wikipedia.org/wiki/Modulation_de_largeur_d%27impulsion modulation PWM].&lt;br /&gt;
&lt;br /&gt;
== Le montage ==&lt;br /&gt;
Au final, le montage a été fait pour gagner un maximum de place sur mon breadboard. La pin data du DHT a été déplacée sur la pin 5, et le reste des pin pour le LCD sont documentées dans le code.&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Cellarkare mark2_2 bb.png|500px|thumb|left]]&lt;br /&gt;
[[Fichier:Cellarkare_mark2_2.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Le code ==&lt;br /&gt;
&lt;br /&gt;
La logique du code est identique à la version mark 1 - arduino. Ce code est aussi disponible (et éventuellement mis à jour) [https://gitlab.com/qberten/cellarkare/blob/master/mark2_rpi/cellarkare_rpi.py sur gitlab]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
# coding=utf8&lt;br /&gt;
# CellarKare - Mark 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
# Un projet de station de mesure de la température et l'humidité dans une cave à vin&lt;br /&gt;
# Plus d'infos et schéma de montage sur http://wiki.makilab.org/index.php/CellarKare&lt;br /&gt;
# Quentin Berten, 2015 - Domaine public, licence WTFPL v2, http://www.wtfpl.net/&lt;br /&gt;
# quentin_#AT#_berten.me&lt;br /&gt;
&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
# Bibliothèque CharLCD d'Adafruit, voir https://github.com/adafruit/Adafruit_Python_CharLCD&lt;br /&gt;
# pour l'installation&lt;br /&gt;
import Adafruit_CharLCD as LCD&lt;br /&gt;
# Bibliothèque DHT d'AdaFruit, voir https://github.com/adafruit/Adafruit_Python_DHT&lt;br /&gt;
# pour l'installation&lt;br /&gt;
import Adafruit_DHT as DHT&lt;br /&gt;
&lt;br /&gt;
# Configuration de l'affichage LCD&lt;br /&gt;
lcd_rs        = 25      # RS sur pin 25&lt;br /&gt;
lcd_en        = 24      # EN sur pin 24&lt;br /&gt;
lcd_d4        = 23      # D4 sur pin 23&lt;br /&gt;
lcd_d5        = 12      # D5 sur pin 12&lt;br /&gt;
lcd_d6        = 20      # D6 sur pin 20&lt;br /&gt;
lcd_d7        = 16      # D7 sur pin 16&lt;br /&gt;
lcd_backlight = 18      # rétro éclairage sur pin 18&lt;br /&gt;
lcd_columns   = 16      # Affichage à 16 colonnes ...&lt;br /&gt;
# Initialisation du LCD avec les variables ci-dessus&lt;br /&gt;
lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, &lt;br /&gt;
		        	lcd_columns, lcd_rows, lcd_backlight)&lt;br /&gt;
# Configuration pour le capteur DHT, soit DHT11, DHT22 ou AM2302.&lt;br /&gt;
dht_sensor    = DHT.AM2302  # Type AM2302&lt;br /&gt;
dht_pin       = 5           # DHT data sur pin 5&lt;br /&gt;
&lt;br /&gt;
# les variables qui permettent de gérer le temps,&lt;br /&gt;
prevMillis = 0          # enregistre le temps de la denière lecture DHT22&lt;br /&gt;
secInterval = 1000      # Un intervalle d'une seconde&lt;br /&gt;
# L'intervalle de lecture du DHT22: 3 secondes, doit etre plus grand que secInterval&lt;br /&gt;
dhtInterval = 3000&lt;br /&gt;
&lt;br /&gt;
def read_and_print_dht():&lt;br /&gt;
    # On lit une valeur sur le senseur avec la fonction read. Attention, cette fonction&lt;br /&gt;
    # ne réessaie pas automatiquement en cas d'erreur, mais fournit les valeurs (None, None).&lt;br /&gt;
    hum, tempC  = DHT.read(dht_sensor, dht_pin)&lt;br /&gt;
&lt;br /&gt;
    # On vérifie que l'on a bien eu une lecture (Linux n'est pas un OS temps réel et ne&lt;br /&gt;
    # peut pas garantir le timing des lectures sur le capteur). Si ça arrive, on réessaie.&lt;br /&gt;
    # On affiche les valeurs sur la console (n'est pas indispensable)&lt;br /&gt;
    if hum is not None and tempC is not None:&lt;br /&gt;
    	print 'Temp={0:0.2f}*C  Humidity={1:0.2f}%'.format(tempC, hum)&lt;br /&gt;
        # On affiche les valeurs sur l'écran LCD&lt;br /&gt;
        lcd.clear()&lt;br /&gt;
        lcd.message('deg C: {0:0.2f}\nhum %: {1:0.2f}'.format(tempC, hum))&lt;br /&gt;
    else:&lt;br /&gt;
	print 'Lecture sur le capteur DHT ratée'&lt;br /&gt;
&lt;br /&gt;
# Boucle principale, l'équivalent de void loop() sur Arduino&lt;br /&gt;
while 1:&lt;br /&gt;
    # On lit le nombre de millisecondes courant&lt;br /&gt;
    curMillis = time.time()*1000&lt;br /&gt;
    if curMillis - prevMillis &amp;gt; dhtInterval:&lt;br /&gt;
        # On essaie de lire et afficher les valeurs du DHT&lt;br /&gt;
        read_and_print_dht()&lt;br /&gt;
        # on enregistre le dernier temps d'exécution de la lecture&lt;br /&gt;
        prevMillis = curMillis&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== La conclusion ==&lt;br /&gt;
En vrac:&lt;br /&gt;
* Pas de gros problème ou obstacles majeurs pour convertir le montage et le code Arduino en son équivalent RPi. Mais heureusement que l'équipe d'Adafruit a déjà programmé les bibliothèques Python qui vont bien!&lt;br /&gt;
* Au niveau du breadboard, ça commence à prendre de la place... Une solution: passer en [https://fr.wikipedia.org/wiki/I2C &amp;quot;I2C&amp;quot;] pour le capteur et le LCD, ce qui limite drastiquement le nombre de pins nécessaires pour le montage, et facilite la programmation. Merci Patrick pour les infos, ce sera sûrement utile pour le prochain montage ;-) !&lt;br /&gt;
** Par exemple, pour la température: un capteur I2C comme le [https://www.adafruit.com/products/1638 SHT15], et pour l'écran, [http://www.electrodragon.com/w/index.php?title=1602_LCD_I2C/SPI_Module la version I2C du même 1602].&lt;br /&gt;
** Par contre dans ce cas, il faut faire gaffe au fait que le passage en 3.3V pour la logique du RPi, le lcd reste en 5V et il faudra ajouter un [http://www.adafruit.com/products/757 convertisseurs de niveau] pour le bus si utilisé avec un capteur qui ne supporte pas 5V.&lt;br /&gt;
* le langage Python, c'est pas plus compliqué que le simili-C de l'Arduino une fois qu'on est rentré dedans.&lt;br /&gt;
&lt;br /&gt;
= Mark 3: Start, Stop, and say Cheese =&lt;br /&gt;
&lt;br /&gt;
== Sart/Stop ==&lt;br /&gt;
Un &amp;quot;problème&amp;quot; du RPi, c'est qu'il n'a pas de bouton ON/OFF simple, et par conséquent, l'éteindre proprement avec &amp;lt;code&amp;gt;sudo halt&amp;lt;/code&amp;gt; ou  &amp;lt;code&amp;gt;sudo poweroff&amp;lt;/code&amp;gt; est impossible sans un accès physique (clavier et écran connectés) ou une connection SSH (connection à distance). Pas pratique pour un boitier qui sera installé dans une cave à vin...&lt;br /&gt;
&lt;br /&gt;
Autrement dit, mes besoins:&lt;br /&gt;
# Le programme python d'affichage et monitoring des températures démarre automatiquement lorsque le RPi démarre.&lt;br /&gt;
# Un bouton OFF permet d'éteindre proprement le RPi avant de le débrancher de son alimentation.&lt;br /&gt;
# Un bouton ON permet de l'allumer une fois éteint sans débrancher/rebrancher son alimentation.&lt;br /&gt;
# Nec plus ultra: avoir un fonctionnement similaire à un bouton ON/OFF d'un laptop par exemple: si éteint, le bouton allume, si allumé, le bouton éteint proprement le RPi, et coupe l'alimentation USB.&lt;br /&gt;
&lt;br /&gt;
Bon après quelques recherches sur le net:&lt;br /&gt;
# C'est simple, il suffit de configurer le &amp;quot;init script&amp;quot; du RPi pour lancer automatiquement le programme python au démarrage&lt;br /&gt;
# Un montage simple permet d'écouter sur une des pins du GPIO, et de lancer la procédure propre d'arrêt (shutdown). Soit un bouton OFF&lt;br /&gt;
# Le RPi (à partir du modèle B rev2, soit Brev2, B+ et 2) possède un pinout &amp;quot;reset&amp;quot;, qui n'est pas soudé de base sur la carte. Si on raccorde ces deux pins, le RPi redémarre électriquement (hard reboot). Donc sans s'éteindre proprement. L'intérêt, c'est que si le RPi est éteint mais encore sous tension, ce bouton permet de le ré-allumer. Donc un bouton ON/RESET. Voir par exemple:&lt;br /&gt;
#* Un article assez complet en anglais sur [http://www.makeuseof.com/tag/add-reset-switch-raspberry-pi/ MakeUseOf.com]&lt;br /&gt;
# Le bouton combiné ON/OFF unique est possible, mais le montage est plus compliqué. Quelques exemples:&lt;br /&gt;
#* Un montage en français sur le site [http://forum.madeinfr.org/topic/43/raspower/ MadeInFR.org].&lt;br /&gt;
#* Un montage en anglais à base de micro contrôleur (pas simple donc) sur [http://www.instructables.com/id/Raspberry-Pi-Shutdown-Button/ Instructables]&lt;br /&gt;
#* Un article très complet en anglais reprenant toutes les options, dont un montage assez simple de bouton unique [http://www.raspberry-pi-geek.com/Archive/2013/01/Adding-an-On-Off-switch-to-your-Raspberry-Pi sur raspberry-pi-geek.com]&lt;br /&gt;
#* Des solutions commerciales toutes faites comme [https://www.pi-supply.com/product/pi-supply-raspberry-pi-power-switch/ PiSupply] ou [http://www.mausberrycircuits.com/collections/frontpage MausberryCircuits]&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, ce sera pour moi le choix suivant: un bouton OFF, qui lors d'un appui long éteint proprement le RPi. En gros la solution 2.&lt;br /&gt;
&lt;br /&gt;
Mais dans un premier temps, il faut configurer le RPi pour lancer le programme au démarrage...&lt;br /&gt;
&lt;br /&gt;
== Lancement du programme via initscript ==&lt;br /&gt;
&lt;br /&gt;
Il y a certainement 36 façons d'arriver au même résultat (après tout, le RPi tourne sous Linux ;-), mais dans mon cas, la solution qui me convient bien: un script d'init lance par défaut le script python localisé en &amp;lt;code&amp;gt;/usr/local/bin/pystartup.py&amp;lt;/code&amp;gt;. L'intérêt de la chose: &amp;lt;code&amp;gt;pystartup.py&amp;lt;/code&amp;gt; peut être un lien symbolique vers n'importe quel autre script.&lt;br /&gt;
&lt;br /&gt;
Pour éviter d'encombrer le wiki, je n'ai pas repris le script ici, mais il est dispo sur [https://gitlab.com/qberten/cellarkare/blob/master/mark3_camera/initscript_pystartup GitLab]. Pour l'installation, en ligne de commande (connecté sur le RPi):&lt;br /&gt;
&lt;br /&gt;
On télécharge le script, on le déplace au bon endroit et on le rend exécutable&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
wget https://gitlab.com/qberten/cellarkare/raw/master/mark3_camera/initscript_pystartup&lt;br /&gt;
sudo mv initscript_pystartup /etc/init.d/pystartup&lt;br /&gt;
sudo chmod a+x /etc/init.d/pystartup&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
On crée le lien symbolique qui va bien (remplacer /chemin/vers/... par la localisation du programme à lancer)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
ln -s /chemin/vers/votre/script/python.py /usr/local/bin/pystartup.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
On configure le système pour qu'il connaisse le nouveau script &amp;quot;pystartup&amp;quot;, et on lui demande de l'exécuter à chaque démarrage&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo update-rc.d pystartup defaults&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Il est ensuite possible de lancer son programme en arrière plan comme n'importe quel autre service avec &amp;lt;code&amp;gt;sudo service pystartup start&amp;lt;/code&amp;gt;, de l'arrêter avec &amp;lt;code&amp;gt;sudo service pystartup stop&amp;lt;/code&amp;gt;, etc&lt;br /&gt;
&lt;br /&gt;
== Pinout RESET ==&lt;br /&gt;
&lt;br /&gt;
Activer le &amp;quot;hard&amp;quot; reset sur le Rpi suppose un peu de soudure, mais rien de bien effrayant, 2 points suffisent. Un fois les connecteur pinout soudés, quand on raccorde les deux pins (par exemple avec un interrupteur), le RPi redémarre (&amp;quot;hard&amp;quot; reset, donc attention à la carte SD...), ou s'allume (si il était raccordé au secteur).&lt;br /&gt;
&lt;br /&gt;
J'ai soudé les 2 pins et testé la fonction, mais comme il s'agit d'un redémarrage &amp;quot;hard&amp;quot;, je n'ai finalement pas vraiment vu l'utilité dans ce projet: autant directement débrancher / rebrancher le câble d'alimentation dans ce cas.&lt;br /&gt;
&lt;br /&gt;
Mais à toutes fins utiles, les photos de l'opération, avant/après.&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Rpi_reset_before.jpg|500px|thumb|left]]&lt;br /&gt;
[[Fichier:Rpi_reset_after.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bouton OFF ==&lt;br /&gt;
&lt;br /&gt;
Rien de très compliqué: on raccorde le bouton à une entrée, on configure la résistance pull-up/down interne du Rpi, on s'assure de récupérer les évènements dans le code.&lt;br /&gt;
&lt;br /&gt;
Les parties utiles du code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# La fonction qui effectuer l'arrêt propre du RPi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def btn_proper_halt(pin):&lt;br /&gt;
    global off_state, cur_millis, off_millis&lt;br /&gt;
    # On lit le nombre de millisecondes courant&lt;br /&gt;
    cur_millis = time.time()*1000&lt;br /&gt;
    # Utilise la variable globale off_state&lt;br /&gt;
    off_state = not off_state&lt;br /&gt;
    # DEBUG&lt;br /&gt;
    logging.debug(&amp;quot;Bouton OFF_PIN pressé, son état est maintenant %s&amp;quot; % str(off_state))&lt;br /&gt;
    if off_state == True:&lt;br /&gt;
        off_millis = cur_millis   &lt;br /&gt;
    elif off_state == False: &lt;br /&gt;
        # DEBUG&lt;br /&gt;
        logging.debug(&amp;quot;Bouton OFF_PIN pressé pendant {0:0.0f} ms&amp;quot;.format(cur_millis - off_millis))&lt;br /&gt;
        if (cur_millis - off_millis) &amp;gt; OFF_INTERVAL:&lt;br /&gt;
            # On a relâché le bouton avec un écart long =&amp;gt; shutdown&lt;br /&gt;
            logging.debug(&amp;quot;Appui long sur le bouton OFF_PIN&amp;quot;)&lt;br /&gt;
            logging.info(&amp;quot;Arrêt du Raspberry PI, attendre encore 10 sec avant de débrancher&amp;quot;)&lt;br /&gt;
            subprocess.call('halt', shell=False)&lt;br /&gt;
        else:&lt;br /&gt;
            # Appuis court =&amp;gt; on ne fait rien&lt;br /&gt;
            logging.debug(&amp;quot;Appui court sur le bouton OFF_PIN&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Fonction de terminaison du programme (appelée lorsque le script est arrêté&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def terminate():&lt;br /&gt;
    logging.debug(&amp;quot;Terminate function started&amp;quot;)&lt;br /&gt;
    # efface l'écran LCD&lt;br /&gt;
    lcd_dim_backlight(0.0, 0.2)&lt;br /&gt;
    lcd.clear()&lt;br /&gt;
    logging.debug(&amp;quot;Terminate function ended&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Fonction d'initialisation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def initialize():&lt;br /&gt;
    global lcd&lt;br /&gt;
    logging.debug(&amp;quot;Initialize function started&amp;quot;)&lt;br /&gt;
    # Initialisation du LCD avec les variables ci-dessus&lt;br /&gt;
    lcd = LCD.Adafruit_CharLCD(LCD_RS, LCD_EN, LCD_D4, LCD_D5, LCD_D6, LCD_D7, &lt;br /&gt;
		        	LCD_COLUMNS, LCD_ROWS,&lt;br /&gt;
                                LCD_BACKLIGHT, invert_polarity = False, enable_pwm = True,&lt;br /&gt;
                                initial_backlight = lcd_backlight)&lt;br /&gt;
    # Initialisation des autres GPIO's&lt;br /&gt;
    GPIO.setmode(GPIO.BCM)        # On utilise la numérotation BCM pour les PIN&lt;br /&gt;
    # On définit la pin OFF_PIN comme entrée, et on active la résistance pull-down interne du RPi&lt;br /&gt;
    GPIO.setup(OFF_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)&lt;br /&gt;
    # Configure une interruption qui va détecter les mouvements up et down sur le bouton&lt;br /&gt;
    GPIO.add_event_detect(OFF_PIN, GPIO.BOTH, callback=btn_proper_halt, bouncetime=20)&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Say &amp;quot;cheese&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Cette partie du projet s'attache à pouvoir prendre rapidement et facilement un photos des étiquettes des bouteilles entrées ou sorties de la cave. Ben oui, j'ai pas forcément une bonne mémoire, et se donner les moyens d'enregistrer facilement et rapidement l'info est le meilleur moyen de suivre son stock ;-)&lt;br /&gt;
&lt;br /&gt;
Cette partie est super simple à réaliser avec le rpi: on raccorde la caméra, on s'assure qu'elle est activée avec &amp;lt;code&amp;gt;sudo raspi-config&amp;lt;/code&amp;gt;, et on peut ensuite l'utiliser en ligne de commande ou en python. Le site web [https://www.raspberrypi.org/documentation/usage/camera/README.md raspberrypi.org (en anglais)] explique cela très bien.&lt;br /&gt;
&lt;br /&gt;
On ajoute un deuxième bouton sur le breadboard, qui déclenche la prise d'une photo, et le prototype est maintenant fonctionnel. Les photos sont sauvegardées dans le répertoire courant du RPi, avec la date et l'heure pour nom de fichier.&lt;br /&gt;
&lt;br /&gt;
Au niveau du code, les parties utiles sont:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Fonction de prise d'une photo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def btn_take_picture(pin):&lt;br /&gt;
    # DEBUG&lt;br /&gt;
    logging.info(&amp;quot;Bouton CAM_PIN pressé, on prend un photo&amp;quot;)&lt;br /&gt;
    # Construction du chemin pour la photo&lt;br /&gt;
    now = datetime.datetime.now()&lt;br /&gt;
    pic_filename = &amp;quot;/home/qb/pic_&amp;quot; + str(now) + &amp;quot;.jpg&amp;quot;&lt;br /&gt;
    # Initialisation de la camera. On ne le fait pas dans initialize() pour éviter au maximum de la laisser&lt;br /&gt;
    # allumée (et consommer) en continu. En plus, une fois activée, les lectures sur le DHT sont beaucoup&lt;br /&gt;
    # plus souvent ratées.&lt;br /&gt;
    with PICAM.PiCamera() as cam:&lt;br /&gt;
        cam.capture(pic_filename)&lt;br /&gt;
        logging.debug(&amp;quot;Photos sauvée &amp;quot; + str(cam.resolution) + &amp;quot;  dans &amp;quot; + pic_filename)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pimp my screen ==&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est d'allumer ou éteindre l'écran, la bibliothèque CharLCD permet la modulation PWN du rétroéclairage. De quoi avoir un chouette effet de fondu au noir lorsque l'écran s'allume et s'éteint.&lt;br /&gt;
&lt;br /&gt;
Au niveau du code, la partie utile:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Module l'intensité du rétro éclairage de l'écran lcd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def lcd_dim_backlight(backlight_value, time_step):&lt;br /&gt;
    global lcd&lt;br /&gt;
    global lcd_backlight&lt;br /&gt;
    # calcule l'incrément à avoir entre lcd_backlight et backlight_value&lt;br /&gt;
    stp = (lcd_backlight &amp;gt; backlight_value) * -2 +1&lt;br /&gt;
    brightnesses = map(lambda x: x/10.0, range(int(lcd_backlight*10), int(backlight_value*10)+1, stp))&lt;br /&gt;
    for bright in brightnesses:&lt;br /&gt;
        lcd_backlight = bright&lt;br /&gt;
        logging.debug(&amp;quot;loop on bright= &amp;quot; + str(bright))&lt;br /&gt;
        lcd.set_backlight(bright)&lt;br /&gt;
        time.sleep(time_step)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A suivre...&lt;br /&gt;
&lt;br /&gt;
Les parties du code python utile&lt;br /&gt;
Le schéma complet &amp;quot;mark 3&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Mark 4: We are (almost) done =&lt;br /&gt;
&lt;br /&gt;
== Pimp my screen, reloaded ==&lt;br /&gt;
Une dernière petite touche intéressante: l'appareil est destiné à être mis dans une cave à vin, endroit où il va faire noir la plupart du temps. En conséquence, l'écran LCD n'a pas vraiment besoin d'être allumé en permanence, pourquoi ne pas l'allumer automatiquement quand la lumière du local dépasse un certain seuil. Une photorésistance permet de réaliser rapidement la mesure d'une intensité lumineuse, pourquoi s'en priver... Oui mais... le RPi n'a pas d'entrée analogique, comment convertir simplement la mesure sur la photorésistance en une valeur analogique, alors que le RPi n'a que des entrées digitales.&lt;br /&gt;
&lt;br /&gt;
Après un peu de recherche, un montage simple à base d'une capacité dont le temps de charge sera directement proportionnel à la mesure sur la photo-résistance. Tout cela est expliqué ici (en anglais): [http://www.raspberrypi-spy.co.uk/2012/08/reading-analogue-sensors-with-one-gpio-pin/]&lt;br /&gt;
&lt;br /&gt;
(TODO - continuer la documentation)&lt;br /&gt;
&lt;br /&gt;
== Buttons, buttons, we want more ==&lt;br /&gt;
&lt;br /&gt;
Dernier petit détail, et non des moindre, Pour avoir un projet réellement fonctionnel, il va falloir travailler un peu l'interface homme-machine, et permettre un peu plus d'interaction avec le Rpi, pour par exemple permettre d'entrer le nombre de bouteilles couvertes par l'entrée ou la sortie photographiée, quitter/valider une action, ...&lt;br /&gt;
&lt;br /&gt;
(TODO - continuer la documentation)&lt;br /&gt;
&lt;br /&gt;
== we want leds ==&lt;br /&gt;
&lt;br /&gt;
Toujours dans l'optique d'améliorer l'interaction avec l'appareil, pourquoi ne pas intégrer une led de status sur l'appareil, pour indiquer visuellement différents états, comme par exemple: une température trop basse ou trop haute est enregistrée, il n'y a pas de connection réseau, ...&lt;br /&gt;
&lt;br /&gt;
(TODO - à implémenter tout court ;-)&lt;br /&gt;
&lt;br /&gt;
== all your data are belong to us ==&lt;br /&gt;
&lt;br /&gt;
Enfin, c'est bien beau d'afficher la température et l'humidité, c'est encore mieux de l'enregistrer quelque part pour pouvoir tracer l'historique, et intéragir plus facilement avec ces données.&lt;br /&gt;
&lt;br /&gt;
(TODO - à implémenter tout court ;-)&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Projets]]&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=CellarKare&amp;diff=2978</id>
		<title>CellarKare</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=CellarKare&amp;diff=2978"/>
		<updated>2015-10-28T20:53:29Z</updated>

		<summary type="html">&lt;p&gt;Quentin : /* Pimp my screen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Un projet lancé par --[[Utilisateur:Quentin|Quentin]] ([[Discussion utilisateur:Quentin|discussion]]) 14 juin 2015 à 19:58 (CEST)&lt;br /&gt;
&lt;br /&gt;
= En bref =&lt;br /&gt;
&lt;br /&gt;
Le projet est de créer une &amp;quot;station météo&amp;quot; pour une cave à vin, d'où le nom du projet un peu fumeux de CellarKare = Cellar + Care, le K c'est pour faire joli ;-)&lt;br /&gt;
Dans un premier temps, le but est d'afficher la température et le taux d'humidité (hygrométrie). Ça, c'est pour le but fonctionnel. Mes autres buts sont:&lt;br /&gt;
* Au niveau perso: réaliser un premier projet à forte composante électronique, dans la foulée de notre formation Arduino&lt;br /&gt;
* Utiliser un maximum toutes les techniques/machines du Makilab&lt;br /&gt;
* Documenter les différentes étapes (tutoriel), et fournir les fichiers sources nécessaires aux différentes étapes.&lt;br /&gt;
&lt;br /&gt;
= Mark 1: Le matos et un premier proto Arduino=&lt;br /&gt;
&lt;br /&gt;
Le premier prototype sera relativement simple: la station affichera la température et l'humidité ambiante sur un écran LCD, le tout piloté par un Arduino Uno.&lt;br /&gt;
&lt;br /&gt;
== T° et humidité: DHT22 / AM2303 ==&lt;br /&gt;
&lt;br /&gt;
Au niveau des capteurs, logiquement il en faut un pour lire la température, et un pour lire l'humidité. Les deux existent certainement séparément, mais une rapide recherche sur le net done des références de capteurs déjà calibrés et fournissant les deux pour pas trop cher. Au final, mon choix se porte sur un DHT22. Ce capteur s'appelle aussi AM2303 dans sa version câblée. Quelques liens et documentation utiles:&lt;br /&gt;
* [http://www.adafruit.com/datasheets/DHT22.pdf Les specs du DHT22 (anglais)];&lt;br /&gt;
* Pour acheter: [http://www.adafruit.com/products/385 ~10 $ chez AdaFruit] ou [http://shop.mchobby.be/senseurs/214-dht22-am2302-senseur-humidite-temperature--3232100002142.html ~17 € chez MCHobby], c'est un peu plus cher, mais ils sont belges et sympas;&lt;br /&gt;
* [http://playground.arduino.cc/Main/DHTLib Un tutoriel pour arduino sur Arduino.cc];&lt;br /&gt;
* [https://learn.adafruit.com/dht/using-a-dhtxx-sensor Un tutoriel pour arduino sur AdaFruit], et sa [http://mchobby.be/wiki/index.php?title=DHTxx version française];&lt;br /&gt;
&lt;br /&gt;
== L'affichage LCD: LCM1602 ==&lt;br /&gt;
&lt;br /&gt;
Pour l'affichage, le choix a été vite fait... J'ai pris ce que j'avais sous la main, soit le LCD fourni dans le starter kit arduino. Cet écran est très répandu, et fait partie de nombreux &amp;quot;kits de démarrage&amp;quot; en électronique. Au niveau fonctionnel, avec 2 lignes de 16 charactères, on devrait pouvoir s'en sortir pour afficher une température et un taux d'humidité ;-). Son contrôleur (hitachi HD44780) est lui aussi très répandu En vrac:&lt;br /&gt;
* [http://www.datasheetspdf.com/datasheet/LCM1602.html Les specs (chinois ou anglais)]&lt;br /&gt;
* Pour acheter: [http://www.ebay.com/sch/items/?_nkw=lcm1602&amp;amp;_sacat=&amp;amp;_ex_kw=&amp;amp;_mPrRngCbx=1&amp;amp;_udlo=&amp;amp;_udhi=&amp;amp;_sop=12&amp;amp;_fpos=&amp;amp;_fspt=1&amp;amp;_sadis=&amp;amp;LH_CAds=&amp;amp;rmvSB=true on en trouve plein sur ebay...]&lt;br /&gt;
* [http://www.arduino.cc/en/Tutorial/LiquidCrystal La librairie LiquidCrystal, qui permet de le contrôler sur Arduino]&lt;br /&gt;
&lt;br /&gt;
== Le montage ==&lt;br /&gt;
&lt;br /&gt;
Le montage est assez simple, et n'est finalement qu'une combinaison des différents tutoriel et exemple d'utilisation de l'écran et du capteur.&lt;br /&gt;
&lt;br /&gt;
Sur le schéma du capteur DHT, la résistance de 10K sert de [https://fr.wikipedia.org/wiki/R%C3%A9sistance_de_rappel &amp;quot;résistance pull-up&amp;quot;].&lt;br /&gt;
'''Cette résistance n'est pas nécessaire dans le cas du capteur AM2302''' (la version avec câble et boitier en plastique, comme sur la photo). Cette version [http://www.adafruit.com/product/393 intègre une résistance de 5.1K dans le boîtier], qui connecte déjà VCC et DATA, merci Patrick pour l'info ;-).&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Cellarkare mark1 bb.png|500px|thumb|left]]&lt;br /&gt;
[[Fichier:Cellarkare_mark1.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Le code ==&lt;br /&gt;
Au niveau programmation du micro-controlleur Arduino, là aussi c'est assez simple: toutes les 3 secondes, on lit les valeurs de t° et humidité, et on les affiches sur l'écran LCD. Les valeurs mesurées et des messages supplémentaires sont aussi envoyés sur la sortie série.&lt;br /&gt;
&lt;br /&gt;
Le code est aussi disponible (et éventuellement mis à jour) [https://gitlab.com/qberten/cellarkare/blob/master/mark1_arduino/cellarkare_arduino.ino sur gitlab]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
CellarKare - Mark #1&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Un projet de station de mesure de la température et l'humidité dans une cave à vin&lt;br /&gt;
Plus d'infos et schéma de montage sur http://wiki.makilab.org/index.php/CellarKare&lt;br /&gt;
Quentin Berten, 2015 - Domaine public, licence WTFPL v2, http://www.wtfpl.net/&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
// Bibliothèque LiquidCrystal, pour l'écran LCD. Installée de base avec l'IDE&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Bibliothèque DHT, pour le capteur de température. Installable directement depuis&lt;br /&gt;
// l'IDE, via Sketch -&amp;gt; Include LIbrary -&amp;gt; Manage Libraries -&amp;gt; DHT sensor Library &lt;br /&gt;
#include &amp;quot;DHT.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Définition l'écran LCD, en argument les pins d'interface, dans l'ordre&lt;br /&gt;
// (RS pin, LCD Enable, D4, D5, D6, D7)&lt;br /&gt;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);&lt;br /&gt;
&lt;br /&gt;
// Définition des pin et type pour le senseur de t° et humidité&lt;br /&gt;
#define DHTPIN 7         // senseur (fil data, en jaune), sur pin 7&lt;br /&gt;
#define DHTTYPE DHT22    // type DHT 22  (AM2302)&lt;br /&gt;
&lt;br /&gt;
// Définition du capteur DHT22, pour un Arduino &amp;quot;normal&amp;quot; à 16mhz, comme le Uno&lt;br /&gt;
DHT dht(DHTPIN, DHTTYPE);&lt;br /&gt;
// les variables associées qui vont lire les valeurs (température, ...)&lt;br /&gt;
float hum;&lt;br /&gt;
float tempC;&lt;br /&gt;
float tempF;&lt;br /&gt;
float indiceHum;&lt;br /&gt;
&lt;br /&gt;
// les variables qui permettent de gérer le temps,&lt;br /&gt;
// voir http://www.arduino.cc/en/pmwiki.php?n=Tutorial/BlinkWithoutDelay&lt;br /&gt;
long prevMillis = 0;           // enregistre le temps de la denière lecture DHT22&lt;br /&gt;
long dhtInterval = 3000;       // L'intervalle de lecture du DHT22: 3 secondes&lt;br /&gt;
&lt;br /&gt;
// la procédure d'initialisation arduino&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  // on ouvre une connection série (pour afficher un maxium d'info)&lt;br /&gt;
  Serial.begin(9600); &lt;br /&gt;
  Serial.println(&amp;quot;CellarKare Mark #1 Test&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // initialisation du capteur&lt;br /&gt;
  dht.begin();&lt;br /&gt;
  // initialisation de l'écran, 16 colonnes et 2 lignes&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// la boucle principale arduino&lt;br /&gt;
void loop() {&lt;br /&gt;
  unsigned long curMillis = millis();&lt;br /&gt;
  &lt;br /&gt;
  if(curMillis - prevMillis &amp;lt; dhtInterval) {&lt;br /&gt;
    goto end_loop;        // pas de lecture DHT, on va à la fin de la boucle loop()&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // on enregistre le dernier temps d'exécution de la lecture&lt;br /&gt;
  prevMillis = curMillis;   &lt;br /&gt;
  &lt;br /&gt;
  // la lecture de la t° et l'humidité prends environ 250 millisecondes&lt;br /&gt;
  // mais les lectures du capteur peuvent etre vieillies de 2 secondes&lt;br /&gt;
  // le capteur n'est pas rapide (d'où l'attente de 3 secondes pour etre&lt;br /&gt;
  // certain d'avoir des lectures correctes.&lt;br /&gt;
  // lecture de l'humidité&lt;br /&gt;
  hum = dht.readHumidity();&lt;br /&gt;
  // lecture de la température en degrés Celsius&lt;br /&gt;
  tempC = dht.readTemperature();&lt;br /&gt;
  // lecture de la température en degrés Fahreneit&lt;br /&gt;
  tempF = dht.readTemperature(true);&lt;br /&gt;
  &lt;br /&gt;
  // On vérifie que les lectures on bien été réalisées. Si pas, on quitte&lt;br /&gt;
  // la boucle pour ré-essayer&lt;br /&gt;
  if (isnan(hum) || isnan(tempC) || isnan(tempF)) {&lt;br /&gt;
    Serial.println(&amp;quot;Lecture sur le capteur DHT ratée&amp;quot;);&lt;br /&gt;
    goto end_loop;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Calcul de l'indice de chaleur (voir https://fr.wikipedia.org/wiki/Indice_de_chaleur )&lt;br /&gt;
  // La température doit etre fournie en degré Fahreneit&lt;br /&gt;
  indiceHum = dht.computeHeatIndex(tempF, hum);&lt;br /&gt;
&lt;br /&gt;
  // On affiche les valeurs sur la console série (n'est pas indispensable)&lt;br /&gt;
  Serial.print(&amp;quot;Humidite: &amp;quot;); &lt;br /&gt;
  Serial.print(hum);&lt;br /&gt;
  Serial.print(&amp;quot; %\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temperature: &amp;quot;); &lt;br /&gt;
  Serial.print(tempC);&lt;br /&gt;
  Serial.print(&amp;quot; *C &amp;quot;);&lt;br /&gt;
  Serial.print(tempF);&lt;br /&gt;
  Serial.print(&amp;quot; *F\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Indice de chaleur: &amp;quot;);&lt;br /&gt;
  Serial.print(indiceHum);&lt;br /&gt;
  Serial.println(&amp;quot; *F&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  // On affiche les valeurs sur l'écran LCD, curseur à (0,0)&lt;br /&gt;
  lcd.setCursor(0, 0);&lt;br /&gt;
  // print Temp in C°&lt;br /&gt;
  lcd.print(&amp;quot;deg C: &amp;quot;);&lt;br /&gt;
  lcd.print(tempC);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;hum %: &amp;quot;);&lt;br /&gt;
  lcd.print(hum);&lt;br /&gt;
&lt;br /&gt;
  // label pour goto&lt;br /&gt;
  end_loop:&lt;br /&gt;
  ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== La conclusion ==&lt;br /&gt;
Un premier prototype fonctionnel, qui a au moins le mérite de vérifier que le capteur DHT renvoie des valeurs réalistes.&lt;br /&gt;
La suite: la même chose avec un Raspberry pi, pour bénéficier de sa faciliter à se connecter au réseau. Ce serait quand même cool de pouvoir lire ces valeurs sur un smartphone ;-)&lt;br /&gt;
&lt;br /&gt;
= Mark 2: la même chose avec un Raspberry Pi =&lt;br /&gt;
Le but de cette nouvelle itération: réaliser un montage équivalent avec un [https://www.raspberrypi.org/ Raspberry Pi] (RPi en abrégé). Pourquoi un RPi ?&lt;br /&gt;
* Parce que j'en avais un sous la main ;-)&lt;br /&gt;
* Parce qu'il permet de se connecter rapidement et facilement à un réseau, via ethernet (câble) ou wifi (via un dongle usb)&lt;br /&gt;
* Parce qu'il permet de brancher facilement un module caméra (on y viendra au Mark 3)&lt;br /&gt;
&lt;br /&gt;
Il est certainement possible d'arriver au même résultat avec d'autres cartes (comme par exemple un [http://www.arduino.cc/en/Main/ArduinoBoardYun Arduino Yun]), c'est juste que c'est un RPi que j'avais sous la main... Dans mon cas un Raspberry Pi B+.&lt;br /&gt;
&lt;br /&gt;
En ce qui concerne le RPi, quelques ressources très utiles:&lt;br /&gt;
* [http://mchobby.be/wiki/index.php?title=RaspberryPi-Accueil#Tutoriels Les tutoriels réalisés/traduits par MC Hobby. Une mine d'or]&lt;br /&gt;
* [http://www.elektronique.fr/montages/raspberry-pi/ Des exemples de montages et réalisations électroniques avec RPi]&lt;br /&gt;
* [http://pi.gadgetoid.com/pinout La configuration des différentes PIN du RPi]&lt;br /&gt;
&lt;br /&gt;
== L'installation de l'OS ==&lt;br /&gt;
La principale différence entre une carte Arduino et le RPi, c'est le cœur de la carte:&lt;br /&gt;
* le cœur de l'Arduino est un microcontrôleur, qui va exécuter le programme qu'on lui injecte de manière bête et méchante. Chaque entrée/sortie va devoir être programmée directement, il n'y a pas de système de driver, ...&lt;br /&gt;
* le cœur du RPi est un microprocesseur (ARM, la même technologie que dans les smartphones). Il s'agit donc en fait d'un véritable &amp;quot;petit ordinateur&amp;quot;, avec un système d'exploitation, des drivers (pour l'usb, l'écran, le wifi, ...).&lt;br /&gt;
&lt;br /&gt;
Donc avant de pouvoir démarrer et utiliser le RPi, il va falloir installer un système d'exploitation (OS: Operating System). C'est exactement la même chose qu'installer Windows sur un PC, c'est juste que dans notre cas, ce ne sera pas Windows mais un système Linux. Il en existe [https://www.raspberrypi.org/downloads/ plusieurs], le standard de facto étant Raspbian (une distribution Debian adaptée pour le RPi), c'est celle-là [http://raspbian-france.fr/installer-raspbian-premier-demarrage-configuration/ que j'ai installée].&lt;br /&gt;
&lt;br /&gt;
Petit truc pour les distraits: écran/clavier/souris ne sont pas indispensables pour l'installation, il est tout à fait possible de se connecter via [https://fr.wikipedia.org/wiki/Secure_Shell SSH] au RPi une fois son premier démarrage exécuté, pour autant qu'il soit raccordé à votre réseau (via son câble ethernet). Le RPi se déclare automatiquement sur le réseau avec le nom raspberry.local, et un &amp;lt;code&amp;gt;ssh pi@raspberry.local&amp;lt;/code&amp;gt; à fait l'affaire (raspberry, c'est son &amp;quot;hostname&amp;quot; par défaut). Pour le mot de passe, c'est &amp;lt;code&amp;gt;raspberry&amp;lt;/code&amp;gt; par défaut. Ensuite &amp;lt;code&amp;gt;raspi-config&amp;lt;/code&amp;gt; permet de terminer la procédure d'installation.&lt;br /&gt;
&lt;br /&gt;
En ce qui me concerne, tout le reste de la configuration se fera donc en [https://fr.wikipedia.org/wiki/Shell_Unix ligne de commande (shell)] via SSH. [http://mchobby.be/wiki/index.php?title=PI-SSH Le wiki de MCHobby] détaille l'accès via SSH au RPi.&lt;br /&gt;
&lt;br /&gt;
'''Un dernier point important''': le RPi, c'est comme un &amp;quot;vrai&amp;quot; ordinateur... il vaut mieux l'éteindre proprement plutôt que le débrancher sauvagement. Donc on s'arrange pour faire un &amp;lt;code&amp;gt;sudo poweroff&amp;lt;/code&amp;gt; en ligne de commande avant de le débrancher. Le gros risque: corrompre le système de fichier sur le carte SD, ce qui empêche le démarrage suivant, et impose un reformatage et une réinstallation complète. Pas drôle en somme, je parle d'expérience :-(&lt;br /&gt;
&lt;br /&gt;
== Le wifi ==&lt;br /&gt;
Bien que le RPi ne soit pas équipé par défaut du wifi, il est compatible avec la majorité des clefs usb wifi. Dans mon cas, une vieille clef Hercules HWGUSB2-54. Un petit tour par les log (&amp;lt;code&amp;gt;sudo tail -f /var/log/syslog&amp;lt;/code&amp;gt;) pour vérifier qu'elle est reconnue correctement lors du branchement, et puis une configuration via l'édition de &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt; pour entrer les références du réseau wifi:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
auto wlan0&lt;br /&gt;
allow-hotplug wlan0&lt;br /&gt;
iface wlan0 inet dhcp&lt;br /&gt;
wpa-ssid &amp;quot;Le_nom_(SSID)_de_votre_wifi&amp;quot;&lt;br /&gt;
wpa-psk &amp;quot;Le_mot_de_passe_de_votre_wifi&amp;quot;&lt;br /&gt;
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Ensuite un redémmarrage de la carte avec &amp;lt;code&amp;gt;$ sudo ifdown wlan0&amp;lt;/code&amp;gt; suivi de &amp;lt;code&amp;gt;sudo ifup wlan0&amp;lt;/code&amp;gt; et ça devrait être OK. On peut maintenant se passer de câble ethernet!&lt;br /&gt;
&lt;br /&gt;
Si nécessaire: plus de détails sur la configuration réseau sur [http://mchobby.be/wiki/index.php?title=Rasp-Config-Reseau le wiki MC Hobby]&lt;br /&gt;
&lt;br /&gt;
== La température avec le DHT22 / AM2302 ==&lt;br /&gt;
Pour la lecture des température avec le capteur, les gars d'Adafruit ont déjà développé un bibliothèque de fonctions utilisables en ligne de commande ou en [https://fr.wikipedia.org/wiki/Python_%28langage%29 python]. Quelques ressources:&lt;br /&gt;
* [https://learn.adafruit.com/dht-humidity-sensing-on-raspberry-pi-with-gdocs-logging/overview La page d'Adafruit (en anglais) sur l'utilisation du DHT22 avec le RPi]&lt;br /&gt;
* [http://www.manuel-esteban.com/lire-une-sonde-dht22-avec-un-raspberry-pi/ Une ressource en français (un peu datée) sur l'utilisation DHT22 + RPi.]&lt;br /&gt;
* [http://pi.gadgetoid.com/pinout La table de référence des 40 pins GPIO du RPi]&lt;br /&gt;
Pour ma part, j'ai suivi la méthode Adafruit, ce qui donne en résumé, en ligne de commande:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
cd /home/pi&lt;br /&gt;
git clone https://github.com/adafruit/Adafruit_Python_DHT.git &lt;br /&gt;
cd Adafruit_Python_DHT&lt;br /&gt;
sudo apt-get install build-essential python-dev  &lt;br /&gt;
sudo python setup.py install&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Au niveau du montage, rien de nouveau: le capteur doit toujours être alimenté en 3.3V ou en 5V, et le câble de lecture à une pin d'entrée/sortie (GPIO: General Purpose Input Output), ce qui donne:&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Cellarkare mark2 bb.png|400px|thumb|left]]&lt;br /&gt;
[[Fichier:Cellarkare_mark2.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Un test en ligne de commande permet de vérifier qu'on a une lecture sur le capteur (dans mon cas un AM2302 raccordé sur la pin GPIO 4):&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
cd /home/pi/Adafruit_Python_DHT/examples/&lt;br /&gt;
sudo ./AdafruitDHT.py 2302 4&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Ce qui affiche &amp;lt;code&amp;gt;Temp=23.0*C  Humidity=53.8%&amp;lt;/code&amp;gt;, des valeurs censées pour une après-midi d'été ;-)&lt;br /&gt;
&lt;br /&gt;
== L'affichage LCD ==&lt;br /&gt;
L'écran LCD est toujours le même que pour la version &amp;quot;Mark 1&amp;quot; Arduino. Quelques resources:&lt;br /&gt;
* [https://learn.adafruit.com/drive-a-16x2-lcd-directly-with-a-raspberry-pi Un tutoriel (en anglais) sur Adafruit] ''Attention, le code source n'est plus tellement a jour, voir le dernier lien Github.''&lt;br /&gt;
* [http://mchobby.be/wiki/index.php?title=Rasp-Hack-Afficheur-LCD La version française, traduite par MC Hobby]&lt;br /&gt;
* [https://github.com/adafruit/Adafruit_Python_CharLCD Le code source de la librairie Adafruit pour le gestion du LCD sur GitHub] ''contient la dernière version de la librairie''.&lt;br /&gt;
&lt;br /&gt;
La logique de raccordement est strictement identique au circuit du Mark 1. La seule différence est que la résistance variable de 10K dans le circuit est supprimée, la bibliothèque Adafruit pour le LCD permettant le pilotage en [https://fr.wikipedia.org/wiki/Modulation_de_largeur_d%27impulsion modulation PWM].&lt;br /&gt;
&lt;br /&gt;
== Le montage ==&lt;br /&gt;
Au final, le montage a été fait pour gagner un maximum de place sur mon breadboard. La pin data du DHT a été déplacée sur la pin 5, et le reste des pin pour le LCD sont documentées dans le code.&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Cellarkare mark2_2 bb.png|500px|thumb|left]]&lt;br /&gt;
[[Fichier:Cellarkare_mark2_2.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Le code ==&lt;br /&gt;
&lt;br /&gt;
La logique du code est identique à la version mark 1 - arduino. Ce code est aussi disponible (et éventuellement mis à jour) [https://gitlab.com/qberten/cellarkare/blob/master/mark2_rpi/cellarkare_rpi.py sur gitlab]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
# coding=utf8&lt;br /&gt;
# CellarKare - Mark 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
# Un projet de station de mesure de la température et l'humidité dans une cave à vin&lt;br /&gt;
# Plus d'infos et schéma de montage sur http://wiki.makilab.org/index.php/CellarKare&lt;br /&gt;
# Quentin Berten, 2015 - Domaine public, licence WTFPL v2, http://www.wtfpl.net/&lt;br /&gt;
# quentin_#AT#_berten.me&lt;br /&gt;
&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
# Bibliothèque CharLCD d'Adafruit, voir https://github.com/adafruit/Adafruit_Python_CharLCD&lt;br /&gt;
# pour l'installation&lt;br /&gt;
import Adafruit_CharLCD as LCD&lt;br /&gt;
# Bibliothèque DHT d'AdaFruit, voir https://github.com/adafruit/Adafruit_Python_DHT&lt;br /&gt;
# pour l'installation&lt;br /&gt;
import Adafruit_DHT as DHT&lt;br /&gt;
&lt;br /&gt;
# Configuration de l'affichage LCD&lt;br /&gt;
lcd_rs        = 25      # RS sur pin 25&lt;br /&gt;
lcd_en        = 24      # EN sur pin 24&lt;br /&gt;
lcd_d4        = 23      # D4 sur pin 23&lt;br /&gt;
lcd_d5        = 12      # D5 sur pin 12&lt;br /&gt;
lcd_d6        = 20      # D6 sur pin 20&lt;br /&gt;
lcd_d7        = 16      # D7 sur pin 16&lt;br /&gt;
lcd_backlight = 18      # rétro éclairage sur pin 18&lt;br /&gt;
lcd_columns   = 16      # Affichage à 16 colonnes ...&lt;br /&gt;
# Initialisation du LCD avec les variables ci-dessus&lt;br /&gt;
lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, &lt;br /&gt;
		        	lcd_columns, lcd_rows, lcd_backlight)&lt;br /&gt;
# Configuration pour le capteur DHT, soit DHT11, DHT22 ou AM2302.&lt;br /&gt;
dht_sensor    = DHT.AM2302  # Type AM2302&lt;br /&gt;
dht_pin       = 5           # DHT data sur pin 5&lt;br /&gt;
&lt;br /&gt;
# les variables qui permettent de gérer le temps,&lt;br /&gt;
prevMillis = 0          # enregistre le temps de la denière lecture DHT22&lt;br /&gt;
secInterval = 1000      # Un intervalle d'une seconde&lt;br /&gt;
# L'intervalle de lecture du DHT22: 3 secondes, doit etre plus grand que secInterval&lt;br /&gt;
dhtInterval = 3000&lt;br /&gt;
&lt;br /&gt;
def read_and_print_dht():&lt;br /&gt;
    # On lit une valeur sur le senseur avec la fonction read. Attention, cette fonction&lt;br /&gt;
    # ne réessaie pas automatiquement en cas d'erreur, mais fournit les valeurs (None, None).&lt;br /&gt;
    hum, tempC  = DHT.read(dht_sensor, dht_pin)&lt;br /&gt;
&lt;br /&gt;
    # On vérifie que l'on a bien eu une lecture (Linux n'est pas un OS temps réel et ne&lt;br /&gt;
    # peut pas garantir le timing des lectures sur le capteur). Si ça arrive, on réessaie.&lt;br /&gt;
    # On affiche les valeurs sur la console (n'est pas indispensable)&lt;br /&gt;
    if hum is not None and tempC is not None:&lt;br /&gt;
    	print 'Temp={0:0.2f}*C  Humidity={1:0.2f}%'.format(tempC, hum)&lt;br /&gt;
        # On affiche les valeurs sur l'écran LCD&lt;br /&gt;
        lcd.clear()&lt;br /&gt;
        lcd.message('deg C: {0:0.2f}\nhum %: {1:0.2f}'.format(tempC, hum))&lt;br /&gt;
    else:&lt;br /&gt;
	print 'Lecture sur le capteur DHT ratée'&lt;br /&gt;
&lt;br /&gt;
# Boucle principale, l'équivalent de void loop() sur Arduino&lt;br /&gt;
while 1:&lt;br /&gt;
    # On lit le nombre de millisecondes courant&lt;br /&gt;
    curMillis = time.time()*1000&lt;br /&gt;
    if curMillis - prevMillis &amp;gt; dhtInterval:&lt;br /&gt;
        # On essaie de lire et afficher les valeurs du DHT&lt;br /&gt;
        read_and_print_dht()&lt;br /&gt;
        # on enregistre le dernier temps d'exécution de la lecture&lt;br /&gt;
        prevMillis = curMillis&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== La conclusion ==&lt;br /&gt;
En vrac:&lt;br /&gt;
* Pas de gros problème ou obstacles majeurs pour convertir le montage et le code Arduino en son équivalent RPi. Mais heureusement que l'équipe d'Adafruit a déjà programmé les bibliothèques Python qui vont bien!&lt;br /&gt;
* Au niveau du breadboard, ça commence à prendre de la place... Une solution: passer en [https://fr.wikipedia.org/wiki/I2C &amp;quot;I2C&amp;quot;] pour le capteur et le LCD, ce qui limite drastiquement le nombre de pins nécessaires pour le montage, et facilite la programmation. Merci Patrick pour les infos, ce sera sûrement utile pour le prochain montage ;-) !&lt;br /&gt;
** Par exemple, pour la température: un capteur I2C comme le [https://www.adafruit.com/products/1638 SHT15], et pour l'écran, [http://www.electrodragon.com/w/index.php?title=1602_LCD_I2C/SPI_Module la version I2C du même 1602].&lt;br /&gt;
** Par contre dans ce cas, il faut faire gaffe au fait que le passage en 3.3V pour la logique du RPi, le lcd reste en 5V et il faudra ajouter un [http://www.adafruit.com/products/757 convertisseurs de niveau] pour le bus si utilisé avec un capteur qui ne supporte pas 5V.&lt;br /&gt;
* le langage Python, c'est pas plus compliqué que le simili-C de l'Arduino une fois qu'on est rentré dedans.&lt;br /&gt;
&lt;br /&gt;
= Mark 3: Start, Stop, and say Cheese =&lt;br /&gt;
&lt;br /&gt;
== Sart/Stop ==&lt;br /&gt;
Un &amp;quot;problème&amp;quot; du RPi, c'est qu'il n'a pas de bouton ON/OFF simple, et par conséquent, l'éteindre proprement avec &amp;lt;code&amp;gt;sudo halt&amp;lt;/code&amp;gt; ou  &amp;lt;code&amp;gt;sudo poweroff&amp;lt;/code&amp;gt; est impossible sans un accès physique (clavier et écran connectés) ou une connection SSH (connection à distance). Pas pratique pour un boitier qui sera installé dans une cave à vin...&lt;br /&gt;
&lt;br /&gt;
Autrement dit, mes besoins:&lt;br /&gt;
# Le programme python d'affichage et monitoring des températures démarre automatiquement lorsque le RPi démarre.&lt;br /&gt;
# Un bouton OFF permet d'éteindre proprement le RPi avant de le débrancher de son alimentation.&lt;br /&gt;
# Un bouton ON permet de l'allumer une fois éteint sans débrancher/rebrancher son alimentation.&lt;br /&gt;
# Nec plus ultra: avoir un fonctionnement similaire à un bouton ON/OFF d'un laptop par exemple: si éteint, le bouton allume, si allumé, le bouton éteint proprement le RPi, et coupe l'alimentation USB.&lt;br /&gt;
&lt;br /&gt;
Bon après quelques recherches sur le net:&lt;br /&gt;
# C'est simple, il suffit de configurer le &amp;quot;init script&amp;quot; du RPi pour lancer automatiquement le programme python au démarrage&lt;br /&gt;
# Un montage simple permet d'écouter sur une des pins du GPIO, et de lancer la procédure propre d'arrêt (shutdown). Soit un bouton OFF&lt;br /&gt;
# Le RPi (à partir du modèle B rev2, soit Brev2, B+ et 2) possède un pinout &amp;quot;reset&amp;quot;, qui n'est pas soudé de base sur la carte. Si on raccorde ces deux pins, le RPi redémarre électriquement (hard reboot). Donc sans s'éteindre proprement. L'intérêt, c'est que si le RPi est éteint mais encore sous tension, ce bouton permet de le ré-allumer. Donc un bouton ON/RESET. Voir par exemple:&lt;br /&gt;
#* Un article assez complet en anglais sur [http://www.makeuseof.com/tag/add-reset-switch-raspberry-pi/ MakeUseOf.com]&lt;br /&gt;
# Le bouton combiné ON/OFF unique est possible, mais le montage est plus compliqué. Quelques exemples:&lt;br /&gt;
#* Un montage en français sur le site [http://forum.madeinfr.org/topic/43/raspower/ MadeInFR.org].&lt;br /&gt;
#* Un montage en anglais à base de micro contrôleur (pas simple donc) sur [http://www.instructables.com/id/Raspberry-Pi-Shutdown-Button/ Instructables]&lt;br /&gt;
#* Un article très complet en anglais reprenant toutes les options, dont un montage assez simple de bouton unique [http://www.raspberry-pi-geek.com/Archive/2013/01/Adding-an-On-Off-switch-to-your-Raspberry-Pi sur raspberry-pi-geek.com]&lt;br /&gt;
#* Des solutions commerciales toutes faites comme [https://www.pi-supply.com/product/pi-supply-raspberry-pi-power-switch/ PiSupply] ou [http://www.mausberrycircuits.com/collections/frontpage MausberryCircuits]&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, ce sera pour moi le choix suivant: un bouton OFF, qui lors d'un appui long éteint proprement le RPi. En gros la solution 2.&lt;br /&gt;
&lt;br /&gt;
Mais dans un premier temps, il faut configurer le RPi pour lancer le programme au démarrage...&lt;br /&gt;
&lt;br /&gt;
== Lancement du programme via initscript ==&lt;br /&gt;
&lt;br /&gt;
Il y a certainement 36 façons d'arriver au même résultat (après tout, le RPi tourne sous Linux ;-), mais dans mon cas, la solution qui me convient bien: un script d'init lance par défaut le script python localisé en &amp;lt;code&amp;gt;/usr/local/bin/pystartup.py&amp;lt;/code&amp;gt;. L'intérêt de la chose: &amp;lt;code&amp;gt;pystartup.py&amp;lt;/code&amp;gt; peut être un lien symbolique vers n'importe quel autre script.&lt;br /&gt;
&lt;br /&gt;
Pour éviter d'encombrer le wiki, je n'ai pas repris le script ici, mais il est dispo sur [https://gitlab.com/qberten/cellarkare/blob/master/mark3_camera/initscript_pystartup GitLab]. Pour l'installation, en ligne de commande (connecté sur le RPi):&lt;br /&gt;
&lt;br /&gt;
On télécharge le script, on le déplace au bon endroit et on le rend exécutable&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
wget https://gitlab.com/qberten/cellarkare/raw/master/mark3_camera/initscript_pystartup&lt;br /&gt;
sudo mv initscript_pystartup /etc/init.d/pystartup&lt;br /&gt;
sudo chmod a+x /etc/init.d/pystartup&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
On crée le lien symbolique qui va bien (remplacer /chemin/vers/... par la localisation du programme à lancer)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
ln -s /chemin/vers/votre/script/python.py /usr/local/bin/pystartup.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
On configure le système pour qu'il connaisse le nouveau script &amp;quot;pystartup&amp;quot;, et on lui demande de l'exécuter à chaque démarrage&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo update-rc.d pystartup defaults&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Il est ensuite possible de lancer son programme en arrière plan comme n'importe quel autre service avec &amp;lt;code&amp;gt;sudo service pystartup start&amp;lt;/code&amp;gt;, de l'arrêter avec &amp;lt;code&amp;gt;sudo service pystartup stop&amp;lt;/code&amp;gt;, etc&lt;br /&gt;
&lt;br /&gt;
== Pinout RESET ==&lt;br /&gt;
&lt;br /&gt;
Activer le &amp;quot;hard&amp;quot; reset sur le Rpi suppose un peu de soudure, mais rien de bien effrayant, 2 points suffisent. Un fois les connecteur pinout soudés, quand on raccorde les deux pins (par exemple avec un interrupteur), le RPi redémarre (&amp;quot;hard&amp;quot; reset, donc attention à la carte SD...), ou s'allume (si il était raccordé au secteur).&lt;br /&gt;
&lt;br /&gt;
J'ai soudé les 2 pins et testé la fonction, mais comme il s'agit d'un redémarrage &amp;quot;hard&amp;quot;, je n'ai finalement pas vraiment vu l'utilité dans ce projet: autant directement débrancher / rebrancher le câble d'alimentation dans ce cas.&lt;br /&gt;
&lt;br /&gt;
Mais à toutes fins utiles, les photos de l'opération, avant/après.&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Rpi_reset_before.jpg|500px|thumb|left]]&lt;br /&gt;
[[Fichier:Rpi_reset_after.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bouton OFF ==&lt;br /&gt;
&lt;br /&gt;
Rien de très compliqué: on raccorde le bouton à une entrée, on configure la résistance pull-up/down interne du Rpi, on s'assure de récupérer les évènements dans le code.&lt;br /&gt;
&lt;br /&gt;
Les parties utiles du code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# La fonction qui effectuer l'arrêt propre du RPi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def btn_proper_halt(pin):&lt;br /&gt;
    global off_state, cur_millis, off_millis&lt;br /&gt;
    # On lit le nombre de millisecondes courant&lt;br /&gt;
    cur_millis = time.time()*1000&lt;br /&gt;
    # Utilise la variable globale off_state&lt;br /&gt;
    off_state = not off_state&lt;br /&gt;
    # DEBUG&lt;br /&gt;
    logging.debug(&amp;quot;Bouton OFF_PIN pressé, son état est maintenant %s&amp;quot; % str(off_state))&lt;br /&gt;
    if off_state == True:&lt;br /&gt;
        off_millis = cur_millis   &lt;br /&gt;
    elif off_state == False: &lt;br /&gt;
        # DEBUG&lt;br /&gt;
        logging.debug(&amp;quot;Bouton OFF_PIN pressé pendant {0:0.0f} ms&amp;quot;.format(cur_millis - off_millis))&lt;br /&gt;
        if (cur_millis - off_millis) &amp;gt; OFF_INTERVAL:&lt;br /&gt;
            # On a relâché le bouton avec un écart long =&amp;gt; shutdown&lt;br /&gt;
            logging.debug(&amp;quot;Appui long sur le bouton OFF_PIN&amp;quot;)&lt;br /&gt;
            logging.info(&amp;quot;Arrêt du Raspberry PI, attendre encore 10 sec avant de débrancher&amp;quot;)&lt;br /&gt;
            subprocess.call('halt', shell=False)&lt;br /&gt;
        else:&lt;br /&gt;
            # Appuis court =&amp;gt; on ne fait rien&lt;br /&gt;
            logging.debug(&amp;quot;Appui court sur le bouton OFF_PIN&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Fonction de terminaison du programme (appelée lorsque le script est arrêté&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def terminate():&lt;br /&gt;
    logging.debug(&amp;quot;Terminate function started&amp;quot;)&lt;br /&gt;
    # efface l'écran LCD&lt;br /&gt;
    lcd_dim_backlight(0.0, 0.2)&lt;br /&gt;
    lcd.clear()&lt;br /&gt;
    logging.debug(&amp;quot;Terminate function ended&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Fonction d'initialisation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def initialize():&lt;br /&gt;
    global lcd&lt;br /&gt;
    logging.debug(&amp;quot;Initialize function started&amp;quot;)&lt;br /&gt;
    # Initialisation du LCD avec les variables ci-dessus&lt;br /&gt;
    lcd = LCD.Adafruit_CharLCD(LCD_RS, LCD_EN, LCD_D4, LCD_D5, LCD_D6, LCD_D7, &lt;br /&gt;
		        	LCD_COLUMNS, LCD_ROWS,&lt;br /&gt;
                                LCD_BACKLIGHT, invert_polarity = False, enable_pwm = True,&lt;br /&gt;
                                initial_backlight = lcd_backlight)&lt;br /&gt;
    # Initialisation des autres GPIO's&lt;br /&gt;
    GPIO.setmode(GPIO.BCM)        # On utilise la numérotation BCM pour les PIN&lt;br /&gt;
    # On définit la pin OFF_PIN comme entrée, et on active la résistance pull-down interne du RPi&lt;br /&gt;
    GPIO.setup(OFF_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)&lt;br /&gt;
    # Configure une interruption qui va détecter les mouvements up et down sur le bouton&lt;br /&gt;
    GPIO.add_event_detect(OFF_PIN, GPIO.BOTH, callback=btn_proper_halt, bouncetime=20)&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Say &amp;quot;cheese&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Cette partie du projet s'attache à pouvoir prendre rapidement et facilement un photos des étiquettes des bouteilles entrées ou sorties de la cave. Ben oui, j'ai pas forcément une bonne mémoire, et se donner les moyens d'enregistrer facilement et rapidement l'info est le meilleur moyen de suivre son stock ;-)&lt;br /&gt;
&lt;br /&gt;
Cette partie est super simple à réaliser avec le rpi: on raccorde la caméra, on s'assure qu'elle est activée avec &amp;lt;code&amp;gt;sudo raspi-config&amp;lt;/code&amp;gt;, et on peut ensuite l'utiliser en ligne de commande ou en python. Le site web [https://www.raspberrypi.org/documentation/usage/camera/README.md raspberrypi.org (en anglais)] explique cela très bien.&lt;br /&gt;
&lt;br /&gt;
On ajoute un deuxième bouton sur le breadboard, qui déclenche la prise d'une photo, et le prototype est maintenant fonctionnel. Les photos sont sauvegardées dans le répertoire courant du RPi, avec la date et l'heure pour nom de fichier.&lt;br /&gt;
&lt;br /&gt;
Au niveau du code, les parties utiles sont:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Fonction de prise d'une photo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def btn_take_picture(pin):&lt;br /&gt;
    # DEBUG&lt;br /&gt;
    logging.info(&amp;quot;Bouton CAM_PIN pressé, on prend un photo&amp;quot;)&lt;br /&gt;
    # Construction du chemin pour la photo&lt;br /&gt;
    now = datetime.datetime.now()&lt;br /&gt;
    pic_filename = &amp;quot;/home/qb/pic_&amp;quot; + str(now) + &amp;quot;.jpg&amp;quot;&lt;br /&gt;
    # Initialisation de la camera. On ne le fait pas dans initialize() pour éviter au maximum de la laisser&lt;br /&gt;
    # allumée (et consommer) en continu. En plus, une fois activée, les lectures sur le DHT sont beaucoup&lt;br /&gt;
    # plus souvent ratées.&lt;br /&gt;
    with PICAM.PiCamera() as cam:&lt;br /&gt;
        cam.capture(pic_filename)&lt;br /&gt;
        logging.debug(&amp;quot;Photos sauvée &amp;quot; + str(cam.resolution) + &amp;quot;  dans &amp;quot; + pic_filename)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pimp my screen ==&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est d'allumer ou éteindre l'écran, la bibliothèque CharLCD permet la modulation PWN du rétroéclairage. De quoi avoir un chouette effet de fondu au noir lorsque l'écran s'allume et s'éteint.&lt;br /&gt;
&lt;br /&gt;
Au niveau du code, la partie utile:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Module l'intensité du rétro éclairage de l'écran lcd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def lcd_dim_backlight(backlight_value, time_step):&lt;br /&gt;
    global lcd&lt;br /&gt;
    global lcd_backlight&lt;br /&gt;
    # calcule l'incrément à avoir entre lcd_backlight et backlight_value&lt;br /&gt;
    stp = (lcd_backlight &amp;gt; backlight_value) * -2 +1&lt;br /&gt;
    brightnesses = map(lambda x: x/10.0, range(int(lcd_backlight*10), int(backlight_value*10)+1, stp))&lt;br /&gt;
    for bright in brightnesses:&lt;br /&gt;
        lcd_backlight = bright&lt;br /&gt;
        logging.debug(&amp;quot;loop on bright= &amp;quot; + str(bright))&lt;br /&gt;
        lcd.set_backlight(bright)&lt;br /&gt;
        time.sleep(time_step)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A suivre...&lt;br /&gt;
&lt;br /&gt;
Les parties du code python utile&lt;br /&gt;
Le schéma complet &amp;quot;mark 3&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Projets]]&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.makilab.org/index.php?title=CellarKare&amp;diff=2977</id>
		<title>CellarKare</title>
		<link rel="alternate" type="text/html" href="https://wiki.makilab.org/index.php?title=CellarKare&amp;diff=2977"/>
		<updated>2015-10-28T20:52:55Z</updated>

		<summary type="html">&lt;p&gt;Quentin : /* Mark 3: Start, Stop, and say Cheese */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Un projet lancé par --[[Utilisateur:Quentin|Quentin]] ([[Discussion utilisateur:Quentin|discussion]]) 14 juin 2015 à 19:58 (CEST)&lt;br /&gt;
&lt;br /&gt;
= En bref =&lt;br /&gt;
&lt;br /&gt;
Le projet est de créer une &amp;quot;station météo&amp;quot; pour une cave à vin, d'où le nom du projet un peu fumeux de CellarKare = Cellar + Care, le K c'est pour faire joli ;-)&lt;br /&gt;
Dans un premier temps, le but est d'afficher la température et le taux d'humidité (hygrométrie). Ça, c'est pour le but fonctionnel. Mes autres buts sont:&lt;br /&gt;
* Au niveau perso: réaliser un premier projet à forte composante électronique, dans la foulée de notre formation Arduino&lt;br /&gt;
* Utiliser un maximum toutes les techniques/machines du Makilab&lt;br /&gt;
* Documenter les différentes étapes (tutoriel), et fournir les fichiers sources nécessaires aux différentes étapes.&lt;br /&gt;
&lt;br /&gt;
= Mark 1: Le matos et un premier proto Arduino=&lt;br /&gt;
&lt;br /&gt;
Le premier prototype sera relativement simple: la station affichera la température et l'humidité ambiante sur un écran LCD, le tout piloté par un Arduino Uno.&lt;br /&gt;
&lt;br /&gt;
== T° et humidité: DHT22 / AM2303 ==&lt;br /&gt;
&lt;br /&gt;
Au niveau des capteurs, logiquement il en faut un pour lire la température, et un pour lire l'humidité. Les deux existent certainement séparément, mais une rapide recherche sur le net done des références de capteurs déjà calibrés et fournissant les deux pour pas trop cher. Au final, mon choix se porte sur un DHT22. Ce capteur s'appelle aussi AM2303 dans sa version câblée. Quelques liens et documentation utiles:&lt;br /&gt;
* [http://www.adafruit.com/datasheets/DHT22.pdf Les specs du DHT22 (anglais)];&lt;br /&gt;
* Pour acheter: [http://www.adafruit.com/products/385 ~10 $ chez AdaFruit] ou [http://shop.mchobby.be/senseurs/214-dht22-am2302-senseur-humidite-temperature--3232100002142.html ~17 € chez MCHobby], c'est un peu plus cher, mais ils sont belges et sympas;&lt;br /&gt;
* [http://playground.arduino.cc/Main/DHTLib Un tutoriel pour arduino sur Arduino.cc];&lt;br /&gt;
* [https://learn.adafruit.com/dht/using-a-dhtxx-sensor Un tutoriel pour arduino sur AdaFruit], et sa [http://mchobby.be/wiki/index.php?title=DHTxx version française];&lt;br /&gt;
&lt;br /&gt;
== L'affichage LCD: LCM1602 ==&lt;br /&gt;
&lt;br /&gt;
Pour l'affichage, le choix a été vite fait... J'ai pris ce que j'avais sous la main, soit le LCD fourni dans le starter kit arduino. Cet écran est très répandu, et fait partie de nombreux &amp;quot;kits de démarrage&amp;quot; en électronique. Au niveau fonctionnel, avec 2 lignes de 16 charactères, on devrait pouvoir s'en sortir pour afficher une température et un taux d'humidité ;-). Son contrôleur (hitachi HD44780) est lui aussi très répandu En vrac:&lt;br /&gt;
* [http://www.datasheetspdf.com/datasheet/LCM1602.html Les specs (chinois ou anglais)]&lt;br /&gt;
* Pour acheter: [http://www.ebay.com/sch/items/?_nkw=lcm1602&amp;amp;_sacat=&amp;amp;_ex_kw=&amp;amp;_mPrRngCbx=1&amp;amp;_udlo=&amp;amp;_udhi=&amp;amp;_sop=12&amp;amp;_fpos=&amp;amp;_fspt=1&amp;amp;_sadis=&amp;amp;LH_CAds=&amp;amp;rmvSB=true on en trouve plein sur ebay...]&lt;br /&gt;
* [http://www.arduino.cc/en/Tutorial/LiquidCrystal La librairie LiquidCrystal, qui permet de le contrôler sur Arduino]&lt;br /&gt;
&lt;br /&gt;
== Le montage ==&lt;br /&gt;
&lt;br /&gt;
Le montage est assez simple, et n'est finalement qu'une combinaison des différents tutoriel et exemple d'utilisation de l'écran et du capteur.&lt;br /&gt;
&lt;br /&gt;
Sur le schéma du capteur DHT, la résistance de 10K sert de [https://fr.wikipedia.org/wiki/R%C3%A9sistance_de_rappel &amp;quot;résistance pull-up&amp;quot;].&lt;br /&gt;
'''Cette résistance n'est pas nécessaire dans le cas du capteur AM2302''' (la version avec câble et boitier en plastique, comme sur la photo). Cette version [http://www.adafruit.com/product/393 intègre une résistance de 5.1K dans le boîtier], qui connecte déjà VCC et DATA, merci Patrick pour l'info ;-).&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Cellarkare mark1 bb.png|500px|thumb|left]]&lt;br /&gt;
[[Fichier:Cellarkare_mark1.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Le code ==&lt;br /&gt;
Au niveau programmation du micro-controlleur Arduino, là aussi c'est assez simple: toutes les 3 secondes, on lit les valeurs de t° et humidité, et on les affiches sur l'écran LCD. Les valeurs mesurées et des messages supplémentaires sont aussi envoyés sur la sortie série.&lt;br /&gt;
&lt;br /&gt;
Le code est aussi disponible (et éventuellement mis à jour) [https://gitlab.com/qberten/cellarkare/blob/master/mark1_arduino/cellarkare_arduino.ino sur gitlab]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
CellarKare - Mark #1&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Un projet de station de mesure de la température et l'humidité dans une cave à vin&lt;br /&gt;
Plus d'infos et schéma de montage sur http://wiki.makilab.org/index.php/CellarKare&lt;br /&gt;
Quentin Berten, 2015 - Domaine public, licence WTFPL v2, http://www.wtfpl.net/&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
// Bibliothèque LiquidCrystal, pour l'écran LCD. Installée de base avec l'IDE&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Bibliothèque DHT, pour le capteur de température. Installable directement depuis&lt;br /&gt;
// l'IDE, via Sketch -&amp;gt; Include LIbrary -&amp;gt; Manage Libraries -&amp;gt; DHT sensor Library &lt;br /&gt;
#include &amp;quot;DHT.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Définition l'écran LCD, en argument les pins d'interface, dans l'ordre&lt;br /&gt;
// (RS pin, LCD Enable, D4, D5, D6, D7)&lt;br /&gt;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);&lt;br /&gt;
&lt;br /&gt;
// Définition des pin et type pour le senseur de t° et humidité&lt;br /&gt;
#define DHTPIN 7         // senseur (fil data, en jaune), sur pin 7&lt;br /&gt;
#define DHTTYPE DHT22    // type DHT 22  (AM2302)&lt;br /&gt;
&lt;br /&gt;
// Définition du capteur DHT22, pour un Arduino &amp;quot;normal&amp;quot; à 16mhz, comme le Uno&lt;br /&gt;
DHT dht(DHTPIN, DHTTYPE);&lt;br /&gt;
// les variables associées qui vont lire les valeurs (température, ...)&lt;br /&gt;
float hum;&lt;br /&gt;
float tempC;&lt;br /&gt;
float tempF;&lt;br /&gt;
float indiceHum;&lt;br /&gt;
&lt;br /&gt;
// les variables qui permettent de gérer le temps,&lt;br /&gt;
// voir http://www.arduino.cc/en/pmwiki.php?n=Tutorial/BlinkWithoutDelay&lt;br /&gt;
long prevMillis = 0;           // enregistre le temps de la denière lecture DHT22&lt;br /&gt;
long dhtInterval = 3000;       // L'intervalle de lecture du DHT22: 3 secondes&lt;br /&gt;
&lt;br /&gt;
// la procédure d'initialisation arduino&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  // on ouvre une connection série (pour afficher un maxium d'info)&lt;br /&gt;
  Serial.begin(9600); &lt;br /&gt;
  Serial.println(&amp;quot;CellarKare Mark #1 Test&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // initialisation du capteur&lt;br /&gt;
  dht.begin();&lt;br /&gt;
  // initialisation de l'écran, 16 colonnes et 2 lignes&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// la boucle principale arduino&lt;br /&gt;
void loop() {&lt;br /&gt;
  unsigned long curMillis = millis();&lt;br /&gt;
  &lt;br /&gt;
  if(curMillis - prevMillis &amp;lt; dhtInterval) {&lt;br /&gt;
    goto end_loop;        // pas de lecture DHT, on va à la fin de la boucle loop()&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // on enregistre le dernier temps d'exécution de la lecture&lt;br /&gt;
  prevMillis = curMillis;   &lt;br /&gt;
  &lt;br /&gt;
  // la lecture de la t° et l'humidité prends environ 250 millisecondes&lt;br /&gt;
  // mais les lectures du capteur peuvent etre vieillies de 2 secondes&lt;br /&gt;
  // le capteur n'est pas rapide (d'où l'attente de 3 secondes pour etre&lt;br /&gt;
  // certain d'avoir des lectures correctes.&lt;br /&gt;
  // lecture de l'humidité&lt;br /&gt;
  hum = dht.readHumidity();&lt;br /&gt;
  // lecture de la température en degrés Celsius&lt;br /&gt;
  tempC = dht.readTemperature();&lt;br /&gt;
  // lecture de la température en degrés Fahreneit&lt;br /&gt;
  tempF = dht.readTemperature(true);&lt;br /&gt;
  &lt;br /&gt;
  // On vérifie que les lectures on bien été réalisées. Si pas, on quitte&lt;br /&gt;
  // la boucle pour ré-essayer&lt;br /&gt;
  if (isnan(hum) || isnan(tempC) || isnan(tempF)) {&lt;br /&gt;
    Serial.println(&amp;quot;Lecture sur le capteur DHT ratée&amp;quot;);&lt;br /&gt;
    goto end_loop;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Calcul de l'indice de chaleur (voir https://fr.wikipedia.org/wiki/Indice_de_chaleur )&lt;br /&gt;
  // La température doit etre fournie en degré Fahreneit&lt;br /&gt;
  indiceHum = dht.computeHeatIndex(tempF, hum);&lt;br /&gt;
&lt;br /&gt;
  // On affiche les valeurs sur la console série (n'est pas indispensable)&lt;br /&gt;
  Serial.print(&amp;quot;Humidite: &amp;quot;); &lt;br /&gt;
  Serial.print(hum);&lt;br /&gt;
  Serial.print(&amp;quot; %\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temperature: &amp;quot;); &lt;br /&gt;
  Serial.print(tempC);&lt;br /&gt;
  Serial.print(&amp;quot; *C &amp;quot;);&lt;br /&gt;
  Serial.print(tempF);&lt;br /&gt;
  Serial.print(&amp;quot; *F\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Indice de chaleur: &amp;quot;);&lt;br /&gt;
  Serial.print(indiceHum);&lt;br /&gt;
  Serial.println(&amp;quot; *F&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  // On affiche les valeurs sur l'écran LCD, curseur à (0,0)&lt;br /&gt;
  lcd.setCursor(0, 0);&lt;br /&gt;
  // print Temp in C°&lt;br /&gt;
  lcd.print(&amp;quot;deg C: &amp;quot;);&lt;br /&gt;
  lcd.print(tempC);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;hum %: &amp;quot;);&lt;br /&gt;
  lcd.print(hum);&lt;br /&gt;
&lt;br /&gt;
  // label pour goto&lt;br /&gt;
  end_loop:&lt;br /&gt;
  ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== La conclusion ==&lt;br /&gt;
Un premier prototype fonctionnel, qui a au moins le mérite de vérifier que le capteur DHT renvoie des valeurs réalistes.&lt;br /&gt;
La suite: la même chose avec un Raspberry pi, pour bénéficier de sa faciliter à se connecter au réseau. Ce serait quand même cool de pouvoir lire ces valeurs sur un smartphone ;-)&lt;br /&gt;
&lt;br /&gt;
= Mark 2: la même chose avec un Raspberry Pi =&lt;br /&gt;
Le but de cette nouvelle itération: réaliser un montage équivalent avec un [https://www.raspberrypi.org/ Raspberry Pi] (RPi en abrégé). Pourquoi un RPi ?&lt;br /&gt;
* Parce que j'en avais un sous la main ;-)&lt;br /&gt;
* Parce qu'il permet de se connecter rapidement et facilement à un réseau, via ethernet (câble) ou wifi (via un dongle usb)&lt;br /&gt;
* Parce qu'il permet de brancher facilement un module caméra (on y viendra au Mark 3)&lt;br /&gt;
&lt;br /&gt;
Il est certainement possible d'arriver au même résultat avec d'autres cartes (comme par exemple un [http://www.arduino.cc/en/Main/ArduinoBoardYun Arduino Yun]), c'est juste que c'est un RPi que j'avais sous la main... Dans mon cas un Raspberry Pi B+.&lt;br /&gt;
&lt;br /&gt;
En ce qui concerne le RPi, quelques ressources très utiles:&lt;br /&gt;
* [http://mchobby.be/wiki/index.php?title=RaspberryPi-Accueil#Tutoriels Les tutoriels réalisés/traduits par MC Hobby. Une mine d'or]&lt;br /&gt;
* [http://www.elektronique.fr/montages/raspberry-pi/ Des exemples de montages et réalisations électroniques avec RPi]&lt;br /&gt;
* [http://pi.gadgetoid.com/pinout La configuration des différentes PIN du RPi]&lt;br /&gt;
&lt;br /&gt;
== L'installation de l'OS ==&lt;br /&gt;
La principale différence entre une carte Arduino et le RPi, c'est le cœur de la carte:&lt;br /&gt;
* le cœur de l'Arduino est un microcontrôleur, qui va exécuter le programme qu'on lui injecte de manière bête et méchante. Chaque entrée/sortie va devoir être programmée directement, il n'y a pas de système de driver, ...&lt;br /&gt;
* le cœur du RPi est un microprocesseur (ARM, la même technologie que dans les smartphones). Il s'agit donc en fait d'un véritable &amp;quot;petit ordinateur&amp;quot;, avec un système d'exploitation, des drivers (pour l'usb, l'écran, le wifi, ...).&lt;br /&gt;
&lt;br /&gt;
Donc avant de pouvoir démarrer et utiliser le RPi, il va falloir installer un système d'exploitation (OS: Operating System). C'est exactement la même chose qu'installer Windows sur un PC, c'est juste que dans notre cas, ce ne sera pas Windows mais un système Linux. Il en existe [https://www.raspberrypi.org/downloads/ plusieurs], le standard de facto étant Raspbian (une distribution Debian adaptée pour le RPi), c'est celle-là [http://raspbian-france.fr/installer-raspbian-premier-demarrage-configuration/ que j'ai installée].&lt;br /&gt;
&lt;br /&gt;
Petit truc pour les distraits: écran/clavier/souris ne sont pas indispensables pour l'installation, il est tout à fait possible de se connecter via [https://fr.wikipedia.org/wiki/Secure_Shell SSH] au RPi une fois son premier démarrage exécuté, pour autant qu'il soit raccordé à votre réseau (via son câble ethernet). Le RPi se déclare automatiquement sur le réseau avec le nom raspberry.local, et un &amp;lt;code&amp;gt;ssh pi@raspberry.local&amp;lt;/code&amp;gt; à fait l'affaire (raspberry, c'est son &amp;quot;hostname&amp;quot; par défaut). Pour le mot de passe, c'est &amp;lt;code&amp;gt;raspberry&amp;lt;/code&amp;gt; par défaut. Ensuite &amp;lt;code&amp;gt;raspi-config&amp;lt;/code&amp;gt; permet de terminer la procédure d'installation.&lt;br /&gt;
&lt;br /&gt;
En ce qui me concerne, tout le reste de la configuration se fera donc en [https://fr.wikipedia.org/wiki/Shell_Unix ligne de commande (shell)] via SSH. [http://mchobby.be/wiki/index.php?title=PI-SSH Le wiki de MCHobby] détaille l'accès via SSH au RPi.&lt;br /&gt;
&lt;br /&gt;
'''Un dernier point important''': le RPi, c'est comme un &amp;quot;vrai&amp;quot; ordinateur... il vaut mieux l'éteindre proprement plutôt que le débrancher sauvagement. Donc on s'arrange pour faire un &amp;lt;code&amp;gt;sudo poweroff&amp;lt;/code&amp;gt; en ligne de commande avant de le débrancher. Le gros risque: corrompre le système de fichier sur le carte SD, ce qui empêche le démarrage suivant, et impose un reformatage et une réinstallation complète. Pas drôle en somme, je parle d'expérience :-(&lt;br /&gt;
&lt;br /&gt;
== Le wifi ==&lt;br /&gt;
Bien que le RPi ne soit pas équipé par défaut du wifi, il est compatible avec la majorité des clefs usb wifi. Dans mon cas, une vieille clef Hercules HWGUSB2-54. Un petit tour par les log (&amp;lt;code&amp;gt;sudo tail -f /var/log/syslog&amp;lt;/code&amp;gt;) pour vérifier qu'elle est reconnue correctement lors du branchement, et puis une configuration via l'édition de &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt; pour entrer les références du réseau wifi:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
auto wlan0&lt;br /&gt;
allow-hotplug wlan0&lt;br /&gt;
iface wlan0 inet dhcp&lt;br /&gt;
wpa-ssid &amp;quot;Le_nom_(SSID)_de_votre_wifi&amp;quot;&lt;br /&gt;
wpa-psk &amp;quot;Le_mot_de_passe_de_votre_wifi&amp;quot;&lt;br /&gt;
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Ensuite un redémmarrage de la carte avec &amp;lt;code&amp;gt;$ sudo ifdown wlan0&amp;lt;/code&amp;gt; suivi de &amp;lt;code&amp;gt;sudo ifup wlan0&amp;lt;/code&amp;gt; et ça devrait être OK. On peut maintenant se passer de câble ethernet!&lt;br /&gt;
&lt;br /&gt;
Si nécessaire: plus de détails sur la configuration réseau sur [http://mchobby.be/wiki/index.php?title=Rasp-Config-Reseau le wiki MC Hobby]&lt;br /&gt;
&lt;br /&gt;
== La température avec le DHT22 / AM2302 ==&lt;br /&gt;
Pour la lecture des température avec le capteur, les gars d'Adafruit ont déjà développé un bibliothèque de fonctions utilisables en ligne de commande ou en [https://fr.wikipedia.org/wiki/Python_%28langage%29 python]. Quelques ressources:&lt;br /&gt;
* [https://learn.adafruit.com/dht-humidity-sensing-on-raspberry-pi-with-gdocs-logging/overview La page d'Adafruit (en anglais) sur l'utilisation du DHT22 avec le RPi]&lt;br /&gt;
* [http://www.manuel-esteban.com/lire-une-sonde-dht22-avec-un-raspberry-pi/ Une ressource en français (un peu datée) sur l'utilisation DHT22 + RPi.]&lt;br /&gt;
* [http://pi.gadgetoid.com/pinout La table de référence des 40 pins GPIO du RPi]&lt;br /&gt;
Pour ma part, j'ai suivi la méthode Adafruit, ce qui donne en résumé, en ligne de commande:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
cd /home/pi&lt;br /&gt;
git clone https://github.com/adafruit/Adafruit_Python_DHT.git &lt;br /&gt;
cd Adafruit_Python_DHT&lt;br /&gt;
sudo apt-get install build-essential python-dev  &lt;br /&gt;
sudo python setup.py install&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Au niveau du montage, rien de nouveau: le capteur doit toujours être alimenté en 3.3V ou en 5V, et le câble de lecture à une pin d'entrée/sortie (GPIO: General Purpose Input Output), ce qui donne:&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Cellarkare mark2 bb.png|400px|thumb|left]]&lt;br /&gt;
[[Fichier:Cellarkare_mark2.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Un test en ligne de commande permet de vérifier qu'on a une lecture sur le capteur (dans mon cas un AM2302 raccordé sur la pin GPIO 4):&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
cd /home/pi/Adafruit_Python_DHT/examples/&lt;br /&gt;
sudo ./AdafruitDHT.py 2302 4&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Ce qui affiche &amp;lt;code&amp;gt;Temp=23.0*C  Humidity=53.8%&amp;lt;/code&amp;gt;, des valeurs censées pour une après-midi d'été ;-)&lt;br /&gt;
&lt;br /&gt;
== L'affichage LCD ==&lt;br /&gt;
L'écran LCD est toujours le même que pour la version &amp;quot;Mark 1&amp;quot; Arduino. Quelques resources:&lt;br /&gt;
* [https://learn.adafruit.com/drive-a-16x2-lcd-directly-with-a-raspberry-pi Un tutoriel (en anglais) sur Adafruit] ''Attention, le code source n'est plus tellement a jour, voir le dernier lien Github.''&lt;br /&gt;
* [http://mchobby.be/wiki/index.php?title=Rasp-Hack-Afficheur-LCD La version française, traduite par MC Hobby]&lt;br /&gt;
* [https://github.com/adafruit/Adafruit_Python_CharLCD Le code source de la librairie Adafruit pour le gestion du LCD sur GitHub] ''contient la dernière version de la librairie''.&lt;br /&gt;
&lt;br /&gt;
La logique de raccordement est strictement identique au circuit du Mark 1. La seule différence est que la résistance variable de 10K dans le circuit est supprimée, la bibliothèque Adafruit pour le LCD permettant le pilotage en [https://fr.wikipedia.org/wiki/Modulation_de_largeur_d%27impulsion modulation PWM].&lt;br /&gt;
&lt;br /&gt;
== Le montage ==&lt;br /&gt;
Au final, le montage a été fait pour gagner un maximum de place sur mon breadboard. La pin data du DHT a été déplacée sur la pin 5, et le reste des pin pour le LCD sont documentées dans le code.&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Cellarkare mark2_2 bb.png|500px|thumb|left]]&lt;br /&gt;
[[Fichier:Cellarkare_mark2_2.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Le code ==&lt;br /&gt;
&lt;br /&gt;
La logique du code est identique à la version mark 1 - arduino. Ce code est aussi disponible (et éventuellement mis à jour) [https://gitlab.com/qberten/cellarkare/blob/master/mark2_rpi/cellarkare_rpi.py sur gitlab]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
# coding=utf8&lt;br /&gt;
# CellarKare - Mark 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
# Un projet de station de mesure de la température et l'humidité dans une cave à vin&lt;br /&gt;
# Plus d'infos et schéma de montage sur http://wiki.makilab.org/index.php/CellarKare&lt;br /&gt;
# Quentin Berten, 2015 - Domaine public, licence WTFPL v2, http://www.wtfpl.net/&lt;br /&gt;
# quentin_#AT#_berten.me&lt;br /&gt;
&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
# Bibliothèque CharLCD d'Adafruit, voir https://github.com/adafruit/Adafruit_Python_CharLCD&lt;br /&gt;
# pour l'installation&lt;br /&gt;
import Adafruit_CharLCD as LCD&lt;br /&gt;
# Bibliothèque DHT d'AdaFruit, voir https://github.com/adafruit/Adafruit_Python_DHT&lt;br /&gt;
# pour l'installation&lt;br /&gt;
import Adafruit_DHT as DHT&lt;br /&gt;
&lt;br /&gt;
# Configuration de l'affichage LCD&lt;br /&gt;
lcd_rs        = 25      # RS sur pin 25&lt;br /&gt;
lcd_en        = 24      # EN sur pin 24&lt;br /&gt;
lcd_d4        = 23      # D4 sur pin 23&lt;br /&gt;
lcd_d5        = 12      # D5 sur pin 12&lt;br /&gt;
lcd_d6        = 20      # D6 sur pin 20&lt;br /&gt;
lcd_d7        = 16      # D7 sur pin 16&lt;br /&gt;
lcd_backlight = 18      # rétro éclairage sur pin 18&lt;br /&gt;
lcd_columns   = 16      # Affichage à 16 colonnes ...&lt;br /&gt;
# Initialisation du LCD avec les variables ci-dessus&lt;br /&gt;
lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, &lt;br /&gt;
		        	lcd_columns, lcd_rows, lcd_backlight)&lt;br /&gt;
# Configuration pour le capteur DHT, soit DHT11, DHT22 ou AM2302.&lt;br /&gt;
dht_sensor    = DHT.AM2302  # Type AM2302&lt;br /&gt;
dht_pin       = 5           # DHT data sur pin 5&lt;br /&gt;
&lt;br /&gt;
# les variables qui permettent de gérer le temps,&lt;br /&gt;
prevMillis = 0          # enregistre le temps de la denière lecture DHT22&lt;br /&gt;
secInterval = 1000      # Un intervalle d'une seconde&lt;br /&gt;
# L'intervalle de lecture du DHT22: 3 secondes, doit etre plus grand que secInterval&lt;br /&gt;
dhtInterval = 3000&lt;br /&gt;
&lt;br /&gt;
def read_and_print_dht():&lt;br /&gt;
    # On lit une valeur sur le senseur avec la fonction read. Attention, cette fonction&lt;br /&gt;
    # ne réessaie pas automatiquement en cas d'erreur, mais fournit les valeurs (None, None).&lt;br /&gt;
    hum, tempC  = DHT.read(dht_sensor, dht_pin)&lt;br /&gt;
&lt;br /&gt;
    # On vérifie que l'on a bien eu une lecture (Linux n'est pas un OS temps réel et ne&lt;br /&gt;
    # peut pas garantir le timing des lectures sur le capteur). Si ça arrive, on réessaie.&lt;br /&gt;
    # On affiche les valeurs sur la console (n'est pas indispensable)&lt;br /&gt;
    if hum is not None and tempC is not None:&lt;br /&gt;
    	print 'Temp={0:0.2f}*C  Humidity={1:0.2f}%'.format(tempC, hum)&lt;br /&gt;
        # On affiche les valeurs sur l'écran LCD&lt;br /&gt;
        lcd.clear()&lt;br /&gt;
        lcd.message('deg C: {0:0.2f}\nhum %: {1:0.2f}'.format(tempC, hum))&lt;br /&gt;
    else:&lt;br /&gt;
	print 'Lecture sur le capteur DHT ratée'&lt;br /&gt;
&lt;br /&gt;
# Boucle principale, l'équivalent de void loop() sur Arduino&lt;br /&gt;
while 1:&lt;br /&gt;
    # On lit le nombre de millisecondes courant&lt;br /&gt;
    curMillis = time.time()*1000&lt;br /&gt;
    if curMillis - prevMillis &amp;gt; dhtInterval:&lt;br /&gt;
        # On essaie de lire et afficher les valeurs du DHT&lt;br /&gt;
        read_and_print_dht()&lt;br /&gt;
        # on enregistre le dernier temps d'exécution de la lecture&lt;br /&gt;
        prevMillis = curMillis&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== La conclusion ==&lt;br /&gt;
En vrac:&lt;br /&gt;
* Pas de gros problème ou obstacles majeurs pour convertir le montage et le code Arduino en son équivalent RPi. Mais heureusement que l'équipe d'Adafruit a déjà programmé les bibliothèques Python qui vont bien!&lt;br /&gt;
* Au niveau du breadboard, ça commence à prendre de la place... Une solution: passer en [https://fr.wikipedia.org/wiki/I2C &amp;quot;I2C&amp;quot;] pour le capteur et le LCD, ce qui limite drastiquement le nombre de pins nécessaires pour le montage, et facilite la programmation. Merci Patrick pour les infos, ce sera sûrement utile pour le prochain montage ;-) !&lt;br /&gt;
** Par exemple, pour la température: un capteur I2C comme le [https://www.adafruit.com/products/1638 SHT15], et pour l'écran, [http://www.electrodragon.com/w/index.php?title=1602_LCD_I2C/SPI_Module la version I2C du même 1602].&lt;br /&gt;
** Par contre dans ce cas, il faut faire gaffe au fait que le passage en 3.3V pour la logique du RPi, le lcd reste en 5V et il faudra ajouter un [http://www.adafruit.com/products/757 convertisseurs de niveau] pour le bus si utilisé avec un capteur qui ne supporte pas 5V.&lt;br /&gt;
* le langage Python, c'est pas plus compliqué que le simili-C de l'Arduino une fois qu'on est rentré dedans.&lt;br /&gt;
&lt;br /&gt;
= Mark 3: Start, Stop, and say Cheese =&lt;br /&gt;
&lt;br /&gt;
== Sart/Stop ==&lt;br /&gt;
Un &amp;quot;problème&amp;quot; du RPi, c'est qu'il n'a pas de bouton ON/OFF simple, et par conséquent, l'éteindre proprement avec &amp;lt;code&amp;gt;sudo halt&amp;lt;/code&amp;gt; ou  &amp;lt;code&amp;gt;sudo poweroff&amp;lt;/code&amp;gt; est impossible sans un accès physique (clavier et écran connectés) ou une connection SSH (connection à distance). Pas pratique pour un boitier qui sera installé dans une cave à vin...&lt;br /&gt;
&lt;br /&gt;
Autrement dit, mes besoins:&lt;br /&gt;
# Le programme python d'affichage et monitoring des températures démarre automatiquement lorsque le RPi démarre.&lt;br /&gt;
# Un bouton OFF permet d'éteindre proprement le RPi avant de le débrancher de son alimentation.&lt;br /&gt;
# Un bouton ON permet de l'allumer une fois éteint sans débrancher/rebrancher son alimentation.&lt;br /&gt;
# Nec plus ultra: avoir un fonctionnement similaire à un bouton ON/OFF d'un laptop par exemple: si éteint, le bouton allume, si allumé, le bouton éteint proprement le RPi, et coupe l'alimentation USB.&lt;br /&gt;
&lt;br /&gt;
Bon après quelques recherches sur le net:&lt;br /&gt;
# C'est simple, il suffit de configurer le &amp;quot;init script&amp;quot; du RPi pour lancer automatiquement le programme python au démarrage&lt;br /&gt;
# Un montage simple permet d'écouter sur une des pins du GPIO, et de lancer la procédure propre d'arrêt (shutdown). Soit un bouton OFF&lt;br /&gt;
# Le RPi (à partir du modèle B rev2, soit Brev2, B+ et 2) possède un pinout &amp;quot;reset&amp;quot;, qui n'est pas soudé de base sur la carte. Si on raccorde ces deux pins, le RPi redémarre électriquement (hard reboot). Donc sans s'éteindre proprement. L'intérêt, c'est que si le RPi est éteint mais encore sous tension, ce bouton permet de le ré-allumer. Donc un bouton ON/RESET. Voir par exemple:&lt;br /&gt;
#* Un article assez complet en anglais sur [http://www.makeuseof.com/tag/add-reset-switch-raspberry-pi/ MakeUseOf.com]&lt;br /&gt;
# Le bouton combiné ON/OFF unique est possible, mais le montage est plus compliqué. Quelques exemples:&lt;br /&gt;
#* Un montage en français sur le site [http://forum.madeinfr.org/topic/43/raspower/ MadeInFR.org].&lt;br /&gt;
#* Un montage en anglais à base de micro contrôleur (pas simple donc) sur [http://www.instructables.com/id/Raspberry-Pi-Shutdown-Button/ Instructables]&lt;br /&gt;
#* Un article très complet en anglais reprenant toutes les options, dont un montage assez simple de bouton unique [http://www.raspberry-pi-geek.com/Archive/2013/01/Adding-an-On-Off-switch-to-your-Raspberry-Pi sur raspberry-pi-geek.com]&lt;br /&gt;
#* Des solutions commerciales toutes faites comme [https://www.pi-supply.com/product/pi-supply-raspberry-pi-power-switch/ PiSupply] ou [http://www.mausberrycircuits.com/collections/frontpage MausberryCircuits]&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, ce sera pour moi le choix suivant: un bouton OFF, qui lors d'un appui long éteint proprement le RPi. En gros la solution 2.&lt;br /&gt;
&lt;br /&gt;
Mais dans un premier temps, il faut configurer le RPi pour lancer le programme au démarrage...&lt;br /&gt;
&lt;br /&gt;
== Lancement du programme via initscript ==&lt;br /&gt;
&lt;br /&gt;
Il y a certainement 36 façons d'arriver au même résultat (après tout, le RPi tourne sous Linux ;-), mais dans mon cas, la solution qui me convient bien: un script d'init lance par défaut le script python localisé en &amp;lt;code&amp;gt;/usr/local/bin/pystartup.py&amp;lt;/code&amp;gt;. L'intérêt de la chose: &amp;lt;code&amp;gt;pystartup.py&amp;lt;/code&amp;gt; peut être un lien symbolique vers n'importe quel autre script.&lt;br /&gt;
&lt;br /&gt;
Pour éviter d'encombrer le wiki, je n'ai pas repris le script ici, mais il est dispo sur [https://gitlab.com/qberten/cellarkare/blob/master/mark3_camera/initscript_pystartup GitLab]. Pour l'installation, en ligne de commande (connecté sur le RPi):&lt;br /&gt;
&lt;br /&gt;
On télécharge le script, on le déplace au bon endroit et on le rend exécutable&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
wget https://gitlab.com/qberten/cellarkare/raw/master/mark3_camera/initscript_pystartup&lt;br /&gt;
sudo mv initscript_pystartup /etc/init.d/pystartup&lt;br /&gt;
sudo chmod a+x /etc/init.d/pystartup&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
On crée le lien symbolique qui va bien (remplacer /chemin/vers/... par la localisation du programme à lancer)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
ln -s /chemin/vers/votre/script/python.py /usr/local/bin/pystartup.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
On configure le système pour qu'il connaisse le nouveau script &amp;quot;pystartup&amp;quot;, et on lui demande de l'exécuter à chaque démarrage&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo update-rc.d pystartup defaults&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Il est ensuite possible de lancer son programme en arrière plan comme n'importe quel autre service avec &amp;lt;code&amp;gt;sudo service pystartup start&amp;lt;/code&amp;gt;, de l'arrêter avec &amp;lt;code&amp;gt;sudo service pystartup stop&amp;lt;/code&amp;gt;, etc&lt;br /&gt;
&lt;br /&gt;
== Pinout RESET ==&lt;br /&gt;
&lt;br /&gt;
Activer le &amp;quot;hard&amp;quot; reset sur le Rpi suppose un peu de soudure, mais rien de bien effrayant, 2 points suffisent. Un fois les connecteur pinout soudés, quand on raccorde les deux pins (par exemple avec un interrupteur), le RPi redémarre (&amp;quot;hard&amp;quot; reset, donc attention à la carte SD...), ou s'allume (si il était raccordé au secteur).&lt;br /&gt;
&lt;br /&gt;
J'ai soudé les 2 pins et testé la fonction, mais comme il s'agit d'un redémarrage &amp;quot;hard&amp;quot;, je n'ai finalement pas vraiment vu l'utilité dans ce projet: autant directement débrancher / rebrancher le câble d'alimentation dans ce cas.&lt;br /&gt;
&lt;br /&gt;
Mais à toutes fins utiles, les photos de l'opération, avant/après.&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Rpi_reset_before.jpg|500px|thumb|left]]&lt;br /&gt;
[[Fichier:Rpi_reset_after.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bouton OFF ==&lt;br /&gt;
&lt;br /&gt;
Rien de très compliqué: on raccorde le bouton à une entrée, on configure la résistance pull-up/down interne du Rpi, on s'assure de récupérer les évènements dans le code.&lt;br /&gt;
&lt;br /&gt;
Les parties utiles du code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# La fonction qui effectuer l'arrêt propre du RPi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def btn_proper_halt(pin):&lt;br /&gt;
    global off_state, cur_millis, off_millis&lt;br /&gt;
    # On lit le nombre de millisecondes courant&lt;br /&gt;
    cur_millis = time.time()*1000&lt;br /&gt;
    # Utilise la variable globale off_state&lt;br /&gt;
    off_state = not off_state&lt;br /&gt;
    # DEBUG&lt;br /&gt;
    logging.debug(&amp;quot;Bouton OFF_PIN pressé, son état est maintenant %s&amp;quot; % str(off_state))&lt;br /&gt;
    if off_state == True:&lt;br /&gt;
        off_millis = cur_millis   &lt;br /&gt;
    elif off_state == False: &lt;br /&gt;
        # DEBUG&lt;br /&gt;
        logging.debug(&amp;quot;Bouton OFF_PIN pressé pendant {0:0.0f} ms&amp;quot;.format(cur_millis - off_millis))&lt;br /&gt;
        if (cur_millis - off_millis) &amp;gt; OFF_INTERVAL:&lt;br /&gt;
            # On a relâché le bouton avec un écart long =&amp;gt; shutdown&lt;br /&gt;
            logging.debug(&amp;quot;Appui long sur le bouton OFF_PIN&amp;quot;)&lt;br /&gt;
            logging.info(&amp;quot;Arrêt du Raspberry PI, attendre encore 10 sec avant de débrancher&amp;quot;)&lt;br /&gt;
            subprocess.call('halt', shell=False)&lt;br /&gt;
        else:&lt;br /&gt;
            # Appuis court =&amp;gt; on ne fait rien&lt;br /&gt;
            logging.debug(&amp;quot;Appui court sur le bouton OFF_PIN&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Fonction de terminaison du programme (appelée lorsque le script est arrêté&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def terminate():&lt;br /&gt;
    logging.debug(&amp;quot;Terminate function started&amp;quot;)&lt;br /&gt;
    # efface l'écran LCD&lt;br /&gt;
    lcd_dim_backlight(0.0, 0.2)&lt;br /&gt;
    lcd.clear()&lt;br /&gt;
    logging.debug(&amp;quot;Terminate function ended&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Fonction d'initialisation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def initialize():&lt;br /&gt;
    global lcd&lt;br /&gt;
    logging.debug(&amp;quot;Initialize function started&amp;quot;)&lt;br /&gt;
    # Initialisation du LCD avec les variables ci-dessus&lt;br /&gt;
    lcd = LCD.Adafruit_CharLCD(LCD_RS, LCD_EN, LCD_D4, LCD_D5, LCD_D6, LCD_D7, &lt;br /&gt;
		        	LCD_COLUMNS, LCD_ROWS,&lt;br /&gt;
                                LCD_BACKLIGHT, invert_polarity = False, enable_pwm = True,&lt;br /&gt;
                                initial_backlight = lcd_backlight)&lt;br /&gt;
    # Initialisation des autres GPIO's&lt;br /&gt;
    GPIO.setmode(GPIO.BCM)        # On utilise la numérotation BCM pour les PIN&lt;br /&gt;
    # On définit la pin OFF_PIN comme entrée, et on active la résistance pull-down interne du RPi&lt;br /&gt;
    GPIO.setup(OFF_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)&lt;br /&gt;
    # Configure une interruption qui va détecter les mouvements up et down sur le bouton&lt;br /&gt;
    GPIO.add_event_detect(OFF_PIN, GPIO.BOTH, callback=btn_proper_halt, bouncetime=20)&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Say &amp;quot;cheese&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Cette partie du projet s'attache à pouvoir prendre rapidement et facilement un photos des étiquettes des bouteilles entrées ou sorties de la cave. Ben oui, j'ai pas forcément une bonne mémoire, et se donner les moyens d'enregistrer facilement et rapidement l'info est le meilleur moyen de suivre son stock ;-)&lt;br /&gt;
&lt;br /&gt;
Cette partie est super simple à réaliser avec le rpi: on raccorde la caméra, on s'assure qu'elle est activée avec &amp;lt;code&amp;gt;sudo raspi-config&amp;lt;/code&amp;gt;, et on peut ensuite l'utiliser en ligne de commande ou en python. Le site web [https://www.raspberrypi.org/documentation/usage/camera/README.md raspberrypi.org (en anglais)] explique cela très bien.&lt;br /&gt;
&lt;br /&gt;
On ajoute un deuxième bouton sur le breadboard, qui déclenche la prise d'une photo, et le prototype est maintenant fonctionnel. Les photos sont sauvegardées dans le répertoire courant du RPi, avec la date et l'heure pour nom de fichier.&lt;br /&gt;
&lt;br /&gt;
Au niveau du code, les parties utiles sont:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Fonction de prise d'une photo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def btn_take_picture(pin):&lt;br /&gt;
    # DEBUG&lt;br /&gt;
    logging.info(&amp;quot;Bouton CAM_PIN pressé, on prend un photo&amp;quot;)&lt;br /&gt;
    # Construction du chemin pour la photo&lt;br /&gt;
    now = datetime.datetime.now()&lt;br /&gt;
    pic_filename = &amp;quot;/home/qb/pic_&amp;quot; + str(now) + &amp;quot;.jpg&amp;quot;&lt;br /&gt;
    # Initialisation de la camera. On ne le fait pas dans initialize() pour éviter au maximum de la laisser&lt;br /&gt;
    # allumée (et consommer) en continu. En plus, une fois activée, les lectures sur le DHT sont beaucoup&lt;br /&gt;
    # plus souvent ratées.&lt;br /&gt;
    with PICAM.PiCamera() as cam:&lt;br /&gt;
        cam.capture(pic_filename)&lt;br /&gt;
        logging.debug(&amp;quot;Photos sauvée &amp;quot; + str(cam.resolution) + &amp;quot;  dans &amp;quot; + pic_filename)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pimp my screen ==&lt;br /&gt;
&lt;br /&gt;
Une dernière petite touche intéressante: l'appareil est destiné à être mis dans une cave à vin, endroit où il va faire noir la plupart du temps. En conséquence, l'écran LCD n'a pas vraiment besoin d'être allumé en permanence, pourquoi ne pas l'allumer automatiquement quand la lumière du local dépasse un certain seuil. Une photorésistance permet de réaliser rapidement la mesure d'une intensité lumineuse, pourquoi s'en priver... Oui mais... le RPi n'a pas d'entrée analogique, comment convertir simplement la mesure sur la photorésistance en une valeur analogique, alors que le RPi n'a que des entrées digitales.&lt;br /&gt;
&lt;br /&gt;
Après un peu de recherche, un montage simple à base d'une capacité dont le temps de charge sera directement proportionnel à la mesure sur la photo-résistance. Tout cela est expliqué ici (en anglais): [http://www.raspberrypi-spy.co.uk/2012/08/reading-analogue-sensors-with-one-gpio-pin/]&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est d'allumer ou éteindre l'écran, la bibliothèque CharLCD permet la modulation PWN du rétroéclairage. De quoi avoir un chouette effet de fondu au noir lorsque l'écran s'allume et s'éteint.&lt;br /&gt;
&lt;br /&gt;
Au niveau du code, la partie utile:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Module l'intensité du rétro éclairage de l'écran lcd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
def lcd_dim_backlight(backlight_value, time_step):&lt;br /&gt;
    global lcd&lt;br /&gt;
    global lcd_backlight&lt;br /&gt;
    # calcule l'incrément à avoir entre lcd_backlight et backlight_value&lt;br /&gt;
    stp = (lcd_backlight &amp;gt; backlight_value) * -2 +1&lt;br /&gt;
    brightnesses = map(lambda x: x/10.0, range(int(lcd_backlight*10), int(backlight_value*10)+1, stp))&lt;br /&gt;
    for bright in brightnesses:&lt;br /&gt;
        lcd_backlight = bright&lt;br /&gt;
        logging.debug(&amp;quot;loop on bright= &amp;quot; + str(bright))&lt;br /&gt;
        lcd.set_backlight(bright)&lt;br /&gt;
        time.sleep(time_step)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A suivre...&lt;br /&gt;
&lt;br /&gt;
Les parties du code python utile&lt;br /&gt;
Le schéma complet &amp;quot;mark 3&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Projets]]&lt;/div&gt;</summary>
		<author><name>Quentin</name></author>
		
	</entry>
</feed>