Question:
Test des scripts Raspberry Pi sur un PC
Lynob
2015-08-15 14:57:04 UTC
view on stackexchange narkive permalink

J'écris un programme Raspberry Pi, pour exécuter des trucs, prendre des entrées de capteurs, enregistrer dans une base de données et synchroniser avec un serveur.

Existe-t-il un moyen de le tester sur le PC avant de le déployer au Raspberry Pi? Comme il y a trop d'opérations GPIO, je veux m'assurer que cela fonctionne avant de le mettre sur le Raspberry Pi. Une sorte d'émulateur GPIO ou quelque chose comme ça. Je suis sous Manjaro Linux.

Il n'est pas nécessaire que ce soit un émulateur, une sorte d'IDE capable de comprendre les fonctions GPIO. Par exemple, une sortie possible serait:

  gpio 1 est en cours d'exécution, le capteur 1 est runningsensor 2 ne fonctionne pas  

Quelque chose comme ça, peut-être un Plugin Bpython ou quelque chose. Tout ce que je veux faire est de m'assurer que toutes mes fonctions GPIO fonctionnent comme je le souhaite avant de tester sur le Raspberry Pi, car souvent, des erreurs sur le Raspberry Pi sont liées au fait que je ne connecte pas correctement les pièces. Et je n'aime pas coder et corriger les bogues sur le Raspberry Pi.

Donc, si je peux vérifier que mon script fonctionne correctement sur mon PC, je peux aller sur le Raspberry Pi, sachant que mon script est bien et réparer des trucs sur le tableau. Je ne veux plus tester mon script sur le Raspberry Pi.

Une approche différente pourrait être d'utiliser "sshfs" pour monter votre répertoire de base raspberry pi sur votre PC. Vous pouvez ensuite utiliser ce que vous voulez pour écrire votre code avec vos fichiers sur le pi, puis avoir un shell ssh sur le pi dans lequel vous exécutez réellement le code. Comme cela se produit sur une connexion ssh, la vitesse est limitée, mais cela peut bien fonctionner pour vous.
Six réponses:
#1
+6
joan
2015-08-15 15:54:17 UTC
view on stackexchange narkive permalink

Je ne connais aucune solution prête à l'emploi pour vos besoins.

Cependant, vous pouvez écrire la vôtre sans trop d'effort. Combien d'appels différents faites-vous aux fonctions gpio? Vous constaterez peut-être que vous en utilisez moins de 10. Créez simplement votre propre module Python local portant le même nom que votre module cible et produisez des stubs pour les fonctions que vous utilisez.

Par exemple. si vous utilisez la fonction gpio_write () qui prend un gpio et un niveau votre stub pourrait juste être

  def gpio_write (gpio, level): print ("gpio_write appelé avec gpio = {} level = { } ". format (gpio, niveau))  

Votre stub gpio_read pourrait être

  def gpio_read (gpio): global val print (" gpio_read appelé avec gpio = {}, renvoyant {} ". format (gpio, val)) return val # où val peut être lu à partir d'un fichier ou défini en externe  

C'est une pratique assez standard, longue utilisé dans le développement de logiciels pour tester les logiciels avant que le matériel ne soit disponible.

Par ailleurs, mon module pigpio Python fonctionne sur les PC Windows / Mac / Linux.

votre module fonctionne sous linux mais ne donne pas d'erreur s'il ne trouve pas gpios comme la bibliothèque gpio standard? J'utilise votre module btw
Mon module donnera des erreurs s'il n'a pas été connecté au Pi. Il a besoin d'un Pi en réseau exécutant le démon pigpio pour être disponible lorsque le script est exécuté. Vous devrez donc toujours utiliser des stubs si vous n'aviez pas de Pi disponible sur le réseau. Cependant, cela vous permettra de développer et d'exécuter des scripts sur votre PC plutôt que sur le Raspberry Pi. J'ai fait cette suggestion en réponse à "Et je n'aime pas coder et corriger les bogues sur pi".
ah thats nice!!!
puis-je installer votre module en utilisant pip?
@Lynob Pas pour autant que je sache.
#2
+4
ben_nuttall
2019-04-12 02:13:50 UTC
view on stackexchange narkive permalink

GPIO Zero fournit une interface fausse broche, ce qui signifie que vous pouvez exécuter le même code sur votre PC et émuler les broches. Consultez des exemples de son utilisation dans la suite de tests.

De nos jours, il est logique de marquer votre réponse comme la meilleure, mais c'est une vieille question (plus de 4 ans). Cependant, cela m'a aidé avec le même doute alors, bon travail :)
#3
+3
fedeb
2019-04-12 01:44:51 UTC
view on stackexchange narkive permalink

J'ai créé cette petite bibliothèque, fedeb95 / pin, qui s'est avérée utile pour moi. Il manque certaines fonctionnalités, mais si cela vous convient ... cela a fonctionné pour moi.

Edit: pin est un wrapper RPi.GPIO. Au lieu d'appeler la méthode x de RPi.GPIO, vous appelez la méthode x de pin. Vous pouvez spécifier dans un fichier de configuration si votre programme s'exécute en mode test (lorsque vous avez lu des valeurs aléatoires à partir de broches, ou des valeurs que vous avez définies avec set_value) ou sur une framboise réelle, où cette bibliothèque appelle simplement la méthode RPi.GPIO correspondante. Il lui manque quelque chose, mais c'est une bibliothèque très simple, et n'importe qui est libre de contribuer ou de me dire de quelle fonctionnalité il a besoin et je vais essayer de l'ajouter

Pourriez-vous énumérer ici un bref aperçu des fonctionnalités?
En gros, c'est un wrapper RPi.GPIO. Au lieu d'appeler la méthode x pf RPi.GPIO, vous appelez la méthode x de pin. Vous pouvez spécifier dans un fichier de configuration si votre programme s'exécute en mode test (lorsque vous avez lu des valeurs aléatoires à partir de broches, ou des valeurs que vous avez définies avec set_value) ou sur une framboise réelle, où cette bibliothèque appelle simplement la méthode RPi.GPIO correspondante. Il manque quelque chose, mais c'est une bibliothèque très simple, et n'importe qui est libre de contribuer ou de me dire de quelle fonctionnalité il a besoin et je vais essayer de l'ajouter
Vous devriez modifier cela dans la réponse.
#4
+2
pddring
2016-10-07 21:57:05 UTC
view on stackexchange narkive permalink

Vous pouvez télécharger une bibliothèque ici: https://roderickvella.wordpress.com/2016/06/28/raspberry-pi-gpio-emulator/

Ou il y a un simulateur qui vous permet d'écrire et de tester le code python ici: http://blog.withcode.uk/2016/10/rpi-gpio-python-simulator/

#5
+2
BriceP
2016-10-07 22:18:30 UTC
view on stackexchange narkive permalink

Je suppose que vous pourriez utiliser des bibliothèques fictives comme Mock.

Elles sont principalement utilisées pour les tests unitaires, mais je suis plutôt que cela fonctionnerait très bien dans votre cas. Et vous feriez probablement mieux de l'essayer en écrivant des tests unitaires.

Il remplace en déplacement une classe existante, et vous n'avez qu'à écrire vous-même le comportement que vous recherchez. Cela vous permet de ne rien changer dans votre logique (même les importations), mais d'obtenir tout de même les valeurs de retour que vous supposez recevoir d'un appel réel de l'API.

#6
+2
M61Vulcan
2018-02-19 03:32:34 UTC
view on stackexchange narkive permalink

Étant un novice en Python et en Pi, je ne comprenais pas la réponse de Joan et j'avais besoin d'un moyen simple (bot pas élégant!) de tester mon programme sur PC sans messages d'erreur causés par des appels GPIO manquants. Je choisis simplement quelles sections de code à exécuter en vérifiant sur quelle machine j'exécute. Je peux ensuite éméluer un appel GPIO - comme un interrupteur fermant - depuis le clavier du PC.

  #! / Usr / bin / python3import socketmy_PC_host_name = 'Dev'host_name = socket.gethostname () if ( host_name! = my_PC_host_name): # N'exécutez ces lignes que si nous ne sommes pas sur le PC import RPi.GPIO as GPIO # Définissez le mode de numérotation GPIO et définissez la broche d'entrée GPIO.setmode (GPIO.BOARD) # Utilise la même numérotation de carte que sur la carte GPIO.setup (16, GPIO.IN) # Configurez la broche 16 comme inputif (host_name! = my_PC_host_name): # N'exécutez ces lignes que si nous ne sommes pas sur le PC essayez: while True: if GPIO.input (16) == 0: print ("Switch is open") else: print ("Switch is closed") finally: GPIO.cleanup () # Nettoyez les ports GPIO avant de terminer sinon: # Nous sommes en cours d'exécution sur le PC essayez : while True: c = input ('Appuyez sur "o" puis "Enter":') if c.upper () == 'O': print ("Switch is open") else: print ("Switch is closed") finally: print ("Process completed")  


Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...