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

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.

Hardware

What she's built from

  1. 01 ESP32 (ACEBOTT QA007 Max controller board)
  2. 02 Arduino UNO + SparkFun MP3 Player Shield
  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

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
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.

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
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)

Voice

What NORA says

Her spoken lines, played from the MP3 shield's SD card (track200–track210). Made with make_voice.bat (Windows text-to-speech + ffmpeg).

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
Tools — CRUSH compression · Image-Generator · GloriosaAI · SynthWomb · PyVitals