Hungry Robot : Différence entre versions
(29 révisions intermédiaires par un autre utilisateur non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
+ | [[Fichier:hungry_robot.jpg|500px]] | ||
+ | |||
== Description == | == 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 | + | 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 | + | 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 | + | 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 == | == Coque == | ||
Ligne 9 : | Ligne 29 : | ||
=== La poubelle === | === 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. | 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 === | === Le chariot === | ||
Ligne 26 : | Ligne 47 : | ||
Un interrupteur est prévu pour choisir si le robot doit avancer ou non. | Un interrupteur est prévu pour choisir si le robot doit avancer ou non. | ||
− | == | + | == Code Source == |
+ | |||
+ | <pre> | ||
+ | #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; | ||
+ | } | ||
+ | </pre> | ||
+ | |||
+ | ==catégorie== | ||
+ | [[Catégorie:Arduino]] | ||
+ | [[Catégorie:Robot]] | ||
+ | [[catégorie:enib2019]] |
Version actuelle datée du 26 août 2024 à 09:31
Sommaire
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; }