3rd arm
Thanks ,it is becoming a real time and money pit but still fun all the same.
i have a bit of a problem though
i have to include a rather annoying offset variable to make the arm return to the same point each time
the off set is different for the pickup points A and B
although the program does work i am mistified why i need to include this offset in the first place ?
ill include the code below but i am guessing the root of the problem must lie in a wobbly lollypop stick
but i havent found it yet
this is the video of the code below working https://youtu.be/WclASes1hY8
//
// This one is for the THIRD wooden arm with 5 servos
// base shoulder elbow wrist claw
// side pick
// mar 2016
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
#define I2C_ADDR 0x27 // <<----- Add your address here. Find it from I2C Scanner
#define BACKLIGHT_PIN 3 // these are lcd pins
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
LiquidCrystal_I2C lcd(I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin);
Servo myservob; // base
Servo myservos; // shoulder
Servo myservoe; // elbow
Servo myservow; // wrist
Servo myservoc; // claw
int ledState = HIGH;
unsigned long previousMillis = 0;
int del = 600; // preset delay between moves
const int ledPin = 13;
void setup() {
Serial.begin(112500);
lcd.begin( 16, 2 );
lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
lcd.setBacklight(HIGH);// Switch on the backlight
lcd.clear();
lcd.home (); // go home
pinMode (ledPin , OUTPUT);// odd or even light
myservos.attach(6); // shoulder 30 - 150
// not pin (7)
myservoe.attach(8); // elbow 0 - 180
myservob.attach(9); // base 0 - 180
myservow.attach(10); // wrist 0 - 180
myservoc.attach(11); // claw 70 - 180 open
lcd.setCursor ( 0, 0); lcd.print(“Third Arm side pick Test”); Serial.println(“Third Arm side pick Test”); delay(del
2); // wait a bit
lcd.clear(); lcd.setCursor( 0, 0); lcd.print(“open close claw”); Serial.println(“open close claw”);
myservoc.write(70); delay(del); myservoc.write(0); delay(del); myservoc.write(70);
/ lcd.clear(); lcd.setCursor ( 0, 1); lcd.print(“start up routine”); Serial.println(“start up routine”); delay(del);
lcd.clear(); lcd.setCursor ( 0, 0); lcd.print(“base to pointA-B”); Serial.println(“Turn base to point A-B”);
myservob.write(0); delay(del); myservob.write(180); delay(del); myservob.write(90); delay(del);
lcd.setCursor ( 0, 1); lcd.print(“wave shoulder”); Serial.println(“wave shoulder”);
myservos.write(70); delay(del); myservos.write(120); delay(del); myservos.write(90); delay(del);
lcd.clear(); lcd.setCursor ( 0, 0); lcd.print(“wave elbow”); Serial.println(" wave elbow");
myservoe.write(50); delay(del); myservoe.write(120); delay(del); myservoe.write(60); delay(del);
lcd.setCursor( 0, 1); lcd.print(“wave wrist”); Serial.println(“wave wrist”);
myservow.write(180); delay(del); myservow.write(0); delay(del); myservow.write(90);
lcd.clear(); lcd.setCursor( 0, 0); lcd.print(“open close claw”); Serial.println(“open close claw”);
myservoc.write(180); delay(del); myservoc.write(0); delay(del); myservoc.write(100);
delay(del * 3);
/
}
void loop() {
digitalWrite(ledPin, ledState++);
int A = 20; // set points A and B
int B = 60;
int offset = 5; // A offset
int offset2= 9; // B offset
// side pick routine
lcd.clear(); lcd.setCursor ( 0, 0); lcd.print(“Side pick”); lcd.setCursor ( 0, 1); lcd.print(“routine”); Serial.println(“Begin side pickup”);
delay(del * 3);
//stand up
myservow.write(90); myservoe.write(90); myservos.write(90);
lcd.clear(); lcd.setCursor ( 0, 0); lcd.print(“turn to point A”); lcd.setCursor ( 0, 1); lcd.print(“and grab object”); Serial.println(“turn to point A and grab objec”);
myservob.write(A+(offset-3)); delay(del);
//A and pick
myservow.write(160); myservoe.write(150); myservos.write(50); delay(del); myservoc.write(180); delay(del); myservos.write(20); delay(del); myservow.write(150); delay(del); myservow.write(140); myservoc.write(70); delay(del);
//stand up
myservow.write(90); myservoe.write(70); myservos.write(90);
//B and drop
lcd.clear(); lcd.setCursor ( 0, 0); lcd.print(“turn to point B”); lcd.setCursor ( 0, 1); lcd.print(“and drop object”); Serial.println(“turn to point B and drop objec”);
delay(del); myservob.write(B); delay(del);
myservow.write(160); myservoe.write(150); myservos.write(50); delay(del); myservos.write(20); delay(del); myservow.write(150); delay(del); myservoc.write(180); delay(del); myservow.write(180); delay(del);
//stand up
myservow.write(90); myservoe.write(70); myservos.write(90);
//sleep
lcd.clear(); lcd.setCursor ( 0, 0); lcd.print(“rest”); lcd.setCursor ( 0, 1); lcd.print(“for a second”); Serial.println(“rest for a second”); delay(del);
myservob.write(180); myservos.write(160); myservoe.write(180); myservow.write(70); myservoc.write(70); myservow.write(40); delay(del);
//stand up
myservow.write(90); myservoe.write(70); myservos.write(90);
lcd.clear(); lcd.setCursor ( 0, 0); lcd.print(“turn to point B”); lcd.setCursor ( 0, 1); lcd.print(“and grab object”); Serial.println(“turn to point B and grab objec”);
delay(del); myservob.write(B-offset2); delay(del);
myservow.write(160); myservoe.write(150); myservos.write(50); delay(del); myservoc.write(180); delay(del); myservos.write(20); delay(del); myservow.write(150); delay(del); myservow.write(140); myservoc.write(70); delay(del);
//stand up
myservow.write(90); myservoe.write(70); myservos.write(90);
lcd.clear(); lcd.setCursor ( 0, 0); lcd.print(“turn to point A”); lcd.setCursor ( 0, 1); lcd.print(“and drop object”); Serial.println(“turn to point A and drop objec”);
delay(del); myservob.write(A+offset); delay(del);
myservow.write(160); myservoe.write(150); myservos.write(50); delay(del); myservos.write(20); delay(del); myservow.write(150); delay(del); myservoc.write(180); delay(del); myservow.write(180); delay(del);
//stand up
myservow.write(90); myservoe.write(70); myservos.write(90);
lcd.clear(); lcd.setCursor ( 0, 0); lcd.print(“goto sleep”); lcd.setCursor ( 0, 1); lcd.print(“goodbye”); Serial.println(“goto sleep goodbye”); delay(del);
myservob.write(180); myservos.write(160); myservoe.write(180); myservow.write(70); myservoc.write(70); myservow.write(40); delay(del);
// **************** pretty handy press any key to continue …
lcd.clear(); lcd.setCursor ( 0, 0); lcd.print(“await key press”); Serial.println(F("\nPress any key / ENTER to continue"));
while (Serial.available() && Serial.read()); // empty buffer
while (!Serial.available()); // wait for data
while (Serial.available() && Serial.read()); // empty buffer again
lcd.clear(); lcd.setCursor ( 0, 0); lcd.print("** key presed
"); Serial.println(" key pressed ***");
delay (500);
Serial.println(“main routine starting”);
} // end of sequence return to begining