Intéragir avec les "digital pins"
AXIOME : Sous Unix, tout est fichier.
Une fois l’OS installé (couverture non prévue à ce jour), j’ai découvert qu’il n’y avait pas de "fichiers" pour intéragir avec un PIN.
suis-je donc Marron ?
Pas de bras, pas de chocolat… On persévère !!!
Découverte de la commande système : gpioctl qui permet d’intéragir avec les pins.
Editer : /etc/rc.securelevel
gpioctl gpio1 13 set out H8_11
gpioctl gpio1 12 set out H8_12
gpioctl gpio0 26 set out H8_14
gpioctl gpio1 15 set out H8_15
gpioctl gpio1 14 set out H8_16
gpioctl gpio0 27 set out H8_17
gpioctl gpio2 1 set out H8_18
gpioctl gpio1 29 set out H8_26
gpioctl gpio2 23 set out H8_29
gpioctl gpio2 25 set out H8_30
gpioctl gpio2 12 set out H8_39
gpioctl gpio2 13 set out H8_40
gpioctl gpio2 10 set out H8_41
gpioctl gpio2 11 set out H8_42
gpioctl gpio2 8 set out H8_43
gpioctl gpio2 9 set out H8_44
gpioctl gpio2 6 set out H8_45
gpioctl gpio2 7 set out H8_46
gpioctl gpio1 16 set in H9_15
gpioctl gpio1 17 set in H9_23
gpioctl gpio3 19 set in H9_27`
gpiofunctions.h
#ifndef GPIOFUNCTIONS_H
#define GPIOFUNCTIONS_H
extern void digitalWrite(char *, char *, int);
extern int digitalRead(char *, char *);
#endif
gpiofunctions.c - Source Updated, ajout de la function : openGpioDevice()
#include <sys/types.h>
#include <sys/gpio.h>
#include <sys/ioctl.h>
#include <sys/limits.h>
#include <err.h>
#include <errno.h>
#include <fcntl.h>
#include <paths.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include "gpiofunctions.h"
void
digitalWrite(char *gpioId, char *gp_name, int action) {
int devfd = -1;
const char *errstr;
struct gpio_pin_op op;
openGpioDevice(gpioId, &devfd);
if (action < 0 || action > 2)
errx(1, "%d: invalid action", action);
memset(&op, 0, sizeof(op));
op.gp_pin = strtonum(gp_name, 0, INT_MAX, &errstr);
if (errstr) {
if (gp_name != NULL)
strlcpy(op.gp_name, gp_name, sizeof(op.gp_name));
op.gp_value = (action == 0 ? GPIO_PIN_LOW : GPIO_PIN_HIGH);
}
if (action < 2) {
ioctl(devfd, GPIOPINWRITE, &op);
} else {
ioctl(devfd, GPIOPINTOGGLE, &op);
}
close(devfd);
}
int
digitalRead(char *gpioId, char *gp_name) {
int devfd = -1;
struct gpio_pin_op op;
openGpioDevice(gpioId, &devfd);
memset(&op, 0, sizeof(op));
if (gp_name != NULL)
strlcpy(op.gp_name, gp_name, sizeof(op.gp_name));
ioctl(devfd, GPIOPINREAD, &op);
close(devfd);
return op.gp_value;
}
int
openGpioDevice(char *gpioId, int *pdevfd) {
char *dev;
char devn[11];
dev = gpioId;
if (strncmp(_PATH_DEV, dev, sizeof(_PATH_DEV) - 1)) {
(void)snprintf(devn, sizeof(devn), "%s%s", _PATH_DEV, dev);
dev = devn;
}
*pdevfd = open(dev, O_RDWR);
return 0;
}
k2k.c : Pour vérifier le tout… (schémas dessiné ultérieurement)
#include <stdio.h>
#include <unistd.h>
#include "gpiofunctions.h"
int
main (void)
{
int val = digitalRead("gpio1", "H9_15");
while(val != 2)
{
val = digitalRead("gpio1", "H9_15");
if(val == 1)
{
digitalWrite("gpio1", "H8_11", 1);
usleep(200000);
digitalWrite("gpio1", "H8_11", 0);
digitalWrite("gpio1", "H8_12", 1);
usleep(200000);
digitalWrite("gpio1", "H8_12", 0);
digitalWrite("gpio0", "H8_14", 1);
usleep(200000);
digitalWrite("gpio0", "H8_14", 0);
digitalWrite("gpio1", "H8_12", 1);
usleep(200000);
digitalWrite("gpio1", "H8_12", 0);
}
else if(val == 0)
{
digitalWrite("gpio1", "H8_15", 1);
usleep(150000);
digitalWrite("gpio1", "H8_15", 0);
digitalWrite("gpio1", "H8_16", 1);
usleep(150000);
digitalWrite("gpio1", "H8_16", 0);
digitalWrite("gpio0", "H8_17", 1);
usleep(150000);
digitalWrite("gpio0", "H8_17", 0);
digitalWrite("gpio1", "H8_16", 1);
usleep(150000);
digitalWrite("gpio1", "H8_16", 0);
}
}
return 0;
}
It works !
J’ai bien mérité un chocolat chaud
Explications / Difficultées rencontrées
Ici la lecture du source a été tres utile. A première lecture, il était difficile de comprends le source. Il fallait aussi comprendre la structure dans le fichier gpio.h qui fournit les indications pour affecter / lire un état électrique (haut ou bas).
Au final, la difficulté initiale était de comprendre le processus pour accéder à un périphérique.
L’appel system : ioctl nous permet de le faire :
Que venons-nous de faire ?
Nous avons écrit une petite librairie de deux fonctions, LIRE et ECRIRE sur un pin gpio, qui vont nous permettre d’intéragir avec le monde extérieur.