Bastão Bengala para Cegos inteligente usando Arduino

Tempo de leitura: 7 minutes
Já ouviu falar de Hugh Herr? Ele é um famoso alpinista americano que quebrou as limitações de suas deficiências; ele acredita firmemente que a tecnologia pode ajudar as pessoas com deficiência a viver uma vida normal. Em uma de suas palestras no TED, Herr disse: “Os humanos não são deficientes. Uma pessoa nunca pode ser quebrada. Nosso ambiente construído, nossas tecnologias, está quebrado e desativado. Nós, as pessoas, não precisamos aceitar nossas limitações, mas podemos transferir a deficiência por meio da inovação tecnológica”.
Estas não eram apenas palavras, mas ele viveu sua vida para elas, hoje ele usa pernas protéticas e alega ter uma vida normal. Então, sim, a tecnologia pode realmente neutralizar a deficiência humana; com isso em mente, vamos usar o poder do Arduino e sensores simples para construir um bastão de cego que poderia executar mais do que apenas um bastão para pessoas com deficiência visual.
Este bastão bengala para Cegos terá um sensor ultrassônico para detectar a distância de qualquer obstáculo, o LDR para detectar as condições de iluminação e um controle remoto de RF usando o qual o cego pode localizar remotamente o stick. Todos os feedbacks serão dados ao cego através de uma campainha. É claro que você pode usar um motor vibrador no lugar do Buzzer e avançar muito mais usando sua criatividade.
Guia-De-Configuração-Programação-Arduino-LCD-1

Materiais requisitados:

  • Arduino Nano (Qualquer versão funcionará)
  • Sensor ultra-sônico HC-SR04
  • LDR
  • Campainha e LED
  • 7805
  • Transmissor e receptor de 433MHz RF
  • Resistores
  • Botão de apertar
  • placa de Circuitis Universal
  • Baterias de 9V

Diagrama de circuito:

O projeto Arduino Bastão Bengala para Cegos inteligente usando Arduino requer dois circuitos separados. Um é o circuito principal que será montado no bastão do cego. O outro é um pequeno circuito transmissor de RF remoto que será usado para localizar o circuito principal. O diagrama do circuito da placa principal é mostrado abaixo:
Guia-De-Configuração-Programação-Arduino-LCD-1
Como podemos ver, o Arduino Nano é usado para controlar todos os sensores. A placa completa é alimentada por uma bateria de 9V que é regulada em + 5V usando um regulador de tensão 7805. O sensor ultrassônico é alimentado por 5V e o gatilho e o pino de eco são conectados aos nano pinos 3 e 2 do Arduino, como mostrado acima. O LDR é conectado com um resistor de valor 10K para formar um divisor de potencial e a diferença de voltagem é lida pelo pino A1 do Arduino ADC. O pino ADC A0 é usado para ler o sinal do receptor de RF. A saída da placa é fornecida pelo sinal sonoro conectado ao pino 12.
circuito remoto de RF é mostrado abaixo. Seu trabalho também é mais explicado.
Guia-De-Configuração-Programação-Arduino-LCD-1
Usei um pequeno truque para fazer esse circuito de controle remoto de RF funcionar. Normalmente, ao usar este módulo de 433 MHz, é necessário um codificador e decodificador ou dois MCU para funcionar. Mas, em nossa aplicação, precisamos apenas do receptor para detectar se o transmissor está enviando alguns sinais. Portanto, o pino de dados do transmissor é conectado ao terra ou Vcc da fonte.
O pino de dados do receptor é passado através de um filtro RC e depois entregue ao Arduino, como mostrado abaixo. Agora, sempre que o botão for pressionado, o Receptor emitirá algum valor ADC constante repetidamente. Esta repetição não pode ser observada quando o botão não é pressionado. Então, escrevemos o programa Arduino para verificar se há valores repetidos para detectar se o botão está pressionado. Então é assim que uma pessoa cega pode rastrear seu bastão.
Eu usei uma placa de Circuitos Universal para soldar todas as conexões, para que ela fique intacta com o bastão. Mas você também pode fazê-los em uma tábua de pão. As placas que eu fiz estão abaixo.
Guia-De-Configuração-Programação-Arduino-LCD-1
Guia-De-Configuração-Programação-Arduino-LCD-1

Programa Arduino para Bastão Bengala para Cegos inteligente:

Quando estivermos prontos com o nosso hardware, podemos conectar o Arduino ao nosso computador e iniciar a programação. O código completo usado para esta página pode ser encontrado na parte inferior desta página, você pode enviá-lo diretamente para sua placa Arduino. No entanto, se você estiver curioso para saber como o código funciona, leia mais.
Como todos os programas, começamos com void setup() para inicializar os pinos de entrada e saída. Em nosso programa, o pino de campainha e gatilho é um dispositivo de saída e o pino de eco é um dispositivo de entrada. Também inicializamos o monitor serial para depuração.
void setup() 
{
 Serial.begin(9600);
 pinMde(Buzz,OUTPUT);
 digitalWrite(Buzz,LOW);
 pinMode(trigger, OUTPUT);
 pinMode(echo, INPUT);
}
Dentro do loop principal, estamos lendo todos os dados dos sensores. Começamos com a leitura dos dados do sensor Ultrasonic para distância, LDR para intensidade de luz e sinal de RF para verificar se o botão está pressionado. Todos esses dados são salvos em uma variável como mostrado abaixo para uso futuro.
calculate_distance(trigger,echo);
Signal = analogRead(Remote);
Intens = analogRead(Light);
Começamos com a verificação do sinal remoto. Usamos uma variável chamada similar_count para verificar quantas vezes os mesmos valores estão sendo repetidos no receptor de RF. Esta repetição ocorrerá apenas quando o botão for pressionado. Portanto, acionamos o alarme pressionado remotamente se a contagem exceder um valor de 100.
//Verifique se o controle remoto está pressionado
int temp = analogRead(Remote);
similar_count=0;
while (Signal==temp)
{
 Signal = analogRead(Remote);
 similar_count++;
}

//Se o controle remoto for pressionado
if (similar_count<100)
{
  Serial.print(similar_count); 
  Serial.println("Remoto pressionado");
  digitalWrite(Buzz,HIGH);delay(3000);
  digitalWrite(Buzz,LOW);
}
Você também pode verificá-lo no Serial Monitor no seu computador:
Guia-De-Configuração-Programação-Arduino-LCD-1
Em seguida, verificamos a intensidade da luz ao redor do cego. Se o LDR fornecer um valor inferior a 200, presume-se que está muito escuro e emitimos o aviso através da campainha com um tom de atraso específico de 200ms. Se a intensidade é muito brilhante, superior a 800, também emitimos um aviso com outro tom. O tom e a intensidade do alarme podem ser facilmente alterados alterando o respectivo valor no código abaixo.
//Se muito escuro
if (Intens<200)
{
  Serial.print(Intens); 
  Serial.println("Bright Light");
  digitalWrite(Buzz,HIGH);
  delay(200);
  digitalWrite(Buzz,LOW);
  delay(200);
  digitalWrite(Buzz,HIGH);
  delay(200);
  digitalWrite(Buzz,LOW);
  delay(200);
  delay(500);
}

//Se muito brilhante
if (Intens>800)
{
  Serial.print(Intens);
  Serial.println("Low Light");
  digitalWrite(Buzz,HIGH);
  delay(500);
  digitalWrite(Buzz,LOW);
  delay(500);
  digitalWrite(Buzz,HIGH);
  delay(500);
  digitalWrite(Buzz,LOW);
  delay(500);
}
Guia-De-Configuração-Programação-Arduino-LCD-1
Finalmente, começamos a medir a distância de qualquer obstáculo. Não haverá alarme se a distância medida for superior a 50 cm. Mas, se tiver menos de 50 cm, o alarme começará emitindo um sinal sonoro. À medida que o objeto se aproxima da campainha, o intervalo do sinal sonoro também diminui. Quanto mais próximo o objeto, mais rápido o sinal sonoro será emitido. Isso pode ser feito criando um atraso proporcional à distância medida. Como o delay () no Arduino não pode aceitar variáveis, temos que usar um loop for que loop com base na distância medida, como mostrado abaixo.
if (dist<50)
{
  Serial.print(dist); Serial.println("Object Alert");
  digitalWrite(Buzz,HIGH);
  for (int i=dist; i>0; i--)
    delay(10);
  digitalWrite(Buzz,LOW);
  for (int i=dist; i>0; i--)
    delay(10);
}
O programa pode ser facilmente adaptado para sua aplicação, alterando o valor que usamos para comparar. Você usa o monitor serial para depurar se um alarme falso for acionado. Se você tiver algum problema, pode usar a seção de comentários abaixo para postar suas perguntas

Arduino Bastão Bengala para Cegos inteligente em ação:

Finalmente, é hora de testar nosso projeto. Verifique se as conexões são feitas de acordo com o diagrama de circuito e se o programa foi carregado com sucesso. Agora, ligue os dois circuitos usando uma bateria de 9V e comece a ver os resultados. Mova o sensor Ultra Sonic para mais perto do objeto e você notará o sinal sonoro da campainha e essa frequência aumentará à medida que o manche se aproxima do objeto. Se o LDR estiver coberto no escuro ou se houver muita luz, a campainha tocará. Se tudo estiver normal, a campainha não emitirá um bipe. no Bastão para Cego em ação:
Quando você pressiona o botão no controle remoto, a campainha emitirá um bipe longo. Eu também uso um pequeno bastão para montar a montagem completa. Você pode usar um maior ou um bastão para cego real e colocá-lo em ação.
Guia-De-Configuração-Programação-Arduino-LCD-1
Se a campainha estiver sempre apitando, significa que o alarme está sendo disparado falso. Você pode abrir o monitor serial para verificar os parâmetros e verificar quais estão em queda crítica e ajustá-los. Como sempre, você pode postar seu problema na seção de comentários para obter ajuda. Espero que você tenha entendido o projeto e tenha gostado de construir algo.

Código

/*
 * Programa para Bastão para Cego
 */

const int trigger = 3; //Trigger pin of 1st Sesnor
const int echo = 2; //Echo pin of 1st Sesnor
const int Buzz = 13; //Echo pin of 1st Sesnor
const int Remote = A0; //Echo pin of 1st Sesnor
const int Light = A1; //Echo pin of 1st Sesnor

long time_taken;
int dist;
int Signal;
int Intens;
int similar_count;

void setup() {
 Serial.begin(9600); 
 pinMode(Buzz,OUTPUT);
 digitalWrite(Buzz,LOW);
 pinMode(trigger, OUTPUT); 
 pinMode(echo, INPUT); 
}

/*###Função para calcular a distância###*/
void calculate_distance(int trigger, int echo)
{
 digitalWrite(trigger, LOW);
 delayMicroseconds(2);
 digitalWrite(trigger, HIGH);
 delayMicroseconds(10);
 digitalWrite(trigger, LOW);

 time_taken = pulseIn(echo, HIGH);
 dist= time_taken*0.034/2;
 if (dist>300)
  dist=300;
}

void loop() { //loop infinito
 calculate_distance(trigger,echo);
 Signal = analogRead(Remote);
 Intens = analogRead(Light);

 //Verifique se o controle remoto está pressionado
 int temp = analogRead(Remote);
 similar_count=0;
 while (Signal==temp)
 {
  Signal = analogRead(Remote);
  similar_count++;
 }

 //Se o controle remoto for pressionado
 if (similar_count<100)
 {
  Serial.print(similar_count); 
  Serial.println("Remote Pressed");
  digitalWrite(Buzz,HIGH);
  delay(3000);
  digitalWrite(Buzz,LOW);
 }

 //Se muito escuro
 if (Intens<200)
 {
  Serial.print(Intens); 
  Serial.println("Bright Light");
  digitalWrite(Buzz,HIGH);
  delay(200);
  digitalWrite(Buzz,LOW);
  delay(200);
  digitalWrite(Buzz,HIGH);
  delay(200);
  digitalWrite(Buzz,LOW);
  delay(200);
  delay(500);
 }

 //Se muito brilhante
 if (Intens>800)
 {
  Serial.print(Intens); 
  Serial.println("Low Light");
  digitalWrite(Buzz,HIGH);
  delay(500);
  digitalWrite(Buzz,LOW);
  delay(500);
  digitalWrite(Buzz,HIGH);
  delay(500);
  digitalWrite(Buzz,LOW);
  delay(500);
 }

 if (dist<50)
 {
  Serial.print(dist); Serial.println("Object Alert");
  digitalWrite(Buzz,HIGH);
  for (int i=dist; i>0; i--)
   delay(10);

  digitalWrite(Buzz,LOW);
  for (int i=dist; i>0; i--)
   delay(10);
    
 }

 //Serial.print("dist=");
 //Serial.println(dist);
 //Serial.print("Similar_count=");
 //Serial.println(similar_count);
 //Serial.print("Intens=");
 //Serial.println(Intens);
}
Visits: 1 Visits: 828752