Pluto ClawBot
A Pick and Drop Rover
Intro
This project is a two-wheeled rover built for the purpose of picking up small objects from one location and dropping them at another. The rover uses two wheels driven independently by servo motors for movement, with a castor wheel mounted at the front for balance and to allow smooth, low-friction turning. A mini robotic claw (Miniclaw) is mounted on the chassis to grip and release objects. The entire system is controlled using the Pluto X2 board by Drona Aviation, which acts as the brain of the rover, processing joystick commands and driving the actuators accordingly.
Theory
The rover works on the principle of differential drive, where the two wheels can be controlled independently to move forward, backward, or turn in place, while the front castor wheel simply pivots and follows without needing separate control. Instead of varying motor speed for control, the RPM of both wheel motors is fixed in code, and steering is achieved purely through directional logic driven by joystick input. The MiniClaw operates on a simple gripper mechanism, where a servo motor rotates a linkage to open and close the claw, allowing it to hold and release objects. The Pluto X2 board, though originally designed as a flight controller for drones, is repurposed here to read joystick (pitch/roll) input as well as the throttle input and generate the corresponding PWM (Pulse Width Modulation) signals for the wheel and gripper servos.
Controls
(A) Rover Controls Overview
- Left Joystick: Speed & Claw
- Throttle (Y-Axis): Sets overall motor speed (1000–2000 range).
- Yaw (X-Axis): Controls the claw. Push left (<1200) to close/grip; push right (>1800) to open/release.
- Right Joystick: Movement
- Pitch (Y-Axis): Drives forward/backward at the set throttle speed.
- Roll (X-Axis): Turns left/right using differential motor speeds.
- Note: A front castor wheel passively swivels to support all turns.
Get Annsh Shah’s stories in your inbox
Join Medium for free to get updates from this writer.
(B) Operation Sequence (Pick-and-Drop)
- Drive to the object using the right joystick.
- Close the claw around the object using left joystick yaw.
- Drive to the destination using the right joystick.
- Open the claw to release the object using left joystick yaw.
Code
The code is written for the Pluto X2 board and primarily involves initializing the motor and claw servo control pins, and continuously reading four joystick channels: throttle, yaw, pitch, and roll. The throttle value (1000–2000) sets the base speed for the wheel motors, while pitch and roll values determine the direction forward, backward, left turn, or right turn via pre-defined movement functions that apply the throttle-based speed accordingly. The yaw value is checked against two threshold conditions: if yaw is less than 1200, a claw-close function is called; if yaw is greater than 1800, a claw-open function is called; values between 1200 and 1800 leave the claw in its current state. A simple loop continuously reads all four channels and calls the appropriate movement and claw functions in response.
#include "PlutoPilot.h"
void CLAW() {
if (RcData_Get(RC_YAW) > 1800) {
Servo_Write(PWM_1,1000);
}else if (RcData_Get(RC_YAW) < 1200) {
Servo_Write(PWM_1,1700);
}
}
void onLoopStartAutoInsertion() {
Set_LED(STATUS, OFF);
}
void onLoopStopAutoInsertion() {
Set_LED(STATUS, ON);
}
void plutoInit() {
Motor_Init(M1);;
Motor_Init(M2);;
Peripheral_Init(PWM_1);
setUserLoopFrequency(100);
}
void plutoRxConfig(void) {
// Receiver mode: Uncomment one line for ESP or PPM setup.
Receiver_Mode(Rx_ESP); // Receiver mode for PrimusX2 / V5
}
void onLoopFinish() {
Motor_Set(M1, 1000);
Motor_SetDir(M1, CLOCK_WISE);
Motor_Set(M2, 1000);
Motor_SetDir(M2, CLOCK_WISE);
Set_LED(RED,OFF);
Set_LED(GREEN,OFF);
Set_LED(BLUE,OFF);
onLoopStopAutoInsertion();
}
void onLoopStart () {
onLoopStartAutoInsertion();
Set_LED(RED,ON);
Set_LED(BLUE,ON);
Set_LED(GREEN,ON);
}
void plutoLoop () {
if (RcData_Get(RC_PITCH) > 1550 && (RcData_Get(RC_ROLL) < 1650 && RcData_Get(RC_ROLL) > 1350)) {
Motor_Set(M1, RcData_Get(RC_THROTTLE));
Motor_SetDir(M1, CLOCK_WISE);
Motor_Set(M2, RcData_Get(RC_THROTTLE));
Motor_SetDir(M2, CLOCK_WISE);
CLAW();
}else if (RcData_Get(RC_PITCH) < 1450 && (RcData_Get(RC_ROLL) < 1650 && RcData_Get(RC_ROLL) > 1350)) {
Motor_Set(M1, RcData_Get(RC_THROTTLE));
Motor_SetDir(M1, ANTICLOCK_WISE);
Motor_Set(M2, RcData_Get(RC_THROTTLE));
Motor_SetDir(M2, ANTICLOCK_WISE);
CLAW();
}else if (RcData_Get(RC_PITCH) > 1550 && RcData_Get(RC_ROLL) > 1650) {
Motor_Set(M1, RcData_Get(RC_THROTTLE));
Motor_SetDir(M1, CLOCK_WISE);
Motor_Set(M2, ((((RcData_Get(RC_THROTTLE) - 1000)) / 2) + 1000));
Motor_SetDir(M2, CLOCK_WISE);
CLAW();
}else if (RcData_Get(RC_PITCH) > 1550 && RcData_Get(RC_ROLL) < 1350) {
Motor_Set(M1, ((((RcData_Get(RC_THROTTLE) - 1000)) / 2) + 1000));
Motor_SetDir(M1, CLOCK_WISE);
Motor_Set(M2, RcData_Get(RC_THROTTLE));
Motor_SetDir(M2, CLOCK_WISE);
CLAW();
}else if (RcData_Get(RC_PITCH) < 1450 && RcData_Get(RC_ROLL) > 1650) {
Motor_Set(M1, RcData_Get(RC_THROTTLE));
Motor_SetDir(M1, ANTICLOCK_WISE);
Motor_Set(M2, ((((RcData_Get(RC_THROTTLE) - 1000)) / 2) + 1000));
Motor_SetDir(M2, ANTICLOCK_WISE);
CLAW();
}else if (RcData_Get(RC_PITCH) < 1450 && RcData_Get(RC_ROLL) < 1350) {
Motor_Set(M1, ((((RcData_Get(RC_THROTTLE) - 1000)) / 2) + 1000));
Motor_SetDir(M1, ANTICLOCK_WISE);
Motor_Set(M2, RcData_Get(RC_THROTTLE));
Motor_SetDir(M2, ANTICLOCK_WISE);
CLAW();
}else if (RcData_Get(RC_PITCH) < 1550 && RcData_Get(RC_PITCH) > 1450) {
Motor_Set(M1, 1000);
Motor_SetDir(M1, ANTICLOCK_WISE);
Motor_Set(M2, 1000);
Motor_SetDir(M2, ANTICLOCK_WISE);
CLAW();
}
}Key Learning
This project provided hands-on experience in working with servo motor control and PWM signal generation. It also helped in understanding how a flight controller board like Pluto X2 can be adapted for a non-flying, ground-based application, showing the flexibility of embedded control boards. Additionally, the project reinforced concepts of differential drive mechanics, basic robotic gripping mechanisms, and coordinating multiple actuators to perform a sequential task.
Future Scope
The rover can be enhanced by adding sensors such as ultrasonic or infrared modules for obstacle detection and autonomous navigation, reducing dependence on manual control. Object detection using a camera module could allow the rover to automatically identify and pick up objects rather than relying on manual positioning. The rover could also be scaled up with more powerful motors and a larger claw mechanism to handle heavier or bigger objects, making it suitable for practical warehouse or logistics applications.







