RASP-GOF-GSM-GPRS-SerialPython
Introduction
Maintenant que nous avons réussit à utiliser le port série matériel du Raspberry Pi et et à échanger des commandes AT à l'aide de minicom, ce qui serait vraiment chouette, c'est de pouvoir communiquer avec le module SIM900 avec un programme en Python.
Cela est rendu possible grâce à la libraire Python pySerial.
pySerial
Qu'est ce que pySerial?
pySerial est un projet OpenSource disponible sur SourceForge.Net.
Ce module encapsule l’accès au port série. Il fournit un support matériel (backends) pour Python fonctionnant sur Windows, Linux, BSD (tou les système répondant à la norme POSIX), Jython and IronPython (.NET et Mono).
Ce qui est génial pour nous, c'est de pySerial peut également être installé sur Raspberry-Pi :-)
Vous pouvez accéder directement au site du projet sur pyserial.sourceforge.net.
Easy-Intall & pip
Il existe des logiciel qui facilitent grandement l'installation de librairies Pythons.
Il s'agit des utilitaires pip et/ou easy_install.
easy_install devrait déjà être présent sur votre Pi puisqu'il fait partie intégrante de la distribution de Python.
Par contre, il est préférable d'installer l'utilitaire pip, à l'aide de la commande:
sudo apt-get install python-pip
Installer pySerial
Nous allons maintenant installer la librairie.
La méthode la plus simple consiste à utiliser l'utilitaire easy_install
sudo easy_install pySerial
Si vous rencontrer des problèmes avec easy_install ou si vous préférez pip, utilisez alors la commande
sudo pip install pySerial
pySerialTest.py
Nous vous proposons maintenant de tester la communication série depuis un programme Python.
Pour se faire, nous allons utiliser une particularité du module SIM900.
Si on lui envoi une commande "AT" sans rien d'autre avec un retour à la ligne alors le module SIM900 répond "OK".
C'est une astuce utilisée pour savoir si le module SIM900 est bien sous tension ;-)
le programme pySerialTest.py
Créez le répertoire pySerialTest
cd ~ mkdir pyGsmGPRS_Test cd pyGsmGPRS_Test mkdir pySerialTest cd pySerialTest
Créez maintenant le programme pySerialTest.py à l'aide de l'éditeur nano.
nano pySerialTest.py
et ajouter le code Python suivant:
#!/usr/bin/env python # -*- coding: latin-1 -*- # Ce programme teste la connexion avec un GSM/GPRS actif # Il envoi une commande AT sur le port série à laquelle il attend une réponse OK # Voir le tutoriel MCHobby sur # http://mchobby.be/wiki/index.php?title=RASP-GOF-GSM-GPRS # Où acheter le module GSM/GPRS # http://mchobby.be/PrestaShop/product.php?id_product=63 import serial, time ser = serial.Serial( port='/dev/ttyAMA0', baudrate=19200, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, timeout=1 ) ser.open # Envoyer la commande AT ser.write( "AT\r\n" ) # Attendons un moment avant de lire la réponse # (ce qui donne aux périphérique le temps de nous fournir une réponse) time.sleep(0.3) # Lecture de la réponse octet par octet out = '' while ser.inWaiting() > 0: out += ser.read(1) print (out) # --- Envoyer une 2ieme commande AT ser.write( "AT\r\n" ) time.sleep(0.3) out = '' while ser.inWaiting() > 0: out += ser.read(1) print out
Saisissez la commande suivante pour rendre le programme exécutable
chmod +x pySerialTest.py
Tester pySerialTest.py
Démarrer le SIM900
Assurez-vous que le module SIM900 soit sous tension avant de lancer le programme de test.
En effet, vous n'obtiendrez aucune réponse si ce dernier est éteint.
Si votre module est allumé alors:
- La led PWR: Alimentation (Vert) est allumée.
- La led Statut: Bleu est allumée.
- La led Netlight: Réseau Rouge clignote.
Démarrez pySerialTest.py
Démarrez maintenant votre programme de test en Python à l'aide de la commande:
./pySerialTest.py
Et vous devriez voir apparaitre le résultat suivant dans votre fenêtre terminal.
Voici quelques informations complémentaires sur les réponses produites par le programme
Pourquoi les commandes AT sont-elles visibles?
Si le programme ne fait que lire les réponses, pourquoi voit-on aussi les "AT" dans les messages de réponses!?!?
Simplement parce que le module SIM900 est configuré en mode echo, ce qui implique que le module SIM900 renvoi aussi sur la sortie série toutes les commande qu'il reçoit.
Beaucoup de ligne vide!!!
Après le AT, il y a une ligne vide puis un OK puis une ligne vide. C'est étonnant d'avoir autant de ligne vide.
Après une recherche scrupuleuse, on remarquera que seule la \r est utile en fin de commande. Le \r\n est interprété comme un double retour à la ligne.
ser.write( "AT\r" )
C'est quoi ce caractère "?" bizarre avant le premier AT?
Probablement produit par l'état indéfini/quelconque/flottant de la ligne série au moment de l'initialisation de la communication.
Une analyse plus scrupuleuse de la réponse à l'aide du code suivant:
ser.write( "AT\r" ) # Attendons un moment avant de lire la réponse # (ce qui donne aux périphérique le temps de nous fournir une réponse) time.sleep(0.3) out = '' aChar = 0 while ser.inWaiting() > 0: aChar = ser.read(1) print( ord( aChar )) out += aChar print (out)
Permet de s'apercevoir que la réponse est
255 65 84 13 13 10 79 75 13 10 �AT OK
Ce caractère bizarre correspond chr(255) qui correspond à un octet/byte où tous les bits sont à 1. 255 correspond à la notation 0b11111111
Ressources
- Le site du projet pyserial.sourceforge.net
Réalisé par Meurisse D. pour MCHobby.be
Traduit avec l'autorisation de Geek On Fire - Translated with the permission from Geek On Fire - [1]
Toute référence, mention ou extrait de cette traduction doit être explicitement accompagné du texte suivant : « Traduction par MCHobby (www.MCHobby.be) - Vente de kit et composants » avec un lien vers la source (donc cette page) et ce quelque soit le média utilisé.
L'utilisation commercial de la traduction (texte) et/ou réalisation, même partielle, pourrait être soumis à redevance. Dans tous les cas de figures, vous devez également obtenir l'accord du(des) détenteur initial des droits. Celui de MC Hobby s'arrêtant au travail de traduction proprement dit.