Logo Mon Club Elec

Programmer le pcDuino : Pyduino : Réseau : Serveur TCP / Http permettant de contrôler l’état d’une LED à l’aide d’un formulaire HTML.

Le pcDuino est une plateforme de développement open source qui permet aux développeurs de créer des applications et des systèmes embarqués. Avec Pyduino, un framework open source pour le pcDuino, les développeurs peuvent facilement créer des applications réseau. Dans cet article, nous allons voir comment créer un serveur TCP / HTTP qui permet de contrôler l’état d’une LED à l’aide d’un formulaire HTML. Nous verrons comment configurer le pcDuino et Pyduino, comment créer le serveur et le formulaire HTML et comment tester le système.

Programmer le pcDuino : Pyduino : Réseau : Serveur TCP / Http permettant de contrôler l’état d’une LED à l’aide d’un formulaire HTML.

Programmer le pcDuino : Pyduino : Réseau : Serveur TCP / Http permettant de contrôler l’état d’une LED à l’aide d’un formulaire HTML. Programmer le pcDuino : Pyduino : Réseau : Serveur TCP / Http permettant de contrôler l’état d’une LED à l’aide d’un formulaire HTML.

Ce que l’on va faire ici

  • Dans ce code, je vous montre comment mettre en place un simple serveur TCP permettant le contrôle d’une LED à l’aide d’un formulaire HTML.

Les « plus » de l’utilisation du réseau avec Pyduino :

  • Il n’est pas nécessaire d’installer quoi que ce soit de plus : les fonctions « réseau » sont directement accessibles depuis la librairie Pyduino !
  • La librairie Pyduino offre une réelle simplicité du code permettant d’implémenter un serveur TCP/Http à la façon « Arduino », de façon totalement personnalisée ! Il existe aussi des solutions plus avancées utilisables au besoin, mais pour rester simple et maîtriser totalement les échanges serveur/client, rien de tel que de coder soi-même son petit serveur « maison » !
  • D’un point de vue matériel, le mini-PC offre également, via sa carte réseau, une stabilité de la connexion plus robuste qu’avec un shield Arduino Ethernet. Et surtout, même si le serveur ne s’exécute pas correctement, l’accès VNC permet à tout moment de reprendre la main de façon distante sur le mini-PC, de relancer le serveur, chose impossible avec Arduino + shield Ethernet : si la connexion TCP est perdue, un reboot physique est obligatoire sur la carte Arduino !

Pré-requis

Schéma fonctionnel

  • Le code Pyduino communique avec l’interface réseau du système qui assure la connexion avec le client distant. Une broche analogique est utilisée :
Programmer le pcDuino : Pyduino : Réseau : Serveur TCP / Http permettant de contrôler l’état d’une LED à l’aide d’un formulaire HTML.
  • Noter que ce code fonctionne aussi bien en éthernet (filaire) qu’en wifi (sans fil) sous réserve que la connexion matérielle soit opérationnelle.

Le réseau utilisé

Programmer le pcDuino : Pyduino : Réseau : Serveur TCP / Http permettant de contrôler l’état d’une LED à l’aide d’un formulaire HTML.
  • Note : le poste fixe peut évidemment être le poste depuis lequel vous accédez au pcDuino par VNC, au moins en phase d’essai.

Matériel nécessaire

Système

  • Le pcDuino
  • connecté à un réseau local actif associant :
    • un routeur (une box internet typiquement) +/- un switch réseau
    • d’autres postes sur le réseau, notamment un poste fixe ou une tablette.
    • voire un poste distant sur le web
  • Si on utilise le wifi, on utilisera le dongle wifi ou une clé USB wifi au lieu de l’interface réseau ethernet. Mais pour un simple test, rester en filaire, c’est plus simple !

E/S

  • une plaque d’essai pour montage sans soudures,
Programmer le pcDuino : Pyduino : Réseau : Serveur TCP / Http permettant de contrôler l’état d’une LED à l’aide d’un formulaire HTML.
  • des straps,
Programmer le pcDuino : Pyduino : Réseau : Serveur TCP / Http permettant de contrôler l’état d’une LED à l’aide d’un formulaire HTML.
  • une LED rouge 5mm,
Programmer le pcDuino : Pyduino : Réseau : Serveur TCP / Http permettant de contrôler l’état d’une LED à l’aide d’un formulaire HTML.
  • une résistance 1/4w de 270 Ohms environ,
Programmer le pcDuino : Pyduino : Réseau : Serveur TCP / Http permettant de contrôler l’état d’une LED à l’aide d’un formulaire HTML.

Instructions de montage

  • Connecter sur la broche 3 (configurée en sortie) une LED et sa résistance (270 Ohms) en série connectée au 0V
  • Connecter le pcDuino au réseau, ce qui est normalement déjà le cas si vous travaillez en accès VNC !

Le montage à réaliser

Programmer le pcDuino : Pyduino : Réseau : Serveur TCP / Http permettant de contrôler l’état d’une LED à l’aide d’un formulaire HTML.

Le fichier *.py

Copier/coller ce code dans l’éditeur Geany :

#!/usr/bin/python
# -*- coding: utf-8 -*-

# exemple pyDuino – par X. HINAULT – www.mon-club-elec.fr
# Juillet 2013 – Tous droits réservés – GPLv3
# voir : https://github.com/sensor56/pyDuino

# Controler une LED a partir bouton d’un formulaire HTML

from pyduino import * # importe les fonctions Arduino pour Python

# entete declarative
LED=3 # broche utilisee pour la LED
etatLED=LOW # reflet etat de la LED – eteinte au depart

ipLocale=Ethernet.localIP() # auto – utilise l’ip de l’interface eth0 du systeme

#ipLocale= »192.168.1.25″ # manuel – attention : utiliser la meme IP qu’une interface reseau du systeme
# pour connaitre les interfaces reseau sur le systeme : utiliser la commande $ ifconfig

print ipLocale # affiche l’adresse IP

port=8080 # attention port doit etre au dessus de 1024 sinon permission refusee par securite – 8080 pour http

serverHTTP=EthernetServer(ipLocale, port) # crée un objet serveur utilisant le port 8080 = port HTTP > 1024

#— setup —
def setup():

        #– LED —
        pinMode(LED,OUTPUT) # broche en sortie
        digitalWrite(LED,etatLED)  # met la LED dans l’etat voulu – eteinte au debut
        Serial.println(« Broche «  + str(LED) +  » en sortie mise au niveau bas. »)

        # — serveur TCP —
        global serverHTTP, ipLocale, port

        #serverHTTP.begin(10) # initialise le serveur – fixe nombre max connexion voulu
        serverHTTP.begin() # initialise le serveur – nombre max connexion par defaut = 5

        print (« Serveur TCP actif avec ip : «  + ipLocale +  » sur port : «  + str(port) )
#— fin setup

# — loop —
def loop():

        global serverHTTP, LED, etatLED

        print (« Attente nouvelle connexion entrante… »)
        clientDistant, ipDistante = serverHTTP.clientAvailable() # attend client entrant
        # code bloque ici tant que pas client ! Si present, on recupere d’un coup objet client ET son ip

        print « Client distant connecte avec ip : »+str(ipDistante) # affiche IP du client

        #— requete client —
        requete=serverHTTP.readDataFrom(clientDistant) # lit les donnees en provenance client d’un coup

        print requete # affiche requete recue

        # analyse de la requete

        if requete.startswith(« GET »): # si la requete commence par GET seul = premiere page

                print « Requete recue valide »

                # extraction requete utile = la premiere ligne
                lignesRequete=requete.splitlines() # recupere la requete est list de lignes
                requeteUtile=lignesRequete[0]  # premiere ligne = la requete utile
                print requeteUtile

                # analyse requete utile
                if « LED=ON » in requeteUtile: # la requete contient LED=ON cad si case cochee
                        Serial.println(« La chaine LED=ON est valide ! »)
                        etatLED=HIGH # memorise etat LED pour renvoie reponse adaptee
                else:
                        Serial.println(« La chaine LED=ON est absente ! »)
                        etatLED=LOW  # memorise etat LED pour renvoi reponse adaptee

                digitalWrite(LED,etatLED)  # met la LED dans l’etat voulu

                #— reponse serveur requete initiale —
                reponse=( # ( … ) pour permettre multiligne..
                httpResponse() # entete http OK 200 automatique fournie par la librairie Pyduino

                # contenu page HTML initiale
                +

                pageHTML() # voir la fonction separee – pour clarte du code

                +« \n« ) # fin reponse

                serverHTTP.writeDataTo(clientDistant, reponse) # envoie donnees vers client d’un coup

                print « Reponse envoyee au client distant : « 
                #print (bytes(reponse))
                #print (reponse) # affiche la reponse envoyee

        #====== si requete pas valide ======
        else : # sinon requete pas valide

                print (« Requete pas valide »)

        #====== une fois la page envoyée ======
        #serverHTTP.close()
        # remarque : le socket = serveur doit rester ouvert

        # quand on quitte l’application: la connexion TCP reste active un peu donc erreur si re-execution trop rapide du code
        # on peut utiliser un port voisin dans ce cas…

        delay(10) # entre 2 loop()

# — fin loop —

#— fonction fournissant la page HTML —
def pageHTML():

        pageHTML=( # debut page HTML
«  » »
<!DOCTYPE html>
<html>
    <head>
        <meta charset= »utf-8″ />
        <title>Controler une LED </title>
    </head>

    <body>

        Formulaire HTML de controle d’une LED
        <br>
        <img src= »https://www.mon-club-elec.fr/mes_images/communs/led_rouge_5mm.gif »> </CENTER>
        <br>

        <form method=get action= »http:// » » »+ Ethernet.localIP()+«  » »:8080″>
            <INPUT type= »checkbox » value= »ON » name= »LED » «  » »
) # fin premiere partie

        if etatLED==HIGH : pageHTML=pageHTML+ «  » » checked «  » »

        pageHTML=(pageHTML+«  » »> Allumer/Eteindre la LED
            <br>
            <INPUT type= »submit » value= »Envoi » name= »Envoi »>
        </form>

        «  » »)  # fin suite page HTML

        # insertion selon etat LED
        if etatLED==HIGH :
                pageHTML=(pageHTML+ «  » »
        <br>
        LED ON
    «  » »
)
        else:
                pageHTML=(pageHTML+ «  » »
        <br>
        LED OFF
        «  » »
)

        # fin de la page HTML
        pageHTML=(pageHTML+«  » »
        </body>

</html>
«  » »

)  # fin suite page HTML

        return pageHTML # la fonction renvoie la page HTML

#— obligatoire pour lancement du code —
if __name__==« __main__ »: # pour rendre le code executable
        setup() # appelle la fonction setup
        while not noLoop: loop() # appelle fonction loop sans fin

 

Ce code est également disponible ici : https://raw.github.com/sensor56/pyduino-exemples/master/Ethernet/EthernetServerFormLed.py

Utilisation

  • Connecter le mini-PC au réseau
  • Appuyer sur le bouton exécuter dans Geany
  • Une fenêtre de Terminal doit apparaître : un message indique que le serveur attend un client entrant. Les paramètres du serveur sont affichés.
  • Ouvrir alors sur le poste client un navigateur, par exemple firefox, et saisir l’adresse ip du mini-PC suivie de :8080 ce qui donne par exemple 192.168.1.12:8080. On utilise ici le port 8080 d’où le :8080…
  • A ce moment là, on doit voir sur le mini-PC les messages attestant de la connexion du client ainsi que le requête reçue
  • Puis le serveur envoie sa réponse et le formulaire s’affiche :
    • cocher la case puis valider : la LED s’allume.
    • décocher la case puis valider : la LED s’éteint.
Programmer le pcDuino : Pyduino : Réseau : Serveur TCP / Http permettant de contrôler l&rsquo;état d&rsquo;une LED à l&rsquo;aide d&rsquo;un formulaire HTML.
Programmer le pcDuino : Pyduino : Réseau : Serveur TCP / Http permettant de contrôler l&rsquo;état d&rsquo;une LED à l&rsquo;aide d&rsquo;un formulaire HTML.
  • Noter que le poste fixe peut simultanément accéder au mini-PC par VNC (qui utilise le port 5900) et par le navigateur client ( qui utilise le port 8080) !
  • Simple et efficace.

Discussion technique

  • Voir également les codes utilisant Ajax et permettant la même chose sans avoir à rafraîchir la page.
Noter cet article

Laisser un commentaire

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

Archive Mon Club Elec

Articles populaires

Newsletter

Inscrivez-vous maintenant et bénéficiez d'un soutien continu pour réaliser vos travaux électriques en toute sécurité.