Help for the Visually Impaired
Project with a social purpose to aid the visually impaired. The glasses can detect obstacles up to 4m away and are readjustable.
Components and supplies
1
Buzzer
1
Inertial Measurement Unit (IMU) (6 deg of freedom)
1
Arduino Nano R3
1
Ultrasonic Sensor - HC-SR04 (Generic)
1
SparkFun MP3 Player Shield
1
Solar Cockroach Vibrating Disc Motor
Tools and machines
1
Mastech MS8217 Autorange Digital Multimeter
1
Soldering iron (generic)
Project description
Code
Oculos_com_MP3V3.ino
arduino
Program for uum glasses for the visually impaired.
1#include <I2Cdev.h> 2#include <MediaMovel.h> //Biblioteca para uso de mdia mvel 3#include <Ultrassonico.h> 4#include <MPU6050.h> 5#include "Wire.h" //Biblioteca para comunicao I2C 6#include <math.h> //Inclui biblioteca para uso da funo atan() 7#include <Wtv020sd16p.h> //Inclui biblioteca MP3 8 9#define RAD(grau) ((grau*3.1415926)/180) //Converte de radianos para graus 10#define GRAU(rad) ((rad*180)/3.1415926) //Converte de graus para radiano 11//Converte algum valor de tenso entre 0 e 5V, para a faixa entre 0 e 255 12#define TENSAO(tensao) ((255*tensao)/5.0) 13#define pino_buzzer 2 14#define pino_vibracall 3 15#define DISTANCIA_MINIMA 40 //Define distncia mnima de deteco 16#define ANGULO_LIMITE_SUPERIOR 30 //Valor em graus 17 18//Carto 19int resetPin = 10; //Pino Reset 20int clockPin = 9; //Pino clock 21int dataPin = 11; //Pino data (DI) 22int busyPin = 12; //Pino busy 23 24//Boto 25int bottonPin = 4; // Pino Liga/Desliga 26int estadoboton; 27int ativado=HIGH; 28 29Ultrassonico ultra(8, 7); //Echo e trigger 30MM mms_1(20), mms_2(30); //Instncia dois objetos do tipo MM, com 15 e 50 amostras, respectivamente 31Wtv020sd16p wtv020sd16p(resetPin,clockPin,dataPin,busyPin); //Instncia quatro ojetos a classe da biblioteca MP3 32 33MPU6050 accelgyro; //Instancia objeto accelgyro, do tipo MPU6050 34 35//Variveis auxiliares 36int16_t ax, ay, az, gx, gy, gz; 37float anguloEixoX, ALTURA_PESSOA=170.0, DISTANCIA_DETECCAO=200.0; 38uint16_t distanciaHorizontal, leituraUltra; 39bool flag; //Indicador de inclinao 40char buf;//Variavel que armazena os caracteres recebidos do MP3 41 42float ANGULO_DETECCAO(float valor){ //Funo para clculo do ngulo de deteco 43 return (GRAU(atan(valor))); 44} 45 46void setup(){ 47 Wire.begin(); //Inicializa comunicao I2C 48 Serial.begin(9600); //Inicializa serial 49 accelgyro.initialize(); //Inicializa objeto accelgyro 50 pinMode(pino_buzzer, OUTPUT); 51 pinMode(pino_vibracall, OUTPUT); 52 pinMode(bottonPin, INPUT_PULLUP); 53 //Inicializa o modulo WTV020 54 wtv020sd16p.reset(); 55 //Informacoes iniciais 56 menu_inicial(); 57 //Testa conexo, em caso de sucesso, dar um simples bip 58 if(accelgyro.testConnection()){ 59 tone(pino_buzzer, 2500); 60 delay(500); 61 noTone(pino_buzzer); 62 } 63 //Em caso de falha na conexo, dar dois bips 64 else{ 65 tone(pino_buzzer, 3500); 66 delay(150); 67 noTone(pino_buzzer); 68 delay(500); 69 tone(pino_buzzer, 3500); 70 delay(150); 71 noTone(pino_buzzer); 72 } 73} 74 75void loop(){ 76 estadoboton=digitalRead(bottonPin); 77 if (estadoboton==LOW){ 78 ativado=!ativado; 79 delay(20); 80 } 81 if (ativado==LOW){ 82aqui: 83 accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); //Obtm valores do acelermetro e giroscpio 84 85 if(ax<-16400) ax=-16400; //Limita valores de "ax" 86 if(ax>=0){ //Se dispositivo inclinado para cima ou reto 87 flag=0; //Indicador de inclinao para cima ou reta 88 //Converte valores de "ax" na faixa de 0 16400, para valores entre 0 e 90 89 anguloEixoX=float((90*(mms_1.calculaMMS(ax)))/16400); 90 if(anguloEixoX>ANGULO_LIMITE_SUPERIOR){ //Verifica limite de ngulo para cima 91 noTone(pino_buzzer); //Desliga tone 92 analogWrite(pino_vibracall, 0); //Desliga vibracall 93 goto aqui; //Salta para a label "aqui" 94 } 95 } 96 else{ //Se dispositivo inclinado para baixo 97 flag=1; //Indicador de inclinao para baixo 98 //Converte valores de "ax" na faixa de 0 -16400, para valores entre 0 e 90 99 anguloEixoX=float((90*(mms_1.calculaMMS(ax)))/(-16400)); 100 } 101 102 //Verifica se a pessoa est com inclinao para o cho 103 if((anguloEixoX>ANGULO_DETECCAO(ALTURA_PESSOA/DISTANCIA_DETECCAO)) && (flag==1)){ 104 tone(pino_buzzer, 2500); //Detecta cho - Liga tone 105 analogWrite(pino_vibracall, 0); //Desliga vibracall 106 } 107 else{ 108 noTone(pino_buzzer); //Desliga tone 109 110 leituraUltra=mms_2.calculaMMS(ultra.centimetrosUltra()); //Ler ultrassnico 111 distanciaHorizontal=leituraUltra*(cos(RAD(anguloEixoX))); //Calcula distncia horizontal 112 113 //CHAMADA MP3 114 if ((distanciaHorizontal>2000) && (distanciaHorizontal<3000)) { 115 wtv020sd16p.playVoice(0); 116 //Reproduz o arquivo 1 117 wtv020sd16p.asyncPlayVoice(1); //Voc esta a mais de 2 metros de um obstculo! 118 delay(3000); 119 wtv020sd16p.stopVoice(); 120 delay(2000); 121 menu_inicial(); 122 } 123 if ((distanciaHorizontal>1000)&& (distanciaHorizontal<2000)){ 124 wtv020sd16p.playVoice(0); 125 //Reproduz o arquivo 2 126 wtv020sd16p.asyncPlayVoice(2); //Ateno obstaculo a menos de 2 metros! 127 delay(3000); 128 wtv020sd16p.stopVoice(); 129 delay(2000); 130 menu_inicial(); 131 } 132 133 if ((distanciaHorizontal>200)&& (distanciaHorizontal<1000)){ 134 wtv020sd16p.playVoice(0); 135 //Reproduz o arquivo 2 136 wtv020sd16p.asyncPlayVoice(3); //Cuidado obstaculo a menos de 1 metro! 137 delay(3000); 138 wtv020sd16p.stopVoice(); 139 delay(2000); 140 menu_inicial(); 141 } 142 143 144 //Limita valores de distanciaHorizontal 145 if(distanciaHorizontal<DISTANCIA_MINIMA) distanciaHorizontal=DISTANCIA_MINIMA; 146 if(distanciaHorizontal>DISTANCIA_DETECCAO){ 147 analogWrite(pino_vibracall, 0); //Desliga vibracall 148 } 149 //Varia a tenso no vibracall de 2.0V 4.0V, conforme a distncia detectada, de 150 //DISTANCIA_MINIMA DISTANCIA_DETECCAO 151 else analogWrite(pino_vibracall, map(distanciaHorizontal, DISTANCIA_DETECCAO, DISTANCIA_MINIMA, TENSAO(1.5), TENSAO(4.0))); 152 } 153 Serial.print(anguloEixoX); 154 Serial.print(','); 155 Serial.print(ANGULO_DETECCAO(ALTURA_PESSOA/DISTANCIA_DETECCAO)); 156 Serial.print(','); 157 Serial.println(distanciaHorizontal); 158 //delay(1); 159 } 160} 161//Mostra menu de opcoes 162void menu_inicial() 163{ 164 Serial.println("\ 165Digite : "); 166 Serial.println("1 - Reproduz o arquivo 0001.ad4"); 167 Serial.println("2 - Reproduz o arquivo 0002.ad4"); 168 Serial.println("3 - Reproduz o arquivo 0003.ad4"); 169 Serial.println(); 170} 171
Downloadable files
Esquema Arduino nano com Ultrassonic
Parte do esquuema completo do projeto, em breve postaremos o esquema completo
Esquema Arduino nano com Ultrassonic

Esquema Arduino nano com Ultrassonic
Parte do esquuema completo do projeto, em breve postaremos o esquema completo
Esquema Arduino nano com Ultrassonic

Comments
Only logged in users can leave comments