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