User Tools

Site Tools


electronique:telecommande:accueil

Télécommande 433.92MHz pilotée par µC

Cette télécommande fonctionne sur la fréquence 433.92MHz. Elle peut gérer 4 canaux en tout ou rien. Vous pouvez bien sur, en changeant le code et en changeant de micro-contrôleur, ajouter des ES ou en enlever. La longueur de l'antenne des modules radio doit être de 17.2cm (pour une fréquence de 433.92MHz).

Quelques photos:
La télécommande homemade (assez crade par ailleurs ^^)
La télécommande en action:
L'intérieur de la télécommande:

Émetteur

L'émetteur est constitué d'un µC générant la trame d'émission, de 4 boutons poussoirs (pour les 4 canaux TOR), d'un émetteur 433.92MHz
Les branchements sont les suivants: émetteur ⇒ PB0, boutons1-4 ⇒ PB1-4

Code source

#include <avr/io.h>
#include <util/delay.h>
#define INPUT(pin) DDRB &= ~(1<<pin)
#define OUTPUT(pin) DDRB |= (1 << pin)
#define TURN_OFF(pin) PORTB &= ~(1 << pin)
#define TURN_ON(pin) PORTB |= (1 << pin)
 
#define EMETTEUR PB0
#define CANAL1 PB1
#define CANAL2 PB2
#define CANAL3 PB3
#define CANAL4 PB4
 
 
void sleep(int ms)
{
    int i = 0;
    while(i <= ms)
    {
        _delay_us(100);
        i++;
    }
}
 
 
 
 
int main(void)
{
    OUTPUT(EMETTEUR);
    INPUT(CANAL1);
    INPUT(CANAL2);
    INPUT(CANAL3);
    INPUT(CANAL4);
    PORTB = 0xFF;
    TURN_OFF(EMETTEUR);
 
    int down = 3; //logic 0 - radio NULL
 
    int start = 10; //logic 1 - radio START
    int up0 = 3; //logic 1 - radio 0
    int up1 = 5; //logic 1 - radio 1
 
    int TRAMME[] = {0, 0, 1, 1};
    int longueurTramme = 3;
 
    int emissionTramme = 0;
 
    int emis = 0;
 
 
    while(1)
    {
        while(emis < 4) //On va envoyer la trame 4 fois, puis on va rescanner les entrées de l'utilisateur
        {
            emissionTramme = 0;
            TURN_ON(EMETTEUR);
            sleep(start);
            TURN_OFF(EMETTEUR);
            sleep(down);
 
 
            while(emissionTramme <= longueurTramme)
            {
                TURN_ON(EMETTEUR);
                if(TRAMME[emissionTramme] == 0)
                    sleep(up0);
                else
                    sleep(up1);
 
                TURN_OFF(EMETTEUR);
                sleep(down);
                emissionTramme++;
            }
            emis++;
        }
        emis = 0;
        if(bit_is_set(PINB, CANAL1))
            TRAMME[0] = 1;
        else
            TRAMME[0] = 0;
 
        if(bit_is_set(PINB, CANAL2))
            TRAMME[1] = 1;
        else
            TRAMME[1] = 0;
 
        if(bit_is_set(PINB, CANAL3))
            TRAMME[2] = 1;
        else
            TRAMME[2] = 0;
 
        if(bit_is_set(PINB, CANAL4))
            TRAMME[3] = 1;
        else
            TRAMME[3] = 0;
 
 
 
 
    }
 
    return 0;
}

Récepteur

Le récepteur est constitué d'un µC décodant la trame, d'un récepteur radio 433.92MHz et de 4 sorties TOR.
Les branchements sont les suivants: récepteur ⇒ PB0, sorties1-4 ⇒ PB1-4

Code source

#include <avr/io.h>
#include <util/delay.h>
#define INPUT(pin) DDRB &= ~(1<<pin)
#define OUTPUT(pin) DDRB |= (1 << pin)
#define RECEPTEUR PB0
#define CANAL1 PB1
#define CANAL2 PB2
#define CANAL3 PB3
#define CANAL4 PB4
 
#define TURN_OFF(pin) PORTB &= ~(1 << pin)
#define TURN_ON(pin) PORTB |= (1 << pin)
 
 
void waitForData()
{
     while(!bit_is_set(PINB, RECEPTEUR)) //On attend un front haut
        {
            asm volatile("NOP"); //On est actuellement dans un front bas
        }
}
 
 
 
 
int main(void)
{
 
    INPUT(RECEPTEUR);
    OUTPUT(CANAL1);
    OUTPUT(CANAL2);
    OUTPUT(CANAL3);
    OUTPUT(CANAL4);
 
 
    unsigned long dataLength = 0; //Le truc pour voir le + grand
    unsigned long dataLengthFinal = 0; //Le plus grand
    unsigned long boucles = 0;
    unsigned int ouOnEnEst = 0;
    while(boucles < 20)
    {
 
        waitForData();
        //Un front haut vient de sortir
 
        dataLength = 0;
        while(bit_is_set(PINB, RECEPTEUR))
        {
            dataLength++;
            _delay_us(1);
        }
        if(dataLength > dataLengthFinal) dataLengthFinal = dataLength; //On a la longueur du bit de start
        boucles++;
    }
 
 
 
    dataLengthFinal -= 100;
    while(1)
    {
        waitForData();
 
        dataLength = 0;
        while(bit_is_set(PINB, RECEPTEUR)) //On va analyser un bit
        {
            dataLength++;
            _delay_us(1);
        }
 
        if(dataLength > dataLengthFinal) //C'est un bit de start
        {
            asm("NOP");
            ouOnEnEst = 0;
        }
 
        else if(dataLength > dataLengthFinal - 250) //Bit 1
        {
            asm("NOP");
            if(ouOnEnEst == 1)
            {
                TURN_ON(CANAL1);
            }
 
            if(ouOnEnEst == 2)
            {
                TURN_ON(CANAL2);
            }
 
            if(ouOnEnEst == 3)
            {
                TURN_ON(CANAL3);
            }
 
            if(ouOnEnEst == 4)
            {
                TURN_ON(CANAL4);
            }
 
        }
 
        else if(dataLength > dataLengthFinal - 500) //Bit 0
        {
            asm("NOP");
            if(ouOnEnEst == 1)
            {
                TURN_OFF(CANAL1);
            }
 
            if(ouOnEnEst == 2)
            {
                TURN_OFF(CANAL2);
            }
 
            if(ouOnEnEst == 3)
            {
                TURN_OFF(CANAL3);
            }
 
            if(ouOnEnEst == 4)
            {
                TURN_OFF(CANAL4);
            }
        }
        ouOnEnEst++;
 
 
    }
 
 
 
 
    return 0;
}

Le code de la partie réception est un peu crade: la longueur des bits sont par rapport au bit de start. Quand vous utilisez la télécommande, allumez en premier l'émetteur puis ensuite le récepteur.

Discussion

Enter your comment. Wiki syntax is allowed:
HRDNB
 
electronique/telecommande/accueil.txt · Last modified: 2011/12/26 20:51 (external edit)