Question:
Accéder aux broches gpio à l'aide du programme C dans Raspberry Pi
sumith
2012-10-25 16:45:16 UTC
view on stackexchange narkive permalink

J'utilise Raspberry Pi avec l'image Debian Wheezy 18-09-2012. Je peux accéder aux broches gpio avec l'outil Wiring pi. Mais j'aimerais savoir s'il existe une autre méthode permettant d'accéder directement aux broches gpio sans câblage pi?

Quand j'exécute la commande suivante sur le terminal

  echo 0 > / sys / class / gpio / export  

cela montre

  -bash: / sys / class / gpio / export: Autorisation refusée  

Y a-t-il une solution pour cela?

J'ai aussi essayé le script suivant

  #! / bin / shecho "4" > / sys / class / gpio / exportecho "out" > / sys / class / gpio / gpio4 / direction while truedo echo 1 > / sys / class / gpio / gpio4 / value echo 0 > / sys / class / gpio / gpio4 / valuedone  

à partir d'ici et j'obtiens la même erreur.

Je voudrais exécuter le code sur C car pour le moment je ne suis pas familier avec Java et Python.

Salut, j'ai effectué de telles opérations gpio dans beagleboard en accédant à / sys / class / gpio / gpio (portpin) / value avec des méthodes d'ouverture / écriture / lecture de fichier en utilisant c. Mais ici, cela montre l'autorisation refusée ...
Vous devez ajouter le groupe de ces derniers à votre utilisateur ou exécuter en tant que root avec sudo. Notez que la redirection est effectuée avant l'exécution de sudo, il essaiera donc de l'ouvrir en tant qu'utilisateur, pas root.
Quatre réponses:
#1
+10
Krzysztof Adamski
2012-10-25 17:04:06 UTC
view on stackexchange narkive permalink

Oui, il y en a au moins deux:

Module noyau GPIO

La documentation complète de ce sous-système peut être trouvée ici (cherchez sous-section Sysfs Interface for Userspace ). Fondamentalement, le noyau exporte certains fichiers dans le répertoire / sys / class / gpio / . Voici un exemple d'utilisation (en utilisant la broche 0 comme entrée, puis en la commutant comme sortie et en la définissant sur 1):

  # echo 0 > / sys / class / gpio / export # echo dans > / sys / class / gpio / gpio0 / direction # cat / sys / class / gpio / gpio0 / value # echo out > / sys / class / gpio / gpio0 / direction # echo 1 > / sys / class / gpio / gpio0 / value  

Notez que dans le cas normal, vous avez besoin des autorisations root pour ce faire.

Comme tout ceci n'est qu'une opération sur fichier, il peut être fait facilement dans le programme C avec les fonctions open () / read () / write () . Soyez prudent lorsque vous utilisez les fonctions fopen () / fread () / fwrite car elles utilisent des E / S tamponnées.

Utilisation directe des registres

Celui-ci, je crois, est utilisé par le câblagePi lui-même. Il utilise le périphérique / dev / mem pour accéder à la mémoire physique RaspberryPi et pour fonctionner directement sur les registres mappés en mémoire BCM2835. Pour l'utiliser, vous devez lire la fiche technique BCM2835 (section General Purpose I / O (GPIO) ). Ce n'est cependant pas si trivial. Notez que vous avez besoin des autorisations root pour ce faire.

Il existe également une autre bibliothèque C qui utilise cette méthode, vous pouvez la trouver ici. Il fait bien plus que manipuler GPIO, mais comme c'est assez simple, il devrait être facile d'extraire uniquement le code GPIO et de comprendre son fonctionnement.

Merci.Mais quand on essaie d'exécuter echo 0> / sys / class / gpio / export, il affiche -bash: / sys / class / gpio / export: Autorisation refuséePourquoi ,? Dis-moi s'il te plaît
@Sumith: Comme mentionné dans la réponse, vous avez besoin des autorisations d'utilisateur root. Essayez d'utiliser `sudo -i` pour devenir utilisateur root, puis tapez les exemples de commandes.
Bonjour merci. Je vais réessayer. J'espère que cette fois je l'attraperai
Désolé, échoué. Lorsque j'exécute la commande sudo -i, elle passe aux paramètres système, comme la mise à jour de pi, l'extension de la carte SD. etc. Je lance donc la commande avec sudo ..Mais toujours la même erreur. Je doute qu'il y ait de sérieux problèmes avec mon image.
@sumith Qu'est-ce que `ls -l / sys / class / gpio / export` affiche? @KrysztofAdamski Pouvez-vous modifier votre réponse en ** gras ** sur le fait que vous devez être root pour accéder à ces fichiers? Je n'ai pas vu ce commentaire dans votre réponse au début.
chmoding ou chowning les fichiers (en tant que root) est une autre option pour permettre un accès non privilégié ultérieur, mais vous devrez le faire à chaque démarrage. Essayez également sudo -s pour obtenir un shell s'exécutant en tant que root à partir duquel exécuter des tests
@HeatfanJohn après avoir entré la commande ls -l / sys / class / gpio / export il montre --w ------- 1 root root 4096 oct 26 04:39 / sys / class / gpio / export .Merci
@Chris Stratton Merci. Je lance d'abord sudo -s et lance les commandes ci-dessus, cela fonctionne. Belle aide.
@Chris Stratton, puis-je vous poser un autre doute? Maintenant, je peux exécuter des commandes comme echo 0> / sys / class / gpio / export dans le terminal et fonctionne bien. Mais je veux exécuter un programme c pour accéder aux broches gpio en exécutant le fichier open / write / read on / sys / class / gpio / gpio (pin)?
@sumith: Oui, votre programme doit simplement ouvrir ces fichiers et lire / écrire depuis / vers eux avec des opérations normales de lecture / écriture. Il est préférable d'utiliser les fonctions `read ()` / `write ()` sans tampon au lieu de `fread ()` / `fwrite ()` tamponnées. Assurez-vous également que votre programme sera exécuté avec les privilèges root.
@KrzysztofAdamski Bonjour, Merci beaucoup pour votre réponse. Je peux exécuter le code c maintenant. Mais avant d'exécuter le code c, je devais exécuter sudo -s, sinon cela ne fonctionnera pas. Je souhaite exécuter le code au démarrage. Puis-je?
@sumith: L'utilisation de `sudo` 'vous fait passer à l'utilisateur` root`. C'est parce que vous avez besoin des autorisations root pour ce faire. Si vous avez écrit votre propre programme, vous pouvez le faire ** toujours ** fonctionner avec les autorisations root, quel que soit l'utilisateur qui l'exécute en utilisant la technique `setuid` (vous devriez pouvoir trouver facilement beaucoup d'informations sur la façon de faire cela), vous devez cependant être conscient des implications de sécurité pour ce faire. à propos de l'exécution de l'application au démarrage, je suppose que vous voulez dire l'exécuter au démarrage du * système *. Si tel est le cas, cela devrait être possible car dans une situation normale, tous les scripts de démarrage s'exécutent avec les autorisations root.
@KrzysztofAdamski Salut Merci. Je travaille dessus.
@KrzysztofAdamski, Il travaille sur le démarrage du système. J'ai entré le chemin du fichier exe que je veux exécuter dans le fichier /etc/rc.local puis redémarrer.Cela a bien fonctionné, mais j'avais besoin d'exécuter ps aux pour trouver le processus en cours et sudo kill (identifiant du processus) pour arrêter le processus. J'essaie d'exécuter la même chose en éditant le fichier inittab parce que je pense que c'est mieux. Parce que maintenant, si j'ai tué le processus, je dois le redémarrer après le redémarrage. Merci
@KrzysztofAdamski Bonjour, je pourrais exécuter le programme en ajoutant bes: 2345: respawn: / home / pi / GPIO / exe dans / etc / inittab. Il fonctionne bien.Merci
#2
+3
recantha
2012-10-25 17:40:54 UTC
view on stackexchange narkive permalink

Ou, si vous ne voulez pas dire strictement "directement", vous pouvez utiliser Python ou même Java

Merci, mais je ne suis pas familier avec java et python.sorry.
#3
  0
sumith
2012-11-06 15:40:15 UTC
view on stackexchange narkive permalink

Je peux accéder aux broches gpio en utilisant une méthode suggérée par Chris Stratton.

Dans le fichier /etc/rc.local, j'ajoute les commandes

echo 17 (gpio pin)> / sys / class / gpio / export

et

chmod 777 -R / sys / class / gpio / gpio17.

Je peux exécuter mon programme c sans entrer sudo -s d'abord.

Merci à tous de m'avoir soutenu ..

#4
  0
Pieter-Jan
2013-06-06 23:21:35 UTC
view on stackexchange narkive permalink

Vous pouvez accéder à tous les périphériques Raspberry Pi (y compris GPIO, C, ...) avec C en écrivant dans les registres respectifs sur le Pi.

J'ai écrit un tutoriel à ce sujet ici: http://www.pieter-jan.com/node/15

De cette façon, vous n'aurez pas à utiliser de bibliothèques, juste une connaissance de base de C. I j'espère que cela vous aidera!

Comme indiqué ci-dessus, vous devrez exécuter tous vos programmes en tant qu'utilisateur sudo.



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...