Emission / Réception avec RF 433 Mhz







Utilisation des emetteurs / recepteurs 433 MHZ à bas coût (5 euros pour 2 modules complets émetteurs/récepteurs commandés en chine).










Commande d'une carte ROMEO (2 moteurs) avec une carte 2560 équipée d'un shield LCD 16X2
Les touches du shield permettent de commander les moteurs, le potentiometre fait varier la vitesse :))

Emission avec RF 433 Mhz 


#include <VirtualWire.h> // inclusion de la librairie VirtualWire
#include <LiquidCrystal.h>


// Variables diverses
int value;
int adr=0;
int valtouche;
int vitesse;
int refvitesse;

// Constantes 
const int touche=0;          // Touche du clavier LCD
const char *msgst = "STOP"; 
const char *msgav = "AVAN"; 
const char *msgar = "ARRI"; 
const char *msgdr = "DROI"; 
const char *msgga = "GAUC"; 
char msgvi[8]; 
const int Potar=15;          // pin analogique du Potar de vitesse 

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7);

// --------------
// Fonction SETUP
// --------------
void setup()
{
     pinMode(Potar, INPUT);
     Serial.begin(9600); 
     lcd.begin(16,2);    // Initialisation LCD lignes / colonnes
     vw_set_tx_pin(24);      // Transmission sur pin 24
     vw_setup(2400);         // initialisation de la librairie VirtualWire en bauds
     affichelcd(0,0,"TELECO 433 MHZ");
     affichelcd(1,0,"Pret");
}

// -----------------
// BOUCLE PRINCIPALE
// -----------------
void loop()
{
  // Traitement des touches du panneau LCD
  TraiteTouche();
  
  // Traitement du potar de vitesse
  TraiteVitesse();
}

// ----------------------------------------------------------
// Fonction du traitement de la vitesse 
// la commande envoyée est Vxxx ou xxx est la valeur du potar
// ----------------------------------------------------------
void TraiteVitesse()
{
   vitesse=map(analogRead(Potar),0,1023,1,255);
   if (vitesse!=refvitesse)
   {
     // Affichage de la vitesse sur l'écran LCD
     affichelcd(1,8,"Vit:      ");
     lcd.setCursor(13,1); 
     lcd.print(vitesse); 
     refvitesse=vitesse;
     
     // Integer en string
     String vitesseS1(vitesse, DEC);
     String vitesseS2;
     
     // Concatenation et formattage commande+valeur
     vitesseS2="V"+vitesseS1; 
     if (vitesse<100) vitesseS2="V0"+vitesseS1; 
     if (vitesse<10) vitesseS2="V00"+vitesseS1; 
     
     // String to char array
     vitesseS2.toCharArray(msgvi,(vitesseS2.length()+1));
  
     // Envoi de la vitesse dans le ROBOT
     vw_send((uint8_t *)msgvi, strlen(msgvi)); // On envoie le message 
     vw_wait_tx(); // On attend la fin de l'envoi
     digitalWrite(10,HIGH);  // réactive le retro eclairage du LCD
   }
}

// -------------------------------------------
// Fonction Affichelcd (Ligne,Colonne,Message)
// -------------------------------------------
void affichelcd(int _ligne,int _colonne,char* _message)
{
  lcd.setCursor(_colonne,_ligne); 
  lcd.write(_message); 
  digitalWrite(10,HIGH);  // réactive le retro eclairage du LCD
}

// ------------------------------------
// Fonction TraiteTouche (Shield Ecran)
// ------------------------------------
void TraiteTouche()
{
  valtouche=analogRead(touche);
   lcd.setCursor(0,1); 
  switch (valtouche) 
  {
    case 640:  // Stop
     Stop();
     affichelcd(1,0,"STOP   ");
    break;
    
    case 410:  // Left
     Stop();
     vw_send((uint8_t *)msgga, strlen(msgga)); // On envoie le message 
     vw_wait_tx(); // On attend la fin de l'envoi
     affichelcd(1,0,"GAUCHE ");
    break;
    
    case 98:  // Up
     Stop();
     vw_send((uint8_t *)msgav, strlen(msgav)); // On envoie le message 
     vw_wait_tx(); // On attend la fin de l'envoi
     affichelcd(1,0,"AVANT  ");
    break;
    
    case 256:  // Down
     Stop();
     vw_send((uint8_t *)msgar, strlen(msgar)); // On envoie le message 
     vw_wait_tx(); // On attend la fin de l'envoi
     affichelcd(1,0,"ARRIERE");
    break;
    
    case 0:    // Right
     Stop();
     vw_send((uint8_t *)msgdr, strlen(msgdr)); // On envoie le message 
     vw_wait_tx(); // On attend la fin de l'envoi
     affichelcd(1,0,"DROITE ");
    break;
  }
}

// --------------------
// Fonction envoie Stop
// --------------------
// permet d'envoyer stop avant le changement de fonctionnement des roues
// évite ainsi le plantage du programme quand les piles sont limites
void Stop()
{
   vw_send((uint8_t *)msgst, strlen(msgst)); // On envoie le message 
   vw_wait_tx(); // On attend la fin de l'envoi
}



Réception avec RF 433 Mhz 


// --------------------------------------------------------------------------------
// Reception sur Robot Roemo des commandes envoyées en 433 Mhz
// STOP : Arrete les roues 
// AVAN : marche avant 
// ARRI : Marchre arriere
// GAUC : Tourne à gauche
// DROI : Tourne à droite
// Vxxx : Valeur vitesse des moteurs ou xxx represente la vitesse entre 1 et 254
// --------------------------------------------------------------------------------
#include <VirtualWire.h> // inclusion de la librairie VirtualWire
 
uint8_t buf[VW_MAX_MESSAGE_LEN];     // Tableau qui va contenir le message reçu (de taille maximum VW_MAX_MESSAGE_LEN)
uint8_t buflen = VW_MAX_MESSAGE_LEN; // Taille maximum de notre tableau

// Variables diverses
String Message="";
String derniermessage;
char caractere;
int vitesse;

//Standard PWM DC control
int E1 = 5;    // M1 Speed Control
int E2 = 6;    // M2 Speed Control
int M1 = 4;    // M1 Direction Control
int M2 = 7;    // M1 Direction Control

// -------------------
// Fonction SETUP
// -------------------
void setup() // Fonction setup()
{
    Serial.begin(9600); // Initialisation du port série pour avoir un retour sur le serial monitor
    while (!Serial) 
    {
    ; // wait for serial port to connect. Needed for Leonardo only
    }
    Serial.println("433 Mhz Reception..."); 
    vw_set_rx_pin(1);    // Pin de reception 
    vw_setup(2400);      // initialisation de la librairie VirtualWire en bauds 
    vw_rx_start();       // Activation de la partie réception de la librairie VirtualWire
    vitesse=255;         // Moteurs à pleine puissance par défaut
}

// ------------------
// Boucle principale
// -----------------
void loop()
{
    if (vw_wait_rx_max(100)) // Si un message est reçu dans les 200ms qui viennent
    {
        if (vw_get_message(buf, &buflen)) // On copie le message, qu'il soit corrompu ou non
        {
            Message="";
            for (byte i = 0; i < buflen; i++)
            {
              caractere=(buf[i]);
              Message.concat(caractere);
            }
            
            traitemessage(); 
        }
    }
}

// ----------------------
// Fonction traitemessage
// ----------------------
void traitemessage()
{
  Serial.println(Message);
  if (Message!=derniermessage || derniermessage=="STOP" || derniermessage.substring(1,1)=="V")
  {
    if (Message=="STOP") Stop();
    if (Message=="AVAN") Avant(vitesse,vitesse);
    if (Message=="ARRI") Arriere(vitesse,vitesse);
    if (Message=="DROI") Adroite(vitesse,vitesse);
    if (Message=="GAUC") Agauche(vitesse,vitesse);
    if (Message.substring(0,1)=="V") ChangeVitesse(Message.substring(1,4));
    derniermessage=Message;
    Message="";
  }
}

// --------------
// Fonction Stop
// --------------
void Stop(void)                    //Stop
{
  digitalWrite(E1,LOW);   
  digitalWrite(E2,LOW);      
}  

// ---------------------
// Fonction Marche Avant
// ---------------------
void Avant(char a,char b)              //Marche Avant
{
  analogWrite (E1,a);                  //PWM Speed Control
  digitalWrite(M1,HIGH);    
  analogWrite (E2,b);    
  digitalWrite(M2,HIGH);
}  

// ------------------------
// Fonction Marche Arriere
// ------------------------
void Arriere (char a,char b)          //Marche arriere
{
  analogWrite (E1,a);
  digitalWrite(M1,LOW);   
  analogWrite (E2,b);    
  digitalWrite(M2,LOW);
}

// -------------------------
// Fonction Tourne à Gauche
// -------------------------
void Agauche (char a,char b)             //A gauche
{
  analogWrite (E1,a);
  digitalWrite(M1,LOW);    
  analogWrite (E2,b);    
  digitalWrite(M2,HIGH);
}

// -------------------------
// Fonction Tourne à droite
// -------------------------
void Adroite (char a,char b)             //A droite
{
  analogWrite (E1,a);
  digitalWrite(M1,HIGH);    
  analogWrite (E2,b);    
  digitalWrite(M2,LOW);
}

// ----------------------
// Fonction ChangeVitesse
// ----------------------
void ChangeVitesse (String _message)
{
      int myStringLength = _message.length()+1;  
      char myChar[myStringLength];
      _message.toCharArray(myChar,myStringLength);
      vitesse=atoi(myChar); 
      analogWrite (E1,vitesse);
      analogWrite (E2,vitesse); 
      Serial.print("Vitesse : ");
      Serial.println(vitesse);
}





Un autre version de l'émetteur sur une carte Nano
Ajout d'une télécommande IR




Aucun commentaire:

Enregistrer un commentaire