cleanyourtv-app
A community-built phone app for Clean Your TV: clean up an Android TV from your phone. No laptop, no coding agent, nothing uninstalled.
A tracked UNO + ESP8266 robot whose mind is a synthesizer.
Translation pending
OtherC++ · PythonGitHub @CursedProgramsOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
NIKA, Neural Instrument Kinetic Automaton: the robot that thinks in square waves. A tracked UNO + ESP8266 robot (MILA's sister) whose mind is a synthesizer: her drives are square-wave oscillators and the loudest is her thought, on the synth, her 16 RGB LEDs and an OLED. Part of the DREAM Robotics fleet.
Taken from the repository README
Loading the full README.
Read the full README ↗NIKA is MILA's sister: the same board, tracks, modes, remote and fleet link, with a 16-LED RGB array, a small OLED, an infrared obstacle sensor and a synthesizer for a brain. Her drives are oscillators, and the loudest one is her thought: you can hear her think.
Windows controller: builds/NIKA-Controller.exe shows NIKA's own web page in a window, so it always matches the page. Source: scripts/web_controller.
Colours: colour_scheme.xml comes from her avatar: a rust orange lead, with her LED purple and badge green beside it.
Other languages: scripts/controllers has this robot's controller in C#, F#, Rust, Go and Julia, all reading one robot.json: W A S D to drive, the mode buttons and the sensors. See its README for how to run each.
Session analysis and training data (Fortran): press CSV in her Python controller to save the session to Documents/NIKA-telemetry, in the same format as MILA's, plus the thought she was having and its pitch. scripts/run-fortran turns it into a report: timing, modes, sensor stats and close calls. scripts/run-dataset turns her human-driven sessions into a dataset for teaching her to drive herself. Needs gfortran.
Website: https://cursedprograms.github.io/NIKA-Robot-v00/
Four drives, each a square-wave frequency that follows what she senses. The highest one is her thought.
| Drive | Frequency | What moves it |
|---|---|---|
| calm | 196 Hz (G3) | always there, the hum underneath |
| curious | 220 to 660 Hz | rises the longer the way ahead stays open (over 30 s), and starts again low after something gets close |
| caution | 220 to 880 Hz | rises as something gets close (60 cm to 5 cm), 880 Hz when the IR sensor sees something |
| social | 523 Hz (C5), falling over 10 s | she heard NORA (her talk or "I'm here" beacon over the IR link): someone's near |
Her thought is heard, seen and acted on:
/status (thought, hz)./status carries rev, her settings in one number.0x0DA5), the drive PIN, Brainfuck talk, SCAN.NIKA AP when she's alone, the dashboard on :5013, the imposter radar, ESP-NOW beacons. Everyone makes way for her: like MILA's, her ESP8266 can't hear them.SND:<Hz>,<ms>), which serves them on GET /sound?since=<n> with her clock, so a chirp keeps its rhythm. Synthesised again on your side, not recorded: what you hear is what she played, not the room. Phones need the tap before they'll make a sound.| Part | Notes |
|---|---|
| UNO + WiFi R3 board (ATmega328P + ESP8266) | The same board as MILA, with its DIP switches |
| L298N motor driver + wooden tank chassis (like IDA's) | ENA / ENB on PWM pins 5 and 6 |
| HC-SR04 on a servo | Looks ahead and to both diagonals |
| IR obstacle sensor (FC-51 style) | Only on/off: LOW when something is within the range set by its pot |
| 16-LED RGB array (WS2812) | Brightness capped in code so it doesn't overload the board |
| SSD1306 128x32 OLED, SPI | The one from spi_screen_test |
| Synthesizer kit (XR2206-style function generator) | Square-wave jumper on; its frequency pot replaced by an MCP41010 digital pot (10 kΩ) |
| IR remote + receiver, buzzer |
| Sketch | Board (Tools > Board) | Needs |
|---|---|---|
scripts/NIKA | Arduino UNO | Libraries: IRremote (4.x), Servo, Adafruit NeoPixel, SSD1306Ascii |
scripts/esp8266 | Generic ESP8266 Module (Flash Size 4MB, FS 2MB OTA) | The esp8266 boards: add https://arduino.esp8266.com/stable/package_esp8266com_index.json under File > Preferences > Additional boards manager URLs |
The Python controller: pip install -r requirements.txt (pygame, requests), or run.bat / run.sh.
| Pin | Part | Pin | Part |
|---|---|---|---|
| D0 / D1 | ESP8266 serial (DIP 1 + 2) | D8 | Buzzer |
| D2 / D3 | HC-SR04 TRIG / ECHO | D9 / D10 | OLED DC / CS |
| D4, D7, D5 | L298N IN1, IN2, ENA (right) | D11 / D13 | OLED MOSI (SDA) / SCK (SCL), and the digital pot's |
| A2, A4, D6 | L298N IN3, IN4, ENB (left) | D12 | IR obstacle sensor OUT |
| A0 | RGB array data | A1 | Servo |
| A3 | IR remote receiver | A5 | Digital pot CS |
| OLED RST | the board's RESET pin |
Why: ENA and ENB need PWM, and on an UNO the Servo library takes Timer1 (no PWM on 9 and 10) and the buzzer and IR receiver take Timer2 (3 and 11). Pins 5 and 6 are the only PWM pins left, so the RGB array, which needs no PWM, is on A0.
Keyboard: web page and every desktop controller
| Key | Does |
|---|---|
| 1 / 2 / 3 | WASD / TANK / OBSTACLE mode |
| F | FOLLOW mode: she keeps your hand 30 cm from her sonar (Python controller; a button on her web page) |
| H / N | HELLO / DANCE, on the spot, in WASD or TANK (Python controller; buttons on her web page) |
| W / Up, S / Down | forward / back (WASD mode, hold) |
| A / Left, D / Right | turn left / right (WASD mode, hold) |
| W+A, W+D, S+A, S+D | curve: one track drives (Python controller; the stick too) |
| Python controller: driving in OBSTACLE takes over (WASD); she stops when you let go | |
| Q / A | left track forward / back (TANK mode, hold) |
| E / D | right track forward / back (TANK mode, hold) |
| Space | stop, in any mode (controllers; the STOP button too) |
| EMULATE / VOICE / THEME | Python controller: a pretend NIKA on this PC / her voice / colours |
| M | her MIND mode on / off: the LLM on this PC drives her (Python controller; x86 PC, GTX 1050+) |
| X | speed preset: 100, 75, 50, 25 % (web page) |
| L | listen: her thought and beeps play on your phone / PC (LISTEN on the web page; she has no speaker) |
| F1 | this window (Python controller; KEYS on the web page) |
| Esc | quit (controllers) |
| driving from the web page needs her PIN first (UNLOCK) |
Gamepad or joystick (ARM's flight stick works too)
| Key | Does |
|---|---|
| Left stick / D-pad | drive, half-way round curves (WASD mode; takes over from OBSTACLE) |
| LB / RB, right stick, twist | turn left / right (Python controller) |
| A (button 0) | stop (any mode) |
| B (1) / X (2) / Y (3) | OBSTACLE / WASD / TANK mode (Python controller) |
| Start (7) | speed + 25 % (Python controller) |
| C++, C# and F# controllers: stick or D-pad drive, triggers speed, A stops, bumpers change mode |
Her IR remote
| Key | Does |
|---|---|
| 1 / 2 / 3 | WASD / TANK / OBSTACLE mode |
| 4 / 5 / 6 | FOLLOW mode / HELLO / DANCE (codes guessed: 0x3, 0x4, 0x5) |
| Up / Down / Left / Right | drive (WASD mode, hold) |
| Red / Green | left track forward / back (TANK mode) |
| Yellow / Blue | right track forward / back (TANK mode) |
| OK | speed preset: 100, 75, 50, 25 % |
NORA's IR link (her web page, controller or Bluetooth)
| Key | Does |
|---|---|
| arrows / I J K L | drive |
| STOP | stop, and out of obstacle mode |
| AUTO / MANUAL | OBSTACLE / WASD mode |
| SPEED | speed preset |
| LOCK / UNLOCK | lock her wheels (nothing drives her) / free them |
| the same lock over WiFi: /motorlockOn, /motorlockOff?pw= (RIFT's Lock all / Unlock all) |
scripts/esp8266/secrets.example.h to secrets.h (the fleet's WiFi passwords and her PIN).scripts/NIKA to the UNO and scripts/esp8266 to the ESP8266 with the Arduino IDE, setting the DIP switches for each (as on MILA).SYNTH_K in NIKA.ino by ear, so each thought's Hz sounds right.NIKA. Open http://<her IP>:5013/, or run the controller:run.bat # Windows
./run.sh # Linux / macOS
python scripts/nika_controller.py --host <her IP> --port 5013
python scripts/nika_controller.py --emulate # a pretend NIKA on this PC (scripts/fake_nika.py), no robot
The controller (scripts/nika_controller.py):
/status says so.colour_scheme.xml (new: sampled from her
avatar: her rust jacket and autumn leaves, with her purple LEDs and circuit-green badge beside them).gamepad_drive.py). Her MIND log:
~/.robot_minds/logs/NIKA-<date>.log.Her /status has wifi_rssi (her signal, 0 while she hosts), which RITA's STATS shows. Her ESP8266 has no Bluetooth: Bluetooth controllers reach her through NORA's IR link.
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