Bribro12
Published © CC BY-NC-ND

3D-printable strain wave gearbox - harmonic drive

3D-printed strain wave gearbox strong enough to pull a car forwards.

IntermediateShowcase (no instructions)Over 1 day499
3D-printable strain wave gearbox - harmonic drive

Things used in this project

Hardware components

Arduino Nano
×1
3D-printed parts
×1
6004-2RS bearing 20 x 42 x 12 mm
×1
606ZZ bearing 6 x 17 x 6 mm
×1
MF105 ZZ bearing 5 x 10 x 4 mm
×1
Wood screws 4.5 x 30 mm
×1
Aluminum tube 100 x 10 x 2 mm
×1
Aluminum shaft 50 x 6 mm
×1
Aluminum shaft 60 x 5 mm
×1
775 motor 12-24 VDC
×1
GT2 Timing belt 6mm 188
×1
GT2 pulley 5mm 16 teeth
×1
GT2 pulley 5mm 36 teeth
×1

Hand tools and fabrication machines

Tools used for this project

Story

Read more

Code

Speed controller Arduino code

Arduino
/*
Arduino Code for the "strain wave gearbox brushed motor controller PCB" designed and developed by brian brocken.
*/
 
int SENSOR_PIN = A2;  // Potentiometer signal, Arduino pin A2
 
int RPWM_Output = 6;  // Right PWM output, Arduino pin 6
int LPWM_Output = 5;  // Left PWM output, Arduino pin 5
int Ren = 9;          // Right Enable, Arduino pin 9
int Len = 10;         // Left Enable, Arduino pin 10

int BlueLed = 2;      // Blue LED, Arduino pin 2
int GreenLed = 3;     // Green LED, Arduino pin 3
int RedLed = 4;       // Red LED, Arduino Pin 4
 
void setup()   //This code only runs once during startup
{
  pinMode(RPWM_Output, OUTPUT);   // Set RPWM as OUTPUT
  pinMode(LPWM_Output, OUTPUT);   // Set LPWM as OUTPUT
  pinMode(Ren, OUTPUT);           // Set Ren as OUTPUT
  pinMode(Len, OUTPUT);           // Set Len as OUTPUT

  pinMode(BlueLed, OUTPUT);       // Set BlueLed as OUTPUT
  pinMode(GreenLed, OUTPUT);      // Set GreenLed as OUTPUT
  pinMode(RedLed, OUTPUT);        // Set RedLed as OUTPUT
  
  digitalWrite(Ren, HIGH);        // Set Ren HIGH
  digitalWrite(Len, HIGH);        // Set Len HIGH

  //Serial.begin(9600);           //Uncomment to use serial monitor
}
 
void loop()
{
  int sensorValue = analogRead(SENSOR_PIN);
 
  // sensor value is in the range 0 to 1023
  // the lower half is used for reverse rotation; the upper half for forward rotation
  if (sensorValue < 512)
  {
    // reverse rotation
    int reversePWM = -(sensorValue - 511) / 2;
    digitalWrite(Ren, HIGH);
    analogWrite(LPWM_Output, 0);
    analogWrite(RPWM_Output, reversePWM);
  }
  else
  {
    // forward rotation
    int forwardPWM = (sensorValue - 512) / 2;
    digitalWrite(Len, HIGH);
    analogWrite(LPWM_Output, forwardPWM);
    analogWrite(RPWM_Output, 0);
  }

  if (sensorValue < 514 and sensorValue > 510)
  {
    digitalWrite(GreenLed, HIGH);
    digitalWrite(RedLed, LOW);
  }
  else
  {
    digitalWrite(GreenLed, LOW);
    digitalWrite(RedLed, HIGH);
  }
  //Serial.println(sensorValue);  //uncomment to use serial monitor
}

Credits

Bribro12

Bribro12

25 projects • 26 followers
I'm a maker. I design and create my own projects and build them from scratch. My favorite tools are my 3D-printer and laser cutter

Comments