====== Conception d'un robot à base d'Arduino ====== {{{project picture: machines: materiaux: logiciels: sources: liens: tags: usager: "le contenu est le fruit du travail des participants" licence:cc-by-sa }}} Dans le cadre des [[http://www.cite-sciences.fr/fr/au-programme/lieux-ressources/carrefour-numerique2/rendez-vous-reguliers/samedi-robots/|Samedis robots]], nous nous lançons dans la conception d'un robot à partir de fonctions générales que nous implémenterons ensuite sur une ou plusieurs réalisations concrètes. ===== Conception ===== ==== Séance du samedi 17 février 2018 ==== Pour cette séance du samedi robots, nous nous attaquons à la programmation d'une petite librairie de gestion de la pince avec pricipalement deux commandes : ouvrir la pince et fermer la pince. Pour cette dernière commande, l'activation du bouton poussoir servira de fin de course et arrêtera la fermeture. Schéma conceptuel de la pince {{:projets:conception_d_un_robot_a_base_d_arduino:pince.png?200|Schéma conceptuel de la pince}} Schéma de montage du prototype pour tester le programme {{:projets:conception_d_un_robot_a_base_d_arduino:pince_robot_bb.png?200|Schéma de montage du prototype}} Pour le programme, nous avons réalisé une librairie contenant une classe TactilServo fille de la classe Servo Fichier tactilservo.h à insérer dans le répertoire Arduino/librairies/TactilServo #ifndef tactilservo_h #define tactilservo_h #include "Arduino.h" #include class TactilServo : public Servo { public: void init(int servoPin, int switchPin); void setOpenPos(int pos); void setClosePos(int pos); void setAngleSpeed(int s); void open(); int close(); private: int servoPin, switchPin; int openPos,closePos,angleDelay; }; #endif Fichier tactilservo.cpp à insérer dans le répertoire Arduino/librairies/TactilServo Pendant la séance du 17 février, nous n'avons pas eu le temps d'implémenter toutes les méthodes. Il nous faudra finir. #include "tactilservo.h" void TactilServo::init(int servoPin, int switchPin) { this->servoPin = servoPin; this->switchPin = switchPin; this->openPos = 180; this->closePos = 0; this->angleDelay = 15; this->attach(this->servoPin); pinMode(this->switchPin,INPUT); digitalWrite(this->switchPin,HIGH); } void TactilServo::setOpenPos(int pos) { // A faire } void TactilServo::setClosePos(int pos) { // A faire } void TactilServo::setAngleSpeed(int s) { // A faire } void TactilServo::open() { this->write(this->openPos); } int TactilServo::close() { int pos = this->read(); while ((digitalRead(this->switchPin) != 0) && (pos > this->closePos)) { pos -= 1; this->write(pos); delay(this->angleDelay); } } Programme de test testpince.ino #include "tactilservo.h" TactilServo mapince; void setup() { mapince.init(3,2); } void loop() { mapince.open(); delay(2000); mapince.close(); //si on appuie sur le poussoir, la pince s'arrête delay(5000); } ==== Séance du samedi 20 janvier 2018 ==== Aujourd'hui, on a décidé de travailler sur la conception/ modélisation de la pince. Elle sera constitué d'un servo moteur, d'un capteur de pression/contact et de pièces d'assemblage que l'on réalisera en impression 3D. Nous avons choisi le servo moteur Hitec HS 422 (couple de ~3.5Kg.cm) et un bouton poussoir comme capteur de contact. La modélisation du moteur est disponible sur GrabCad ([[https://grabcad.com/]]). Il faut se créer un compte pour pouvoir télécharger(gratuit). Nous avons récupéré un fichier .step qui peut s'ouvrir sur Freecad. {{:projets:conception_d_un_robot_a_base_d_arduino:hs-422.step|Moteur Hitec Hs 422}} Sources d'inspiration pour la pince : {{:projets:conception_d_un_robot_a_base_d_arduino:pince_ecrevisse.jpg?100 |}} {{:projets:conception_d_un_robot_a_base_d_arduino:pince_robot.jpg?100 |}} ==== Séance du samedi 16 décembre 2017 ==== Aujourd'hui on a testé fritzing, un logiciel qui permet de dessiner un circuit sur breadboard (idéal pour la documentation) et même d'aller jusqu'à la conception du circuit imprimé. === Circuit on off === L'objectif est de faire un circuit contenant une led et un bouton relié à un arduino qui permettra de changer l'état d'un système entre on et off. Au départ, l'état est off et à chaque pression du bouton poussoir on inverse l'état entre off(false) et on(true). L'état est rendu par la led. === Le montage sur breadboard === {{:projets:conception_d_un_robot_a_base_d_arduino:on_off_bb.png?100 |}} === Le circuit imprimé === {{:projets:conception_d_un_robot_a_base_d_arduino:on_off_circuit_imprime.png?100 |}} {{:projets:conception_d_un_robot_a_base_d_arduino:on_off_pistes.svg|}} === Le programme === le fichier onofflib.h à placer dans le repertoire libraries du dossier Arduino /* onofflib.h - Library for button Created by samedi robot, dec 16 2017 Released into the public domain. */ #ifndef onofflib_h #define onofflib_h #include "Arduino.h" class OnOffButton { public: OnOffButton(int buttonPin,int ledPin); bool inspect(); bool isOn(); private: int bpin,lpin; bool on; int previous; }; #endif le fichier onofflib.cpp à placer dans le repertoire libraries du dossier Arduino /* onofflib.h - Library for button Created by samedi robot, dec 16 2017 Released into the public domain. */ #include "Arduino.h" #include "onofflib.h" OnOffButton::OnOffButton(int buttonPin,int ledPin) { bpin = buttonPin; lpin = ledPin; pinMode(bpin,INPUT); digitalWrite(bpin,HIGH); //active la resistance pullup pinMode(lpin,OUTPUT); on = false; digitalWrite(lpin,LOW); previous = digitalRead(bpin); // test bouton } bool OnOffButton::inspect() { int result = digitalRead(bpin); if (result == 0 && previous) { on = !on; digitalWrite(lpin,on); } previous = result; return on; } bool OnOffButton::isOn() { return on; } Le programme de test /* * Programme de test de la librairie de gestion de bouton on off */ #include OnOffButton button(3,7); void setup() { // put your setup code here, to run once: Serial.begin(115600); Serial.println("onofflib !!!"); } void loop() { // put your main code here, to run repeatedly: bool state = button.inspect(); Serial.println(state); delay(20); } ==== Séance du samedi 17 décembre 2016 ==== === Le brainstorming === Après un brainstorming autour des fonctionnalités et contraintes techniques, nous avons défini quelques modules à développer. {{:projets:conception_d_un_robot_a_base_d_arduino:20161217_atelierrobot.png?400 |brainstorming}} === Les modules === Les modules prioritaires : * [[projets:conception_d_un_robot_a_base_d_arduino#contact_par_bouton_poussoir|détection de contact]] (poussoir) * détection d'obstacle ([[projets:conception_d_un_robot_a_base_d_arduino#capteur_infrarouge|récepteur IR]], sonar) direction ? * déplacement (moto-réduction) * articulation (servo-moteur) Les modules secondaires : * détection de proximité (magnétique) * détection de luminosité (photorésistance) * potentiomètre (pour faire varier la résistance) * marche arrière * led RGB * son (buzzer) ===== Capteurs ===== ==== Contact par Bouton poussoir ==== //Séance du samedi 21 janvier 2017// Composants : * 1 bouton poussoir * 1 résistance 1 kOhm * 1 LED * 1 résistance 220 Ohms Code et schéma issu de [[http://wiki.seeedstudio.com/wiki/Arduino_Sidekick_Basic_Kit#Talk_to_Arduino_:_Connecting_a_Pushbutton_Switch]]. {{:projets:conception_d_un_robot_a_base_d_arduino:400px-arduino_sidekick_pushbutton_led.jpg?200|}} {{:projets:conception_d_un_robot_a_base_d_arduino:grand-montage-arduino-bouton-poussoir.jpg?200|}} {{:projets:conception_d_un_robot_a_base_d_arduino:petit-montage-arduino-bouton-poussoir.jpg?200|}} Programme sur l'IDE Arduino : //Pushbutton switch demo: LED is connected to digital pin 8 and Pushbutton is connected to digital pin 12. const int led = 8; // numéro de la broche sur laquelle la led est connectée const int pushbutton = 12; // numéro de la broche sur laquelle la led est connectée //The LED glows when the button is pressed. char inputButtonState; void setup() { pinMode(led, OUTPUT); // Initialize Arduino Digital Pins 8 as output for connecting LED pinMode(pushbutton,INPUT); // Initialize Arduino Digital Pins 12 as input for connecting Pushbutton } void loop() { inputButtonState = digitalRead(pushbutton); //Read the Pushbutton state. if (inputButtonState == HIGH) { digitalWrite(led, HIGH); //Switch on LED } else { digitalWrite(led, LOW); //Switch off LED } } === Marche/arrêt piloté par Bouton poussoir === {{:projets:conception_d_un_robot_a_base_d_arduino:arduino.pdf|}} [[https://www.arduino.cc/en/Hacking/LibraryTutorial]] === Servomoteur commandé par bouton poussoir === //Séance du samedi 18 novembre 2017// {{:projets:conception_d_un_robot_a_base_d_arduino:20171118_160710.jpg?200|}} /* Controlling a servo position using a potentiometer (variable resistor) by Michal Rinott modified on 8 Nov 2013 by Scott Fitzgerald http://www.arduino.cc/en/Tutorial/Knob */ #include // librairie pour le servomoteur Servo myservo; // crée l'objet myservo const int pushbutton = 2; // numéro de la broche sur laquelle le bouton poussoir est connecté char inputButtonState; void setup() { myservo.attach(3); // attache l'objet servomoteur à la pin 3 myservo.write(0); // initialisation de la position du servo pinMode(pushbutton,INPUT); // la bouton poussoir est une entrée digitalWrite(pushbutton, HIGH); // envoie du courant dans le bouton poussoir } void loop() { inputButtonState = digitalRead(pushbutton); // lit l'état du bouton poussoir if (inputButtonState == HIGH) // si le bouton poussoir n'est pas pressé { myservo.write(0); } else // sinon (le bouton est appuyé) { myservo.write(90); // met le servomoteur à 90° } } ==== récepteur infrarouge ==== //Séance du samedi 18 mars 2017// Détection de mouvement par le récepteur infrarouge pour allumer une LED {{:projets:conception_d_un_robot_a_base_d_arduino:recepteur-infrarouge-os-1838b-texte.png?direct&100 |}} Composants: * 1 récepteur infrarouge [[http://www.conrad.fr/ce/fr/product/184288/Recepteur-infrarouge-IR-OS-1838B-forme-speciale-sortie-axiale-38-kHz-940-nm-35-1-pcs|ref OS 1838B]] - ([[http://www.produktinfo.conrad.com/datenblaetter/175000-199999/184288-da-01-en-IR_RECEIVER_2_7_5_5V_OS_1838B.pdf|fiche technique]] pour vérifier la polarité) * 1 LED * 1 résistance 220 Ohms montage inspiré du circuit du [[http://www.sainsmart.com/zen/documents/20-013/SainSmart%20UNO%20Starter%20Kits%20Tutorials.zip|tutoriel Sainsmart]] p.71 {{:projets:conception_d_un_robot_a_base_d_arduino:capture_arduino_capteur_infrarouge_led.png?direct&200|}} {{:projets:conception_d_un_robot_a_base_d_arduino:sr_capteur_infrarouge_led1.jpg?direct&200|}} code inspiré du livre "la boite à outils Arduino" de Michael Margolis - Ed Dunod /* Allume une LED branchée sur la broche 9 lorsque le récepteur infrarouge, branché sur la broche 2, détecte un mouvement. Résistance de 220 ohms pour la LED */ // Initialisation des constantes : const int led = 9; // numéro de la broche sur laquelle la led est connectée const int capteurIR = 2; // numéro de la broche sur laquelle le récepteur infrarouge est connecté // Déclaration des variables : int valIR=0; // initialise la variable qui sera utilisée pour stocker la valeur lue par le récepteur infrarouge void setup() { // cette boucle ne s'éxécute qu'une fois, au début pinMode(led, OUTPUT); // indique que la broche de la led est une sortie pinMode(capteurIR, INPUT); // indique que la broche du récepteur infrarouge est une entrée } void loop() { // cette boucle se répète indéfiniment valIR = digitalRead(capteurIR); // lit la broche du récepteur infrarouge et conserve sa valeur dans la variable valIR if (valIR==LOW) { // si la valeur du récepteur infrarouge est à 0 digitalWrite(led, HIGH); // on allume la led delay(1000); // on attend 1s (=1000ms) digitalWrite(led, LOW); // on éteint la led } } ==== Photorésistance ==== Composant dont la résistance varie en fonction de la luminosité ambiante. A tester : voir [[https://www.youtube.com/watch?v=LBozBb322tE|vidéo]] montrant le montage avec une photorésistance et une led sur une breadboard. La lumière peut contrôler d'autres actionneurs grâce à la photorésistance. * contrôle d'un [[https://vimeo.com/43102757|un servomoteur]] (vidéo sans le code) * [[http://carrefour-numerique.cite-sciences.fr/fablab/wiki/lib/exe/fetch.php?media=projets:tete_de_robot_en_boite:boite_visage_mini_v1_cablage_avec_arduino2.png|photoresistance contrôlant 2 leds et 1 buzzer]] - {{:projets:sketch_montage_visage2.txt|code }} ==== potentiomètre ==== Appelé aussi **Résistance variable**, il peut également servir à d'autres [[http://eskimon.fr/110-arduino-401-les-entrees-analogiques-de-larduino#623683|tâches]]. A tester : Lecture des variations du potentiomètre dans le serial monitor ou terminal série : [[https://tutoarduino.com/portfolio-items/les-potentiometres/]] et [[http://www.chambeyron.fr/index.php/arduino-raspberry-py/66-utilisation-d-un-potentiometre-sur-arduino]] Faire varier la luminosité d'une led avec le potentiomètre : * [[http://www.projetsdiy.fr/led-allumer-intensite-rgb-arduino/#Faire_varier_lrsquointensite_lumineuse_drsquoune_LED]] * [[http://www.mon-club-elec.fr/pmwiki_reference_arduino/pmwiki.php?n=Main.Fade]] (cf autre projet [[projets:robot_poppyno_avec_arduino#test_servomoteur_et_potentiometre|servomoteur et potentiomètre]]) ===== Actionneurs : mouvement ===== ==== Moteur courant continu ==== Recherche de la datasheet du moteur, d'un exemple de montage et des composants nécessaires (transistor NPN, diode, condensateur) [[https://www.pololu.com/product/1124/specs|moteur courant continu]] : voir [[https://openclassrooms.com/courses/programmez-vos-premiers-montages-avec-arduino/le-moteur-a-courant-continu-partie-1-transistors-et-sorties-pwm]] et montage simplifié sur [[https://wiki.fablab-sud31.fr/index.php/Utilisation_d'un_moteur_%C3%A0_courant_continu]]. Le transistor sert d'interrupteur commandé, la diode permet au moteur de tourner en roue libre (quand on arrête la commande et qu'il continue de tourner par inertie), et le condensateur permet de lisser les pics de courant. Tutoriels à tester : [[https://openclassrooms.com/courses/programmez-vos-premiers-montages-avec-arduino/le-moteur-a-courant-continu-partie-1-transistors-et-sorties-pwm]] [[https://openclassrooms.com/courses/programmez-vos-premiers-montages-avec-arduino/le-moteur-a-courant-continu-partie-2-le-pont-en-h-et-les-circuits-integres]] ==== servomoteur ==== à tester : [[http://wiki.seeedstudio.com/wiki/Arduino_Sidekick_Basic_Kit#6_Mini_Servo: ]] mais corriger n° de pin cf test sur autre projet : [[projets:robot_poppyno_avec_arduino#test_servomoteur_et_potentiometre]] et [[https://circuits.io/circuits/4205034-tp04-mooc-fun-minestelecom-programmer-un-objet-avec-arduino|servomoteur actionné par bouton poussoir]] (pour le TP04 du [[https://www.fun-mooc.fr/courses/MinesTelecom/04017S02/session02/about|MOOC FUN MinesTelecom - Programmer un objet avec Arduino]]. ===== Autres actionneurs ===== ==== son (buzzer) ==== cf changer la [[https://circuits.io/circuits/4309641-tp03-correction-pair-1-mooc-fun-arduino|fréquence d'un buzzer]] selon la luminosité captée par une photorésistance (solution d'un des participants pour le TP03 du [[https://www.fun-mooc.fr/courses/MinesTelecom/04017S02/session02/about|MOOC FUN MinesTelecom - Programmer un objet avec Arduino]]. à tester : * [[http://wiki.seeedstudio.com/wiki/Arduino_Sidekick_Basic_Kit#5_Music:]] * Utilisation de la fonction tone() pour moduler la fréquence : [[http://www.mon-club-elec.fr/pmwiki_reference_arduino/pmwiki.php?n=Main.Tone]] * Faire de la musique avec le buzzer : [[https://openclassrooms.com/courses/perfectionnez-vous-dans-la-programmation-arduino/generez-des-sons]] ==== led RGB ==== à tester : * [[http://wiki.seeedstudio.com/wiki/Arduino_Sidekick_Basic_Kit#4_Rainbow_On_Desk:_Tricolor_LED]] * [[http://www.projetsdiy.fr/led-allumer-intensite-rgb-arduino/#Utiliser_une_Led_RVG_RBG]] ===== Réalisation ===== ===== Difficultés rencontrées ===== ===== Photos ===== ===== Liens divers ===== * [[https://fr.slideshare.net/labsud/documents|Cours Labsud - Arduino pour les kids]] * [[http://www.robotshop.com/blog/fr/comment-fabriquer-un-robot-lecon-1-4294|Tutoriel Robotshop - Comment fabriquer un robot]] * [[https://openclassrooms.com/courses/programmez-vos-premiers-montages-avec-arduino|Openclassroom - Programmez vos premiers montages avec Arduino]] * [[https://openclassrooms.com/courses/perfectionnez-vous-dans-la-programmation-arduino|Openclassroom - Perfectionnez-vous dans la programmation Arduino]] * [[http://www.memoireonline.com/01/16/9368/Conception-et-realisation-d-un-robot-mobile--base-d-arduino.html]] ===== Suites du projet ===== ==== + sur les boutons poussoirs ==== Dans le [[https://www.fun-mooc.fr/courses/MinesTelecom/04017S02/session02/about|MOOC FUN Mines Telecom - Programmer un objet avec Arduino]], ils conseillent de déclarer les pins avec des constantes, par ex : ''const int led = 8;''. Autres exemples: * [[https://circuits.io/circuits/3979855-s2-bouton-poussoir-mooc-fun-programmer-un-objet-avec-arduino|ce montage virtuel de bouton poussoir]]: utilise le serial monitor pour lire l'état du bouton (0 ou 1). * led allumée par appui sur un [[https://circuits.io/circuits/3979855-s2-bouton-poussoir-mooc-fun-programmer-un-objet-avec-arduino|bouton poussoir]] (basé sur cours 2 du [[https://www.fun-mooc.fr/courses/MinesTelecom/04017S02/session02/about|MOOC FUN MinesTelecom - Programmer un objet avec Arduino]]) * Code plus complet à tester : [[http://arts-numeriques.codedrops.net/Arduino-creer-un-bouton]] (fin de la page) ==== + sur les capteurs infrarouges ==== //Phase de test (liens pour mémoire) - en cours - pour utiliser une télécommande// cf sur exemple sur [[https://translate.google.fr/translate?sl=en&tl=fr&js=y&prev=_t&hl=fr&ie=UTF-8&u=http%3A%2F%2Fwww.instructables.com%2Fid%2FTracked-Robot-IR-Remote-Control-by-Arduino%2F&edit-text=&act=url|Instructable]] - [[http://www.righto.com/2009/08/multi-protocol-infrared-remote-library.html|montage en photo]] - [[https://www.arduino.cc/en/Guide/Libraries#toc3|Installation librairie]] IR Remote à tester : * [[https://circuits.io/circuits/1114583-infrared-lcd]] * [[http://playground.arduino.cc/French/TutorielsCodeSourceAutonome-Capteur-Infrarouge-Telecommande-Recyclez]] * [[https://learn.adafruit.com/ir-sensor/using-an-ir-sensor]] * [[http://nagashur.com/blog/2015/08/14/capteur-pir-et-arduino-tutoriel/]] * [[http://arts-numeriques.codedrops.net/Utiliser-un-detecteur-de-presence]] * [[https://openclassrooms.com/courses/programmez-vos-premiers-montages-avec-arduino/les-capteurs-electroniques#/id/r-3236693]] * [[https://openclassrooms.com/courses/perfectionnez-vous-dans-la-programmation-arduino/utilisez-le-pilotage-infrarouge]]