Chrono'braille

De Les Fabriques du Ponant
Aller à : navigation, rechercher

Nous souhaitons créer une horloge adapté aux personnes aveugles ou mal-voyantes.

9.jpg

Cadre pédagogique

Notre environnement au quotidien n'est pas toujours adapté aux personnes souffrant d'un handicap. Il est donc important de trouver des solutions pour leur faciliter le quotidien. Avec ce projet nous souhaitons sensibiliser les plus jeunes à l'entraide et les inviter à réfléchir sur cette problématique .

Sur l'aspect programmation et réalisation, le projet peut s'adresser aux collégiens et aux lycéens. Une fois le projet réalisé, il pourra être utilisé pour des enfants aveugles ou mal-voyant en cours d'apprentissage de l'heure.

Les notions pédagogiques:

  • utiliser un servomoteur
  • programmer un Arduino

Réalisation technique

Schéma de la disposition des roues

Chrono'braille schema.jpeg


Schéma général de l'horloge 1.png


L'affichage de l'horloge sera le suivant : HEURE - MINUTE

Nous allons utiliser deux servomoteurs 360° pour aller de 0 à 9 (unité pour les heures et minutes) et deux servomoteurs 180° pour aller de 0 à 2 et de 0 à 5 (dizaines pour les heures et minutes).



Schéma fonctionnement de l'horloge 2.png

Les points en braille de l'horloge sont réalisés à l'aide d'un pistolet à colle.

11.jpg



Aide arduino : * https://openclassrooms.com/forum/sujet/arduino-allumer-une-led-en-fonction-de-l-heure-actuelle-88253

Liste du matériel

  • 1 Arduino
  • 1 Breadboard
  • 2 servomoteurs 180°
  • 2 servomoteurs 360°
  • Carton
  • Colle

Câblage d'un servomoteur

10.jpg

SERVO - ARDUINO

  • marron -> masse
  • rouge -> Vcc
  • orange -> consigne

Code


#include <Servo.h>
#include <Time.h>


//----VARIABLES----//
boolean previousBP_M = false; //Variables de FM_BP()
boolean newBP_M = false;

//--Gestion des boutons--//
const byte clockSetBP = 7;
const byte plusBP = 6;
const byte moinsBP = 5;

//--Gestion des servomoteurs--//
int angleHeureUnit = 0;
int angleHeureDix = 0;
int angleMinuteUnit = 0;
int angleMinuteDix = 0;

//--Gestion de l'horloge--//
float t_ecoule = 0.0; //temps ecoule depuis le reset (en ms)
unsigned char t_hms[3] = {0,0,0}; //heure calculee au format hh:mm:ss
float t_raz = 0.0; //temps à soustraire pour remettre à zéro (en ms)
float t_offset = 0.0; //heure "offset" à ajouter au temps ecoule depuis raz ou reset

Servo servoHeureDix;
Servo servoHeureUnit;
Servo servoMinuteDix;
Servo servoMinuteUnit; 

//----DECLARATIONS DE FONCTION----//
void convertFloatToHms(float t, unsigned char* hms);
boolean FM_BP(byte);
void setTime(unsigned char* hms,float* offset,float* raz, float t);
void gestionServo(unsigned char* hms);

//----MAIN----//
void setup(){
  pinMode(clockSetBP,INPUT);
  pinMode(plusBP,INPUT);
  pinMode(moinsBP,INPUT);
  Serial.begin(9600);
  // Attacher la pin 9 à l'objet servo.
  //   ATTN: le code initialise l'angle à 90 degrés par défaut. 
  servoMinuteUnit.attach(9); 
  servoMinuteDix.attach(10);
  servoHeureUnit.attach(11);
  servoHeureDix.attach(12);

  // Assigne un angle de 0 degrés
  servoMinuteUnit.write( 0 );
  servoMinuteDix.write( 0 );
  servoHeureUnit.write( 0 );
  servoHeureDix.write( 0 );
}

void loop(){
  //--Gestion de l'horloge--//
  t_ecoule = millis() - t_raz + t_offset; //Actualisation de l'heure
  convertFloatToHms(t_ecoule,t_hms);  //Conversion du format float vers hh:mm:ss

  //--Affichage sur moniteur série--//
  Serial.print("Il est : ");
  Serial.print(t_hms[0]);Serial.print(" : ");Serial.print(t_hms[1]);Serial.print(" : ");Serial.print(t_hms[2]);
  Serial.println();

  if(FM_BP(clockSetBP)){
    setTime(t_hms,&t_offset,&t_raz,t_ecoule);
    delay(250);
  }

  gestionServo(t_hms);
  /*// Passer de 0 a 180 par angle de 30 degrés
  for( int iAngle=0; iAngle<= 180; iAngle+=30 )
  { 
    servoMinuteUnit.write(iAngle);
    servoHeureDix.write(iAngle);
    delay( 2000 );
  }*/
}

//----DEFINITIONS DE FONCTION----//

void convertFloatToHms(float t, unsigned char* hms){
  //Conversion d'une variable de temps du format float (en ms) vers hh:mm:ss
  unsigned long long t_long = t/1000;
  hms[2] = t_long%60;
  hms[1] = (t_long/60)%60;
  hms[0] = (t_long/60/60)%24;
}

void setTime(unsigned char* hms,float* offset,float* raz, float t){
  //Sous-programme qui permet le réglage de l'heure. On affiche l'heure que l'on souhaite obtenir.
  delay(250); //Attente du relachement du BP clockSetBP
  *offset = 0.0;
  int m = hms[1];
  int h = hms[0];
  while(not(FM_BP(clockSetBP))){
    //Réglages des heures avec les BP + et -
    if(digitalRead(plusBP)){
      h += 1;
      delay(500);
      if(h > 23){h=0;}
    }
    if(digitalRead(moinsBP)){
      h -= 1;
      delay(500);
      if(h < 0){h=23;}
    }
    //Affichage
    unsigned char hmsSet[3] = {h,m,0}; 
    Serial.print("Reglage de l'heure : ");
    Serial.print(h);Serial.print(" : ");Serial.print(m);Serial.print(" : ");Serial.print(0);Serial.println();
    Serial.print(hmsSet[0]);Serial.print(hmsSet[1]);Serial.print(hmsSet[2]);Serial.println();
    gestionServo(hmsSet);
  }
  delay(250); //Attente du relachement du clockSetBP
  while(not(FM_BP(clockSetBP))){
    //Réglages des minutes avec les BP + et -
    if(digitalRead(plusBP)){
      m += 1;
      delay(500);
      if(m > 59){m=0;}
    }
    if(digitalRead(moinsBP)){
      m -= 1;
      delay(500);
      if(m < 0){m=59;}
    }
    //Affichage
    unsigned char hmsSet[3] = {h,m,0}; 
    Serial.print("Reglage de l'heure : ");
    Serial.print(h);Serial.print(" : ");Serial.print(m);Serial.print(" : ");Serial.print(0);Serial.println();
    Serial.print(hmsSet[0]);Serial.print(hmsSet[1]);Serial.print(hmsSet[2]);Serial.println();
    gestionServo(hmsSet);
  }
  delay(250); //Attente du relachement du clockSetBP
  *raz = millis();
  *offset = (h*3600000+m*60000);
}

boolean FM_BP(byte nom){
  //Fonction qui permet la détection d'un front montant d'un bouton poussoir
  previousBP_M = newBP_M;
  newBP_M = digitalRead(nom);
  if (previousBP_M == false && newBP_M == true) {return true;}
  else {return false;}
}

void gestionServo(unsigned char* hms){
  //--Gestion des servomoteurs--//
  //Calcul des angles pour la rotation des servomoteurs.
  angleHeureUnit = hms[0]%10*30;  //Unités pour les heures * 30 degrés
  angleHeureDix = hms[0]/10*36;   //Dizaines pour les heures * 36 degrés
  angleMinuteUnit = hms[1]%10*30; //Unités pour les heures * 30 degrés
  angleMinuteDix = 144-hms[1]/10*36;  //Dizaines pour les heures * 36 degrés

  servoMinuteUnit.write(angleMinuteUnit);
  servoMinuteDix.write(angleMinuteDix);
  servoHeureUnit.write(angleHeureUnit);
  servoHeureDix.write(angleHeureDix);
}

Participants

  • Damien Cado
  • Jordan Creff
  • Lucas Lesven
  • Erwan Loulier
  • Pascal Mai
  • Alexandre Mecca
  • Yoann Spriet

Diaporama

Fichier:DiaporamaHackaton2018.odp

Projet Final

12.jpg