Outils pour utilisateurs

Outils du site


issue117:tutoriel2

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
issue117:tutoriel2 [2017/02/06 15:01] andre_domenechissue117:tutoriel2 [2017/02/07 11:54] (Version actuelle) auntiee
Ligne 3: Ligne 3:
 Our test scenario will be to turn the RPi into a lighting manager, that controls three separate lighting circuits from a Free Vision interface. Each circuit will be controlled by a simple On/Off press button. ** Our test scenario will be to turn the RPi into a lighting manager, that controls three separate lighting circuits from a Free Vision interface. Each circuit will be controlled by a simple On/Off press button. **
  
-Dans la partie précédente de cette série, nous avons vu plusieurs façons par lesquelles notre application peut tourner sur un Raspberry Pi, le transformant, soit en terminal léger, soit en serveur d'applications tout aussi léger. Dans cette partie, nous nous intéresserons à ce qui rend le Raspberry Pi unique, et nous construirons une interface en Vision pour faire usage des ports d'entrées/sorties d'usage général (GPIO) sur ce petit ordinateur mono-carte.+Dans la partie précédente de cette série, nous avons vu plusieurs façons de faire tourner notre application sur un Raspberry Pi, le transformant, soit en terminal léger, soit en serveur d'applications tout aussi léger. Dans cette partie, nous nous intéresserons à ce qui rend le Raspberry Pi unique, et nous construirons une interface en Free Vision pour utiliser des ports d'entrées/sorties d'usage général (GPIO) sur ce petit ordinateur mono-carte.
  
 Notre scénario de test transformera le RPi en gestionnaire d'éclairage, qui pilote trois circuits séparés d'éclairage à partir d'une interface en Free Vision. Chaque circuit sera piloté par un simple bouton poussoir marche/arrêt. Notre scénario de test transformera le RPi en gestionnaire d'éclairage, qui pilote trois circuits séparés d'éclairage à partir d'une interface en Free Vision. Chaque circuit sera piloté par un simple bouton poussoir marche/arrêt.
Ligne 15: Ligne 15:
 Le circuit matériel Le circuit matériel
  
-Les modèles 2 et 3 du Raspberry Pi ont conservé une disposition de broches GPIO identiques aux modèles B+ plus anciens. Le connecteur 40 broches a deux rangées parallèles de picots, avec les numéros impairs à l'intérieur de la carte et les numéros pairs sur le bord. J'ai tendance à utiliser les derniers picots (à droite) de la rangée, spécialement les broches 34, 36, 38 et 40 qui sont respectivement reliées à la masse et aux ports GPIO 16, 20 et 21.+Les modèles 2 et 3 du Raspberry Pi ont conservé une disposition de broches GPIO similaire à celle des modèles B+ plus anciens. Le connecteur 40 broches a deux rangées parallèles de picots, avec les numéros impairs à l'intérieur de la carte et les numéros pairs sur le bord. J'ai tendance à utiliser les derniers picots (à droite) de la rangée, en particulier les broches 34, 36, 38 et 40 qui sont respectivement reliées à la masse et aux ports GPIO 16, 20 et 21.
  
-Les circuits qui seront connectés au RPi pour faire fonctionner le logiciel seront de simples LED, bien que, dans un vrai circuit, celles-ci seraient remplacées par un adaptateur à haute impédance (probablement un optocoupleur, un relais ou un triac) qui nous permettrait de piloter des circuits électriques classiques sur le secteur. Pour l'instant, nous connecterons les trois ports GPIO sur chaque patte positive de LED, alors que chaque patte négative sera branchée à la masse commune sur la broche 34.+Les circuits qui seront connectés au RPi pour faire fonctionner le logiciel seront de simples LED, bien que, dans un vrai circuit, celles-ci seraient remplacées par un adaptateur à haute impédance (probablement un optocoupleur, un relais ou un triac) qui nous permettrait de piloter des circuits électriques classiques sur le secteur. Pour l'instant, nous connecterons les trois ports GPIO chacun sur une patte positive de LED, alors que chaque patte négative sera branchée à la masse commune sur la broche 34.
  
 **LEDs need to avoid high current values, with about 15 mA being a safe limit for most robust parts. On the other hand, the RPi’s GPIO ports have even lower working values (2 to 12 mA) both as a source (providing current to drive an external circuit) or as a sink (ground return). This means we need to insert some way of limiting current in series with the LEDs - or risk overloading both the LEDs and the Raspberry Pi itself. A simple way of doing this is to insert a simple resistor into the common ground. We will be using a 1 kΩ part here, though 2.2 kΩ would probably be safer. **LEDs need to avoid high current values, with about 15 mA being a safe limit for most robust parts. On the other hand, the RPi’s GPIO ports have even lower working values (2 to 12 mA) both as a source (providing current to drive an external circuit) or as a sink (ground return). This means we need to insert some way of limiting current in series with the LEDs - or risk overloading both the LEDs and the Raspberry Pi itself. A simple way of doing this is to insert a simple resistor into the common ground. We will be using a 1 kΩ part here, though 2.2 kΩ would probably be safer.
Ligne 25: Ligne 25:
 To make connections to the RPi, we would need electric cords with female connectors to slip over the RPi’s male pins. However, a typical breadboard will need cords with male pins at their ends. I had no cords with male connectors so, instead of soldering normal cords directly to the Raspberry Pi, I connected several to a short strip of header that can then be placed and removed at will from the computer.** To make connections to the RPi, we would need electric cords with female connectors to slip over the RPi’s male pins. However, a typical breadboard will need cords with male pins at their ends. I had no cords with male connectors so, instead of soldering normal cords directly to the Raspberry Pi, I connected several to a short strip of header that can then be placed and removed at will from the computer.**
  
-Les forts courants doivent être évités sur les LED, 15 mA étant une limite de sécurité pour les appareils les plus robustes. D'un autre côté, les port GPIO du RPi ont plutôt des valeurs de travail plus basses (entre 2 et 12 mA), comme source (fournissant du courant à un circuit extérieur) ou en absorption (retour à la masse). Ceci signifie que nous avons besoin d'insérer une quelconque limitation de courant en série avec les LED, ou de risquer de surcharger, et les LED, et le Raspberry lui-même. Une manière simple de le faire est d'insérer une simple résistance dans la masse commune. Nous en utiliserons une de 1 k ici, bien que 2,2 k serait plus sûr.+Les forts courants doivent être évités sur les LED, 15 mA étant une limite de sécurité pour les appareils les plus robustes. Par ailleurs, les port GPIO du RPi ont plutôt des valeurs de travail plus basses (entre 2 et 12 mA), comme source (fournissant du courant à un circuit extérieur) ou en absorption (retour à la masse). Ceci signifie que nous avons besoin d'insérer une quelconque limitation de courant en série avec les LED, ou de risquer de surcharger, et les LED, et le Raspberry Pi lui-même. Une manière simple de le faire est d'insérer une simple résistance dans la masse commune. Nous en utiliserons une de 1 kΩ ici, bien que 2,2 kΩ serait plus sûr.
  
-Sur le diagramme tracé avec Fritzing, le vert, le jaune et le bleu seront utilisés respectivement pour les circuits 1, 2 et 3. Fritzing a aussi une représentation du RPi 2 dans sa bibliothèque, mais celle-ci est interchangeable avec le RPi 3 pour tous les cas pratiques.+Sur le diagramme tracé avec Fritzing, le vert, le jaune et le bleu seront utilisés respectivement pour les circuits 1, 2 et 3. Fritzing n'qu'une représentation du RPi 2 dans sa bibliothèque, mais celle-ci est interchangeable avec le RPi 3 pour tous les cas pratiques.
  
-Pour réaliser les connexions au RPi, nous aurons besoin de câbles électriques avec des connecteurs femelles pour les embrocher dans les picots mâles du RPi. Cependant, une plaque d'essai usuelle nécessitera des fils avec des terminaisons mâles aux deux bouts. Je n'avais pas de câbles avec des connecteurs mâles ; aussi, plutôt que de souder directement les fils sur les picots du Raspberry Pi, j'en ai connecté plusieurs sur un petit connecteur en ligne qui peut être branché à l'ordinateur et enlevé à volonté.+Pour réaliser les connexions au RPi, nous aurons besoin de câbles électriques avec des connecteurs femelles pour les embrocher dans les picots mâles du RPi. Cependant, une plaque d'essai standard nécessitera des fils avec des terminaisons mâles aux deux bouts. Je n'avais pas de câbles avec des connecteurs mâles ; aussi, plutôt que de souder directement les fils sur les picots du Raspberry Pi, j'en ai connecté plusieurs sur un petit connecteur en ligne qui peut être branché à l'ordinateur et enlevé à volonté.
  
 **Controlling the GPIO from Free Pascal **Controlling the GPIO from Free Pascal
Ligne 49: Ligne 49:
 Piloter les GPIO depuis Free Pascal Piloter les GPIO depuis Free Pascal
  
-Il y a plusieurs projets pour construire une « unit » en Pascal qui pilote les GPIO. Cependant, juste pour rendre les choses plus intéressantes, je pensais qu'il serait amusant de l'écrire nous-même. C'est en fait assez simple - sous Ubuntu comme sous Debian - de piloter les broches GPIO d'un RPi, car le noyau Linux a été corrigé pour donner accès au système de fichiers /sys. Nous pouvons vraiment le faire en ligne de commande, bien que l'accès comme root soit nécessaire. Pour paramétrer le port GPIO 16 en sortie, par exemple, nous devons faire : +Il y a plusieurs projets pour construire une « unit » en Pascal qui pilote les GPIO. Cependant, pour rendre les choses plus intéressantes, je pensais qu'il serait amusant de l'écrire nous-même. C'est en fait assez simple - sous Ubuntu comme sous Raspbian - de piloter les broches GPIO d'un RPi, car le noyau Linux a été corrigé pour donner accès au système de fichiers /sys. Nous pouvons en fait le faire en ligne de commande, bien que l'accès comme root soit nécessaire. Pour paramétrer le port GPIO 16 en sortie, par exemple, nous devons faire : 
  
 echo 16 > /sys/class/gpio/export echo 16 > /sys/class/gpio/export
Ligne 57: Ligne 57:
 Nous voyons bien que les ports sont activés à un moment donné en listant les contenus du répertoire /sys/class/gpio/gpio* - chaque fois qu'un port est activé, un lien correspondant apparaît à cet endroit. Nous voyons bien que les ports sont activés à un moment donné en listant les contenus du répertoire /sys/class/gpio/gpio* - chaque fois qu'un port est activé, un lien correspondant apparaît à cet endroit.
  
-Maintenant, pour activer GPIO 16 (mettre la sortie à 5 V), ou l'éteindre (O V) :+Maintenant, pour activer GPIO 16 (mettre la sortie à 5 V), ou l'éteindre (0V) :
  
 echo 1 > /sys/class/gpio/gpio16/value echo 1 > /sys/class/gpio/gpio16/value
Ligne 75: Ligne 75:
 echo 16 > /sys/class/gpio/unexport echo 16 > /sys/class/gpio/unexport
  
-Comme vous le voyez, l'interface /sys aide en fait à accéder aux ports, de façon à ce que ça puisse être porté sur n'importe quel langage de programmation qui a accès au système de fichiers. Faisons-le avec Pascal, dans une « unit » appelée Gpio (ci-dessus).+Comme vous le voyez, l'interface /sys nous aide vraiment à accéder aux ports, de façon à ce que ça puisse être porté sur n'importe quel langage de programmation qui a accès au système de fichiers. Faisons-le avec Pascal, dans une « unit » appelée Gpio (ci-dessus).
  
-C'est plus facile de référencer les numéros des ports et les valeurs sous forme de chaînes ; s'ils sont passés en entiers, chaque valeur devra être convertie en chaîne pour construire les noms des fichiers. Les deux premières routines sont là pour paramétrer un port, soit en entrée numérique (setup_input), soit en sortie numérique (setup_output). Les deux exportent le port et écrivent sa direction : « in » ou « out », respectivement. Dans la section d'implémentation de l'unit, nous commençons par écrire une courte procédure qui sert à ajouter une chaîne dans un fichier donné ; ainsi, cette fonctionnalité est logée ailleurs que dans les procédures principales (page suivante, en haut à droite).+C'est plus facile de référencer les numéros des ports et les valeurs sous forme de chaînes ; s'ils sont passés en entiers, chaque valeur devra être convertie en chaîne pour construire le nom des fichiers. Les deux premières routines sont là pour paramétrer un port, soit en entrée numérique (setup_input), soit en sortie numérique (setup_output). La routine exporte le port et écrit sa direction : « in » ou « out », respectivement. Dans la section d'implémentation de l'unit, nous commençons par écrire une courte procédure qui sert à ajouter une chaîne dans un fichier donné ; ainsi, cette fonctionnalité est logée ailleurs que dans les procédures principales (page suivante, en haut à droite).
  
 **Finally, procedure release will unexport the port. All of these are rather simple to code, and the complete unit is available at this link: http://pastebin.com/Vnj6ZCqP . **Finally, procedure release will unexport the port. All of these are rather simple to code, and the complete unit is available at this link: http://pastebin.com/Vnj6ZCqP .
Ligne 91: Ligne 91:
  
 Enfin, la procédure release « dé-exportera » le port. Tout ceci est plutôt simple à coder, et l'unit complète est disponible par ce lien : http://pastebin.com/Vnj6ZCqP. Enfin, la procédure release « dé-exportera » le port. Tout ceci est plutôt simple à coder, et l'unit complète est disponible par ce lien : http://pastebin.com/Vnj6ZCqP.
 +
 +Un programme simple pour tester cette unit pourrait être :
  
 Pour compiler et exécuter ce programme, nous devrons compiler à la fois l'unit et le programme lui-même, et, ensuite, exécuter le fichier binaire comme root : Pour compiler et exécuter ce programme, nous devrons compiler à la fois l'unit et le programme lui-même, et, ensuite, exécuter le fichier binaire comme root :
Ligne 125: Ligne 127:
   App, Objects, Menus, Drivers, Views, Dialogs, MsgBox, StdDlg;   App, Objects, Menus, Drivers, Views, Dialogs, MsgBox, StdDlg;
      
-l'application elle-même n'aura besoin que d'un constructeur sur mesure, qui crée et lance notre LightsDialog :+L'application elle-même n'aura besoin que d'un constructeur sur mesure, qui crée et lance notre LightsDialog :
  
-Enfin, LightsDialog aura besoin d'une procédure HandleEvent pour répondre aux appuis sur les boutons. Ceci est un brin pénible, car nous aurons besoin de détecter un appui sur un bouton pour chaque boutonet pour chacun d'eux de déterminer si nous passons d'Allumé à Éteint, ou vice-versa. Ça commence de cette manière (page suivante) :+Enfin, LightsDialog aura besoin d'une procédure HandleEvent pour répondre aux appuis sur les boutons. Ceci est un brin pénible, car nous aurons besoin de détecter un appui sur un bouton pour chaque bouton etpour chacun d'euxde déterminer si nous passons d'Allumé à Éteint, ou vice-versa. Ça commence de cette manière (page suivante).
  
 **The complete code for this program is available here: http://pastebin.com/KdGuJexk . **The complete code for this program is available here: http://pastebin.com/KdGuJexk .
Ligne 137: Ligne 139:
 Le code complet de ce programme est disponible ici : http://pastebin.com/KdGuJexk. Le code complet de ce programme est disponible ici : http://pastebin.com/KdGuJexk.
  
-Dans cette septième partie de notre série sur Free Pascal, nous avons vu comme le Raspberry Pi peut être câblé pour piloter plusieurs LED. Puis, nous avons écrit une unit simple en Pascal pour accéder aux ports GPIO, et, enfin, nous avons utilisé l'unit dans une application Free Vision pour produire une interface utilisateur en mode texte qui, franchement, est élégante et fonctionnelle. Comme exercice, ce projet est pratiquement complet car il combine des éléments de très bas niveau proches du matériel avec une programmation de style orientée objet très propre. Le résultat final est vraiment très pratique, car on peut accéder à l'application directement par le Raspberry Pi s'il est connecté à un écran et un clavier, ou via une connexion SSH filaire ou sans fil (si le modèle 3 est utilisé).+Dans cette septième partie de notre série sur Free Pascal, nous avons vu comment câbler le Raspberry Pi pour piloter plusieurs LED. Puis, nous avons écrit une unit simple en Pascal pour accéder aux ports GPIO, et, enfin, nous avons utilisé l'unit dans une application Free Vision pour produire une interface utilisateur en mode texte qui, franchement, est élégante et fonctionnelle. Comme exercice, ce projet est pratiquement complet car il combine des éléments de très bas niveau proches du matériel avec une programmation de style orientée objet très propre. Le résultat final est vraiment très pratique, car on peut accéder à l'application directement par le Raspberry Pi s'il est connecté à un écran et un clavier, ou via une connexion SSH filaire ou sans fil (si le modèle 3 est utilisé).
  
 Pour approfondir, le lecteur intéressé pourra modifier l'application de sorte que le second circuit s'allume sur pression du bouton et s'éteigne au bout d'un certain temps. Une réglette pourrait fournir un réglage fin du délai. Le troisième circuit pourrait aussi être paramétré pour s'allumer et s'éteindre à des moments particuliers de la journée. Pour approfondir, le lecteur intéressé pourra modifier l'application de sorte que le second circuit s'allume sur pression du bouton et s'éteigne au bout d'un certain temps. Une réglette pourrait fournir un réglage fin du délai. Le troisième circuit pourrait aussi être paramétré pour s'allumer et s'éteindre à des moments particuliers de la journée.
Ligne 145: Ligne 147:
 It is also wise to remember that any current over 10 to 15 mA going in or coming out can seriously damage the Raspberry Pi, so an optical isolator or some equivalent means of disconnecting the RPi from the load’s level of current will be a must.** It is also wise to remember that any current over 10 to 15 mA going in or coming out can seriously damage the Raspberry Pi, so an optical isolator or some equivalent means of disconnecting the RPi from the load’s level of current will be a must.**
  
-D'un point de vue matériel, nos trois bonnes LED peuvent être remplacées par des choses plus conséquentes. Cependant, se lancer dans un circuit sur le secteur avec des tensions de 110 V à 250 V ne devrait pas se faire, sauf à être un électricien qualifié ; beaucoup plus de précautions doivent être prises en utilisant le secteur car il peut être mortel, directement ou par incendie. C'est tout aussi vrai pour le 12 V dc des voitures. Faites-le à vos propres risques, et, s'il vous plaît, faites des recherches d'abord. La présence d'une personne qualifiée qui vous assiste et vérifie votre travail - avant la mise sous tension - est certainement une bonne chose.+D'un point de vue matériel, nos trois bonnes LED peuvent être remplacées par des choses plus conséquentes. Cependant, se lancer dans un circuit sur le secteur avec des tensions de 110 V à 250 V ne devrait pas se faire, sauf à être un électricien qualifié ; beaucoup plus de précautions doivent être prises en utilisant le secteur car il peut être mortel, directement ou par incendie. C'est tout aussi vrai pour le 12 V DC des voitures. Faites-le à vos propres risques, et, s'il vous plaît, faites des recherches d'abord. La présence d'une personne qualifiée qui vous assiste et vérifie votre travail - avant la mise sous tension - est certainement une bonne chose.
  
-Il est aussi avisé de rappeler que tout courant de 10 à 15 mA entrant ou sortant du Raspberry Pi peut l'endommager ; aussi, un optocoupleur ou un moyen équivalent pour découpler le RPi du circuit du courant de la charge est une amélioration.+Il est aussi avisé de se rappeler que tout courant de 10 à 15 mA entrant ou sortant du Raspberry Pi peut l'endommager ; aussi, un optocoupleur ou un moyen équivalent pour découpler le RPi du circuit du courant de la charge est obligatoire.
  
 //Textes en noir dans les zones saumon :// //Textes en noir dans les zones saumon ://
Ligne 165: Ligne 167:
 **The LightsDialog type will need a few more elements to work. We will need to keep track of the state of each circuit (True for on, False for off). If we wish to be able to change the caption on each button to reflect the state of the circuit, we will also need to access these buttons from the main Dialog object, so include buttons 1 , 2 and 3 in its declaration:** **The LightsDialog type will need a few more elements to work. We will need to keep track of the state of each circuit (True for on, False for off). If we wish to be able to change the caption on each button to reflect the state of the circuit, we will also need to access these buttons from the main Dialog object, so include buttons 1 , 2 and 3 in its declaration:**
  
-Le type LightsDialog a besoin de quelques éléments supplémentaires pour fonctionner. Nous devons garder une trace de l'état de chaque circuit (True quand allumé, False quand éteint). Si nous souhaitons être capable de changer le « caption » de chaque bouton pour refléter l'état du circuit, nous aurons aussi besoin d'accéder à ces boutons dans le dialogue principal de l'objet ; aussi, incluez les boutons 1, 2 et 3 dans sa déclaration :+Le type LightsDialog a besoin de quelques éléments supplémentaires pour fonctionner. Nous devons garder une trace de l'état de chaque circuit (True quand allumé, False quand éteint). Si nous souhaitons pouvoir changer le « caption » de chaque bouton pour refléter l'état du circuit, nous aurons également besoin d'accéder à ces boutons dans le dialogue principal de l'objet ; aussi, incluez les boutons 1, 2 et 3 dans sa déclaration :
  
 **We will also need several constants, both to identify which GPIO ports will be used to control each circuit, and to store the command identification codes that each button will emit when pressed:** **We will also need several constants, both to identify which GPIO ports will be used to control each circuit, and to store the command identification codes that each button will emit when pressed:**
Ligne 175: Ligne 177:
 **The LightsDialog can be initialized in a very simple manner. All we need to do is set up the buttons, and then add some code at the end of this constructor to initialize button states for the software, and set up the hardware correctly:** **The LightsDialog can be initialized in a very simple manner. All we need to do is set up the buttons, and then add some code at the end of this constructor to initialize button states for the software, and set up the hardware correctly:**
  
-LightsDialog peut être initialisé de manière très simple. Tout ce dont nous avons besoin est de paramétrer les boutons et, ensuite, d'ajouter du code à la fin de ce constructeur pour initialiser l'état des boutons dans le logiciel, et de préparer correctement le matériel.+LightsDialog peut être initialisé de manière très simple. Nous devons simplement paramétrer les boutons et, ensuite, ajouter du code à la fin de ce constructeur pour initialiser l'état des boutons dans le logiciel, et préparer correctement le matériel :
  
  
issue117/tutoriel2.1486389664.txt.gz · Dernière modification : 2017/02/06 15:01 de andre_domenech