General Purpose Input/Output

Un article de Wikipédia, l'encyclopédie libre.
Sauter à la navigation Sauter à la recherche
Test de contrôle d'une hélice via les GPIO d'une Arduino et une Platine d'expérimentation

Les ports GPIO (anglais : General Purpose Input/Output, littéralement Entrée-sortie à usage général) sont des ports d'entrées-sorties très utilisés dans le monde des microcontrôleurs, en particulier dans le domaine de l'électronique embarquée, qui ont fait leur apparition aux débuts des années 1980[1]. Elles sont placées sur un circuit électronique afin de communiquer avec des composants électroniques et circuits externes. Il peut s'agir de détecteurs ou senseurs pour capter des données, ou encore de contrôler des commandes.

Utilisation[modifier | modifier le code]

Un connecteur GPIO offre à une carte électronique la possibilité de communiquer avec d'autres circuits électroniques. Le GPIO est très présent dans les domaine de l'informatique, principalement embarquée, l'électronique, l'automatisme, la commande numérique, ou la robotique.

Dans les années 1980 il existait des cartes d'interfaces dédiées à ces ports.

Elle est présente en tout premier lieu sur les cartes comportant des microcontrôleurs, comme l'Arduino et son Atmel AVR ou des cartes proches (PCDuino[2]) ou certaines cartes d'essai à DSP comme les STM32 Nucleo de ST Microelectronics, également compatibles Arduino[3], ou encore les DSP eux même comme le TMS320C6474 de Texas Instruments[4], intègrent des connecteurs ou des instructions spécifiques pour le GPIO. Le Raspberry Pi dispose d'un connecteur GPIO[5] depuis sa première version, lui permettant ainsi d'être utilisé à la fois en tant qu'ordinateur personnel, et à la fois en tant que carte contrôleur pour des applications purement électroniques, à l'image de Stellaris Launchpad[6].

Une grande partie des ordinateurs monocartes, orientées développement, comme les Arndale Board, Banana Pi, BeagleBoard, Cubieboard, Firefly, Odroid, OLinuXinoetc. intègrent elles aussi des séries de connecteurs GPIO.

Plus récemment, certaines cartes mère pour PC comme la carte Intel® NUC DE3815TYBE en comporte également[réf. souhaitée].

Programmation[modifier | modifier le code]

Plan GPIO d'une Banana Pi, chaque broche correspond un nom défini dans l'API

Ces connecteurs sont gérés par les pilotes du noyau du système d'exploitation.

Linux reconnaît par exemple nativement les ports GPIO, une documentation complète est même disponible sur le site officiel du kernel[7] et expose la façon de programmer des pilotes. Les ports sont également directement accessible depuis leur export dans /sys/class/gpio/ via Sysfs[8], les rendent directement accessibles en ligne de commande shell[9].

Microsoft Windows intègre lui aussi des API de développement spécifiques pour la création de pilotes GPIO[10], la documentation MSDN donne des informations à ce sujet[11].

Bibliothèques[modifier | modifier le code]

En plus de la bibliothèque standard du noyau, il existe des bibliothèques spécialisées de plus haut niveau, facilitent la programmation des connecteurs GPIO ou la gestion de périphériques standards. Certaines permettent également une portabilité sur des matériels au brochage compatible mais à l'architecture différente.

Le RaspberryPi par exemple, dispose de WiringPi une bibliothèque (en C) permettant de gérer les cartes d'extension les plus populaires de cette carte[12].

Comme sur les autres systèmes, Il existe pour cette architecture, des ports de l'API dans différents langages, comme RPi.GPIO pour le langage Python[13] ou Pi4J pour le langage Java[14]. Il est aussi envisageable pour certaines architectures d'utiliser directement les capacités du processeur.

Il est également possible de descendre d'un niveau dans les bibliothèques. Le système défini généralement une assignation générique aux connecteurs GPIO, les fonctions et nom de ses connecteurs sont défini par le pilote du contrôleur de ces connecteurs. On peut donc y accéder de façon générique, directement par l'API GPIO en utilisant le fichier d'entête (par exemple pour Linux : <Linux/gpio.h>[15]. Il est également possible dans certains cas de se baser sur le fichiers d'entête de registres spécifiques au contrôleur. Dans le cas par exemple d'un RaspberryPi utilisant un processeur Broadcom BCM 2835[16], où différents pilotes sont propriétaires et ne sont donc pas incluses dans le noyau, il s'agit de l'entête <bcm2835.h>[17]. dans un code source en langage C[18].

Capacités[modifier | modifier le code]

Un connecteur GPIO peut être configuré pour jouer le rôle d'une entrée (réception d'un signal) ou d'une sortie (émission d'un signal). Lorsqu'il est configuré en tant que sortie, on peut écrire dans un registre interne afin de modifier l'état d'une sortie. Lorsqu'il est configuré en tant qu'entrée, on peut détecter son état en lisant le contenu d'un registre interne.

Un connecteur GPIO ne peut traiter que des signaux numériques, 1 ou 0, une connexion sur un support analogique nécessitera un CAN/CNA comme le MCP3008[19].

Les périphériques GPIO peuvent également produire des interruptions[20] et des événements d'accès direct à la mémoire (EDMA).

Un connecteur GPIO est généralement alimenté en 3.3Vcc et ne peut émettre que des courants de faible intensité, allant de 3 mA à 50 mA[21].

Voir aussi[modifier | modifier le code]

Notes et références[modifier | modifier le code]

  1. http://www.series80.org/PDFs/HP82940A-GPIO.pdf
  2. http://tronixstuff.com/2014/01/29/tutorial-pcduino-gpio-arduino-ide/
  3. Pierrick Arlot, « Les microcontrôleurs STM32 de ST sautent à pieds joints dans l’univers Arduino », sur L'Embarqué,
  4. « TMS320C6474 Multicore Digital Signal Processor », sur Texas Instrument
  5. http://mchobby.be/wiki/index.php?title=Rasp-Hack-GPIO_Connecteur
  6. http://www.ti.com/tool/ek-lm4f120xl
  7. https://www.kernel.org/doc/Documentation/gpio
  8. (en) « GPIO Sysfs Interface for Userspace », sur Kernel.org
  9. (en) « GPIO », sur Linux-Sunxi
  10. http://www.ctcom.com.tw/doc/324257.pdf
  11. http://msdn.microsoft.com/en-us/library/windows/hardware/hh439512%28v=vs.85%29.aspx
  12. François MOCQ, « La documentation de WiringPi traduite en français », sur Framboise 314,
  13. https://pypi.python.org/pypi/RPi.GPIO
  14. http://pi4j.com/
  15. (en) « GPIO Interfaces », sur kernel.org
  16. « BCM2835 ARM Peripherals », sur Raspberrypi.org
  17. (en) « bcm2835 1.56 — C library for Broadcom BCM 2835 as used in Raspberry Pi »
  18. « Alarme de maison avec un raspberry pi », sur oversimple.fr
  19. https://learn.adafruit.com/downloads/pdf/reading-a-analog-in-and-controlling-audio-volume-with-the-raspberry-pi.pdf
  20. http://eduscol.education.fr/sti/sites/eduscol.education.fr.sti/files/ressources/pedagogiques/4346/4346-4-rpi-gpio.pdf
  21. https://mespotesgeek.fr/controle-dun-dispositif-basse-tension-via-raspberry-pi/