Embedded · Robotics · Arduino · Autonomous Navigation

Autonomous
Obstacle Rover

Wheeled robot navigating autonomously in real time. HC-SR04 ultrasonic sensors measure front, left, and right distances. Priority-based decision algorithm selects: proceed, slow, stop, reverse, or pivot. L298N dual H-bridge with PWM speed control.

20cm
Stop Threshold
~15ms
Detect→Reroute
3
Ultrasonic Sensors
360°
Navigation
TEAM: Islam Emad Ismail · Abdelaziz Eltohami Mohamed · Nada Atla · Mariam Issa  |  SUPERVISOR: Prof. Dr. Hatem Khater (Dean of Faculty of Engineering)
Hardware Architecture

Exploded View

Top-down exploded diagram showing all hardware components and their signal connections.

CHASSIS ARDUINO UNO ATmega328P · 16MHz Digital / PWM / Analog Pins Decision Algorithm C++ Bare-Metal HC-SR04 FRONT Ultrasonic · 2cm–400cm T R TRIG/ECHO HC-SR04 LEFT Side detection T R Digital HC-SR04 RIGHT Side detection Digital L298N MOTOR DRIVER Dual H-Bridge · 2A/ch · PWM IN1 IN2 IN3 IN4 · ENA ENB PWM+DIR LEFT MOTORS (×2) DC Gear Motor · 1:48 RIGHT MOTORS (×2) DC Gear Motor · 1:48 POWER 4×AA Battery 6V · 2000mAh Vin (6V) SENSOR → ARDUINO → DRIVER → MOTORS
Arduino Uno (ATmega328P)
16MHz · 32KB Flash · 14 digital I/O · 6 PWM outputs
HC-SR04 Ultrasonic (×3)
40kHz burst · Range 2cm–400cm · Resolution 3mm · ~58µs/cm
L298N Motor Driver
Dual H-bridge · 2A per channel · PWM speed control · 5–35V
DC Gear Motors (×4)
1:48 reduction ratio · 6V · ~180 RPM · Plastic gearbox
Chassis + Wheels
4WD acrylic chassis · 65mm rubber wheels · 2-layer mounting
Power Supply
4×AA NiMH batteries · 6V / 2000mAh · On/Off switch
Interactive Simulation

Navigation Algorithm

Watch the rover navigate around obstacles in real time. The decision loop runs every ~10ms.

Rover — Top View Simulation FORWARD
System nominal — navigating forward
Decision Algorithm — Priority Logic
READ SENSORS Front · Left · Right Front < 20cm? Critical zone YES STOP ~5ms NO Front < 40cm? Caution zone SLOW 50% PWM YES NO Left < Right? Choose direction PIVOT RIGHT YES PIVOT LEFT NO FORWARD Full PWM ↻ Loop every ~10ms
Technical Specs

Performance Data

📡
Ultrasonic Sensing
Range2cm – 400cm
Resolution~3mm
Timing~58µs/cm
Scan rate~10ms/cycle
Motor Control
DriverL298N dual H-bridge
Speed controlPWM 0–100%
Max current2A per channel
Direction4-wire IN1–IN4
🧠
Decision Timing
Ping → Decision~10ms
Motor response<5ms
Stop threshold20cm
Total reroute~15ms
🔋
Power
Supply4×AA · 6V
Capacity2000mAh
Arduino draw~50mA
Motors draw~300mA total
/* NEON RIBBON */ (function(){ const canvas=document.getElementById('ribbon-canvas'); if(!canvas)return; const ctx=canvas.getContext('2d'); const CFG={SPEED_X:.14,SPEED_Y:.14,MAX_LENGTH:90,RS:.018,GS:.013,BS:.022,SPREAD:16}; let anim=0,W=0,H=0; const pts=[],mouse={x:0,y:0},prev={x:0,y:0},cs={r:0,g:200,b:255,sz:0}; function resize(){W=canvas.width=innerWidth;H=canvas.height=innerHeight} resize();window.addEventListener('resize',resize,{passive:true}); document.addEventListener('mousemove',e=>{mouse.x=e.clientX;mouse.y=e.clientY},{passive:true}); mouse.x=prev.x=innerWidth/2;mouse.y=prev.y=innerHeight/2; function sp(p){p.x+=p.dx;p.y+=p.dy} function dl(){ const n=pts.length;if(n<3)return; for(let i=n-1;i>1;i--){ const p0=pts[i],p1=pts[i-1],p2=pts[i-2]; ctx.beginPath();ctx.strokeStyle=p0.color;ctx.lineWidth=p0.sz;ctx.globalAlpha=i/n; ctx.moveTo((p1.x+p0.x)/2,(p1.y+p0.y)/2); ctx.quadraticCurveTo(p1.x,p1.y,(p1.x+p2.x)/2,(p1.y+p2.y)/2);ctx.stroke();sp(p0); } if(pts[0])sp(pts[0]);if(pts[n-1])sp(pts[n-1]); } function draw(){ let dx=Math.max(-CFG.SPREAD,Math.min(CFG.SPREAD,(mouse.x-prev.x)*CFG.SPEED_X)); let dy=Math.max(-CFG.SPREAD,Math.min(CFG.SPREAD,(mouse.y-prev.y)*CFG.SPEED_Y)); prev.x=mouse.x;prev.y=mouse.y;cs.sz+=.12;cs.r+=CFG.RS;cs.g+=CFG.GS;cs.b+=CFG.BS; const sz=Math.abs(Math.sin(cs.sz)*8)+1; const r=Math.floor(Math.sin(cs.r)*128+128),g=Math.floor(Math.sin(cs.g)*128+128),b=Math.floor(Math.sin(cs.b)*128+128); pts.push({x:mouse.x,y:mouse.y,dx,dy,sz,color:`rgb(${r},${g},${b})`}); if(pts.length>CFG.MAX_LENGTH)pts.shift(); ctx.globalCompositeOperation='source-over';ctx.globalAlpha=1; ctx.fillStyle='rgba(0,0,0,.05)';ctx.fillRect(0,0,W,H); ctx.globalCompositeOperation='lighter';dl();dl();dl(); anim=requestAnimationFrame(draw); } draw(); document.addEventListener('visibilitychange',()=>{if(document.hidden)cancelAnimationFrame(anim);else draw()}); })(); /* 3D TILT on cards */ document.querySelectorAll('.spec-card,.feature-card,.stat-card,.phase-card,.card,.metric-card,.tech-card,.detail-card,.comp-card,.step-card,.challenge-card').forEach(card=>{ card.style.transition='transform .32s ease,box-shadow .32s'; card.addEventListener('mousemove',e=>{ const r=card.getBoundingClientRect(); const x=(e.clientX-r.left)/r.width-.5,y=(e.clientY-r.top)/r.height-.5; card.style.transform=`perspective(820px) rotateX(${-y*8}deg) rotateY(${x*10}deg) scale3d(1.015,1.015,1.015)`; },{passive:true}); card.addEventListener('mouseleave',()=>{card.style.transform='perspective(820px) rotateX(0) rotateY(0) scale3d(1,1,1)'}); }); /* CIPHER TEXT on section headings */ (function(){ const CHARS='ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789#@!%'; function cipher(el,target,delay){ setTimeout(()=>{ let frame=0;const total=Math.floor(1000/30); const id=setInterval(()=>{ const prog=frame/total;let out=''; for(let i=0;i(i/target.length)?target[i]:CHARS[Math.floor(Math.random()*CHARS.length)]; el.textContent=out; if(frame>=total){clearInterval(id);el.textContent=target} frame++; },30); },delay); } const ro=new IntersectionObserver(entries=>{ entries.forEach(e=>{ if(e.isIntersecting){ const el=e.target; const orig=el.dataset.cipherText||el.textContent; el.dataset.cipherText=orig; cipher(el,orig,0); ro.unobserve(el); } }); },{threshold:.3}); document.querySelectorAll('h2,h3').forEach(h=>{ if(h.textContent.trim().length<60)ro.observe(h); }); })();