The issue with navigation for the blind or visually impaired is that you cannot have the user's functional sense occupied with another activity.
Thus I , inspired from JR Rizzo, decided to add the glove based wheel chair with the tactile feedback system.
int analogInPin0 = A0;
int analogOutPin0 = 0;
int analogInPin1 = A1;
int analogOutPin1 = 1;
int analogInPin2 = A2;
int analogOutPin2 = 2;
int analogInPin3 = A3;
int analogOutPin3 = 3;
int analogInPin4 = A4;
int analogOutPin4 = 4;
int analogInPin5 = A5;
int analogOutPin5 = 5;
int analogInPin6 = A6;
int analogOutPin6 = 6;
int analogInPin7 = A7;
int analogOutPin7 = 7;
int analogInPin8 = A8;
int analogOutPin8 = 8;
int analogInPin9 = A9;
int analogOutPin9 = 9;
int analogInPin10 = A10;
int analogOutPin10 = 10;
int analogInPin11 = A11;
int analogOutPin11 = 11;
int analogInPin12 = A12;
int analogOutPin12 = 12;
int analogInPin13 = A13;
int analogOutPin13 = 13;
int analogInPin14 = A14;
int analogOutPin14 = 14;
int analogInPin15 = A15;
int analogOutPin15 = 15;
int sensorValue0 = 0; // value read from the IR sensor
int sensorValue1 = 0;
int sensorValue2 = 0;
int sensorValue3 = 0; // value read from the IR sensor
int sensorValue4 = 0;
int sensorValue5 = 0;
int sensorValue6 = 0; // value read from the IR sensor
int sensorValue7 = 0;
int sensorValue8 = 0;
int sensorValue9 = 0; // value read from the IR sensor
int sensorValue10= 0;
int sensorValue11= 0;
int sensorValue12= 0; // value read from the IR sensor
int sensorValue13= 0;
int sensorValue14= 0;
int sensorValue15= 0; // value read from the IR sensor
int outputValue0 = 0; // value output to the Actuator
int outputValue1 = 0; // value output to the Actuator
int outputValue2 = 0; // value output to the Actuator
int outputValue3 = 0; // value output to the Actuator
int outputValue4 = 0; // value output to the Actuator
int outputValue5 = 0; // value output to the Actuator
int outputValue6 = 0; // value output to the Actuator
int outputValue7 = 0; // value output to the Actuator
int outputValue8 = 0; // value output to the Actuator
int outputValue9 = 0; // value output to the Actuator
int outputValue10= 0; // value output to the Actuator
int outputValue11= 0; // value output to the Actuator
int outputValue12= 0; // value output to the Actuator
int outputValue13= 0; // value output to the Actuator
int outputValue14= 0; // value output to the Actuator
int outputValue15= 0; // value output to the Actuator
void setup()
{
Serial.begin(9600);
}
void loop()
{
float volts0 = analogRead(analogInPin0)*0.00273; // value from sensor * (5/1024) - if running 3.3.volts then change 5 to 3.3
sensorValue0= analogRead(analogInPin0);
float distance0 = 65*pow(volts0, -1.10); // worked out from graph 65 = theoretical distance / (1/Volts)S - luckylarry.co.uk
float volts1 = analogRead(analogInPin1)*0.00273; // value from sensor * (5/1024) - if running 3.3.volts then change 5 to 3.3
sensorValue1 = analogRead(analogInPin1);
float distance1 = 65*pow(volts1, -1.10); // worked out from graph 65 = theoretical distance / (1/Volts)S - luckylarry.co.uk
float volts2 = analogRead(analogInPin2)*0.000273; // value from sensor * (5/1024) - if running 3.3.volts then change 5 to 3.3
sensorValue2 = analogRead(analogInPin2);
float distance2 = 65*pow(volts2, -1.10); // worked out from graph 65 = theoretical distance / (1/Volts)S - luckylarry.co.uk
float volts3 = analogRead(analogInPin3)*0.00273; // value from sensor * (5/1024) - if running 3.3.volts then change 5 to 3.3
sensorValue3= analogRead(analogInPin3);
float distance3 = 65*pow(volts3, -1.10); // worked out from graph 65 = theoretical distance / (1/Volts)S - luckylarry.co.uk
float volts4 = analogRead(analogInPin4)*0.00273; // value from sensor * (5/1024) - if running 3.3.volts then change 5 to 3.3
sensorValue4= analogRead(analogInPin4);
float distance4 = 65*pow(volts4, -1.10); // worked out from graph 65 = theoretical distance / (1/Volts)S - luckylarry.co.uk
float volts5 = analogRead(analogInPin5)*0.00273; // value from sensor * (5/1024) - if running 3.3.volts then change 5 to 3.3
sensorValue5= analogRead(analogInPin5);
float distance5 = 65*pow(volts5, -1.10); // worked out from graph 65 = theoretical distance / (1/Volts)S - luckylarry.co.uk
float volts6 = analogRead(analogInPin6)*0.00273; // value from sensor * (5/1024) - if running 3.3.volts then change 5 to 3.3
sensorValue6= analogRead(analogInPin6);
float distance6 = 65*pow(volts6, -1.10); // worked out from graph 65 = theoretical distance / (1/Volts)S - luckylarry.co.uk
float volts7 = analogRead(analogInPin7)*0.00273; // value from sensor * (5/1024) - if running 3.3.volts then change 5 to 3.3
sensorValue7= analogRead(analogInPin7);
float distance7 = 65*pow(volts7, -1.10); // worked out from graph 65 = theoretical distance / (1/Volts)S - luckylarry.co.uk
float volts8 = analogRead(analogInPin8)*0.00273; // value from sensor * (5/1024) - if running 3.3.volts then change 5 to 3.3
sensorValue8= analogRead(analogInPin8);
float distance8 = 65*pow(volts8, -1.10); // worked out from graph 65 = theoretical distance / (1/Volts)S - luckylarry.co.uk
float volts9 = analogRead(analogInPin9)*0.00273; // value from sensor * (5/1024) - if running 3.3.volts then change 5 to 3.3
sensorValue9= analogRead(analogInPin9);
float distance9 = 65*pow(volts9, -1.10); // worked out from graph 65 = theoretical distance / (1/Volts)S - luckylarry.co.uk
float volts10 = analogRead(analogInPin10)*0.00273; // value from sensor * (5/1024) - if running 3.3.volts then change 5 to 3.3
sensorValue10 = analogRead(analogInPin10);
float distance10 = 65*pow(volts10, -1.10); // worked out from graph 65 = theoretical distance / (1/Volts)S - luckylarry.co.uk
float volts11 = analogRead(analogInPin11)*0.00273; // value from sensor * (5/1024) - if running 3.3.volts then change 5 to 3.3
sensorValue11 = analogRead(analogInPin11);
float distance11 = 65*pow(volts11, -1.10); // worked out from graph 65 = theoretical distance / (1/Volts)S - luckylarry.co.uk
float volts12 = analogRead(analogInPin12)*0.00273; // value from sensor * (5/1024) - if running 3.3.volts then change 5 to 3.3
sensorValue12 = analogRead(analogInPin12);
float distance12 = 65*pow(volts12, -1.10); // worked out from graph 65 = theoretical distance / (1/Volts)S - luckylarry.co.uk
float volts13 = analogRead(analogInPin13)*0.00273; // value from sensor * (5/1024) - if running 3.3.volts then change 5 to 3.3
sensorValue13 = analogRead(analogInPin13);
float distance13 = 65*pow(volts13, -1.10); // worked out from graph 65 = theoretical distance / (1/Volts)S - luckylarry.co.uk
float volts14 = analogRead(analogInPin14)*0.00273; // value from sensor * (5/1024) - if running 3.3.volts then change 5 to 3.3
sensorValue14 = analogRead(analogInPin14);
float distance14 = 65*pow(volts14, -1.10); // worked out from graph 65 = theoretical distance / (1/Volts)S - luckylarry.co.uk
float volts15 = analogRead(analogInPin15)*0.00273; // value from sensor * (5/1024) - if running 3.3.volts then change 5 to 3.3
sensorValue15 = analogRead(analogInPin15);
float distance15 = 65*pow(volts15, -1.10); // worked out from graph 65 = theoretical distance / (1/Volts)S - luckylarry.co.uk
if(distance0>150)
distance0=150;
if(distance0<30)
distance0=30;
if(distance1>150)
distance1=150;
if(distance1<30)
distance1=30;
if(distance2>150)
distance2=150;
if(distance2<30)
distance2=30;
if(distance3>150)
distance3=150;
if(distance3<30)
distance3=30;
if(distance4>150)
distance4=150;
if(distance4<30)
distance4=30;
if(distance5>150)
distance5=150;
if(distance5<30)
distance5=30;
if(distance6>150)
distance6=150;
if(distance6<30)
distance6=30;
if(distance7>150)
distance7=150;
if(distance7<30)
distance7=30;
if(distance8>150)
distance8=150;
if(distance8<30)
distance8=30;
if(distance9>150)
distance9=150;
if(distance9<30)
distance9=30;
if(distance10>150)
distance10=150;
if(distance10<30)
distance10=30;
if(distance11>150)
distance11=150;
if(distance11<30)
distance11=30;
if(distance12>150)
distance12=150;
if(distance12<30)
distance12=30;
if(distance13>150)
distance13=150;
if(distance13<30)
distance13=30;
if(distance14>150)
distance14=150;
if(distance14<30)
distance14=30;
if(distance15>150)
distance15=150;
if(distance15<30)
distance15=30;
outputValue0 = map(distance0, 30, 150, 270, 0);
outputValue1 = map(distance1, 30, 150, 270, 0);
outputValue2 = map(distance2, 30, 150, 270, 0);
outputValue3 = map(distance3, 30, 150, 270, 0);
outputValue4 = map(distance4, 30, 150, 270, 0);
outputValue5 = map(distance5, 30, 150, 270, 0);
outputValue6 = map(distance6, 30, 150, 270, 0);
outputValue7 = map(distance7, 30, 150, 270, 0);
outputValue8 = map(distance8, 30, 150, 270, 0);
outputValue9 = map(distance9, 30, 150, 270, 0);
outputValue10= map(distance10, 30, 150, 270, 0);
outputValue11= map(distance11, 30, 150, 270, 0);
outputValue12= map(distance12, 30, 150, 270, 0);
outputValue13= map(distance13, 30, 150, 270, 0);
outputValue14= map(distance14, 30, 150, 270, 0);
outputValue15= map(distance15, 30, 150, 270, 0);
Serial.print(" distance Value0 = " );
Serial.print(distance0);
Serial.print(" output Value0 = " );
Serial.print(outputValue0);
Serial.println();
Serial.print(" distance Value1 = " );
Serial.print(distance1);
Serial.print(" output Value1 = " );
Serial.print(outputValue1);
Serial.println();
Serial.print(" distance Value2 = " );
Serial.print(distance2);
Serial.print(" output Value2 = " );
Serial.print(outputValue2);
Serial.print(" distance Value3 = " );
Serial.print(distance3);
Serial.print(" output Value3 = " );
Serial.print(outputValue3);
Serial.println();
Serial.print(" distance Value4 = " );
Serial.print(distance4);
Serial.print(" output Value4 = " );
Serial.print(outputValue4);
Serial.println();
Serial.print(" distance Value5 = " );
Serial.print(distance5);
Serial.print(" output Value5 = " );
Serial.print(outputValue5);
Serial.print(" distance Value6 = " );
Serial.print(distance6);
Serial.print(" output Value6 = " );
Serial.print(outputValue6);
Serial.println();
Serial.print(" distance Value7 = " );
Serial.print(distance7);
Serial.print(" output Value7 = " );
Serial.print(outputValue7);
Serial.println();
Serial.print(" distance Value8 = " );
Serial.print(distance8);
Serial.print(" output Value8 = " );
Serial.print(outputValue8);
Serial.print(" distance Value9 = " );
Serial.print(distance9);
Serial.print(" output Value9 = " );
Serial.print(outputValue9);
Serial.println();
Serial.print(" distance Value10 = " );
Serial.print(distance10);
Serial.print(" output Value10 = " );
Serial.print(outputValue10);
Serial.println();
Serial.print(" distance Value11 = " );
Serial.print(distance11);
Serial.print(" output Value11 = " );
Serial.print(outputValue11);
Serial.print(" distance Value12 = " );
Serial.print(distance12);
Serial.print(" output Value12 = " );
Serial.print(outputValue12);
Serial.println();
Serial.print(" distance Value13 = " );
Serial.print(distance13);
Serial.print(" output Value13 = " );
Serial.print(outputValue13);
Serial.println();
Serial.print(" distance Value14 = " );
Serial.print(distance14);
Serial.print(" output Value14 = " );
Serial.print(outputValue14);
Serial.print(" distance Value15 = " );
Serial.print(distance15);
Serial.print(" output Value15 = " );
Serial.print(outputValue15);
Serial.println();
delay(1000);
}
' {$STAMP BS2}
' {$PBASIC 2.5}
' {$PORT COM3}
' -----[ I/O Definitions ]-------------------------------------------------
RightServo PIN 15 ' Right Servo
LeftServo PIN 14 ' Left Servo
lcd PIN 8
' -----[ Constants ]-------------------------------------------------------
scalecon1 CON 11000 'Constant for Flex Sensor 1
scalecon2 CON 10850 'Constant for Flex Sensor 2
scalecon3 CON 10800 'Constant for Flex Sensor 3
scalecon4 CON 10800 'Constant for Flex Sensor 4
distcon CON 2257
' -----[ Variables ]-------------------------------------------------------
fs1 VAR Word
fs2 VAR Word
fs3 VAR Word
fs4 VAR Word
ul1 VAR Word
ir1 VAR Word
ir2 VAR Word
temp VAR Word
pulsecount VAR Word
PS VAR Word
RS VAR Word
LS VAR Word
' -----[ Program Code ]----------------------------------------------------
Main:
DO
DEBUG CLS
GOSUB ld
GOSUB f1
GOSUB f2
GOSUB f3
GOSUB f4
GOSUB ping
GOSUB irs
rs = 750
ls = 750
IF (fs3 < 450) AND (fs4 <450) THEN 'Stop switch
DO
IF(fs2 < 450) AND (fs1 < 450) THEN 'Reset the stop switch
SEROUT lcd, 84, [12]
SEROUT lcd, 84, [128,"Reset Cleared"]
DEBUG "reset cleared"
GOTO main
ELSE
DEBUG "reset"
SEROUT lcd, 84, [12]
SEROUT lcd, 84, [128,"STOP1 Switch"]
GOSUB f3
GOSUB f4
ENDIF
LOOP
ENDIF
DO WHILE (ul1 < 20) 'Obstacle detection
PULSOUT LeftServo, 750 ' Left Servo Move Pulse Value
PULSOUT RightServo, 750 ' Right Servo Move Pulse Value
DEBUG CR,"STOP UltraSonic"
SEROUT lcd, 84, [12]
SEROUT lcd, 84, [128,"STOP2 Ultrasonic"]
'PAUSE 10
GOSUB ping
'
LOOP
IF (fs1 > 650) AND (fs1 < 850) THEN 'Speed Control Using FLex Sensor
DEBUG CR,"stationary1"
ELSEIF (fs1 < 650) AND (fs1 > 550) THEN
DEBUG CR,"fw1"
SEROUT lcd, 84, [12]
SEROUT lcd, 84, [128,"Forward"]
LS = 850
RS = 650
PS = 20
GOTO mov
ELSEIF (fs1 < 550) AND (fs1 > 450) THEN
DEBUG CR,"fw2"
LS = 800
RS = 600
PS = 20
SEROUT lcd, 84, [12]
SEROUT lcd, 84, [128,"Forward"]
GOTO mov
ELSEIF (fs1 < 450) THEN
DEBUG CR,"fw3"
LS = 780
RS = 720
PS = 20
SEROUT lcd, 84, [12]
SEROUT lcd, 84, [128,"Forward"]
GOTO mov
ENDIF
IF (fs2 > 650) AND (fs2 < 850) THEN 'Speed Control Using FLex Sensor
DEBUG CR,"stationary2"
ELSEIF (fs2 < 650) AND (fs2 > 550) THEN
DEBUG CR,"bck1"
SEROUT lcd, 84, [12]
SEROUT lcd, 84, [128,"BACK"]
RS = 850
LS = 650
PS = 20
GOTO mov
ELSEIF (fs2 < 550) AND (fs2 > 450) THEN
DEBUG CR,"bck2"
SEROUT lcd, 84, [12]
SEROUT lcd, 84, [128,"BACK"]
RS = 800
LS = 700
PS = 20
GOTO mov
ELSEIF (fs2 < 450) THEN
DEBUG CR,"bck3"
SEROUT lcd, 84, [12]
SEROUT lcd, 84, [128,"BACK"]
RS = 780
LS = 720
PS = 20
GOTO mov
ENDIF
IF (fs3 > 650) AND (fs3 < 850) THEN 'Speed Control Using FLex Sensor
DEBUG CR,"stationary3"
ELSEIF (fs3 < 650) AND (fs3 > 550) THEN
DEBUG CR,"rw1"
SEROUT lcd, 84, [12]
SEROUT lcd, 84, [128,"RIGHT"]
RS = 650
LS = 650
PS = 20
GOTO mov
ELSEIF (fs3 < 550) AND (fs3 > 450) THEN
DEBUG CR,"rw2"
SEROUT lcd, 84, [12]
SEROUT lcd, 84, [128,"RIGHT"]
RS = 700
LS = 700
PS = 20
GOTO mov
ELSEIF (fs3 < 450) THEN
DEBUG CR,"rw3"
SEROUT lcd, 84, [12]
SEROUT lcd, 84, [128,"RIGHT"]
RS = 720
LS = 720
PS = 20
GOTO mov
ENDIF
IF (fs4 > 650) AND (fs4 < 850) THEN 'Speed Control Using FLex Sensor
DEBUG CR,"stationary4"
ELSEIF (fs4 < 650) AND (fs4 > 550) THEN
DEBUG CR,"lf1"
SEROUT lcd, 84, [12]
SEROUT lcd, 84, [128,"LEFT"]
RS = 850
LS = 850
PS = 20
GOTO mov
ELSEIF (fs4 < 550) AND (fs4 > 450) THEN
DEBUG CR,"lf2"
RS = 800
LS = 800
PS = 20
SEROUT lcd, 84, [12]
SEROUT lcd, 84, [128,"LEFT"]
GOTO mov
ELSEIF (fs4 < 450) THEN
DEBUG CR,"lf3"
SEROUT lcd, 84, [12]
SEROUT lcd, 84, [128,"LEFT"]
RS = 780
LS = 780
ps = 20
GOTO mov
ENDIF
'DEBUG ? fs1,? fs2,? fs3,? fs4
LOOP
'Initialize LCD
LD:
SEROUT lcd, 84, [22, 12] 'Initialize LCD
SEROUT lcd, 84, [128,"Glove Controlled", 148, " BoeBot "]
' *************************************************************************
' * USE THE INFRARED SENSORS TO DETECT CLIFFS *
' * WHILE THE PING))) IS FACING FORWARD. *
' *************************************************************************
'IR sensor
IRS: 'Check for IR Sensor 1 and 2 HIGH
DO WHILE(IN6 = 0) OR (IN7 = 0)
PULSOUT LeftServo, 750 ' Left Servo Move Pulse Value
PULSOUT RightServo, 750 ' Right Servo Move Pulse Value
DEBUG CR,"STOP IR Sensor"
SEROUT lcd, 84, [12]
SEROUT lcd, 84, [128,"CLIFF DETECTED"]
LOOP
' *************************************************************************
' * USE THE ULTRASONIC SENSOR TO GET DISTANCE VALUES *
' * WHILE THE PING))) IS FACING FORWARD. *
' *************************************************************************
'Ping sensor
PING: 'Ultrasonic Distance Measuring
PULSOUT 4, 5
PULSIN 4, 1, ul1
ul1 = distcon ** ul1
DEBUG CR,DEC3 ul1, " cm"
RETURN
' *************************************************************************
' * USE THE RCTIME VALUES TO GET THE FLEX SENSOR VALUES *
' * WHILE THE PING))) IS FACING FORWARD. *
' *************************************************************************
'Flex Sensor1
F1:
HIGH 0 'hold pin 0 high to charge capacitor
PAUSE 1 'charge capacitor for 1/1000 of a second
RCTIME 0, 1,fs1 'measure discharge time of flex resistor through capacitor
'fs1=fs1**scalecon1+500
temp = fs1*/439 - 2572
fs1 = fs1 - temp
fs1 = fs1/2
RETURN
'Flex Sensor2
F2:
HIGH 1 'hold pin 0 high to charge capacitor
PAUSE 1 'charge capacitor for 1/1000 of a second
RCTIME 1, 1,fs2 'measure discharge time of flex resistor through capacitor
' fs2=fs2**scalecon2+500
temp = fs2*/439 - 2572
fs2 = fs2 - temp
fs2 = fs2/2
RETURN
'Flex Sensor3
F3:
HIGH 2 'hold pin 0 high to charge capacitor
PAUSE 1 'charge capacitor for 1/1000 of a second
RCTIME 2, 1,fs3 'measure discharge time of flex resistor through capacitor
'fs3=fs3**scalecon3+500
temp = fs3*/439 - 2572
fs3 = fs3 - temp
fs3 = fs3/2
RETURN
'Flex Sensor4
F4:
HIGH 3 'hold pin 0 high to charge capacitor
PAUSE 1 'charge capacitor for 1/1000 of a second
RCTIME 3, 1,fs4 'measure discharge time of flex resistor through capacitor
'fs4=fs4**scalecon4+500
temp = fs4*/439 - 2572
fs4 = fs4 - temp
fs4 = fs4/2
RETURN
' *************************************************************************
' * USE THE APPROPRIATE PULSOUT VALUES TO MAKE YOUR BOE-BOT MOVE *
' * WHILE THE PING))) IS FACING FORWARD. *
' *************************************************************************
MOV: ' Send Moving Pulse
FOR pulseCount = 0 TO 200
PULSOUT LeftServo, LS ' Left Servo Move Pulse Value
PULSOUT RightServo, RS ' Right Servo Move Pulse Value
' PAUSE PS 'Refresh Delay using values passed from speed control
NEXT
RETURN
Parth Singh
8 projects • 43 followers
M.S. EE with interest in Arduino/Intel Edison/RPi and Tinkering
Thanks to J R Rizzo.
Comments