Dans le cadre des 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.
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
Schéma de montage du prototype pour tester le programme
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 <Servo.h> 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); }
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. Moteur Hitec Hs 422
Sources d'inspiration pour la pince :
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é.
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 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 <onofflib.h> 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); }
Après un brainstorming autour des fonctionnalités et contraintes techniques, nous avons défini quelques modules à développer.
Les modules prioritaires :
Les modules secondaires :
Séance du samedi 21 janvier 2017
Composants :
Code et schéma issu de http://wiki.seeedstudio.com/wiki/Arduino_Sidekick_Basic_Kit#Talk_to_Arduino_:_Connecting_a_Pushbutton_Switch.
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 } }
Séance du samedi 18 novembre 2017
/* Controlling a servo position using a potentiometer (variable resistor) by Michal Rinott <http://people.interaction-ivrea.it/m.rinott> modified on 8 Nov 2013 by Scott Fitzgerald http://www.arduino.cc/en/Tutorial/Knob */ #include <Servo.h> // 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° } }
Séance du samedi 18 mars 2017
Détection de mouvement par le récepteur infrarouge pour allumer une LED
Composants:
montage inspiré du circuit du tutoriel Sainsmart p.71
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 } }
Composant dont la résistance varie en fonction de la luminosité ambiante.
A tester :
voir 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.
Appelé aussi Résistance variable, il peut également servir à d'autres 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 :
(cf autre projet servomoteur et potentiomètre)
Recherche de la datasheet du moteur, d'un exemple de montage et des composants nécessaires (transistor NPN, diode, condensateur)
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
à tester : http://wiki.seeedstudio.com/wiki/Arduino_Sidekick_Basic_Kit#6_Mini_Servo: mais corriger n° de pin
cf test sur autre projet : test_servomoteur_et_potentiometre
et servomoteur actionné par bouton poussoir (pour le TP04 du MOOC FUN MinesTelecom - Programmer un objet avec Arduino.
cf changer la fréquence d'un buzzer selon la luminosité captée par une photorésistance (solution d'un des participants pour le TP03 du MOOC FUN MinesTelecom - Programmer un objet avec Arduino.
à tester :
à tester :
Dans le 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:
Phase de test (liens pour mémoire) - en cours - pour utiliser une télécommande
cf sur exemple sur Instructable - montage en photo - Installation librairie IR Remote
à tester :