All things moose, and, then some.
RSS icon Email icon Home icon
  • Arduino controlled arm

    Controlling 3 motors with an Arduino board.

    I dug out an old robot arm kit that I had built a long time ago. It was originally operated by push buttons for each motor with a slide switch to reverse the polarity of the current and thus the direction of the motor.

    With an Arduino module, a couple of H-bridge chips, and a bit of surfing for ideas, I managed to automate it to drop a washer in a small container. The main idea comes from this page page, which describes how to hook up and control one motor. Learning to control two motors is largely inspired by this diagram.

    Here it is in action. I had bigger plans for what it would do, but, it is after all, just a cheap kit with plastic parts. The jaws barely have enough grip to hold a small washer. It is a good proof of concept for controlling multiple motors with a single arduino board.




    Wiring code for robot arm

    int motor1Pin1 = 3;    // H-bridge leg 1
    int motor1Pin2 = 4;    // H-bridge leg 2
    int motor1SpeedPin = 9;     // H-bridge enable pin
    int motor2Pin1 = 5;
    int motor2Pin2 = 6;
    int motor2SpeedPin = 10;
    int motor3Pin1 = 7;
    int motor3Pin2 = 8;
    int motor3SpeedPin = 11;

    int ledPin = 13;      //LED

    void setup() {
    // set all the other pins you’re using as outputs:
    pinMode(motor1Pin1, OUTPUT);
    pinMode(motor1Pin2, OUTPUT);
    pinMode(motor1SpeedPin, OUTPUT);
    pinMode(motor2Pin1, OUTPUT);
    pinMode(motor2Pin2, OUTPUT);
    pinMode(motor2SpeedPin, OUTPUT);
    pinMode(motor3Pin1, OUTPUT);
    pinMode(motor3Pin2, OUTPUT);
    pinMode(motor3SpeedPin, OUTPUT);

    pinMode(ledPin, OUTPUT);

    // set speedPin high so that motor can turn on:
    digitalWrite(motor1SpeedPin, HIGH);
    digitalWrite(motor2SpeedPin, HIGH);
    digitalWrite(motor3SpeedPin, HIGH);

    // blink the LED 3 times. This should happen only once.
    // if you see the LED blink three times, it means that the module
    // reset itself,. probably because the motor caused a brownout
    // or a short.
    blink(ledPin, 3, 100);
    }

    void loop() {
    delay(5000);
    digitalWrite(motor2Pin1, HIGH);  // Arm up
    digitalWrite(motor2Pin2, LOW);   //
    delay(1000);
    digitalWrite(motor2Pin1, LOW);
    delay(500);

    digitalWrite(motor3Pin1, LOW);   // Arm left
    digitalWrite(motor3Pin2, HIGH);  //
    delay(2500);
    digitalWrite(motor3Pin2, LOW);
    delay(500);

    digitalWrite(motor2Pin1, LOW);  // Arm down
    digitalWrite(motor2Pin2, HIGH);   //
    delay(1100);
    digitalWrite(motor2Pin2, LOW);
    delay(500);

    digitalWrite(motor1Pin1, HIGH);  // open jaws
    digitalWrite(motor1Pin2, LOW);   //
    delay(4000);
    digitalWrite(motor1Pin1, LOW);
    delay(500);

    digitalWrite(motor2Pin1, HIGH);  // Arm up
    digitalWrite(motor2Pin2, LOW);   //
    delay(1000);
    digitalWrite(motor2Pin1, LOW);
    delay(500);

    digitalWrite(motor3Pin1, HIGH);  // Arm right
    digitalWrite(motor3Pin2, LOW);   //
    delay(2000);
    digitalWrite(motor3Pin1, LOW);
    delay(500);

    digitalWrite(motor2Pin1, LOW);  // Arm down
    digitalWrite(motor2Pin2, HIGH);   //
    delay(1100);
    digitalWrite(motor2Pin2, LOW);
    delay(500);
    }

    /*
    blinks an LED
    */

    void blink(int whatPin, int howManyTimes, int milliSecs) {
    int i = 0;
    for ( i = 0; i < howManyTimes; i++) {
    digitalWrite(whatPin, HIGH);
    delay(milliSecs/2);
    digitalWrite(whatPin, LOW);
    delay(milliSecs/2);
    }
    }