A stamp-sized BLE-controlled vibrobot that steers using only one reversible ERM motor — no wheels, no servos, no gears.
How It Works · Math · Hardware · Build · Firmware
Most robots use multiple motors, wheels, or servos to steer. This project does it with one motor and pure software.
A single coin ERM (Eccentric Rotating Mass) motor — the flat pancake type from phone vibration alerts — is mounted at a 20-30° tilt on a chassis the size of a postage stamp. The tilt is critical: it converts vertical vibration into a directional horizontal force. By controlling when the motor spins clockwise vs counterclockwise, and for how long, the robot can:
- Move forward (rapid CW↔CCW switching)
- Curve right (sustained CW)
- Curve left (sustained CCW)
- Stop (motor off)
All controlled wirelessly over BLE 5.0 from a phone.
When the ERM motor spins, the eccentric mass creates a rotating centrifugal force. Because the motor is tilted at an angle (30–45°), this force has two components:
Coin ERM Motor (tilted 20-30° above chassis)
_____
/ ○ \ ← coin motor (flat pancake, 10mm dia)
/________\
╱ ← tilt angle 20-30°
╱
━━━━━━━━╱━━━━━━━━━━ ← chassis (2cm × 2cm)
● ● ● ● ● ← pen nib contacts (pentagon)
Video_._Main_Explainer_se.mp4
| Phase | What Happens |
|---|---|
| Slip | Horizontal force > static friction → robot slides forward |
| Stick | Force drops below friction → robot holds position |
| Net result | Robot crawls forward one tiny step per vibration cycle |
This is the key insight. When the ERM spins clockwise, the rotating force vector sweeps in one direction, creating a yaw torque bias — the robot curves right. Reverse to counterclockwise and the yaw torque mirrors — robot curves left.
Rapid CW↔CCW switching cancels the yaw torques out → straight line.
Sustained CW → curves RIGHT ↷
Sustained CCW → curves LEFT ↶
Rapid CW/CCW → STRAIGHT ↑
Validated by: SimoBot (4.76g, 20mm diameter — peer reviewed), Pro Know single-motor robot (ESP-based, open source)
The eccentric mass spins in a circle. That spinning creates a centrifugal force that pushes the robot. The tilt angle decides which direction the push goes.
Where:
-
$m_e$ = eccentric mass (kg) -
$\omega = \frac{2\pi \cdot \text{RPM}}{60}$ = angular velocity (rad/s) -
$r$ = eccentricity (distance of mass from center, m)
For a 4mm ERM at ~12,000 RPM:
At tilt angle
-
$F_h = F_c \cdot \sin(25°) \approx 0.423 \cdot F_c$ (propulsion) -
$F_v = F_c \cdot \cos(25°) \approx 0.906 \cdot F_c$ (modulates normal force)
Note: Coin ERM vibrates primarily in the Z-axis when flat. The 20-30° tilt converts this into a usable horizontal propulsion component. Never mount flat — it kills directional control.
Robot moves only when horizontal force exceeds static friction:
Solving for minimum ω:
Physical meaning: Too slow = robot just sits there vibrating. Above
Where
The motor needs time to reach full speed before reversing:
where
Confirmed by SimoBot: 500ms CW / 500ms CCW produced straight-line motion.
Where
| Source | Calculation | Value |
|---|---|---|
| Battery energy | 80mAh × 3.7V | 296 mWh |
| HT7737C boost | 3.7V → 5V at ~85% eff | ~4.25V output |
| CP6208 drop | 1.0–1.6V at 100mA | Motor gets ~2.6–3.4V |
| Motor current | ~80–120mA | — |
| BL602 BLE | ~15–20mA | — |
| Total draw | ~100–140mA peak | — |
| Runtime estimate | 80mAh ÷ 120mA | ~40 min |
| Component | Part | Purpose |
|---|---|---|
| MCU | Ai-WB2-M1-I (BL602) | BLE 5.0 + WiFi brain |
| H-Bridge | CP6208DTR | Motor CW/CCW control |
| Motor | Coin ERM (10mm dia, 3V) | Stick-slip locomotion, low noise |
| Boost | HT7737C SOT-89-3 | 3.7V → 5V for motor |
| Battery | 80mAh 20-30C LiPo | Power |
| Contacts | 5× ballpoint pen nibs | Pentagon ground contact |
| Cap | 100µF | Motor spike buffer |
| Cap | 0.1µF | CP6208 bypass |
LiPo (+) ──→ HT7737C IN ──→ 5V OUT ──→ CP6208 VCC
LiPo (+) ──→ BL602 Pin3 (VCC 3.3V via LDO)
LiPo (-) ──→ Common GND
BL602 Pin19 (IO3) ──10kΩ──GND
└──────────→ CP6208 AIN
BL602 Pin26 (IO1) ──10kΩ──GND
└──────────→ CP6208 BIN
CP6208 AOUT ──→ Motor (+)
CP6208 BOUT ──→ Motor (-)
| IO3 (AIN) | IO1 (BIN) | Motor | Robot |
|---|---|---|---|
| HIGH | LOW | CW | Curves Right |
| LOW | HIGH | CCW | Curves Left |
| Rapid toggle | Rapid toggle | Oscillating | Straight |
| LOW | LOW | Stop | Stop |
Top view (20mm × 20mm)
┌─────────────────┐
│ [BL602 PCB] │
│ ___ │
│ /○ \ ← coin │
│ /____\ motor │
│ ╱ tilted 25° │
└─────────────────┘
Side view — motor tilt is everything
┌──────┐
│ coin │ ← 10mm dia, 3mm thick
└──┬───┘
│ ← tilted 20-30° from horizontal
───┴────────────── chassis
● ● ● ● ● pen nib pentagon
Bottom view — pentagon nib contacts
●
● ●
● ●
(omnidirectional low-friction steel balls)
Critical mounting note: Coin ERM must be tilted 20-30° off horizontal. Flat mounting = only vertical vibration = no steering, weak locomotion. The tilt is the entire physics basis of the project.
- BL602 module communication via UART confirmed
- AT firmware responding (BLE advertising confirmed)
- CP6208 wired and tested
- Custom GPIO firmware flashed
- Motor CW/CCW bench tested
- Locomotion direction verified
- Pentagon pen nib contacts attached
- ERM motor mounted at 35° angle
- HT7737C boost circuit integrated
- LiPo connected
- Chassis weight measured
- Custom BLE firmware flashed
- Phone app / web BLE controller built
- Forward/Left/Right/Stop commands working
- Switching frequency tuned for surface
Command byte → Motor action
0x46 ('F') → Forward (rapid CW/CCW 250ms intervals)
0x52 ('R') → Right (sustained CW)
0x4C ('L') → Left (sustained CCW)
0x53 ('S') → Stop
void forward() {
while(moving) {
gpio_write(IO3, HIGH); gpio_write(IO1, LOW); // CW
delay(250);
gpio_write(IO3, LOW); gpio_write(IO1, HIGH); // CCW
delay(250);
}
}
void right() {
gpio_write(IO3, HIGH);
gpio_write(IO1, LOW); // Sustained CW
}
void left() {
gpio_write(IO3, LOW);
gpio_write(IO1, HIGH); // Sustained CCW
}- SimoBot: "SimoBot: An underactuated miniature robot driven by a single motor" — 4.76g, 20mm, peer-reviewed validation of this exact concept
- Pro Know Robot — Open source ESP-based single-motor vibrobot using DRV8212 + pager motor
- PufferFace Robot (PFR) — Soft-body vibrobot using ERM for pipeline navigation
- Hexbug Nano — Commercial bristlebot (unidirectional, for comparison)
Ishant Jaiswal — B.Tech Robotics & Automation, 3rd Year
GitHub: @Ishu1519
MIT License — build it, improve it, share it.