Compte-rendu : Robots de combats Chef de projet : VERPILLIEUX Yves, VITELLI Enzo Collaborateurs : DEMONT Aurélien, JACQUIEZ Romain, NGATCHOU Geoffrey, GIACOMO Gaubert Le principal objectif du projet consiste à réaliser deux robots de combat afin de pouvoir en faire des démonstrations aux étudiants intérieur/extérieur de l ISEN, par exemple en faire la démonstration aux lycéens et leurs parents lors des journées portes-ouvertes. Leur rôle sera de remporter le combat. Ils s affronteront l un contre l autre dans le but de se neutraliser. Ces robots seront constitués d un moteur, de chenilles, d un alliage en plastique, d une carte mère et d une carte Arduino. Nous essayerons de le réaliser de manière peu onéreuse, écologique et le plus petit possible afin de respecter le budget. Etat d avancement : Les robots sont montés et fonctionnels. L idée de les diriger avec un système sans-fil a été abandonnée du fait du manque de temps. On s est donc ramener à l idée de commander les robots via des câbles USB. Outils de management utilisés : Trello, Facebook Somme à prévoir pour le projet : 60 euros voire 70 euros.
Liste des composants commandés
Eagle du pont H Le pont en H va permettre de contrôler les moteurs des roues.
Reste à faire Communication Bluetooth Programmation de l arduino pour le module RF Développement d un code sur Arduino pour gérer les PWM Gestion des moteurs Ce qui a été fait Communication filaire Montage des robots Fabrication du PCB pont en H et du gyrophare Montage pour le contrôle d un moteur via Arduino Lien internet qui explique tout ce qui doit être fait : http://www.mon-clubelec.fr/pmwiki_mon_club_elec/pmwiki.php?n=main.arduinoexpertmoteurcccontro lersensvitesserotationserie
Programme complet en langage Arduino A copier/coller directement sur l éditeur Arduino // --- Programme Arduino --- // Trame de code générée par le générateur de code Arduino // du site www.mon-club-elec.fr // Auteur du Programme : X. HINAULT - Tous droits réservés // Programme écrit le : 5/2/2011. // ------- Licence du code de ce programme ----- // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, // or any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. // //////////////////// PRESENTATION DU PROGRAMME //////////////////// // -------- Que fait ce programme? --------- /* Ce programme permet de contrôler le sens de rotation et la vitesse de rotation d'un moteur à courant continu (CC) par une valeur entière reçue sur le port série. Ce programme utilise la génération PWM : la valeur reçue devra être comprise entre 0 et 255. Le signe de la valeur reçue déterminera le sens de rotation : + vers l'avant et - vers l'arrière. Ce programme commande le moteur par 3 broches (1 sens AV, 1 sens AR et 1 vitesse (PWM)) et utilise une interface de puissance basée sur le CI tb6612 fng. */ // --- Fonctionnalités utilisées --- // Utilise la connexion série vers le PC // -------- Circuit à réaliser --------- // La connexion série vers le PC utilise les broches 0 et 1 (via le câble USB) // Broche 3 : la broche PWM de l'interface moteur // Broche 4 : la broche IN2 de l'interface moteur // Broche 5 : la broche IN1 de l'interface moteur // /////////////////////////////// 1. Entête déclarative /////////////////////// // A ce niveau sont déclarées les librairies incluses, les constantes, les variables, les objets utiles... // --- Déclaration des constantes --- // --- Inclusion des librairies --- // --- Déclaration des constantes utiles --- // --- Déclaration des constantes des broches E/S numériques --- const int VITESSE_MOT1=3; // Constante pour la broche 3 const int AVANT_MOT1=4; // Constante pour la broche 4
const int ARRIERE_MOT1=5; // Constante pour la broche 5 // --- Déclaration des constantes des broches analogiques --- // --- Déclaration des variables globales --- int octetreception=0; // variable de stockage des valeurs reçues sur le port Série long nombrereception=0; // variable de stockage du nombre reçu sur le port Série long nombrereception0=0; // variable de stockage du dernier nombre reçu sur le port Série String chainereception=""; // déclare un objet String vide pour reception chaine // --- Déclaration des objets utiles pour les fonctionnalités utilisées --- // ////////////////////////// 2. FONCTION SETUP = Code d'initialisation ////////////////////////// // La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du programme void setup() { // debut de la fonction setup() // --- ici instructions à exécuter 1 seule fois au démarrage du programme --- // ------- Initialisation fonctionnalités utilisées ------- Serial.begin(115200); // initialise connexion série à 115200 bauds // IMPORTANT : régler le terminal côté PC avec la même valeur de transmission // ------- Broches en sorties numériques ------- pinmode (VITESSE_MOT1,OUTPUT); // Broche VITESSE_MOT1 configurée en sortie pinmode (AVANT_MOT1,OUTPUT); // Broche AVANT_MOT1 configurée en sortie pinmode (ARRIERE_MOT1,OUTPUT); // Broche ARRIERE_MOT1 configurée en sortie // ------- Broches en entrées numériques ------- // ------- Activation si besoin du rappel au + (pullup) des broches en entrées numériques ------- // ------- Initialisation des variables utilisées ------- // ------- Initialisation des broches utilisées ------- digitalwrite(vitesse_mot1,high); // PWM haut = transparent à l'état des broches IN1/IN2 //---- +/- test des moteurs ---- //digitalwrite(avant_mot1,high), digitalwrite(arriere_mot1,low);; // Test marche avant //delay (1000); //digitalwrite(avant_mot1,low), digitalwrite(arriere_mot1,high);; // Test marche arriere //delay (1000); digitalwrite(avant_mot1,low), digitalwrite(arriere_mot1,low);; // ARRET } // fin de la fonction setup() // ******************************************************************************** ////////////////////////////////// 3. FONCTION LOOP = Boucle sans fin = coeur du
programme ////////////////// // la fonction loop() s'exécute sans fin en boucle aussi longtemps que l'arduino est sous tension void loop(){ // debut de la fonction loop() // --- ici instructions à exécuter par le programme principal --- //---- code type réception valeur sur le port série --- //--- réception valeur sur port Série par fonction dédiée --- if (Serial.available()==true) nombrereception=recevoirnombre(); // si caractères présents sur port Série appel de la fonction recevoirnombre if (nombrereception!=nombrereception0) { // si un nombre a été reçu nombrereception=constrain(nombrereception,-255,255); // oblige valeurs entre -255 et +255 Serial.print("Arduino a recu : "); Serial.println(nombreReception); nombrereception0=nombrereception; // RAZ nombrereception0 // gestion des moteurs en fonction de la valeur recue if (nombrereception>0) { // si nombre positif / Marche avant vitesse digitalwrite(avant_mot1,high), digitalwrite(arriere_mot1,low);; / analogwrite(vitesse_mot1,nombrereception); // impulsion PWM } if (nombrereception==0) { // si nombre =0 Arret moteur d'impulsion PWM digitalwrite(avant_mot1,low), digitalwrite(arriere_mot1,low);; // digitalwrite(vitesse_mot1,low); // broche PWM au niveau bas = pas } if (nombrereception<0) { // si nombre négatif digitalwrite(avant_mot1,low), digitalwrite(arriere_mot1,high);; / / Marche arriere analogwrite(vitesse_mot1,abs(nombrereception)); // impulsion PWM vitesse - attention valeur positive } } // fin si nombrereception } // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin // ********************************************************************************
// ////////////////////////// FONCTIONS DE GESTION DES INTERRUPTIONS //////////////////// // ////////////////////////// AUTRES FONCTIONS DU PROGRAMME //////////////////// //---- fonction de réception valeur entière sur le port série --- long recevoirnombre() { // fonction de reception d'un nombre sur le port série int octetrecu=0; // variable pour octet recu int compt=0; // variable locale comptage caractères reçus boolean signe=true; // variable locale signe nombre recu long nombrerecu=0; // variable locale nombre recu while (Serial.available()>0) { // tant qu'un octet en réception variable octetrecu=serial.read(); // Lit le 1er octet reçu et le met dans la if (octetreception==10) { // si Octet reçu est le saut de ligne break; // sort de la boucle while } else { // si le caractère reçu n'est pas un saut de ligne if ((octetrecu=='-') && (compt==0))signe=false; // si Octet reçu est le - et si c'est le 1er caractère reçu - signe négatif compt=compt+1; // incrémente compt décimale octetrecu=octetrecu-48; // transfo valeur ASCII en valeur // calcul du nombre à partir des valeurs reçues u*10)+octetrecu; if ((octetrecu>=0)&&(octetrecu<=9)) nombrerecu = (nombrerec } // fin else if delay(1); // pause pour laisser le temps à la fonction available de recevoir octet suivant } // fin tant que octet réception //----- une fois que le saut de ligne est reçu, on sort du While et on se positionne ici négatif if (signe==false) nombrerecu=nombrerecu*(-1); // prise en compte signe return(nombrerecu); // renvoie le nombre calculé - type long } // fin fonction recevoirnombre // ////////////////////////// Fin du programme //////////////////// // ////////////////////////// Mémo instructions //////////////////// // ////////////////////////// Fin Mémo instructions ////////////////////