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

Leave a Reply