edv.ddns.net
Le monde du raspberry

Accueil

1 / 4
Raspberry Pi
2 / 4
Raspberry Pi
3 / 4
Raspberry Pi
4 / 4
Raspberry Pi

La température

Date:

Mois:

Année:

La Webcam

Le chenillard

Ce chenillard comprend 6 differents modes de fonctionnement:

Pour selectionner un mode il suffit d'appuyer sur le bouton.
Une Led rouge s'illumine pour indiquer que le bouton poussoire a été actionné.

Matériel necessaire

Nous allons avoir besoin des éléments suivants pour réaliser ce chenillard:

Montage

Montage

Pour bien comprendre ce qui va suivre je tiens éclaircir certaines choses sur les GPIO du Raspberry Pi.
Comme vous pouvez le voir ci-dessous, ce tableau nous montre la correspondance pin physique / nom / n° wPi / n° BCM.
Pour le montage je vais identifier les pins par leurs nom. A vous donc, de faire la correspondance avec les pins physiques correspondantes a votre Raspberry Pi.
Dans un terminal tappez la commande suivante pour avoir votre correspondance:

gpio readall

gpio

Définition

Code source

WiringPi

Pour ce code j'ai choisi le C avec l'utilisation de la bibliotheque wiringPi.
Cette bibliothéque permet de controler les ports GPIO.
Voici comment installer cette bibliothéque:
Premiérement, verifier qu'elle n'est pas deja installée:

gpio -v

Si vous avez en retour quelque chose qui ressemble a ca c'est qu'elle est installée

wiringpi

Si non taper la commande suivante dans un terminal

sudo apt-get install wiringpi

Code C

Créez un fichier nomé chenillard.c

nano chenillard.c

/********************************************************************************************************/
/* Chenillard a 9 led                                                                                   */
/* 9 leds a cabler sur les ports GPIO 21 à 29                                                           */
/* 1 bouton a clabler sur port GPIO 0                                                                   */
/* 1 led a cabler sur le port GPIO 1 (symbolise l'appui sur le bouton)                                  */
/********************************************************************************************************/

#include <stdio.h>
#include <wiringPi.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>

#define LEDPWM    1
#define BOUTON    3

int NbrLed = 9; // nbre de Leds dans le tableau
int ledPins[] = { 21,22,23,24,25,26,27,28,29 };  // Tableau contenant les Pins pour les leds
int interval = 25; // Interval entre deux actions LEDS, 40 ms
static volatile selection=0; //  Numero de type de chenillard (de 0 a 5)

// Routine d'interruption permettant de changer le type de chenillard lors de l'appui sur le bouton
// Allume egalement une led pour refleter l'appui sur le bouton
void Interruption(void)
{
    int bright;

    printf("\nun appui sur un bouton a été détécté, le n° du chenillard selectionné est %d: \n",selection);
    // Changement du type de chenillard
    if(selection == 5)
        selection=0;
    else
        selection++;

    // Allume une LED 500 ms pour refleter l'appui sur le bouton de changement de chenillard
    //digitalWrite(1,HIGH);
    //delay(200);
    //digitalWrite(1,LOW);

    // Fait varier l'intensité de la LED (utilisation du PWM)
    for(bright=0;bright<1001;bright+=5)
    {
        pwmWrite(LEDPWM,bright);
        delay(1);
    }

    for(bright=1000;bright>=0;bright-=5)
    {
        pwmWrite(LEDPWM,bright);
        delay(1);
    }
    delay(20);
}

// Initialisation des ports GPIO
void setup()
{
    int i;
    wiringPiSetup () ;

    // Activer les pins pour les leds en sortie pour les 9 LEDs
    for(i=0; i<NbrLed; i++ )
        pinMode( ledPins[i], OUTPUT );

    //pour  refleter l'appui sur le bouton:
    pinMode(LEDPWM,PWM_OUTPUT); //La led est branchée sur le port GPIO 1
    pwmSetMode (PWM_MODE_BAL) ;
    pwmSetRange (1024) ;
    pwmSetClock (50) ;

    pinMode(BOUTON,INPUT); //Le bouton est branché sur le port GPIO 0, passage du GPIO en mode entrée
    //pinMode(LEDPWM,PWM_OUTPUT); // La led est branchée sur le port GPIO 1 en mode PWM
    pwmWrite(LEDPWM,0); // on eteint la led

    //Mise en place de l'interruption sur le GPIO 0 (pin physique 11)
    wiringPiISR(BOUTON,INT_EDGE_FALLING,&Interruption);
}

// Fonction qui détéct l'appui sur une touche du clavier
int kbhit(void)
{
    struct termios oldt, newt;
    int ch;
    int oldf;

    tcgetattr(STDIN_FILENO, &oldt);
    newt = oldt;
    newt.c_lflag &= ~(ICANON | ECHO);
    tcsetattr(STDIN_FILENO, TCSANOW, &newt);
    oldf = fcntl(STDIN_FILENO, F_GETFL, 0);
    fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);

    ch = getchar();

    tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
    fcntl(STDIN_FILENO, F_SETFL, oldf);

    if(ch != EOF)
    {
        ungetc(ch, stdin);
        return 1;
    }

    return 0;
}


// Les 6  types de chenillards:
void OnOffAll()
{
    int iTime,iOnOff,i;

    for(iTime=0; iTime<NbrLed; iTime++ )
        for(iOnOff=0; iOnOff<2; iOnOff++ )
        {
            for(i=0; i<NbrLed; i++ )
                if( iOnOff == 0 ) // Allumer au premier passage
                    digitalWrite( ledPins[i], HIGH );
                else // Eteindre au deuxième passage
            digitalWrite( ledPins[i], LOW );
            delay( interval );
        }
}

// Allume puis éteind chaque led, chaque led a son tour.
 // De gauche à droite
void OnOffEachAtTheTime_LtoR()
{
    int i;

    for(i=0; i<NbrLed; i++ )
    {
        digitalWrite( ledPins[i], HIGH );
        delay( interval );
        digitalWrite( ledPins[i], LOW );
        delay( interval );
    }
}

void OnOffEachAtTheTime_RtoL()
{
    int i;

    for(i=NbrLed-1; i>=0; i-- )
    {
        digitalWrite( ledPins[i], HIGH );
        delay( interval );
        digitalWrite( ledPins[i], LOW );
        delay( interval );
    }
}

// allume toutes les leds une par une puis les éteinds
 // De Gauche à Droite
void GraduatedOnOff_LtoR()
{
    int i;

    for(i=0; i<NbrLed; i++ )
    {
        digitalWrite( ledPins[i], HIGH );
        delay( interval );
    }
    for(i=0; i<NbrLed; i++ )
    {
        digitalWrite( ledPins[i], LOW );
        delay( interval );
    }
}

// allume toutes les leds une par une puis les éteinds
 // De Gauche à Droite
void GraduatedOnOff_RtoL()
{
    int i;

    for(i=NbrLed-1; i>=0; i-- )
    {
        digitalWrite( ledPins[i], HIGH );
        delay( interval );
    }
    for(i=NbrLed-1; i>=0; i-- )
    {
        digitalWrite( ledPins[i], LOW );
        delay( interval );
    }
}

// Allume et éteind les leds à la façon K2000
 // Un aller retour complet
void K2000()
{
    int i,iBrowser;

    for(i=0; i<NbrLed; i++)
    {
        // Allume uniquement la led, la précédente et la suivante
        // éteind toutes les autres.
        for(iBrowser=0; iBrowser<NbrLed; iBrowser++ )
            if( iBrowser==(i-1) || iBrowser==(i+1) || iBrowser==i )
                digitalWrite( ledPins[iBrowser], HIGH );
            else
                digitalWrite( ledPins[iBrowser], LOW );
        delay( interval );
    }

    for(i=NbrLed-1; i>=0; i--)
    {
        // Allume uniquement la led, la précédente et la suivante
        // éteind toutes les autres.
        for(iBrowser=0; iBrowser<NbrLed; iBrowser++ )
            if( iBrowser==(i-1) || iBrowser==(i+1) || iBrowser==i )
                digitalWrite( ledPins[iBrowser], HIGH );
            else
                digitalWrite( ledPins[iBrowser], LOW );
        delay( interval );
    }

    // eteind les deux dernières led
    digitalWrite( ledPins[0], LOW );
    digitalWrite( ledPins[1], LOW );
}



int main (void)
{
    int i;

    //printf("\nChenillard à 9 LEDs\n");
    //printf("\nFonctionne avec 9 LEDs câblées sur les ports GPIO 21 à 29\n");
    //printf("\nPourquoi 9 ? et pourquoi 8 ? ...\n");
    //printf("\nAppuyer sur une touche pour quitter\n");


    setup();

    // tant qu'on appui par sur une touche du clavier
    //while(!kbhit())
    while(1)
    {
        switch(selection)
        {
            case 0:    OnOffAll();
                break;
            case 1:    OnOffEachAtTheTime_LtoR();
                break;
            case 2:    OnOffEachAtTheTime_RtoL();
                break;
            case 3:    GraduatedOnOff_LtoR();
                break;
            case 4:    GraduatedOnOff_RtoL();
                break;
            case 5:    K2000();
                break;
            default:  OnOffAll();
                break;
        }
    }

        // Fin du programme, extinction des Leds
        //for(i=0; i<NbrLed; i++ )
                //digitalWrite( ledPins[i], LOW );

}

Compilation

Pour compiler le code source tapez la commande suivante dans un terminal:

gcc chenillard.c -o chenillard -lwiringPi

Lancez le programme avec la commande suivante dans un terminal:

sudo ./chenillard

Amélioration possibles

Bien qu'il y ait un anti rebond logiciel, vous aurez noté que l'appui sur le bouton peut déclencher deux interruptions et, par conséquent, il est difficile de choisir le type de chenillard souhaité. Pour remédier au probleme il faudrait cabler le bouton avec un système anti rebond matériel.

Acquisition de température

logo raspberry

Protocole 433Mhz

logo raspberry

Modulation de largeur d'impulsions (PWM)

La modulation de largeur d'impulsion sert pricipalement a convertir un signal numérique en un signal analogique. Dans notre cas, la sortie GPIO du Raspberry sera utilisée pour délivrer un courant continu a une valeur progressive. Dans le cadre de ce tuoriel cela va nous servir a allumer / eteindre une led de maniere progressive

Matériel necessaire

Nous allons avoir besoin des éléments suivants pour réaliser ce chenillard:

Montage

Montage

Pour bien comprendre ce qui va suivre je tiens éclaircir certaines choses sur les GPIO du Raspberry Pi.
Comme vous pouvez le voir ci-dessous, ce tableau nous montre la correspondance pin physique / nom / n° wPi / n° BCM.
Pour le montage je vais identifier les pins par leurs nom. A vous donc, de faire la correspondance avec les pins physiques correspondantes a votre Raspberry Pi.
Dans un terminal tappez la commande suivante pour avoir votre correspondance:

gpio readall

gpio

Définition

Code source

WiringPi

Pour ce code j'ai choisi le C avec l'utilisation de la bibliotheque wiringPi.
Cette bibliothéque permet de controler les ports GPIO.
Voici comment installer cette bibliothéque:
Premiérement, verifier qu'elle n'est pas deja installée:

gpio -v

Si vous avez en retour quelque chose qui ressemble a ca c'est qu'elle est installée

wiringpi

Si non taper la commande suivante dans un terminal

sudo apt-get install wiringpi

Code C

Créez un fichier nomé chenillard.c

nano chenillard.c

/********************************************************************************************************/
/* Chenillard a 9 led                                                                                   */
/* 9 leds a cabler sur les ports GPIO 21 à 29                                                           */
/* 1 bouton a clabler sur port GPIO 0                                                                   */
/* 1 led a cabler sur le port GPIO 1 (symbolise l'appui sur le bouton)                                  */
/********************************************************************************************************/

#include <stdio.h>
#include <wiringPi.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>

#define LEDPWM    1
#define BOUTON    3

int NbrLed = 9; // nbre de Leds dans le tableau
int ledPins[] = { 21,22,23,24,25,26,27,28,29 };  // Tableau contenant les Pins pour les leds
int interval = 25; // Interval entre deux actions LEDS, 40 ms
static volatile selection=0; //  Numero de type de chenillard (de 0 a 5)

// Routine d'interruption permettant de changer le type de chenillard lors de l'appui sur le bouton
// Allume egalement une led pour refleter l'appui sur le bouton
void Interruption(void)
{
    int bright;

    printf("\nun appui sur un bouton a été détécté, le n° du chenillard selectionné est %d: \n",selection);
    // Changement du type de chenillard
    if(selection == 5)
        selection=0;
    else
        selection++;

    // Allume une LED 500 ms pour refleter l'appui sur le bouton de changement de chenillard
    //digitalWrite(1,HIGH);
    //delay(200);
    //digitalWrite(1,LOW);

    // Fait varier l'intensité de la LED (utilisation du PWM)
    for(bright=0;bright<1001;bright+=5)
    {
        pwmWrite(LEDPWM,bright);
        delay(1);
    }

    for(bright=1000;bright>=0;bright-=5)
    {
        pwmWrite(LEDPWM,bright);
        delay(1);
    }
    delay(20);
}

// Initialisation des ports GPIO
void setup()
{
    int i;
    wiringPiSetup () ;

    // Activer les pins pour les leds en sortie pour les 9 LEDs
    for(i=0; i<NbrLed; i++ )
        pinMode( ledPins[i], OUTPUT );

    //pour  refleter l'appui sur le bouton:
    pinMode(LEDPWM,PWM_OUTPUT); //La led est branchée sur le port GPIO 1
    pwmSetMode (PWM_MODE_BAL) ;
    pwmSetRange (1024) ;
    pwmSetClock (50) ;

    pinMode(BOUTON,INPUT); //Le bouton est branché sur le port GPIO 0, passage du GPIO en mode entrée
    //pinMode(LEDPWM,PWM_OUTPUT); // La led est branchée sur le port GPIO 1 en mode PWM
    pwmWrite(LEDPWM,0); // on eteint la led

    //Mise en place de l'interruption sur le GPIO 0 (pin physique 11)
    wiringPiISR(BOUTON,INT_EDGE_FALLING,&Interruption);
}

// Fonction qui détéct l'appui sur une touche du clavier
int kbhit(void)
{
    struct termios oldt, newt;
    int ch;
    int oldf;

    tcgetattr(STDIN_FILENO, &oldt);
    newt = oldt;
    newt.c_lflag &= ~(ICANON | ECHO);
    tcsetattr(STDIN_FILENO, TCSANOW, &newt);
    oldf = fcntl(STDIN_FILENO, F_GETFL, 0);
    fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);

    ch = getchar();

    tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
    fcntl(STDIN_FILENO, F_SETFL, oldf);

    if(ch != EOF)
    {
        ungetc(ch, stdin);
        return 1;
    }

    return 0;
}


// Les 6  types de chenillards:
void OnOffAll()
{
    int iTime,iOnOff,i;

    for(iTime=0; iTime<NbrLed; iTime++ )
        for(iOnOff=0; iOnOff<2; iOnOff++ )
        {
            for(i=0; i<NbrLed; i++ )
                if( iOnOff == 0 ) // Allumer au premier passage
                    digitalWrite( ledPins[i], HIGH );
                else // Eteindre au deuxième passage
            digitalWrite( ledPins[i], LOW );
            delay( interval );
        }
}

// Allume puis éteind chaque led, chaque led a son tour.
 // De gauche à droite
void OnOffEachAtTheTime_LtoR()
{
    int i;

    for(i=0; i<NbrLed; i++ )
    {
        digitalWrite( ledPins[i], HIGH );
        delay( interval );
        digitalWrite( ledPins[i], LOW );
        delay( interval );
    }
}

void OnOffEachAtTheTime_RtoL()
{
    int i;

    for(i=NbrLed-1; i>=0; i-- )
    {
        digitalWrite( ledPins[i], HIGH );
        delay( interval );
        digitalWrite( ledPins[i], LOW );
        delay( interval );
    }
}

// allume toutes les leds une par une puis les éteinds
 // De Gauche à Droite
void GraduatedOnOff_LtoR()
{
    int i;

    for(i=0; i<NbrLed; i++ )
    {
        digitalWrite( ledPins[i], HIGH );
        delay( interval );
    }
    for(i=0; i<NbrLed; i++ )
    {
        digitalWrite( ledPins[i], LOW );
        delay( interval );
    }
}

// allume toutes les leds une par une puis les éteinds
 // De Gauche à Droite
void GraduatedOnOff_RtoL()
{
    int i;

    for(i=NbrLed-1; i>=0; i-- )
    {
        digitalWrite( ledPins[i], HIGH );
        delay( interval );
    }
    for(i=NbrLed-1; i>=0; i-- )
    {
        digitalWrite( ledPins[i], LOW );
        delay( interval );
    }
}

// Allume et éteind les leds à la façon K2000
 // Un aller retour complet
void K2000()
{
    int i,iBrowser;

    for(i=0; i<NbrLed; i++)
    {
        // Allume uniquement la led, la précédente et la suivante
        // éteind toutes les autres.
        for(iBrowser=0; iBrowser<NbrLed; iBrowser++ )
            if( iBrowser==(i-1) || iBrowser==(i+1) || iBrowser==i )
                digitalWrite( ledPins[iBrowser], HIGH );
            else
                digitalWrite( ledPins[iBrowser], LOW );
        delay( interval );
    }

    for(i=NbrLed-1; i>=0; i--)
    {
        // Allume uniquement la led, la précédente et la suivante
        // éteind toutes les autres.
        for(iBrowser=0; iBrowser<NbrLed; iBrowser++ )
            if( iBrowser==(i-1) || iBrowser==(i+1) || iBrowser==i )
                digitalWrite( ledPins[iBrowser], HIGH );
            else
                digitalWrite( ledPins[iBrowser], LOW );
        delay( interval );
    }

    // eteind les deux dernières led
    digitalWrite( ledPins[0], LOW );
    digitalWrite( ledPins[1], LOW );
}



int main (void)
{
    int i;

    //printf("\nChenillard à 9 LEDs\n");
    //printf("\nFonctionne avec 9 LEDs câblées sur les ports GPIO 21 à 29\n");
    //printf("\nPourquoi 9 ? et pourquoi 8 ? ...\n");
    //printf("\nAppuyer sur une touche pour quitter\n");


    setup();

    // tant qu'on appui par sur une touche du clavier
    //while(!kbhit())
    while(1)
    {
        switch(selection)
        {
            case 0:    OnOffAll();
                break;
            case 1:    OnOffEachAtTheTime_LtoR();
                break;
            case 2:    OnOffEachAtTheTime_RtoL();
                break;
            case 3:    GraduatedOnOff_LtoR();
                break;
            case 4:    GraduatedOnOff_RtoL();
                break;
            case 5:    K2000();
                break;
            default:  OnOffAll();
                break;
        }
    }

        // Fin du programme, extinction des Leds
        //for(i=0; i<NbrLed; i++ )
                //digitalWrite( ledPins[i], LOW );

}

Compilation

Pour compiler le code source tapez la commande suivante dans un terminal:

gcc chenillard.c -o chenillard -lwiringPi

Lancez le programme avec la commande suivante dans un terminal:

sudo ./chenillard

Amélioration possibles

Bien qu'il y ait un anti rebond logiciel, vous aurez noté que l'appui sur le bouton peut déclencher deux interruptions et, par conséquent, il est difficile de choisir le type de chenillard souhaité. Pour remédier au probleme il faudrait cabler le bouton avec un système anti rebond matériel.