Hungry Robot : Différence entre versions

De Les Fabriques du Ponant
Aller à : navigation, rechercher
(Code Source)
Ligne 50 : Ligne 50 :
  
 
== Code Source ==
 
== Code Source ==
 
+
<nowiki>
 
#include <Servo.h>
 
#include <Servo.h>
  
Ligne 200 : Ligne 200 :
 
   return distance_mm;
 
   return distance_mm;
 
}
 
}
 +
</nowiki>
  
 
[[catégorie:enib2019]]
 
[[catégorie:enib2019]]

Version du 25 janvier 2019 à 14:40

Logo-enib.png


Erreur lors de la création de la miniature : Fichier avec des dimensions supérieures à 12,5 MP

Description

Qui n'a jamais trouvé la tâche de nettoyage rébarbative ? Après le bricolage ou des des expériences, il y a toujours des morceaux qui traînent, des bouts de paille, des gaines, des morceaux de papier... Avec le Hungry Robot, fini l'ennui ! Ce petit robot pratique et amusant vous facilitera le ménage ! Vous venez de dénuder un fil ? Il le mange. Des bouts de papier ? De même. Des morceaux de cure-dent ? Il l'avale sans hésiter ! De plus, le Hungry Robot peut se déplacer. Placez-le d'un côté de la table, il la parcourra, permettant à tous vos convives de se délester de leurs détritus.

Matériel nécessaire

  • Une carte Arduino
  • Du fil électrique
  • Un interrupteur
  • Deux servo-moteurs
  • Un capteur de distance
  • Une pince à dénuder
  • Une plaque labdec
  • Une boîte en carton
  • Une bouteille ou un gros bocal en plastique
  • Un petit bocal cylindrique en plastique
  • Des bouchons en liège
  • De la patafix
  • Un pistolet à colle chaude
  • Une découpeuse laser
  • Une pile
  • Un adaptateur pile à alimentation de la carte arduino

Coque

La structure du Hungry Robot est constituée de deux parties :

La poubelle

La partie avant du robot est la partie qui avalera vos déchets. Elle est constituée d'un bocal rond surmontée d'une tête articulée, ainsi que de bras qui tiennent un bac. Le capteur est fixé à l'avant, juste au-dessus du bac.

Le chariot

La partie arrière du robot se compose en un bac en carton dans lequel sera inséré la carte arduino, le board et la poubelle. La jambe du robot est un assemblage articulé lui permettant d'avancer comme une chenille.

Montage électrique

Arduino

Le montage est centralisé autour d'une carte Arduino Uno, sur laquelle est branchée tous les composants électroniques.

Servo moteurs

Deux servo moteurs sont utilisés : un pour monter et descendre le bac, et un pour faire bouger la jambe du robot.

Capteur

Un capteur de distance à ultrasons placé à l'avant du robot permet de détecter une main mettant quelque chose dans le bac.

Interrupteur

Un interrupteur est prévu pour choisir si le robot doit avancer ou non.

Code Source

#include <Servo.h> // CONFIG SERVOS ---------------------------------- Servo servo_chariot; // Servo du chariot Servo servo_poubelle; // Servo de la poubelle /* Pin des servos */ const byte PIN_CHARIOT = 4; const byte PIN_POUBELLE = 5; /* Booléen d'activation des servos */ bool SERVO_CHARIOT_ON = 0; bool POUBELLE_ON = 0; // CONFIG CAPTEUR --------------------------------- /* Constantes pour les broches */ const byte TRIGGER_PIN = 2; // Broche TRIGGER const byte ECHO_PIN = 3; // Broche ECHO /* Constantes pour le timeout */ const unsigned long MEASURE_TIMEOUT = 25000UL; // 25ms = ~8m à 340m/s /* Vitesse du son dans l'air en mm/us */ const float SOUND_SPEED = 340.0 / 1000; /* Distances (mm) */ const unsigned int CAPTEUR_BAC = 80; const unsigned int MIN_D = 20; float distance = 0; // CONFIG SWITCH const byte PIN_SWITCH = 6; // CONFIG TEMPORELLE ------------------------------ /* Variables de temps */ unsigned long dt = 0; unsigned long mesure_prev_dt = 0; unsigned long servo_prev_dt = 0; /* Constantes de temps */ const int MESURE_DT = 50; const int SERVO_DT = 500; //################################################## void setup() { Serial.begin(9600); // Monitor // SERVO CHARIOT servo_chariot.attach(PIN_CHARIOT); // Attache le servo du chariot au Pin 9 servo_chariot.write(0); // Init position chariot delay(SERVO_DT); // SERVO POUBELLE servo_poubelle.attach(PIN_POUBELLE); // Attache le servo de la poubelle au Pin 8 servo_poubelle.write(0); // Init position poubelle delay(SERVO_DT); // CAPTEUR POUBELLE /* Initialise les broches */ pinMode(TRIGGER_PIN, OUTPUT); digitalWrite(TRIGGER_PIN, LOW); // La broche TRIGGER doit être à LOW au repos pinMode(ECHO_PIN, INPUT); // SWITCH pinMode(PIN_SWITCH, INPUT); Serial.println("Setup Done !"); } //################################################## void loop() { /* Temps */ dt = millis(); if(dt - mesure_prev_dt >= MESURE_DT){ distance = mesure(0); mesure_prev_dt = dt; if((distance > MIN_D) && (distance < CAPTEUR_BAC)){ /* On vérifie si on detecte qq hose devant le capteur */ POUBELLE_ON = 1; } } if(POUBELLE_ON){ /* Activation de la poubelle */ delay(2*SERVO_DT); Serial.println(" Mange on"); servo_poubelle.write(140); //Bras levé delay(SERVO_DT); Serial.println(" Mange off"); servo_poubelle.write(0); //Bras baissé delay(2*SERVO_DT); POUBELLE_ON = 0; } else { /* Si pas de poubelle et switch on, marche */ if(digitalRead(PIN_SWITCH)){ if(dt - servo_prev_dt >= SERVO_DT && !SERVO_CHARIOT_ON){ /* Avancer la jambe */ Serial.println("Bouge on"); servo_chariot.write(90); //Avance Jambe SERVO_CHARIOT_ON = 1; servo_prev_dt = dt; } else if(dt - servo_prev_dt >= SERVO_DT && SERVO_CHARIOT_ON){ /* Reculer la jambe */ Serial.println("Bouge off"); servo_chariot.write(0); //Recul Jambe SERVO_CHARIOT_ON = 0; servo_prev_dt = dt; } } } } //################################################## /* Fonction de mesure du capteur */ float mesure(bool show){ digitalWrite(TRIGGER_PIN, HIGH); delay(10); digitalWrite(TRIGGER_PIN, LOW); /* Mesure le temps entre l'envoi de l'impulsion ultrasonique et son écho (si il existe) */ long measure = pulseIn(ECHO_PIN, HIGH, MEASURE_TIMEOUT); /* Calcul la distance à partir du temps mesuré */ float distance_mm = measure / 2.0 * SOUND_SPEED; /* Affiche les résultats en mm, cm et m */ if(show){ Serial.print(F("Distance: ")); Serial.print(distance_mm); Serial.print(F("mm (")); Serial.print(distance_mm / 10.0, 2); Serial.print(F("cm, ")); Serial.print(distance_mm / 1000.0, 2); Serial.println(F("m)")); } return distance_mm; }