Table des matières

Conception d'un robot à base d'Arduino

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.

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

Schéma conceptuel de la pince

Schéma de montage du prototype pour tester le programme

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 <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);
}

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. Moteur Hitec Hs 422

Sources d'inspiration pour la pince :

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

Le circuit imprimé

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 <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); 
}

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.

brainstorming

Les modules

Les modules prioritaires :

Les modules secondaires :

Capteurs

Contact par Bouton poussoir

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
  }
 
}

Marche/arrêt piloté par Bouton poussoir

arduino.pdf

https://www.arduino.cc/en/Hacking/LibraryTutorial

Servomoteur commandé par bouton poussoir

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°
  }  
}

récepteur infrarouge

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
  }
}

Photorésistance

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.

potentiomètre

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)

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)

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 : test_servomoteur_et_potentiometre

et servomoteur actionné par bouton poussoir (pour le TP04 du MOOC FUN MinesTelecom - Programmer un objet avec Arduino.

Autres actionneurs

son (buzzer)

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 :

led RGB

à tester :

Réalisation

Difficultés rencontrées

Photos

Liens divers

Suites du projet

+ sur les boutons poussoirs

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:

+ sur les capteurs infrarouges

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 :