Currently blind people are facing a huge problem when they are in a public place. They have stick in their hand which helps them a bit. But I modified that stick and installed ultrasonic sensors along with necessary hardware in it. Which helps the blind person more efficiently and lets him sense the surrounding up to a radius of 2 meters (which can be extended as per the need) and the device has proven as the best assistant for the blind person as per the real time survey in blind schools.
The TechEye enables the blind person the sense the surrounding and act accordingly. Ones he/she starts using it, they feel no need of human assistance.
My first objective is to provide an easy way of detecting obstacles to blind people, while walking. Secondly I had to design a low cost i.e. economical instrument for the blind people, which they could afford. The design of the instrument should be simple to operate and easy to use for the blind people. The instrument must give fairly accurate results while detecting the obstacles. The instrument must work for a long time on the portable and rechargeable battery. And lastly, the instrument must work long life and to the fullest possible utility.
Demonstration Video
Interested in my research work? Download the abstract of my research paper. Check page-73 in downloaded .pdf file. Don’t forget to cite my work…! Its a microcontroller based instrument for blind persons, which will help them navigate while walking. The instrument will help them to detect the obstacles appearing in front of them. This instrument can also produce audible beeps to recognise the direction of motion of the obstacle (in a limited sense), if the blind person is standing still.
The Complete Code
/*
* Program of Blind Person Helper using ATMega16 and US Sensor
* Created: May14, 2019
* Vidyasagar Academy, Akola; www.vsa.edu.in
===== CONNECTION DETAILS =====
Connections of US sensor
Vcc --> Vcc of dev. board
Trig --> PA1 of PORTA
Echo --> PA2 of PORTA
Gnd --> Gnd of dev board
*/
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
void USTrigger()
{
// Send a 16uS pulse on trigger line
PORTA|=(1<<PA1); // High=1 i.e. PORTA=0b00000010;
_delay_us(16); // wait 16uS
PORTA&=~(1<<PA1); // Low=0 i.e. PORTA=0b00000000;
}
uint16_t GetPulseWidth()
{ // get pulse width started
uint32_t i, result;
// Wait for the rising edge
for(i=0;i<600000;i++)
{
if(!(PINA&(1<<PA2))) // i.e. if(PINA&0b00000000)
continue; // Line is still low, so wait
else
break; // High edge detected, so break.
}
if(i==600000)
return -1; // Indicates time out
// High Edge Found
// Setup Timer1
TCCR1A=0X00;
TCCR1B=(1<<CS11); // Prescaler = F_CPU/8
TCNT1=0x00; // Init counter
// Now wait for the falling edge
for(i=0;i<600000;i++)
{
if(PINA&(1<<PA2))
{
if(TCNT1 > 60000) break;
else
continue;
}
else
break;
}
if(i==600000)
return -2; // Indicates time out
// Falling edge found
result=TCNT1;
//Stop Timer
TCCR1B=0x00;
if(result > 60000)
return -2; // No obstacle
else
return (result>>1);
} // get pulse width completed
int main()
{ // void main started
DDRB=0b00010000;
DDRA=0b00000010;
uint16_t r;
while(1)
{ // while started
// Send a trigger pulse
USTrigger();
// Measure the width of pulse
r=GetPulseWidth();
// Handle Errors
if(r==-1)
{
PORTB=0b00010000;
_delay_ms(100);
PORTB=0b00000000;
_delay_ms(100);
}
else if(r==-2)
{
PORTB=0b00010000;
_delay_ms(100);
PORTB=0b00000000;
_delay_ms(100);
}
else
{
int d;
d=(r/58.0);
_delay_ms(1);
if(d<=6)
{
PORTB=0b00010000; // on
_delay_ms(50);
PORTB=0b00000000; // off
_delay_ms(50);
}
if(d<=4)
{
PORTB=0b00010000; // on
_delay_ms(25);
PORTB=0b00000000; // off
_delay_ms(25);
}
if(d<=2)
{
PORTB=0b00010000; // on
_delay_ms(10);
PORTB=0b00000000; // off
_delay_ms(10);
}
}
} // while closed
} // main closed