Walker aid for visually impaired elderly person

Hi!
i'm a complete noob in the arduino world so bear with me.

The problem:
My blind father (89) would love to walk the hallways of the house he lives in with his walker, he can't handle feeling the walls with a stick and push the walker simultaniously.
He walks very slowly.

Was thinking about the parking sensors on a car and my internet search lead me to Arduino.
Could i attach a box with 3 distance sensors and 2 vibrating motors to the walker to help him steer between the walls. i think YES!

For the sides a narrow beam would be preferred.
When he is < 80 CM from the wall left or right a motor on the left or right handlebar vibrates for .5 seconds or so and then stops until another event tekes place.

For the front a wider beam would be nice the walker is about 60 CM wide.
When something is blocking his path both motors simultaniosly vibrate a short time.

The sensors only need to sense when the walker is moving.

Its a very simple setup from wich he believes would help him a lot.

Would love some help from you.
-Which arduino do i need to attach 3 distance sensors and 2 vibrating motors?
-What sensors should i buy?
-How do i power this setup, and can it know when the battery is low?
-Do i forget somehting important in this idea, please brainstorm with me.

Hope somebody clever likes my idea and feels like helping me out.

Tia,
Steef

Virtually any will do.

Ultrasonic sensors come to mind. They're common, affordable, easy to use.

Popular choices are banks of 18650 cells, although you may have to do some paper napkin work to figure out how long they'd last and whether this would give a useful lifetime for your dad to work with.

I think your project sounds great and I hope you persevere. And even if it doesn't work out, I hope it helps to keep you close to your aging father. Cherish the time you have with him.

1 Like

Thank you for your quick reply!
So the most simple read: cheap Arduino would do?
It is fun to do this project with him yes!

Yes - that is to say, it's always possible to work with a more powerful/fancy model, and certainly if you end up using sensors that require more computing power, this may work. This may also help with things like bluetooth connectivity etc. in case you end up wanting that sort of thing. But frankly, if I were to do this, I'd pick any old Nano, a couple of ultrasonic sensors and get started.

Portability will probably be a concern, so I'd opt for a relatively compact board.

One Arduino would handle that. A Nano would work. You will need drivers for the motor. Simple MOSFET drivers will do,

The only rangefinder that I have experience with is the HCSR04. I see no reason that they would not work for your use. Their beam is 15 to 30 degrees. For narrower beam, laser TOF devices may be better.

1 Like

Thank you for your answers!
Ordering a nano and goodies and keep you posted.

Ordered:
Arduino Nano Every with headers.
3 Ultrasonic distance sensors HC-SR04
2 vibration mini motors disk
2 TC4428CPA MOSFET Drivers
2 Battery holders for 3x AA.
A breadboard with 400 tie points
And some M/M and F/M jumper wires.

It will arrive today hopefully so i can start prototyping.

Watched a tutorial on Arduino hardware and programming.
Saw there is a library on the sensors so that will probably make that bit easier.

It's starting to take shape in my head!
Will update as i go along.

Keep in mind these are MOSFET drivers - they are intended to drive a MOSFET. They're not switching MOSFETs, themselves, and as such, they're not intended to directly drive motors etc.

It's conceivable that the modules you ordered consists of a TC4428 driver plus a power MOSFET, but I can't see this in the description. Could you link to a product page, or at least post a good photograph of the part?

A general purpose power MOSFET suitable for use in Arduino projects is e.g. IRLZ44; it's widely available, cheap, comes in a TO220 package that can be plugged into a breadboard and it can easily be soldered, it has a low on-resistance even if driven from a low-voltage signal and it can power fairly heavy loads. Use something like this instead of the TC4428's you've ordered.
E.g. here: IRLZ44N N-Channel Power MOSFET 55V 47A - IRLZ44NPBF

Note: don't be tempted to purchase the omnipresent "IRF520"-based MOSFET modules. They're a poor choice for Arduino projects.

Other than that, you should be good to go - and you can already get started with trying to get the distance sensors to work, blinking an LED on your Arduino etc.

If you're going to order some additional stuff anyway, I'd suggest getting a piezo buzzer and a display, too. The buzzer can play a role in the low-battery alert system. The display can be useful for you and other bystanders. A simple 16x2 LCD with I2C backpack would be a suitable choice for most purposes. They're easy to work with, last virtually indefinitely and consume little power. A few buttons (tactile switches, microswitches) are also convenient to have for user input.

Thank you for your remarks, will read them better when there is more time.
The guy at the shop said these MOSFET thingies should do the trick, will search for more info later.


The stuff is so much smaller than I imagined :hushed:
See AA battery for reference.

A terminal adapter may help with the final build

Best of Luck

That's good though, isn't it?

No doubt, as they certainly are not TC4428CPA MOSFET drivers! What you got looks like power MOSFETs in a TO-220 housing. What numbers are on there? Either way, they'll work, even if they're not an ideal type. Your vibration motors are tiny and pretty much any transistor would be fine to drive those.

You can hook up the MOSFETs straight to your Arduino and it'll work that way. If you are going to order more stuff, see if you can get a couple of resistors to go with them; either get a kit with common values, or get a handful of common values you select yourself. I mostly use 160R, 330R, 1k, 4k7, 10k, 100k. For the MOSFETs, it's nice to have e.g. 10k between the Arduino pin you connect them to and GND, and something like 1k between the pin and the gate on the MOSFET.
It'll work without those, too, however.

Congratulations - you've got everything to get started! Now see if you can blink the onboard LED!

Tnx for all your support, much appreciated!
Will look at the mosfets tomorrow when i am at home.

Those are cool tnx!

Here is a picture of it ( TC4428CPA - MOSFET Driver on the invoice ) cannot make out what it sais.

They are IRF520N. They're not a very good choice for Arduino projects in general; in your specific application, they will likely work - but only because the vibration motors you're using are so tiny and will not draw any significant current.

Because they're bare MOSFETs and not MOSFEt modules, you should also get yourself two diodes (e.g. 1n400x, or even 1n4148 would work here) that you connect across the motor (cathode to voltage supply, anode to the drain of the MOSFET where it connects to the motor). Otherwise you may (will) fry your MOSFETs in due course.

If you speak with the shopkeeper who sold you these, please ask him to sell his customers "logic level MOSFETs" in the future instead. The IRF520N was never made to be driven with gate voltages as low as what an Arduino can put out. It's also an ancient type that is superseded by a plethora of more appropriate types.

got a setup with 3 sensors and weird stuff happens.
When i do not block the sensor it measures the ceiling just fine?

When i don't block the sensors
15:21:07.744 -> pin:0-180.56
15:21:07.791 -> pin:1-172.19
15:21:07.837 -> pin:2-180.78

When i block sensor 1:
15:21:30.346 -> pin:0-9.57
15:21:30.393 -> pin:1-0.00
15:21:30.393 -> pin:2-181.44

when i block sensor 2:
15:21:41.502 -> pin:0-181.39
15:21:41.549 -> pin:1-7.99
15:21:41.549 -> pin:2-0.00

When i block sensor 3:
15:21:56.689 -> pin:0-181.07
15:21:56.736 -> pin:1-174.25
15:21:56.736 -> pin:2-8.53

Is my code wrong or should i look elsewhere.

/*
 *Using HCSR04-ultrasonic-sensor-lib made by gamegine, thanks for yor work!
 *https://github.com/gamegine/HCSR04-ultrasonic-sensor-lib
 *Checking the distance on the left and right and front of the walker.
 *There is 3 distances with unique buzz characteristics.
 *on high we buzz the left, right or both ( for front) once  for .5 seconds 
 *on short we buzz 3 x for .5 seconds
 *on left right or front we buzz till the way is clear.
 */

#include <HCSR04.h>

HCSR04 hc(2, new int[3]{4, 7, 8}, 3); //initialisation class HCSR04 (trig pin , echo pin, number of sensor)


    bool leftlong = false;
    bool leftshort = false;
    bool rightlong = false;
    bool rightshort = false;
    bool frontlong = false;
    bool frontshort = false;
    const float lefthigh = 15.0;
    const float leftlow = 10.0;
    const float left = 5.0;
    const float righthigh = 20.0;
    const float rightlow = 14.0;
    const float right = 7.0;
    const float fronthigh = 30.0;
    const float frontlow = 20.0;
    const float front = 10.0;
void setup()
{
    Serial.begin(9600);
    pinMode(LED_BUILTIN, OUTPUT);
}

void loop()
{
     digitalWrite(LED_BUILTIN, LOW);
    for (int i = 0; i < 3; i++)
        Serial.println((String)"pin:"+i+"-"+hc.dist(i)); //return curent distance in serial for sensor 1 to 6
        if(hc.dist(0) < lefthigh && !leftlong)
        {
          // buzzercode left short
          for (int i = 0; i < 3; i++) 
        {
         digitalWrite(LED_BUILTIN, HIGH);
         delay(200);
         digitalWrite(LED_BUILTIN, LOW);
         delay(200);
        }
        leftlong = true;
        }
        else
        {
          leftlong = false;
        }
        if(hc.dist(0) < leftshort && !leftshort)
        {
          // buzzercode left short
          for (int i = 0; i < 4; i++) 
        {
         digitalWrite(LED_BUILTIN, HIGH);
         delay(200);
         digitalWrite(LED_BUILTIN, LOW);
         delay(200);
        }
        leftshort = true;
        }
        else
        {
           leftshort = false;
        }
        if(hc.dist(0) < left)
        {
          // buzzercode left
          for (int i = 0; i < 10; i++) 
        {
         digitalWrite(LED_BUILTIN, HIGH);
         delay(80);
         digitalWrite(LED_BUILTIN, LOW);
         delay(50);          
        }
        }      
        if(hc.dist(1) < righthigh && !rightlong)
        {
        //buzzercode right long
          for (int i = 0; i < 6; i++) 
        {
         digitalWrite(LED_BUILTIN, HIGH);
         delay(500);
         digitalWrite(LED_BUILTIN, LOW);
         delay(500);          
        }        
        rightlong = true;
        }
        else
        {
          rightlong = false;
        }
        if(hc.dist(1) < rightshort && !rightshort)
        {
        //buzzercode right short
          for (int i = 0; i < 7; i++) 
        {
         digitalWrite(LED_BUILTIN, HIGH);
         delay(500);
         digitalWrite(LED_BUILTIN, LOW);
         delay(500);          
        }        
        rightshort = true;
        }
        else
        {
           rightshort = false;
        }
        if(hc.dist(1) < right)
        {
          // buzzercode right
          for (int i = 0; i < 15; i++) 
        {
         digitalWrite(LED_BUILTIN, HIGH);
         delay(200);
         digitalWrite(LED_BUILTIN, LOW);
         delay(50);          
        }          
        }
             
        if(hc.dist(2) < fronthigh && !frontlong)
        {
        //buzzercode front long
          for (int i = 0; i < 9; i++) 
        {
         digitalWrite(LED_BUILTIN, HIGH);
         delay(500);
         digitalWrite(LED_BUILTIN, LOW);
         delay(500);          
        }        
        frontlong = true;
        }
        else
        {
          frontlong = false;
        }
        if(hc.dist(2) < frontshort && !frontshort)
        {
        //buzzercode front short
          for (int i = 0; i < 10; i++) 
        {
         digitalWrite(LED_BUILTIN, HIGH);
         delay(500);
         digitalWrite(LED_BUILTIN, LOW);
         delay(500);          
        }        
        frontshort = true;
        }
        else
        {
           frontshort = false;
        }        
         if(hc.dist(2) < front)
        {
          // buzzercode front
          for (int i = 0; i < 20; i++) 
        {
         digitalWrite(LED_BUILTIN, HIGH);
         delay(150);
         digitalWrite(LED_BUILTIN, LOW);
         delay(150);          
        }          
        }
                    
        
    delay(60);                      // we suggest to use over 60ms measurement cycle, in order to prevent trigger signal to the echo signal.
}

Have you tried a setup with a single HC sensor? Does that function as expected?
If yes, then try adding the other two sensors, but running a sketch with only one sensor active at a time. If that also works as expected, then modify the sketch so it checks all three sensors, one after another.

That was good advice thank you.
Started with a basic script to run the sensor and added the two others the same way after that, works like a charm.
Guess we can not assume that libraries are functional.

On to the buzzing stuff tomorrow! :partying_face:

Brilliant! You're making amazingly good progress. I can only see this end exceptionally well - have fun!!