Chrono'braille
Nous souhaitons créer une horloge adapté aux personnes aveugles ou mal-voyantes.
Sommaire
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
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
Les points en braille de l'horloge sont réalisés à l'aide d'un pistolet à colle.
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
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