Réalisation d’une tondeuse autonome pilotée par Arduino et imprimée en 3D

Ce projet n’est pas fini et fonctionnel…

Actuellement la tondeuse fonctionne mais part chez le voisin car n’est pas limiter dans un périmètre. J’ai fait plusieurs exercice pour ne pas enterrer un cable de périmètre, GPS Emetteur-Recepteur, mais cela na pas été concluent, je suis donc en cours de modification (mais c’est l’hiver et la neige est arrivée) pour un fil périmetrique.

Actuellement elle resemble à ca :
Capture décran 2015-12-14 à 07.00.19

  • Une batterie au plomb
  • Deux moteur pas a pas
  • 4 lames de cutter (pour la coupe)
  • un moteur de visseuse et sa cachette pour régler la vitesse de coupe
  • 2 détecteurs a ultrasons pour les obstacles
  • Une roue auto directionnel
  • Un Arduino Mega pour le pilotage
  • Deux A4988 pour le pilotage des moteurs pas à pas.
  • Un accélérometre – magnétometre
  • Une poignée de resistance et autre composant de base …
  • Et beaucoup de temps ….

Elle est passée par ca …
2015-08-13 16.02.53

J’avais fait des essai avec des chenille mais l’herbe se glissait entre la chenille et les roues dès qu’elle tournait.2015-08-21 14.35.19

Le modele 3D Sketchup
Tondeuse.skp

Le schema de câblage
Capture décran 2016-01-04 à 16.48.37
et le PCB
Capture décran 2016-01-04 à 16.49.02

Le Code Arduino …

// Sensor int SensorTempArPin = A0; // Pin de reception temperature Ar int SensorTempAvPin = A1; // Pin de reception temperature Av //Relay int PinMoteurSens = 2; // Pin de rotation du moteur SAM int PinMoteurON = 3; // Pin de rotation du moteur SIAM int PinResistance1 = 4; // Pin du corp de chauffe de base int PinResistance2 = 5; // Pin du corp de chauffe de regulation de t° int PinMoteurPompe = 6; // Pin du Moteur de pompe int PinCapteurRelaiPorte = 7; // Pin du du capteur de relai de la porte // Capteur int PinCapteurPorte = 8; // pin du capteur de porte int PinContactTropPlein = 9; // Pin du contact de trop plein // LED int PinLedcapteurTropPlein = 13; // pin du capteur de porte int PinLedON = 12; // pin du capteur de porte //Accessoire int PinBeep = 10; //Pin du beep // Bouton int PinLancementCycle = 11; //Pin du bouton de lancement de cycle // Variable de capteur int SensorTempAr = 0; // Variable de valeur lue Ar int SensorTempAv = 0; // Variable de valeur lue Av int capteurPorteEtat = 0; //Variable de l’etat du capteur de porte int capteurTropPleinEtat = 0; //Variable de l’etat du capteur de trop plein long heureDeDebut = 0; // Heure en MilliSeconde du lancement du cycle // Variable de memoire int valeurMoteurPrecedente = 0; // Valeur de moteur precedente int valeurResistancePrecedente = 0; // Valeur de la resistance precedente // Variable modifiable long tempsEntre2Inversion = 600000; // Temps entre 2 inversion en MilliSeconde ( 10 min * 60 sec * 1000ms) long tempsDInversion = 15000; // Temps de l’inversion en MilliSeconde ( 15 sec * 1000ms) avec temps d’inversion du moteur de 4 seconde il tourne donc 11 sec long tempsMaxiDUnCycle = 3000000; // Temps maximum d’un cycle en MilliSeconde (50min*60*60) int limiteSensorTempArResitance2 = 400;//Limite de temperature de la segonde resistance int limiteSensorTempArTotale = 500;//Limite de temperature pour arret des resistance int debug = 1; // Mode debug pour afficher ce qu’il fait int RetourCycle = -1; void setup() { // Declare la pin du lancement de cycle en entree pinMode(PinLancementCycle, INPUT); // Declare la pin du beep en sortie pinMode(PinBeep, OUTPUT); //Execute un beep au lancement de l’arduino beep(1,200); // Declare la pin du capteur de porte en entree et du relai de porte en sortie pinMode(PinCapteurPorte, INPUT); pinMode(PinCapteurRelaiPorte, OUTPUT); // Declare les pins de moteur en sortie pinMode(PinMoteurSens, OUTPUT); pinMode(PinMoteurON, OUTPUT); // Declare les pins de resitance en sortie pinMode(PinResistance1, OUTPUT); pinMode(PinResistance2, OUTPUT); // Declare la pin du moteur de pompe en sortie pinMode(PinMoteurPompe, OUTPUT); // Declare la pin du contact de trop plein pinMode(PinContactTropPlein, INPUT); // Active la communication seriel Serial.begin(9600); Serial.println(« Version logiciel 0.91.2 »); } void loop() { // Controle de l’ouverture de la porte capteurPorteEtat = capteurPorte(); switch (capteurPorteEtat){ case 1: // Porte fermee // Controle de l’etat du capteur de trop plein capteurTropPleinEtat = capteurTropPlein(); ledCapteurTropPlein(capteurTropPleinEtat); switch (capteurTropPleinEtat){ case 0: // capteur de trop plein eteint on continue if (lancementCycle() == 1){ // Lance le cycle RetourCycle = cycle(); if (debug = 1){ Serial.println(« RetourCycle » + String(RetourCycle)); // Debug } } else{ RetourCycle = -1; } switch (RetourCycle){ case -1: // Attente de lancement de cycle break; case 0: beep(10,100); RetourCycle = -1; // Attente de depart du prochain cycle break; case 1: beep(2,500); RetourCycle = -1; // Attente de depart du prochain cycle break; case 2: beep(100,100); RetourCycle = -1; // Attente de depart du prochain cycle break; default: if (debug = 1){ Serial.println(« Erreur de code beep »); } break; } break; case 1: // capteur de trop plein allume if (debug = 1){ Serial.println(« Vider le bac d’eau »); } break; default: if (debug = 1){ Serial.println(« Erreur de code Capteur Trop Plein »); } break; } break; case 0: // Porte ouverte // Arrete le moteur moteur(0); //Arrete la chauffe resistance(0); // Arrete le moteur de pompe MoteurPompe(0); // Message de fermeture de porte if (debug = 1){ Serial.println(« Fermer la porte »); } break; default: if (debug = 1){ Serial.println(« Erreur de code capteur de porte »); } } // Controle le capteur de trop plein capteurTropPleinEtat = capteurTropPlein(); ledCapteurTropPlein(capteurTropPleinEtat); //Attente reboucle delay(100); } int cycle(){ // Execute un cycle // cycle = 0 si fini normallement // = 1 si ouverture de porte // = 2 si erreur de code // Troune jusqu’a la fin de cycle int finDeCycle = 0; // Lance le moteur de pompe MoteurPompe(1); // Prend l’heure qu’il est pour le debut du cycle heureDeDebut = HeureDepart(); if (debug = 1){ Serial.println(« Debut de cycle »); } while (finDeCycle == 0){ // Controle de l’ouverture de la porte capteurPorteEtat = capteurPorte(); switch (capteurPorteEtat){ case 1: // Porte fermee // Controle de l’etat du capteur de trop plein capteurTropPleinEtat = capteurTropPlein(); ledCapteurTropPlein(capteurTropPleinEtat); switch (capteurTropPleinEtat){ case 0: // capteur eteint on continue // Mesure de la temperature AR SensorTempAr = MesureTemperature(SensorTempArPin); // Mesure de la temperature AV SensorTempAv = MesureTemperature(SensorTempAvPin); if ((TempsEcouler(heureDeDebut) % tempsEntre2Inversion) < tempsDInversion){ //Arrete la chauffe resistance(0); // Lance le moteur en SIAM moteur(-1); } else{ // Lance le moteur en SAM moteur(1); // Controle si l’on peux chauffer if (SensorTempAr >= limiteSensorTempArTotale){ // on est en limite on arrete les 2 resitances if (debug = 1){ Serial.println(« Pas de chauffe »); } resistance(0); } else{//Lance la chauffe en fonction de la temperature actuel de la sonde arriere if (SensorTempAr >= limiteSensorTempArResitance2){ if (debug = 1){ Serial.println(« Chauffe 1 »); } resistance(1); } else{ if (valeurResistancePrecedente ==1){ if (SensorTempAr >= (limiteSensorTempArResitance2 – 10)){ // On ne fait rien pour eviter d’alumer et eteindre le relai tout le temps if (debug = 1){ Serial.println(« Limite bass pas atteinte on continue a chauffer en 1 »); } }else { if (debug = 1){ Serial.println(« Chauffe 2 »); } resistance(2); } }else{ if (debug = 1){ Serial.println(« Chauffe 2 »); } resistance(2); } } } } // test de fin de cycle si les 2 sondes ont la meme valeur /* if (SensorTempAr == SensorTempAv){ finDeCycle = 1; // Arrete le moteur moteur(0); //Arrete la chauffe resistance(0); return 0; } else{ finDeCycle = 0; } */ // Test de fin de cylce si duree maxi atteinte if (TempsEcouler(heureDeDebut) > tempsMaxiDUnCycle){ if (debug = 1){ Serial.println(« tempsMaxiDUnCycle » + String(tempsMaxiDUnCycle)); // Debug } finDeCycle = 1; //Arrete la chauffe resistance(0); // Arrete le moteur moteur(0); // Arrete le moteur de pompe MoteurPompe(0); return 0; } else{ finDeCycle = 0; } break; case 1: // capteur de trop plein allume if (debug = 1){ Serial.println(« Vider le bac d’eau »); } //Arrete la chauffe resistance(0); // Arrete le moteur moteur(0); // Arrete le moteur de pompe MoteurPompe(0); // Retourne l’information que le cycle n’est pas fini finDeCycle = 2; if (debug = 1){ Serial.println(« finDeCycle » + String(finDeCycle)); // Debug } return 1; break; default: if (debug = 1){ Serial.println(« Erreur de code Capteur Trop Plein »); } finDeCycle = 3; if (debug = 1){ Serial.println(« finDeCycle » + String(finDeCycle)); // Debug } return 2; break; } break; case 0: // Porte ouverte //Arrete la chauffe resistance(0); // Arrete le moteur moteur(0); // Arrete le moteur de pompe MoteurPompe(0); // Retourne l’information que le cycle n’est pas fini finDeCycle = 4; if (debug = 1){ Serial.println(« finDeCycle » + String(finDeCycle)); // Debug } return 1; break; default: if (debug = 1){ Serial.println(« Erreur de code capteur de porte »); } finDeCycle = 5; if (debug = 1){ Serial.println(« finDeCycle » + String(finDeCycle)); // Debug } return 2; break; } } } long HeureDepart(){ //Retourne l’heure de depart en MilliSeconde if (debug = 1){ Serial.println(« Heure depart :  » + String(millis())); // Debug } return millis(); } long TempsEcouler(long heureDeDebut){ long TempsEcouler = 0; // Retourne le temps ecouler depuis l’heureDeDebut TempsEcouler = (millis()) – heureDeDebut; if (debug = 1){ Serial.println(« heureDeDebut » + String(heureDeDebut)); // Debug } if (debug = 1){ Serial.println(« millis() :  » + String((millis()))); // Debug } if (debug = 1){ Serial.println(« TempsEcouler » + String(TempsEcouler)); // Debug } return TempsEcouler; } int MesureTemperature(int SensorTempArPin){ // Temperature ambiant 77 / 1024 // Temperature chauffe au briquet 100 / 1024 int SensorTemp = 0; SensorTemp = analogRead(SensorTempArPin); if (debug = 1){ Serial.println(« SensorTemp » + String(SensorTemp)); // Debug } return SensorTemp; } int capteurPorte(){ // lit et retourne l’etat du capteur de porte 1 = Fermer / 0 = Ouvert int capteurPorteVal = digitalRead(PinCapteurPorte); if (debug = 1){ Serial.println(« capteurPorte » + String(capteurPorteVal)); // Debug } RelaiCapteurPorte(capteurPorteVal); return capteurPorteVal; } int RelaiCapteurPorte(int Etat){ // Alumme out eteind le relai du capteur de porte if (debug = 1){ Serial.println(« RelaiCapteurPorte » + String(Etat)); // Debug } switch (Etat){ case 0: digitalWrite(PinCapteurRelaiPorte,Etat); break; case 1: digitalWrite(PinCapteurRelaiPorte,Etat); break; default: if (debug = 1){ Serial.println(« Erreur de code dans l’etat du RelaiCapteurPorte » + String(Etat)); } break; } } int capteurTropPlein(){ // lit et retourne l’etat du capteur de trop plein if (debug = 1){ Serial.println(« capteurTropPlein » + String(digitalRead(PinContactTropPlein))); // Debug } return digitalRead(PinContactTropPlein); } int ledCapteurTropPlein(int Etat){ // Alumme out eteind la les de trop plein if (debug = 1){ Serial.println(« ledCapteurTropPlein » + String(Etat)); // Debug } switch (Etat){ case 0: digitalWrite(PinLedcapteurTropPlein,Etat); break; case 1: digitalWrite(PinLedcapteurTropPlein,Etat); break; default: if (debug = 1){ Serial.println(« Erreur de code dans l’etat de ledCapteurTropPlein » + String(Etat)); } break; } } int MoteurPompe(int Etat){ // lit et retourne l’etat du capteur de trop plein if (debug = 1){ Serial.println(« MoteurPompe » + String(Etat)); // Debug } digitalWrite(PinMoteurPompe,Etat); } int moteur(int SensMoteur){ if (debug = 1){ Serial.println(« valeurMoteurPrecedente » + String(valeurMoteurPrecedente)); // Debug } if (debug = 1){ Serial.println(« SensMoteur » + String(SensMoteur)); // Debug } if (SensMoteur != valeurMoteurPrecedente){ // Changement de valeur // Lance le moteur en fonction su sens desire switch (SensMoteur) { case 0: digitalWrite(PinMoteurSens, LOW); digitalWrite(PinMoteurON, LOW); valeurMoteurPrecedente = 0; break; case 1: // Arrete le moteur 3 secondes pour temps d’arret si il tourne digitalWrite(PinMoteurSens, LOW); digitalWrite(PinMoteurON, LOW); delay(3000); digitalWrite(PinMoteurSens, HIGH); delay(1000); // Temps de basculement du relai digitalWrite(PinMoteurON, HIGH); valeurMoteurPrecedente = 1; break; case -1: // Arrete le moteur 3 secondes pour temps d’arret si il tourne digitalWrite(PinMoteurSens, LOW); digitalWrite(PinMoteurON, LOW); delay(3000); digitalWrite(PinMoteurSens, LOW); delay(1000); // Temps de basculement du relai digitalWrite(PinMoteurON, HIGH); valeurMoteurPrecedente = -1; break; default: if (debug = 1){ Serial.println(« Erreur de code sens moteur »); } } } else{// Pas de changement de valeur on ne fait rien // ne rien faire } } int resistance(int niveau){ // Alume les resistance en fonction du niveau de chauffe // 0 = Arret // 1 = Resitance de base // 2 = Resitance de base & resistancede regulation if (debug = 1){ Serial.println(« resistance » + String(niveau)); // Debug } if (niveau != valeurResistancePrecedente){ // Changement de valeur switch(niveau){ case 0: digitalWrite(PinResistance1, LOW); digitalWrite(PinResistance2, LOW); valeurResistancePrecedente = 0; break; case 1: digitalWrite(PinResistance1, HIGH); digitalWrite(PinResistance2, LOW); valeurResistancePrecedente = 1; break; case 2: digitalWrite(PinResistance1, HIGH); digitalWrite(PinResistance2, HIGH); valeurResistancePrecedente = 2; break; default: if (debug = 1){ Serial.println(« Erreur de code lancement de resitance »); } return -1; } } else{ // Pas de changement de valeur on ne fait rien // ne rien faire } } int beep(int nombre,int duree){ if (debug = 1){ Serial.println(« Beep » + String(duree)); // Debug } for (int i = 0 ;i < nombre; i++){ digitalWrite(PinBeep, HIGH); delay(duree / 2); digitalWrite(PinBeep, LOW); delay(duree / 2); } } int lancementCycle(){ if (debug = 1){ Serial.println(« lancementCycle » + String(digitalRead(PinLancementCycle))); // Debug } return digitalRead(PinLancementCycle); }

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.