General purpose remote controlled mobile robot

Robot on a tank chassis with a manipulator and FPV camera.

Public Chat
Similar projects worth following
A remotely controlled robot with a manipulator that can pick up small items and put them into a box on top. FPV camera installed on it broadcasts video to the phone via WIFI in real time.

The rear-mounted ultrasonic rangefinder is used to detect dangerous elevation changes when driving backward. If a cliff is detected the movement backwards is blocked.

The two temperature sensors located inside and outside the case are actually useless, but they just measure the temperature.

The RC can control the movement of the robot, its arm, lighting LED and the buzzer inside the robot.

The remote control display shows data on the state of the remote control controls, the battery charge of the robot and the batteries of the remote control, the temperature inside and outside the robot, data on the presence of a cliff or obstacle behind the robot, the state of communication and the selected radio frequency channel.

The robot is made using STM32F103C8T6 microcontroller development board, and the RC has STM8S105K4T6.

The PCBs for both devices are made using the toner transfer method.

The detection of cliffs and obstacles is carried out by the HC-SR04 ultrasonic rangefinder. The robot also can detect it's failure.

The robot has a buzzer to be able to make sound. It can be used in testing purposes and for determining robot location if you can't see him.

The robot has 2 accumulators:

  • One for powering the MCU, sensors, radio module and camera;
  • And another for powering chassis motors, servo motors of the manipulator and the lighting LED.

The battery charge level measurement on both devices is implemented using voltage dividers.

The FPV camera is not connected to robot circuit, it is just powered from it's accumulator through a DC-DC step-down converter.

Radio communication is made using NRF24L01+ transceivers, so I wrote (during the process of software support) a library for them:

As mentioned in the description the robot has 2 temperature sensors (DS18B20), so I wrote a library for them too:

And for Nokia 5110 LCD display used in the remote control:

The robot software uses FreeRTOS with CMSIS-RTOS wrapper (unfortunately STM32CubeIDE doesn't allow user to remove that wrapper). The remote control uses the STM8S_StdPeriph_Driver library patched to work with SDCC.

I used STM32CubeIDE for programming robot, and SDCC for programming RC.

The old video demonstration:

General demonstration:

FPV view demo:

Adobe Portable Document Format - 56.90 kB - 10/09/2020 at 12:24


Adobe Portable Document Format - 79.29 kB - 10/09/2020 at 12:23


Adobe Portable Document Format - 206.01 kB - 10/09/2020 at 12:21


Adobe Portable Document Format - 87.30 kB - 10/09/2020 at 12:21


  • Improving the grip of the manipulator with objects.

    Danya0x0710/19/2020 at 21:46 0 comments

    Adding coarse plates to a manipulator increases the friction between the manipulator and the object it is holding. Why didn't I think about it right away?

  • An invisible bug found and fixed in the RC software!

    Danya0x0710/16/2020 at 12:43 0 comments

    The bug was in the button checking code and was causing the debounce filter to work every cycle of infinite loop.

    bool button_pressed(button_t *btn)
        bool pressed = FALSE;
        BitStatus current_status = !!GPIO_ReadInputPin(btn->gport, btn->gpin);
        if (btn->_last_status != current_status) {
            current_status = GPIO_ReadInputPin(btn->gport, btn->gpin);

    There is a typo here that gets compiled and causes an increase in the response time of the remote by 30 ms (6 buttons, 5 ms for debouncing). The GPIO_ReadInputPin() function returns not a bool value, but a bitmask, i.e. 0 if logic level on the pin is low and (1 << pin) if the logic level on the pin is high.

    So the right code looks like that:

    bool button_pressed(button_t *btn)
        bool pressed = FALSE;
        BitStatus current_status = !!GPIO_ReadInputPin(btn->gport, btn->gpin);
        if (btn->_last_status != current_status) {
            // Forgot to normalize to 0..1
            current_status = !!GPIO_ReadInputPin(btn->gport, btn->gpin);

  • DUMRONv2 demonstration

    Danya0x0710/09/2020 at 17:22 0 comments


    FPV photos:

    Old view

    New view

    FPV Videos:

  • DUMRONv2.0 released

    Danya0x0710/09/2020 at 15:25 0 comments

    A huge update for robot and RC is just released. I was working on it since summer (but not only on it of course).

    Hardware update:

    An extension board added. The board provides an easy way to connect different modules to power lines with different voltage and data interface lines (SPI, I2C, 1-Wire) without soldering.

    The extension board is just below and to the right of the middle of the photo.

    FPV Camera has been moved to a place with a better view. So, the robot has become a little more compact.
    FPV Camera has been attached to the frame to which the manipulator is attached.

    Powerful lighting LED instead of 4 green LEDs which actually don't provide enough light to make the camera see anything in the darkness.

    1W lighting LED.

    Small constructive improvements to the remote control case. No impressing photos.

    Software update:

    of robot: (in Russian)

    • Refactoring names and CodeStyle, how can we do without it!)
    • Moving the code for interaction with NRF24L01 + and DS18B20 into separate, cross-platform super-duper libraries with documentation, examples and other benefits of humanity;
    • The DS18B20 library implements checksum verification, so the heresy about temperature no longer comes to the RC.
    • Added power-on self test;
    • Added debug logs to UART and runtime errors indication;
    • Detected and fixed a stack overflow in one of the tasks;
    • Various local optimizations (eg. uint8_t -> uint_fast8_t);
    • Battery charge measurement now works not "head-on", but through DMA;
    • Optimized manipulator control, now, when it does not move, its software timer does not spin idle, but stopped;
    • The communication protocol with the RC has been rethought and optimized, the encapsulation of data from the rear rangefinder has been improved.
    • Added detection of mechanical failure of the rear rangefinder;
    • Migration to CMSIS-RTOS APIv2;
    • Added the ability to change the radio frequency channel by command from the RC.

    of remote control: (in Russian)

    • Migration to the PlatformIO build system;
    • Moving the Nokia display Interaction code into a standalone PCD8544 cross-platform library;
    • Added energy saving measures (redundant microcontroller subsystems are disabled);
    • Added scanning of the radio frequency range after power on and switching the RC and the robot to the new selected clear channel;
    • GUI updated and improved;
    • Refactoring and optimization of various kinds;

View all 4 project logs

Enjoy this project?



Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates