A DREAM Robotics Agent · Mecanum

NORA

Nomadic Omnidirectional Reactive Automaton

An ESP32 mecanum robot that moves in any direction without turning. She hosts the WiFi network and fleet registry the rest of the robots join, while an Arduino with an MP3 shield runs her four ultrasonic sensors, music and buzzer.

C++ Python Arduino ESP32 Mecanum MIT License
NORA's avatar: a human representation of the robot
NORA · avatar
NORA, the omnidirectional mecanum robot
NORA
NORA from another angle
Chassis
NORA's electronics
Electronics

Overview

Any direction, no turning

Phone

An Android app

Hold the stick to drive, let go to stop. A second stick slides her sideways.

Download the APK

Play

Follow, hello, dance

She keeps your hand 30 cm from her front sonar, and wiggles or spins on the spot, with her wall stop still on.

Move

Omnidirectional

Mecanum wheels let her drive, strafe and turn in place.

Host

The fleet's network

She runs the NORA access point and the fleet registry on port 5000, so no router is needed.

Protect

Four-way braking

HC-SR04 sensors front, back, left and right block any drive command that would hit something, with a buzzer warning.

Music

MP3 player

Play, skip, repeat and volume from the web, the remote or the controller. A single clap starts the music.

Sense

Environment

Temperature and humidity (AHT10), ambient light, and a 3-channel line sensor.

Clean

UV light

A UV LED that can be off, on or blinking.

Think

MIND mode

The LLM on her PC controller drives her: she looks, thinks out loud, says what she’s doing as the fleet’s boss, moves and remembers. N on the controller.

Lead

IDA’s mind too

H runs IDA’s mind over the IR link. IDA can’t report back, so her mind knows she’s blind and takes one short step at a time.

Feel

Remote and rumble

The remote’s 5 locks and frees her wheels, 6 / 7 slow her down and speed her up; a gamepad buzzes harder as she nears a wall in the way it drives her.

Hardware

What she's built from

  1. 01 ESP32 (ACEBOTT QA007 Max controller board)
  2. 02 Arduino UNO + VS1053 MP3 board
  3. 03 Mecanum robot chassis
  4. 04 2× L298N motor drivers
  5. 05 4× 5 V DC motors
  6. 06 2S 18650 battery pack
  7. 07 4× HC-SR04 ultrasonic sensors
  8. 08 3-channel line tracking sensor
  9. 09 AHT10 temperature / humidity
  10. 10 Photoresistor and sound sensor
  11. 11 Buzzer and UV LED
  12. 12 IR receiver and IR transmitter LED
  13. 13 TEA5767 FM radio module (planned)

ESP32 pinout

MotorsPWMDir 1Dir 2
M0 (front)GPIO 5GPIO 16GPIO 17
M1 (front)GPIO 23GPIO 18GPIO 19
M2 (rear)GPIO 12GPIO 13GPIO 14
M3 (rear)GPIO 27GPIO 26GPIO 25
Sensors & outputsGPIO
Line follower L / M / R34 / 35 / 39
UV LED4
IR receiver (3.3 V)32
IR transmitter33
AHT10 SDA / SCL21 / 22
TEA5767 FM radio (planned)21 / 22, 0x60
UNO linkRX0 / TX0

UNO pinout

UltrasonicPin
TRIG (all four joined)A4
Front / right ECHOA0 / A1
Back / left ECHOA2 / A3
OtherPin
PhotoresistorA5
Sound sensorD5
BuzzerD10
ESP32 linkD0 / D1

The MP3 shield reserves D2–D4, D6–D9 and D11–D13. The boards talk over a 9600 baud UART on their hardware serial pins, so unplug the link before uploading to either board.

# UNO → ESP32: distances in cm, track, music state, light %, sound flag
F:23.4,L:10.1,B:45.0,R:8.3,MT:101,MS:1,LT:62,SND:0

# ESP32 → UNO
M:PLAY  M:NEXT  M:PREV  M:STOP  M:REPEAT  V:UP  V:DOWN  V:MUTE
BZ:SPD:<0-100>  BZ:MODE:<0-3>  BZ:UV:<0-2>  BZ:LOCK:<0|1>  BZ:DENIED

Common GND is non-negotiable. If the motors behave erratically or the sensors read 0, check the ground bridge between every module first.

Drive modes

Four ways to move

1 · Manual

Web, controller, Bluetooth

D-pad control from the web page, the Python controller or Bluetooth serial.

2 · Auto

Obstacle avoidance

Omnidirectional avoidance using all four ultrasonic sensors.

3 · Line

Line following

Follows a line with the 3-channel sensor.

4 · IR remote

Direct driving

Hold a D-pad direction to drive and let go to stop. Enter swaps left/right between strafing and turning.

The mode keys, music, volume and mute work in every mode. The D-pad and Enter only drive in IR remote mode, so they never fight the web driver or the autonomous logic. There's no key-up over IR, so a 250 ms gap with no repeat counts as “released”. The web page also has a motor lock (password 1234 by default). The button map is in ir_mapping.txt.

Voice

What NORA says

Her spoken lines, played from the MP3 shield's SD card: her modes, lock and UV (track200–track210), and her mind's phrase book (track211–track231), said from her own speaker when MIND mode drives her. Made with make_voice.bat (Windows text-to-speech + ffmpeg).

Connect

Flash and join her network

  1. Install the Arduino IDE with the ESP32 boards and the CH340 driver.
  2. ESP32 libraries: IRremote 4.x and Adafruit AHTX0. UNO libraries: SFEMP3Shield and SdFat from the SparkFun MP3 Player Shield library.
  3. For the ESP32, pick a bigger app partition under Tools → Partition Scheme: Huge APP (3MB No OTA/1MB SPIFFS) or Minimal SPIFFS (1.9MB APP with OTA).
  4. Flash scripts/esp32 and scripts/arduino with the serial link unplugged, reconnect it, power her on and join her WiFi.
SettingValue
WiFi SSIDNORA
Password12345678
Control pagehttp://192.168.4.1:5002
Fleet registryhttp://192.168.4.1:5000
BluetoothDevice NORA
$ pip install -r requirements.txt
$ python scripts/controller.py              # WiFi
$ python scripts/controller.py --bt COM7    # Bluetooth serial

Fleet IR link

NORA drives IDA, MILA, WHIP and KIDA-01 through her IR transmitter on GPIO 33: Samsung-format IR, one address per robot, the same commands 0x48–0x4F for all. Pick the robot with the panel's tabs (or Tab in the Python controller); its avatar, name and colour follow. Drive commands repeat every 150 ms while held; each robot stops by itself if the link goes quiet.

RobotAddressReceiver
IDA0x0DA1IDA.ino
MILA0x0DA2MILA.ino
WHIP0x0DA3esp32.ino
KIDA-010x0DA4arduino01 sketch
NIKA0x0DA5NIKA.ino
FromDriveStopObstacleManualSpeed
Web pageI K J Lbuttonbuttonbuttonbutton
Python controllerI K J LreleaseOPY
HTTP/link?r=mila&c=fwstopautomanualspeed
BluetoothT + robot I M W K + F B L R…S…O…W…X

Talking with the fleet

Every 30–90 s, when she isn’t driving anyone, NORA says something to IDA in Brainfuck: every phrase is a program that prints its words (hello is ++++++++[>+++++++++++++<-]>.+. → hi), beeped one tone per symbol. Once she’s finished she sends it over the link and IDA beeps her reply. RIFT has her chat with the other robots over WiFi too. A silent “I am here” beacon goes round the fleet in between, and IDA greets NORA when she comes back after a minute away. GET /talk returns the conversation log as JSON; /talk?r=ida&p=hello (or SAY HI on the panel) says one now. Phrases: 0x40 hello, 0x41 how are you, 0x42 happy, 0x43 curious, 0x44 sleepy, 0x45 let’s play, 0x46 bye, 0x47 “I am here” beacon (silent).

Connect through RIFT at the same address. Board docs: ACEBOTT ESP32 Max V1.0.

NORA on the floor
NORA

Who's nearby

ESP-NOW + Bluetooth LE: the robots sense each other

Every robot sends a small "I'm here" beacon twice a second. The signal strength says roughly how close each one is, and how it changes says whether it's coming closer, steady or leaving. Coarse, for "who's around": the ultrasonic and ToF sensors still do the precise avoiding.

Zones

Very close to far

Above −45 dBm very close, −60 near, −75 medium, below that far.

Talk

In Brainfuck

Over ESP-NOW each beacon carries a program that prints park, go, wait or hand; the receiver runs it. RIFT decodes them too.

Manners

Who makes way

A parked robot isn't the one moving; a yielding one is making way; a human-driven one gets space; otherwise the alphabet decides, and everyone makes way for MILA.

NORA hears the others over ESP-NOW (WHIP, MILA) and Bluetooth LE (WHIP and the Pi robots KIDA-00 / KIDA-01). In Auto mode she slows down while a robot is near and gives way when one with right of way is very close; in Line mode she waits on the line. GET /near shows her list.

Screens

The controllers

Captured without a robot connected, so live values show their offline state.

NORA's controller connection screen
Python controller (WiFi or Bluetooth)
NORA's web dashboard with distances, modes, music and drive pad
Web dashboard (served by the ESP32)

Windows app

A native window on NORA's page

It opens NORA's own hosted page in a window, so it always looks the same as the page. It remembers the address, and FIND looks on the fleet list of the network you're on. If NORA doesn't answer, it says so and lets you change the address.

STAY CLOSE: press STAY on RITA and she keeps near her, in your hand, stopping about a metre away. It's only been tested in simulation so far.

Her ESP32 page now looks like her Python controller, with a view of her from above.

Download NORA-Controller.exe

The DREAM Robotics ecosystem
Minds — DREAM companion · TINA engineer · NINA caretaker · RIFT fleet hub · LYCEA training school
Robots — NORA · MILA · WHIP · KIDA-00 · KIDA-01 · IDA · ARM · NIKA · ARIA · AURA weather · FLORA gardener
Remotes — RITA handheld remote