sexta-feira, 23 de agosto de 2019

Smart Blind Sitck usando Arduino

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 poderia ajudar as pessoas com deficiência a viver uma vida normal. Em uma de suas palestras TED Herr disse Os seres humanos não estão desativados. Uma pessoa nunca pode ser quebrada. Nosso ambiente construído, nossas tecnologias, está quebrado e desabilitado. Nós, o povo, não precisamos aceitar nossas limitações, mas podemos transferir a deficiência através da inovação tecnológica. Estas não foram apenas palavras, mas ele viveu sua vida para eles, hoje ele usa pernas protéticas e afirma viver para a vida normal. Então sim, a tecnologia pode de fato neutralizar a deficiência humana; com isso em mente, vamos usar o poder de Arduino e sensores simples para construir um homem cego que poderia realizar mais do que apenas um bastão para pessoas com deficiência visual.
Este stick inteligente terá um Sensor ultrassônico para detectar a distância de qualquer obstáculo, LDR para detectar condições de iluminação e um controle remoto de RF usando o qual o cego poderia localizar remotamente seu bastão. Todos os feedbacks serão dados ao cego através de uma Buzzer. Claro que você pode usar um motor vibrador no lugar do Buzzer e avançar muito mais usando sua criatividade.
Arduino Based Blind Stick circuit board

Materiais requisitados:

  1. Arduino Nano (Qualquer versão funcionará)
  2. Ultrasonic Sensor HC-SR04
  3. LDR
  4. Buzzer e LED
  5. 7805
  6. 433MHz RF transmissor e receptor
  7. Resistores
  8. Push button
  9. Placa Perf
  10. Kit De Solda
  11. 9V baterias

Diagrama de circuito:

Esta Projeto Arduino Smart Blind Stick requer dois circuitos separados. Um é o circuito principal que será montado no bastão do cego. O outro é um pequeno controle remoto Circuito transmissor de RF que será usado para localizar o circuito principal. O diagrama de circuito da placa principal é mostrado abaixo:
Receiver circuit diagram of arduino based blind stick project


Como podemos ver um 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 Ultrasonic sensor é alimentado por 5V e o gatilho e o pino de eco são conectados aos pinos 3 e 2 do Arduino nano, 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 de Receptor de RF. A saída da placa é fornecida pelo Buzzer que está conectado ao pino 12.

Circuito remoto RF é mostrado abaixo. Seu trabalho também é mais explicado. 

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. Você pode conferir aqui: como o transmissor e o receptor de RF funcionam.
Eu usei um placa perf soldar todas as conexões para que fiquem intactas 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.
working of arduino based blind stick project
Backside image of arduino based blind stick pcb board

Programa Arduino para Smart Blind Stick:

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() inicializar 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);
pinMode(Buzz,OUTPUT);
digitalWrite(Buzz,LOW);
pinMode(trigger, OUTPUT);
pinMode(echo, INPUT);
}
Dentro de main loop 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. &Nbsp;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("Remote Pressed");
  digitalWrite(Buzz,HIGH);delay(3000);digitalWrite(Buzz,LOW);
}

Você também pode verificá-lo no Serial Monitor no seu computador:
serial monitor screen for arduino based blind stick project

Em seguida nós verifique 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 específico de atraso com 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.
//If very dark
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);
}

//If very bright
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);
}
serial monitor screen showing measurement of distance for ultrasonic sensor

Finalmente, nós comece 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 for menor que 50 cm, o alarme começará soando a campainha. À 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. Desde o delay () no Arduino não pode aceitar variáveis, temos que usar um for loop qual 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 Stick cego 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 de bipes aumenta à 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.
Quando você pressiona o botão no controle remoto, a campainha emitirá um bipe longo. o O trabalho completo deste Smart Blind Stick é mostrado fornecido no final desta página. Eu também uso um pequeno bastão para montar a montagem completa. Você pode usar um maior ou um bastão cego real e colocá-lo em ação.
Arduino Based Blind Stick project in working
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.
Code: 
/*
 * Programa para Blind Man Stick
 * Data: 23-08-2019
 */
const int trigger = 3; //Pino de gatilho do 1º sensor
const int echo = 2; //Pino de eco do 1º sensor
const int Buzz = 13; //Pino de eco do 1º sensor
const int Remote = A0; //Pino de eco do 1º sensor
const int Light = A1; //Pino de eco do 1º sensor
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);
}

Nenhum comentário:

Postar um comentário

Peço que use somente caixa baixa, não todo escrito em letra grande.