Publié le 5 mars 2016 - par

Une interface web simple pour piloter des LED avec HTML5 et Python sur le Raspberry Pi

image_01_250pxUn bel article que nous devons à Bruno Il a pris comme base deux articles publiés sur le blog et s’en est inspiré pour créer un système « simple » qui met quand même en œuvre des fonctionnalités avancées… Je lui laisse la parole :
C’est sur framboise314 que j’ai trouvé ces deux descriptions. La première signée TheFreeElectron concerne l’interface web qui permet de piloter facilement 8 sorties GPIO du Raspberry Pi.
La seconde est une application de cette interface, réalisée par rleddington. Elle permet de piloter facilement 8 prises secteur à partir de votre smartphone. Je vous propose de la modifier et d’utiliser uniquement la librairie python GPIO.

Ce tutoriel se limitera au langage Python et plus précisément à la librairie RPi.GPIO.

L’électronique

La partie électronique n’a rien de spécial, elle ne comporte que 8 LED avec leur résistance de protection… La seule partie délicate est de bien relier chaque LED à la bonne broche sur le GPIO du Raspberry Pi.

Le GPIO (General Purpose Input/Output = Entrée/Sortie pour un Usage Général) sont des broches d’entrée/sortie permettant au Raspberry PI de communiquer avec des périphériques extérieurs. Ces broches peuvent assurer différentes fonctions mais sont uniquement de type numérique :

image_02

  • Entrée/Sortie Numérique (Tout ou Rien).
  • Bus SPI.
  • Bus I2C.
  • Bus Série (UART).
  • PWM.
  • et les broches d’alimentation : GND, 3,3V et 5V
image_03_600px

Cliquez pour agrandir

Pour ce qui est des résistances, elles devraient valoir 1,5kΩ pour une diode LED rouge HLMP-K150

Calcul UR=Vs-VLED=3,3-1,6= 1,7 V avec IF=1mA -> R=UR/IF= 1700Ω

Utilisation de la bibliothèque GPIO

Le choix se porte sur du Python car ce langage de programmation est celui retenu à l’origine pour le développement sur le Raspberry PI et il est proche des langages de programmation comme le C mais avec sa propre syntaxe, ceci facilitera malgré tout son apprentissage et le 2eme avantage est que la librairie RPi.GPIO est déjà installée sur le Raspbery PI si ce dernier est à jour où si vous utilisez une version de la distribution Raspbian de 2016.

Pour vérifier et connaitre la version installée tapez la commande à l’invite de commande:

pi@raspberry - $ find /usr | grep -i gpio

Toutefois si vous souhaitez utiliser la dernière version, tapez au niveau de l’invite de commande la commande suivante pour installer la librairie :

pi@raspberry - $ sudo apt-get install raspi-gpio

 

La librairie RPi.GPIO

 

La librairie Python RPi.GPIO nécessite d’être en ROOT (super utilisateur) ou d’en posséder les droits (SUDO) pour utiliser le GPIO. Avec la nouvelle distribution « Jessie » de Raspbian le problème ne se pose plus puisqu’un simple utilisateur peut accéder au GPIO (PI par exemple) mais actuellement travaillant avec un Rasberry PI2 sur « Wheezy » (ancienne distribution) il me sera nécessaire de faire précéder les commandes Python par sudo.

Plusieurs possibilités existent, vous pouvez exécuter vos commandes Python soit:

  • En ligne de commande Python.
  • Avec un script Python.
  • A partir d’une page WEB en PHP qui appel un script Python.

Accès au GPIO par ligne de commande

Cette manière est surtout utilisée lorsque l’on est en cours de développement pour tester une partie des commandes ou pour l’apprentissage de façon à comprendre la réaction d’une commande particulière.

Interpréteur Python avec les droits du Super Utilisateur

Tapez la commande sur l’invite de commande :

pi@raspberry - $sudo python3

Apparait la version de Python et l’invite de commande Python représentée par 3 chevrons : >>>

Si vous souhaitez sortir de l’interpréteur de commandes Python tapez sur l’association des touches CTRL+D

Importer la librairie RPi.GPIO

Pour utiliser les commandes de la librairie RPi.GPIO il faut dans un premier temps importer la librairie avec la commande :

>>> Import RPi.GPIO as GPIO

Choix de la désignation des broches BCM (N° de broche du microcontrôleur) ou Connecteur GPIO :

GPIO.setmode(GPIO.BCM) ou GPIO.setmode(GPIO.BOARD)

Il est plus simple de choisir le connecteur, exemple pour le GPIO 0 le numéro broche du connecteur est 11

 

Commandes des broches d’entrée/sortie TOR (Tout ou Rien):

Les commandes suivantes permettent de gérer des entrées/sorties TOR (Tout Ou Rien).

Définir le sens d’une broche

Il est nécessaire avant d’utiliser une broche de définir le type d’utilisation c’est-à-dire soit une entrée soit une sortie avec la commande suivante :

Sortie : GPIO.setup(11, GPIO.OUT)
ou
Entrée : GPIO.setup(11, GPIO.IN)

 

Réinitialiser la configuration d’une broche ou de l’ensemble du GPIO

Il est conseillé de réinitialiser la configuration des broches ou de l’ensemble du GPIO à la fin d’un script pour finir proprement Pour réinitialiser une broche, il faut mettre entre les parenthèses le N° de la broche concernée.

GPIO.cleanup(11)

Pour réinitialiser l’ensemble du GPIO, il ne faut rien mettre en les parenthèses.

GPIO.cleanup()

Imposer un état logique sur une sortie

Une des commandes les plus utilisées est celle permettant de fixer un état logique Haut ou Bas sur une sortie de façon à commander un périphérique. La syntaxe générale de la commande imposant un niveau logique sur une sortie est :

Sortie à « 1 » : GPIO.output (11, GPIO.HIGH) ou GPIO.output (11, 1)

Sortie à « 0 » : GPIO.output (11, GPIO.LOW) ou GPIO.output (11, 0)

Lire l’état logique d’une entrée

Les systèmes doivent tenir compte de stimuli extérieurs, il est donc nécessaire de pouvoir lire les broches en entrée. La syntaxe générale permettant de lire l’état d’une broche qu’elle soit en entrée ou en sortie est :

GPIO.input (11) -> Variable = GPIO.input (11)

Python Shell

La fenêtre python Shell s’ouvre permettant de tester les lignes de commande une après l’autre et de vérifier le résultat mais il est possible de regrouper ces lignes dans un fichier. Dans le fichier fifi.py ajoutez la ligne suivante en entête pour qu’il puisse être interprété comme du python3 : #!/usr/bin/env python3

image_04_600px

Cliquez sur l’image pour l’agrandir

Vous allez tester vos lignes avec le Shell (fenêtre de droite) puis les copier dans fichier (fenêtre de gauche) si elles fonctionnent correctement.

Puis sauvegarder votre fichier :

image_05Donner les droits à votre fichier

pi@raspberry - $ sudo chmod 777 /home/pi/titi/fifi.py 

Droits 777 : correspond à rwxrwxrwx (soit tous les droits) :

La commande ls –l exécutée dans le répertoire où se situe le fichier permet de lister les fichiers et leurs droits.

image_06Testez votre programme ainsi si vous êtes dans son répertoire :

image_07Sinon il faut taper son chemin absolu : /home/pi/titi/fifi.py

Pour exécuter de n’importe où votre programme, on va le copier dans un répertoire particulier, pour connaitre l’ensemble des répertoires ou votre programme peut-être stocké et exécuté sans avoir à préciser son chemin taper :

image_08_600px

Cliquez sur l’image pour l’agrandir

Chaque chemin proposé est séparé par « : », on va choisir /usr/local/bin, on copie le fichier dans ce répertoire

image_09On peut simplifier l’écriture du fichier en supprimant son extension .py. Pour cela effectuez la commande suivante, ainsi le fichier devient exécutable sans extension :

image_10Taper le nom du fichier sous n’importe quel dossier :

image_11Exécution du script python au démarrage :

image_12Puis placer le nom du programme avec son chemin : /home/pi/titi/fifi.py & (entre fi et exit 0)

image_13Sauvegardez le fichier avec « Ctrl+o » puis valider en tapant sur « ENTREE » et fermez l’éditeur avec « Ctrl+x ».

Installation du SERVEUR apache voir ce lien

Accès au GPIO à partir d’un site WEB en PHP

Introduction

Vous allez découvrir comme gérer le GPIO et exécuter des commandes Pythons à partir d’une page WEB qui est écrite en langage PHP. Dans le PHP il existe des commandes permettant d’exécuter des programmes externes et de récupérer des données renvoyées par ces derniers.

image_01

Droits super utilisateur au Serveur APACHE

Cette bibliothèque ne peut être utilisée qu’en super utilisateur (root) ou avec la commande « sudo ».
Il faut paramétrer le Raspberry pi pour que le serveur apache2 (www-data) puisse exécuter des commandes système linux.
Ouvrir le fichier suivant :

pi@raspberry - $ sudo nano /etc/sudoers

Limiter les privilèges de www-data uniquement à certains fichiers, ici ecriture.py, lecture.py pour la suite de notre application.

image_14_600px

Cliquer pour agrandir

Les programmes en python pourront être exécuté à partir d’un site WEB avec les commandes PHP EXEC() et SYSTEM().
Du côté de Python il existe une librairie système permettant de gérer entre autre le passage d’arguments. Il faut donc l’importer au début du programme Python au niveau des autres librairies importées (RPi.GPIO et tempo).

Import sys

Ensuite il ne reste qu’à récupérer les arguments, ces derniers sont stockés dans une variable système argv de type tableau. Ce tableau contiendra une case de plus que le nombre d’arguments passés en PHP. En effet la 1ere case contient le nom du programme (ici le fichier Python) à qui sont passés les arguments.

Syntaxe

sys.argv[0] contient le nom du programme Python destinataire des arguments.
sys.argv[1] contient le 1er argument passé en PHP et ainsi de suite.

Droits des fichiers Python

Copier : sur /usr/local/bin les deux fichiers python « lecture.py » et « ecriture.py » puis donner les droits suivants

pi@raspberry - $ sudo chmod 777 /usr/local/bin/lecture.py
pi@raspberry - $ sudo chmod 777 /usr/local/bin/ecriture.py

Tester les deux fichiers avec la broche 11 en passant les arguments.

image_15Placer vos fichier web

Utiliser WinSCP en SSH

image_16
Copier sur /var/ www l’ensemble des fichiers (sans oublier les droits) du zip
Le langage client (exécuté sur votre machine) HTML5 et langage serveur PHP

Conclusion

Nous gérons les entrées sorties avec des scripts Python.

Remarque importante : pour des processus complexes, la méthode préconisée est la suivante :
Ecrire un programme Python indépendant (exécuté par exemple au démarrage du Raspberry Pi) qui gère le processus comme sur un microcontrôleur de façon autonome. Avec la méthode suivante nous allons procéder de la sorte.

GESTION DE MULTIPLES PROCESSUS:

Nous voulons pouvoir partager des données entre plusieurs programmes Python qui tournent au même moment car nous aurons un processus principal qui gère le GPIO et une application web qui va lancer grâce aux instructions PHP SYSTEM() et EXEC() des scripts Python, afin qu’il n’y ai qu’un unique programme qui effectue la gestion du GPIO, nous définirons une zone mémoire commune afin de transmettre des données entre différents processus. Nous ne sommes plus obligés de donner des droits au serveur Apache.

Méthodologie

Création d’un fichier texte (led.txt) qui sera lancé par les différents scripts Python et placé dans une zone mémoire RAM dont l’accès en écriture/lecture par ces différents scripts Python sera extrêmement rapide.

Copier ce fichier dans le répertoire: /usr/local/bin/led.txt (3 octets).

Lui donner les droits complets :

pi@raspberry - $ sudo chmod 777 /usr/local/bin/led.txt

On remplira au préalable ce fichier par un nombre de caractères qui définira la taille de la zone mémoire réservée :
Exemple : fichier led.txt

image_23La taille du fichier est de 3 octets.
On va donc réserver une zone mémoire de 3 octets, un tableau de 0 à 2 (tableau de 3 cases).
Attention chaque case à une valeur numérique entre 0 et 255 (1 octet)

Copier dans le répertoire /usr/local/bin les deux fichiers python « lececri.py » et « g_gpio.py » puis donner les droits

pi@raspberry - $ sudo chmod 777 /usr/local/bin/lececri.py
pi@raspberry - $ sudo chmod 777 /usr/local/bin/g_gpio.py

Mettre en tache de fond le script principal au démarrage ou lancer en local avec sudo g_gpio.py

image_17image_18Vous pouvez tester vos fichiers python : broche 11 ici j’ai choisi comme argument 0->broche 11, 1->broche 12,….
Je lance deux fenêtres et je mets en tâche de fond g_gpio.py puis je teste avec lececri.py

image_19_600px

Cliquez sur l’image pour agrandir

Explication sur les deux fichiers, ils partagent une zone mémoire identique si l’un modifie cette zone, le processus de l’autre fichier est modifié :

Ici dans le processus principal, j’effectue une boucle infinie et je teste la broche sélectionnée par lececri.py et lui renvoie l’état de cette sortie sélectionnée.

Mes deux fichiers sont correctement installés je peux mettre en route mon application web avec mes nouveau fichiers index.php et gpio.php

Taper la commande ps -aux | more dans une autre fenêtre console qui va lister tous les processus lancés sur le système (appuyer sur la touche entrée pour faire défiler la liste).

image_20

image_21_600px

Cliquez sur l’image pour agrandir

Nous pouvons observer dans la deuxième colonne le numéro représentatif du PID de chacun des processus. Pour arrêter le processus vous pouvez utiliser la commande kill. Ainsi la commande suivante demandera au processus 3294 de s’arrêter :

image_22

 

Conclusion

Vous pouvez gérer des processus complexes, des robots en wifi avec motion et pwm, i2c …
A titre personnel je gère un capteur i2c de température ds1621 en Python et un robot deux roues avec interface WEB sans aucune difficulté.

Deux versions sont disponibles sous forme d’archive, une version de base et une version utilisant mmap, une librairie qui va allouer une zone fixe de mémoire RAM à un fichier «mapage».

L’auteur

lycee_langevin_la_seyne_sur_merBruno enseigne au Lycée Langevin de La Seyne sur Mer. Il nous promet avec ses élèves la description d’un projet de fin d’année : un robot avec motion (c’est très cool) équipé d’un radar de recul ultra son, avec son interface de pilotage par appli web et python ! On attend ça avec impatience 🙂 . Bravo à tous les participants.

Merci Bruno pour cette description très détaillé et la mise à disposition des fichiers qui permettront à ceux qui sont intéressés de démarrer en douceur 🙂
framboise314

Sources

29 réflexions au sujet de « Une interface web simple pour piloter des LED avec HTML5 et Python sur le Raspberry Pi »

  1. Ping : Une interface web simple pour piloter des LED avec HTML5 et Python sur le Raspberry Pi – Radioamateur France

  2. bruno83

    bonjour,
    Je viens d’installer jessie, l’installation ultra simple :
    J’ai mis l’ensemble de mes serveurs apache2,mysql,motion tous fonctionnent très bien
    http://www.billyinfo.be/showthread.php?64-Installation-serveur-web-sous-Debian-8-Jessie
    le tuto de framboise314 pour le paramétrage j’ai mis 30 minutes pour tous réinstaller
    Effectivement fini le sudo pour le GPIO
    Placer le site en var/www/html/
    Ne pas oublier de donner les droits au fichier python,javascript,php
    Autre chose en ssh fini le root sauf en faisant cette manip qui marche super
    http://blog.tfrichet.fr/debian-8-jessie-connexion-root-en-ssh-impossible/

    Répondre
  3. gean95

    bonjour,
    Merci pour ce tuto. Mais il faut savoir qu’il ne fonctionne pas avec internet Explorer 11,
    avec Chrome c’est OK.

    Répondre
    1. bruno83

      Bonjour,
      Je viens de tester sur windows 7
      Internet explorer 11.0.9600.18314 ça marche bien en principe quand on change de navigateur c’est le css qui peut poser problème là aucun souci, si non as-tu activé l’autorisation javascript (en principe par défaut) si non ça marche pas.
      A+bruno

      Répondre
  4. Jeremy

    Bonjour François !

    Je vous lis régulièrement et je dois dire que vos articles sont vraiment de qualité : merci 🙂

    2 petites remarques sur celui-ci :
    – la modification du fichier sudoers devrait plutôt passer par la commande « visudo », qui évite d’enregistrer un fichier corrompu en cas d’erreur. Si ce fichier est corrompu, la commande sudo ne fonctionnera plus, rendant même impossible la modification du fichier sudoers pour le corriger !
    – plutôt que de modifier le fichier sudoers, il est plutôt recommandé d’ajouter tout simplement l’utilisateur www-data dans le groupe gpio !

    A+

    Jeremy

    Répondre
    1. François MOCQ

      Bonjour Jeremy
      Tout d’abord désolé que vous ayez été rejeté par l’anti-spam… Il est assez virulent mais le blog a déjà été attaqué l’an passé (obligé de tout refaire à partir des sauvegardes) et j’ai dû en passer par là pour le protéger.
      Comme indiqué au début de l’article, c’est Bruno qui en est l’auteur et il est parti de traductions d’articles que j’avais mises sur le blog. Ceci pouvant expliquer cela.
      Merci pour vos remarques qui seront certainement notées avec intérêt par les lecteurs de cet article.
      Cordialement
      François

      Répondre
    2. bruno83

      Bonjour,
      Je connaissais pas la commande visudo mais effectivement en lisant la doc c’est ce qu’il faut faire.
      Pour la deuxième remarque sous Wheezi avec python3 et gpio qui ne fonctionnaient quand super utilisateur la solution simple d’ajouter un utilisateur au gpio ne marche pas ce qui n’est plus le cas sous Jessie .
      Avec jessie plus besoin de toucher sudoers.
      A+ bruno

      Répondre
  5. Nicolas SCHMIT

    Autant j’ai trouvé la première partie (qu’est-ce qu’un GPIO etc.) très simple, autant je n’ai rien compris quand à la mise en place. Comment configurer le serveur apache, etc.

    Répondre
    1. Bruno Auteur de l’article

      Bonjour,
      http://www.billyinfo.be/showthread.php?64-Installation-serveur-web-sous-Debian-8-Jessie
      Pour apache tu l’installes comme le lien ci-dessus
      Il faut savoir que l’utilisateur apache www-data
      Si tu es sur jessie en locale tu donnes des droits à tes fichiers
      Sudo chmod 775 lecture.py
      Sudo chmod 775 lecture.py
      Tu peux ensuite les copier dans le dossier
      Sudo cp lecture.py /usr/local/bin
      En ssh tu colles tes fichiers web (css,javascript,php) dans var/www/html/
      Tu donnes les droits aux divers fichiers
      Puis sur ton pc, tu tapes 192.*.*.*/index.php (adresse de ton pi)
      A+ Bruno

      Répondre
  6. dyox

    Bonjour,
    Je peux te répondre car j’ai testé il y a 1 an de lancer un script via une page web.
    voici les liens qui m’ont aidé :
    https://code4pi.fr/2013/12/installation-dun-serveur-web-lighttpd/
    http://wiki.auto-hebergement.fr/serveurs/lighttpd
    https://mike632t.wordpress.com/2013/09/21/installing-lighttpd-with-python-cgi-support/

    Premièrement, il y a quelque-chose qui me gène lorsque l’on parle de serveur web sur le pi. Beaucoup de tutos parlent d’Apache alors qu’il est de notoriété publique qu’il est lourd et extrêmement bavard (les logs). Donc je pense que ce n’est pas une bonne idée de l’installer sur une carte SD.
    C’est pourquoi je m’étais tourné sur Lighttpd. L’installation est simple, peut se faire par un script simplement en plus !
    Il y a une foule de tutos bien explicite !
    J’avais testé Nginx mais je n’ai pas réussi à le faire fonctionner.

    Pour répondre à tes questions, l’installation d’un serveur web crée le groupe ET l’utilisateur www-data.

    Mon plus grand piège a été la gestion des droits pour l’exécution des scripts donc il faut toujours vérifier que les fichiers/dossiers appartiennent au bon utilisateur, ici www-data car Lighttpd est lancé avec cet utilisateur !
    Ces commandes peuvent t’aider, « ls -l » et « ps -aef | grep lighttpd »
    #l’utilisateur et le groupe www-data est propriétaire de /var/www/ car pour l’instant c’est root
    sudo chown -R www-data:www-data /var/www
    #ajoute l’utilisateur pi au groupe www-data
    sudo usermod -a -G www-data pi
    #attribution automatique des fichiers et répertoires au groupe www-data
    sudo chmod -R g+ws /var/www/
    #vérifie l’abonnement de l’utilisateur pi aux groupes
    groups pi

    Il faut aussi installer php car c’est lui qui possède les commandes pour exécuter des scripts. La liaison lighttpd -> php se fait extrèmement facilement.

    Dans mon cas j’avais comme arborescence :
    /var/www/html/cgi-bin/
    avec dans /html/ mon fichier.php
    ====

    exec('sudo python /var/www/html/cgi-bin/k2000.py');
    ?>
    =====
    qui fait appel à k2000.py dans /cgi-bin/ (celui-ci fait la bande lumineuse à led de k2000 avec les gpio)

    Voilà j'espère t'avoir aidé

    Répondre
    1. dyox

      Le code dans le fichier php a été supprimé, je fais une image comme Bruno.

      Je compte sur François pour que l’image soit bien affichée, sinon le code est :
      exec(‘sudo python /var/www/html/cgi-bin/k2000.py’);

      Répondre
      1. François MOCQ

        j’ai rajouté le code dans le commentaire j’espère que c’est bon 🙂
        l’anti spam est assez virulent ! désolé
        N’hésitez pas à me mettre un message en direct (adresse en bas de chaque page) s’il y a des incidents comme ça je peux ajouter code ou images
        cordialement
        François

        Répondre
  7. estelle

    J’ai installé APACHE
    lorsque je lance l’appli la page s’ouvre bien mais reste statique
    les scripts lecture et ecriture fonctionnent bien
    apparemment la commande EXEC ne fonctionne pas
    Pas de retour sue status [0]
    quelqu’un a une idée?
    A+

    Répondre
    1. bruno83

      Bonjour c’est typiquement un problème de droit
      Mettre les droits aux fichiers puis
      Tester en mettant dans le sudoers pour voir car non conseillé
      www-data ALL=(ALL) NOPASSWD: ALL
      A+ Bruno

      Répondre
  8. Pierre

    Bonjour,
    Je ne trouve pas la partie des scripts pour faire en sorte qu’au lieux que le contact se fasse tout le temps jusqu’au prochain appuis sur le bouton, je voudrais que ça n’envoie qu’une impulsion d’un bref instant.
    Merci

    Répondre
  9. Philippe

    Bonjour

    Pour lancer un script python via une page web, ou en l’appelant directement dans un navigateur, il faut configurer apache2

    Voici la procédure.

    1) mettre les scripts pythons dans un repertoire . Pas obligatoirement dans /var/www, dans l’exemple , ils sont dans /usr/share/scripts_python
    2) s’assurer qu’ils sont exécutables, dans le doute faire chmod +x /usr/share/scripts_python/*.py
    3) s’assurer que www-data y a accès chown www-data  /usr/share/scripts_python/*.py
    4) configuration apache
    nano /etc/apache2/sites-enabled/000-default
    ajouter la section suivante dans le fichier. Noter au passage le nom (boa) de l’alias que l’on a donné au repertoire qui contient les scripts

    ScriptAlias /boa/ /usr/share/scripts_python/
           
                    AllowOverride None
                    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                    Order allow,deny
                    Allow from all
                    AddHandler cgi-script .py
           

    Enregistrer avec la commande ; CTRL+O puis Enter
    Quitter avec la commande CTRL +X
    Redémarrer apache2 avec la commande : service apache2 restart

    Dès lors on peut appeler les scripts python dans le navigateur à l’adresse:  http://IP_rasperry/boa/monfichier.py
    Noter que l’on utilise, dans l’url,  l’alias défini précédemment. (ici boa)

    Répondre
  10. estelle

    Cela fonctionne bien sauf que si une sortie change d’état par l’action d’un autre script l’affichage sur les boutons reste statique.
    Normal car la fonction « Lecture » est statique
    J’ai essayé d’utiliser la fonction « setInterval » dans index.php qui relance un php avec le code php (boucle For) de index.php.
    Les boutons deviennent statiques au click mais changent d’état si la sortie change d’état
    Qui a une idée pour améliorer ce prg ?

    Répondre
    1. bruno83

      bonjour,
      un truc simple en html

      si non tu prends ma version full python cgi
      tu appelles
      change_pin (0, 3);//tester l’état des led autre utilisateur
      avec un setinterval

      Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Complétez ce captcha SVP *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.