Menu Fermer

PyDev, un IDE Python pour Eclipse (usage: le GPIO du Raspberry Pi)

Date de la dernière modification: 29 avril 2020

Cet article a été soumis en mars 2019 à developpez.com et est maintenant disponible sous le titre PyDev, un IDE pour Python, sous Eclipse et pour le Raspberry Pi 3.

Introduction

Cet article est destiné au programmeur Python développant des applications pour le Raspberry Pi 3 ou Pi 4 et peut être considéré comme une extension de mon livre Programmer en Java avec un Raspberry Pi.

Comme c’est expliqué dans le livre, nous utilisons des scripts Python pour tester nos composants attachés au port GPIO, comme défini dans les schémas Fritzing.

Dans mon ouvrage, qui a dû rester avec un nombre de pages restreintes, à cause du format couleur, nous avons dû nous contenter, aussi à cause des nombreux sujets traités, de ne faire qu’une introduction rapide à Python en indiquant aussi comment l’installer sur le PC.

Une installation sur le PC n’est pas nécessaire, car les scripts Pythons décrits dans le livre peuvent être simplement téléchargés sur le Raspberry Pi pour vérifier les composants montés sur nos planches à pain.

Cet article nous montre comment installer le PyDev, un IDE Python pour Eclipse, sur un PC Windows, et y écrire une librairie fictive RPi.GPIO pour que le script Python blink2leds.py (chapitre 6) puisse être exécuté sur le PC sans GPIO hardware (chapitre 5) et avant le déploiement sur le Raspberry Pi.

# coding: utf-8

import RPi.GPIO as GPIO
import time

LedPin1 = 12 # pin15 (Pi4J GPIO_01)
LedPin2 = 15 # pin15 (Pi4J GPIO_03)
# pin3 la terre

def setup():
print(« Les deux leds vont clignoter »)

GPIO.setmode(GPIO.BOARD) # Numéro GPIO par location physique
GPIO.setup(LedPin1, GPIO.OUT) # LedPin1 en mode output
GPIO.setup(LedPin2, GPIO.OUT) # LedPin2 en mode output

def blink():
i = 0
while i < 15: # Pour 15 sec
GPIO.output(LedPin1, GPIO.HIGH) # Allume la led
GPIO.output(LedPin2, GPIO.HIGH) # Allume la led
time.sleep(.5)
GPIO.output(LedPin1, GPIO.LOW) # Eteint la led
GPIO.output(LedPin2, GPIO.LOW) # Eteint la led
time.sleep(.5)
i += 1

print(« Une seule led va clignoter plus lentement »)

while True: # Pour une boucle éternelle
GPIO.output(LedPin2, GPIO.HIGH) # Allume la led
time.sleep(1)
GPIO.output(LedPin2, GPIO.LOW) # Eteint la led
time.sleep(1)

def destroy():
GPIO.output(LedPin1, GPIO.LOW) # Led éteinte
GPIO.output(LedPin2, GPIO.LOW) # Led éteinte
GPIO.cleanup() # Ressources liberées

if __name__ == ‘__main__’: # Démarrage en Python
setup()
try:
blink()
except KeyboardInterrupt: # Interruption avec ‘Ctrl+C’
destroy()

Ce script est vraiment simple et ne nécessiterait pas vraiment une vérification sur le PC. Cependant, si le lecteur désirerait étendre ce script avec des fonctionnalités plus délicates, un développement et des tests sur le PC seraient profitables. Rappelons aussi qu’il est possible d’exécuter des scripts Python depuis Java, avec la classe ProcessBuilder, et d’en extraire la réponse (chapitre 13).

Installation de PyDev dans Eclipse

Je ne décrirai pas ici l’installation d’Eclipse ni son utilisation (chapitre 1 et 2). J’assume que le lecteur le connais déjà. Pour vérifier cet article, je l’ai installé sur une de mes versions anciennes, Neon, ainsi qu’un workspace séparé  (D:\EclipseWorkspaceNeon). J’ai installé la version Eclipse IDE for Java Developers, mais une version Eclipse IDE for C/C++ Developers devrait fonctionner. Le même espace de travail que Java peut aussi être utilisé: nous pourrons alors développer aussi bien nos classes Java que des scripts Python, dédiés ou non au Raspberry Pi.

Nous trouverons une description de l’installation sur  www.pydev.org .
Avec le menu Help > Install New Software… nous déposerons dans la fenêtre du bouton Add la sélection http://www.pydev.org/updates.

Nous ne cocherons que le premier, PyDev (Mylyn n’étant pas « encore » utilisé), avant de cliquer sur le bouton Next,deux fois, et accepter la « licence agreement » et un OK final pour le logiciel non signé. Il faudra redémarrer Eclipse.

Installation de Python sur Windows

Le script précédemment montré ( blink2leds.py ) fonctionne sur le Raspberry Pi  sous la version 2 de Python, c’est implicite. Mais une commande python3 blink2leds.py va aussi montrer nos deux LEDS clignoter, donc avec la version 3.

Nous  allons donc installer la version 3.5.3, celle retournée par la commande
python3 — version
sur le Raspberry Pi (image Raspbian utilisé: 2018-06-27-raspbian-stretch.img, voir chapitre 3) .

Nous devrons télécharger Python, si pas encore installé, depuis https://www.python.org/downloads/. Avec  le nom Windows x86 executable installer nous recevrons  python-3.5.3.exe que nous exécuterons:

Nous choisirons Customize installation afin de choisir un répertoire d’installation, comme par exemple D:\Python\Python35-32.  Nous aimons bien ne pas saturer le disque C: souvent un SSD.

Il est tout à fait possible  d’installer la version 2 de Python qui sera cette fois-ci disponible avec l’extension msi: python-2.7.13.msi. Il est conseillé d’utiliser le répertoire  D:\Python\Python27_13: ce sera plus aisé de passer d’un à l’autre par un changement de configuration.

Au chapitre 19 nous expliquons comment convertir le script  ultrasonic.py de Python 2 à Python 3 et de l’exécuter sur un Raspberry Pi avec la commande python3.

Configuration de PyDev dans Eclipse

La première chose est de spécifier l’interpréteur Python d’Eclipse. Sans passer par cette configuration, nous ne pourrons pas créer un projet dédié à Python.

Pour cette configuration nous irons sous le menu Window / Preferences / PyDev / Interpreters et finalement Python Interpreter. Le bouton en haut à droite nous permettra d’entrer l’information: la seconde pour l’exécutable suffira:

Le bouton Browse nous permettra de naviguer entre les deux versions de Python si nous les avons installées les deux. A tout moment nous pourrons en activer une autre, en installant la nouvelle (Add) et effaçant l’ancienne (Remove).

Ensuite nous installerons notre premier projet dédié à Python, comme nous l’avons déjà fait pour Java dans le livre et par chapitre.

Eclipse Python projet

Pour obtenir cette fenêtre il nous suffira d’utiliser le menu File / New / Projet et PyDev Project:

Nous créerons un projet PythonPremierPas et Eclipse nous demandera d’accepter la perspective PyDev qui est plus que judicieuse.

De la même manière que les projets Java dédié au Raspberry Pi, en sélectionnant le projet PythonPremierPas , nous pourrons créer, préparer et exécuter nos scripts Python sous Eclipse.  Toutes les procédures nécessaires avant d’exécuter notre premier script Python  sont similaire à Java (chapitre 2 – Maîtriser Eclipse d’abord).

Nous pourrons préparer notre premier script Python, ici en Python 3, hello.py:

# This program prints Salut au Raspberry Pi
# followed by Bravo!

print(‘Salut au Raspberry Pi’)
print(‘Bravo’)

L’avantage de mettre deux lignes est de pouvoir vérifier le débogueur et stopper sur une ligne. C’est pareil à Java. Dans la console, nous pourrions voir:

pydev debugger: starting (pid: 6248)
Salut au Raspberry Pi
Bravo

Retour à blink2leds.py

Le script Python ci-dessus, blink2leds.py, sera déposé dans le projet PythonPremierPas avec New / File comme pour hello.py.

Nous avons expliqué pour Java comment copier un fichier, ici  blink2leds.py (qui vient avec le livre, car utilisé), directement dans le répertoire D:\EclipseWorkspaceNeon\PythonPremiersPas  de l’explorateur de Windows, et d’exécuter ensuite un F5 (refresh) sur ce projet dans Eclipse.

Il est clair que nos verrons tout de suite le problème: nous n’avons pas de librairie RPi.GPIO sur le PC:

Installation d’une librairie GPIO fictive dans Eclipse

Pour cette partie il est plus facile d’utiliser l’explorateur de Windows dans le répertoire de l’espace de travail de notre projet Eclipse: D:\EclipseWorkspaceNeon\PythonPremiersPas et ensuite d’exécuter un Refresh ou F5 sur le projet en question.

Les actions suivantes sont requises:

  • Création d’un répertoire RPi 
  • Création dans le répertoire RPi d’un fichier __init__.py, mais VIDE. C’est le fichier d’initialisation de la bibliothèque
  • Création dans le répertoire RPi d ‘un fichier GPIO.py comme ceci (le code source zippé de ce fichier ici):
import time

BOARD = 1
OUT = 1
IN = 1
HIGH=1
LOW=0
PUD_DOWN=0

def setmode(arg):
   print (arg)

def setup(pin, state, initial=-1, pull_up_down=-1):
   print "setup:", pin, "with", state

def output(arg1, arg2):
   print "output: " ,arg1, "-" ,arg2

def input(arg1):
   print " input: " ,arg1
   time.sleep(0.1)
   return (1)

def cleanup():
   print " cleanup "

def setwarnings(flag):
   print " setwarning: " + flag

Je conseillerais d’installer et d’utiliser Notepad++ (chapitre 1) pour l’indentation à 3 espaces.

Toutes les fonctions utilisées par blink2leds.py seront donc simulées par des print en Python.  GPIO.py est en Python 3, mais fonctionnera en Python 2. Nous avons introduit l’input qui est un peu différent: nous avons testé le script ultrasonic.py du chapitre 19 qui en avait besoin et qui mesure une distance. C’est clair que du code de simulation devrait être introduit, car ce script doit recevoir différentes valeurs d’input suivant le retour du signal ultrasonique après réfection sur un objet.

Test de notre blink2leds.py

Dans cette exemple nous avons avons stoppé avec le débogueur sur la ligne 26 (i += 1)  pour limiter les prints sur la console d’Eclipse:

pydev debugger: starting (pid: 5972)
Les deux leds vont clignoter
1
(‘setup: ‘, 12, ‘-‘, 1)
(‘setup: ‘, 15, ‘-‘, 1)
(‘output: ‘, 12, ‘-‘, 1)
(‘output: ‘, 15, ‘-‘, 1)
(‘output: ‘, 12, ‘-‘, 0)
(‘output: ‘, 15, ‘-‘, 0)

Les parenthèses viennent des prints du fichier GPIO.py écrit en Python 3, mais qui apparaissent ici, car notre Eclipse est présentement configuré avec l’interpréteur Python 2. Nous voyons bien les 12 et 15 des broches physiques décrites au chapitre 5, et les 1 et 0 correspondant à nos LEDS qui s’allument et s’éteignent.

Transfert des fichiers .py du PC au Raspberry Pi

Pour ce projet et cette configuration, nos fichiers Python seront dans le répertoire D:\EclipseWorkspaceNeon\PythonPremiersPas.

L’outil de transfert WinScp (chapitre 4) nous permettra de copier nos fichiers Python dans le répertoire créé à cet effet sur Les Raspberry Pi: /home/pi/python. Je conseillerai d’utiliser l’extension .py3 pour des scripts utilisant la version 3 de Python.

PuTTY (chapitre 4) nous permettra d’exécuter ces scripts avec python ou python3 dans une console de Raspbian.

Débogage à distance

Le débogage en Python est similaire à Java. Nous pouvons sélectionner les lignes de point d’arrêt, faire du pas à pas  (F5 -> F8) ou stopper avec le carré rouge bien connu.

Je n’ai ni trouvé le temps ni l’opportunité d’installer et de vérifier le débogage à distance sur un Raspberry Pi  avec PyDev sous Eclipse. Je l’ai fait pour Java et s’est expliqué au chapitre 15 pour le relais 5 VDC.
L’article ici pourrait aider  un lecteur explorateur.