A wireless, joystick-controlled plant pot that drives itself toward the light — no more manually repositioning your plants to chase the sun (could also act as a covert spy camera mount). Built as a final project for EE-14 Embedded Systems at Tufts.
Team: Natalie Phua, Rakshi Rangaprasad, Daniel Yeo, Sabine Dinovo
A two-board wireless control system: a handheld transmitter reads joystick input and sends it over radio to a receiver board inside the pot, which drives two motors to move the pot in that direction.
- Transmitter — reads joystick position via ADC, transmits over nRF24L01
- Receiver — receives joystick data, converts it to differential-drive motor commands, outputs PWM to the motor driver
The pot body is laser-cut wood with wheels hidden under the rim; the "plants" are handmade colored craft paper.
- MCU: STM32L432KC (Nucleo-32), programmed bare-metal via CMSIS
- Wireless: nRF24L01 transceiver (SPI); one per board
- Input: Analog joystick (2-axis, read via ADC)
- Motor driver: DRV8835 dual motor driver
- Drive: 2x DC motor + wheel, PWM-controlled, differential steering
- Power: Battery pack (receiver side)
- Enclosure: Laser-cut wood pot with wheels hidden under the rim
Built with PlatformIO, targeting the nucleo_l432kc board.
src/
main.c # transmitter logic (active); receiver logic included below, commented out
adc.c # joystick ADC reads
gpio.c # pin config/control
nrf.c # nRF24L01 driver (SPI-based radio tx/rx)
spi.c # SPI peripheral driver
timer.c # PWM generation for motor control
serial.c # UART for debug output
delay.c # busy-wait timing
include/
ee14lib.h # shared hardware abstraction layer used across drivers
Control flow: transmitter polls joystick ADC → sends via NRF24_Transmit → receiver picks up via NRF24_Receive → converts to left/right wheel PWM (differential steering, with deadzone) → drives motors.
main.c contains both main() functions — receiver is commented out below the active transmitter code. Toggle between them depending on which board you're flashing.
- Install PlatformIO
- Clone the repo and open it in PlatformIO
- In
src/main.c, uncomment themain()for the board you're flashing (transmitter or receiver) - Build and upload to each Nucleo-L432KC board