Product

CR Hand

2,000 USD

Free shipping.  

It will be shipped approximately 2-4 weeks after placing your order.




The CR Hand is a truly human-sized robotic hand with 6 degrees of freedom. The distance from the wrist mounting surface to the fingertips is only 172 mm. All motors and the control box are integrated into this compact design, making it ready to operate as soon as you connect a USB cable and power supply. By utilizing high-precision FDM 3D printing, we have achieved an affordable price. It is ideal for educational and research purposes.

 <Main Features>

Diverse movements with 13 joints and 6 motors.

Capable of precise pinching and powerful grasping.

Joints with built-in springs enable flexible interaction and help avoid damage during collisions.

The fingertips are detachable with M2 screws, allowing various sensors and materials to be attached for versatile use.

 <Specifications>

<Approximate dimensions / Wrist mounting dimensions>

<Fingertip mounting dimensions>

For quotes, orders, or any other inquiries, please contact us at admin@curious-robotics.com

The following is technical information.

<How to use>

1. Using the GUI  

You can use the Maestro Control Center by downloading Pololu’s driver and software. The Maestro Control Center is an intuitive tool for operating and configuring the robotic hand. Its key features include:


- Real-time control: Each motor can be controlled individually, and you can adjust motor positions simply by dragging the sliders.

- Cross-platform compatibility: Supports both Windows and Linux.

- Script creation and execution: The built-in script editor allows you to create, edit, and execute scripts directly. This enables automation and customization of movements.

- Motion recording and playback: You can record motor movements as sequences and replay them. This makes it easy to create and modify complex motion patterns.


These features allow for intuitive and efficient configuration and control of the CR Hand.

2. Using with a Program  

The built-in control board, Pololu Micro Maestro 6-Channel USB Servo Controller, supports serial communication, allowing you to control the CR Hand using programming languages such as Python.  

Before using serial communication, make sure to set the Serial mode to "USB Dual Port" in the Serial Settings of the Maestro Control Center as mentioned earlier.

The following is an example of using Processing to control the hand's posture via keyboard input.

import processing.serial.*;


// Serial object

Serial myPort;


// Define servo positions to be set when each key ('1' to '7') is pressed

// Index: 0-6 corresponds to Ch0-Ch5

// Example: scenarios[0] represents the servo positions when key '1' is pressed

int[][] scenarios = {

  {4000, 4000, 4000, 4000, 4000, 4000}, // '1' Open

  {8000, 7000, 4000, 8000, 8000, 8000}, // '2' Pinch_open

  {8000, 7000, 6000, 8000, 8000, 8000}, // '3' Pinch_close

  {8000, 4000, 4000, 4000, 4000, 4000}, // '4' Grasp_open

  {8000, 6000, 8000, 8000, 8000, 8000}, // '5' Grasp_close

  {4000, 4000, 8000, 8000, 8000, 8000}, // '6' Thumb_pinch_open

  {4000, 8000, 8000, 8000, 8000, 8000}  // '7' Thumb_pinch_close

};


void setup() {

  size(400, 200);

  

  // Display available serial ports (for debugging)

  println(Serial.list());

  

  // Connect to the Maestro Command Port (change the port name as needed)

  myPort = new Serial(this, "COM4", 9600);

  println("Connected to COM4");

  

  // Set the initial state, for example, to the position for key '1'

  setAllServos(scenarios[0]);

}


void draw() {

  // No processing required

}


// Called when a key is pressed

void keyPressed() {

  // Check if the key is between '1' and '7'

  if (key >= '1' && key <= '7') {

    int index = key - '1'; // Calculate: '1' corresponds to 0, '2' to 1, and so on

    if (index >= 0 && index < scenarios.length) {

      // Set the servo positions defined in scenarios[index]

      setAllServos(scenarios[index]);

    }

  }

}


// Function to set positions for all servos (Ch0 to Ch5)

void setAllServos(int[] positions) {

  for (int ch = 0; ch < 6; ch++) {

    setServoPosition(ch, positions[ch]);

  }

}


// Function to set a servo position

void setServoPosition(int channel, int target) {

  byte[] command = new byte[4];

  command[0] = (byte)0x84;  // Servo position setting command (0x84)

  command[1] = (byte)channel;

  command[2] = (byte)(target & 0x7F);        // Lower 7 bits

  command[3] = (byte)((target >> 7) & 0x7F); // Upper 7 bits


  println("Sending command to Ch" + channel + ": " 

          + hex(command[0]) + " " 

          + hex(command[1]) + " " 

          + hex(command[2]) + " " 

          + hex(command[3]));

  println("Target: " + target + " (" + (target * 0.25) + "µs)");


  myPort.write(command);

}