⭐ FeaturedIntroduction & Project Overview Traditional white canes used by visually impaired individuals can only detect obstacles that are physically touched by the cane tip, leaving overhead obstacles, holes, and distant hazards undetected until it's too late. The Smart Stick project solves this by equipping a regular walking cane with ultrasonic sensors that detect obstacles at multiple heights and distances, alerting the user through vibration motors and buzzer sounds before they get close enough to collide. This project is a highly meaningful Final Year Project (FYP) or semester project for Biomedical, Electrical, and Computer Science students, since it directly addresses a real accessibility challenge, demonstrating genuine social impact alongside solid embedded systems engineering — a combination that consistently impresses FYP evaluators .
Contact Us About This ProjectWorking Process
Key Features & Functionality
| ● | Detects obstacles at both ground level and upper-body/head height using dual ultrasonic sensors |
|---|---|
| ● | Alerts the user through distinct vibration motor patterns for near and far obstacles |
| ● | Sounds a buzzer alert for immediate, close-range obstacles requiring urgent attention |
| ● | Includes a water/puddle detection sensor at the cane tip to warn of wet or flooded ground |
| ● | Optional GPS and GSM module sends the user's live location to a caregiver via SMS on request |
| ● | Compact, lightweight design that attaches easily to any standard walking cane |
Core Hardware Components Required
| ● | Arduino Nano: Compact microcontroller ideal for mounting directly onto the cane handle |
|---|---|
| ● | HC-SR04 Ultrasonic Sensor (x2): One mounted low for ground-level obstacles, one mounted higher for head-level obstacles |
| ● | Vibration Motor Module (x2): Provides silent, tactile alerts distinguishing near and far obstacles |
| ● | Active Buzzer Module: Sounds an urgent alert for very close obstacles |
| ● | Water Sensor Module: Detects puddles or wet ground at the cane's tip |
| ● | 9V Battery with Connector: Provides portable power for the entire cane-mounted circuit |
| ● | Compact Project Enclosure: Houses the electronics neatly on the cane handle |
Circuit Design & Pin Connections
Two ultrasonic sensors are positioned at different heights along the cane — one near the bottom to detect ground-level obstacles like curbs or steps, and one near the top to detect chest or head-height obstacles like tree branches or open cabinet doors. Each sensor is paired with its own vibration motor so the user can distinguish between a ground hazard and an overhead hazard purely by feel. The water sensor at the tip provides an additional layer of ground-condition awareness, and the buzzer serves as a universal urgent-proximity alert.
Complete Pin Connection Table
| Component | Component Pin | Microcontroller Pin | Notes / Description |
|---|---|---|---|
| Lower HC-SR04 (Ground) | VCC / GND | 5V / GND | Power Line |
| Lower HC-SR04 (Ground) | Trig / Echo | Pin 2 / Pin 3 | Ground-Level Obstacle Detection |
| Upper HC-SR04 (Head) | VCC / GND | 5V / GND | Power Line |
| Upper HC-SR04 (Head) | Trig / Echo | Pin 4 / Pin 5 | Head-Level Obstacle Detection |
| Ground Vibration Motor | Signal | Pin 6 | Ground Obstacle Alert |
| Head Vibration Motor | Signal | Pin 7 | Head Obstacle Alert |
| Buzzer Module | Signal | Pin 8 | Urgent Close-Range Alert |
| Water Sensor Module | VCC / GND | 5V / GND | Power Line |
| Water Sensor Module | AO (Analog Out) | A0 | Wet Ground Detection Signal |
Bill of Materials (BOM)
| Product / Component | Quantity | Link |
|---|---|---|
| Arduino Nano | 1 | |
| HC-SR04 Ultrasonic Sensor | 2 | |
| Vibration Motor Module | 2 | |
| Active Buzzer Module | 1 | |
| Water Sensor Module | 1 | |
| 9V Battery with Connector | 1 | |
| Compact Project Enclosure | 1 |
Step by Step assembly
| 1. | Step 1: Mount the Microcontroller Fix the Arduino Nano inside a small enclosure attached near the top handle of the cane, where it stays protected but remains easy to access for charging or reprogramming. |
|---|---|
| 2. | Step 2: Connect the Power Rails Wire the 9V battery to the Arduino's power input and run a shared 5V and GND connection along the length of the cane to reach all sensors and motors. |
| 3. | Step 3: Wire the Primary Sensor Mount the lower HC-SR04 sensor near the bottom third of the cane, angled slightly downward, and connect its Trig and Echo pins to Pin 2 and Pin 3. |
| 4. | Step 4: Wire the Secondary Sensor (if applicable) Mount the upper HC-SR04 sensor near the handle, angled forward at roughly chest/head height, and connect its Trig and Echo pins to Pin 4 and Pin 5. |
| 5. | Step 5: Setup the Communication Module If including the optional GPS/GSM emergency location feature, wire the GSM module's TX/RX pins to a SoftwareSerial pair on two spare digital pins at this stage. |
| 6. | Step 6: Connect Output Displays A display is not needed for this wearable-style project since all feedback is tactile and audible, so this step can be skipped in the basic build. |
| 7. | Step 7: Wire up the Buzzers/Alarms Connect the ground and head vibration motors to Pin 6 and Pin 7 respectively, and wire the buzzer to Pin 8 for close-range urgent obstacle alerts. |
| 8. | Step 8: Double-Check for Short Circuits Carefully route and secure all wires along the length of the cane with cable ties or heat-shrink tubing, checking that no bare wires are exposed where the user grips the handle. |
| 9. | Step 9: Connect the USB Cable and Power Up Connect the Arduino Nano to your computer via USB, confirm it powers on, and open the Arduino IDE ready to upload the obstacle detection code. |
- Step 10: Final Assembly Check and Testing Walk the cane toward obstacles at both ground and head height, confirming the correct vibration motor activates at the appropriate distance and the buzzer sounds only when an obstacle is very close, before finalizing the cane assembly.
Arduino Source Code
// Detects ground and head-level obstacles, alerting via vibration and buzzer
// ----- Pin Definitions -----
#define groundTrig 2
#define groundEcho 3
#define headTrig 4
#define headEcho 5
#define groundVibration 6
#define headVibration 7
#define buzzerPin 8
#define waterSensorPin A0
// ----- Distance Thresholds (in cm) -----
| const int farThreshold = 100; | // Gentle vibration warning distance |
| --- | --- |
| const int nearThreshold = 40; | // Urgent buzzer alert distance |
const int waterThreshold = 500; // Analog threshold for wet ground detection
void setup() {
pinMode(groundTrig, OUTPUT); pinMode(groundEcho, INPUT);
pinMode(headTrig, OUTPUT); pinMode(headEcho, INPUT);
pinMode(groundVibration, OUTPUT);
pinMode(headVibration, OUTPUT);
pinMode(buzzerPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
float groundDist = getDistanceCM(groundTrig, groundEcho);
float headDist = getDistanceCM(headTrig, headEcho);
int waterLevel = analogRead(waterSensorPin);
handleObstacle(groundDist, groundVibration, "Ground");
handleObstacle(headDist, headVibration, "Head");
checkWater(waterLevel);
checkUrgent(groundDist, headDist);
delay(150); // Short delay between scans for responsive feedback
}
// Measures distance using a given ultrasonic sensor pair
float getDistanceCM(int trigPin, int echoPin) {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH, 30000);
return duration * 0.034 / 2;
}
// Activates the corresponding vibration motor if an obstacle is within warning range
void handleObstacle(float distance, int motorPin, String label) {
if (distance > 0 && distance < farThreshold) {
digitalWrite(motorPin, HIGH);
Serial.println(label + " obstacle detected at " + String(distance) + " cm");
} else {
digitalWrite(motorPin, LOW);
}
}
// Sounds the buzzer if either sensor detects a very close, urgent obstacle
void checkUrgent(float groundDist, float headDist) {
if ((groundDist > 0 && groundDist < nearThreshold) ||
(headDist > 0 && headDist < nearThreshold)) {
tone(buzzerPin, 1500);
} else {
noTone(buzzerPin);
}
}
// Checks the water sensor and gives a distinct vibration pattern if ground is wet
void checkWater(int level) {
if (level > waterThreshold) {
digitalWrite(groundVibration, HIGH);
delay(100);
digitalWrite(groundVibration, LOW);
delay(100);
digitalWrite(groundVibration, HIGH); // Double-pulse pattern signals "wet ground"
delay(100);
digitalWrite(groundVibration, LOW);
}
}
Questions, Custom Pricing, or Requests
Want this project customized, a quote for your budget, help understanding a feature, or anything else related to it? Send us a message.
Prefer to talk? Call or WhatsApp us at +92 3176572690










