Away, sort of, from radio things I have indulged myself with a robot arm kit, the meArm. But there is a tiny nagging thought at the back of my mind - that is to control a set of these arms by radio, maybe using the ubiquitous 433MHz RX TX modules, and make them dance in harmony, fun eh?
The meArm sitting on my desk
So far I have done a little bit of Arduino programming to try it out, and written a library file to keep some of the functions in.
CODE "meArm.h"
// mearm.h
// v 0.5 20-7-17
#include "Servo.h"
Servo arm, left, right, grip;
// arm deg max = max, home = mid point, left = min
#define ARMMAX 180
#define ARMHOME 98
#define ARMMIN 0
// right deg min = in, max = out
#define RIGHTMIN 90
#define RIGHTMAX 180
// left deg min = in, max = out
#define LEFTMIN 50
#define LEFTMAX 140
// grip close = in, open = out
#define GRIPIN 65
#define GRIPOUT 10
// ============= BEGIN =============
void armBegin() {
arm.attach(11);
right.attach(10);
left.attach(9);
grip.attach(6);
// start positions
arm.write(ARMHOME);
right.write(RIGHTMIN);
left.write(LEFTMIN);
grip.write(GRIPOUT);
}
// ============= ARM MOVEMENTS =============
// ARM steady move arm to pos 0-100 in ms steps
void armpos(int pos, int ms) {
int m, r;
pos = map(pos, 0, 100, ARMMIN, ARMMAX);
r = arm.read();
if (pos > r) {
for (m = r; m != pos; m += 1) {
arm.write(m);
delay(ms);
}
return;
}
else if (pos < r) {
for (m = r; m != pos; m -= 1) {
arm.write(m);
delay(ms);
}
}
return;
}
// LEFT steady move left to pos in ms steps
void leftpos(int pos, int ms) {
int m, r;
pos = map(pos, 0, 100, LEFTMIN, LEFTMAX);
r = arm.read();
if (pos > r) {
for (m = r; m != pos; m += 1) {
left.write(m);
delay(ms);
}
return;
}
else if (pos < r) {
for (m = r; m != pos; m -= 1) {
left.write(m);
delay(ms);
}
}
return;
}
// RIGHT steady move left to pos in ms steps
void rightpos(int pos, int ms) {
int m, r;
pos = map(pos, 0, 100, RIGHTMIN, RIGHTMAX);
r = arm.read();
if (pos > r) {
for (m = r; m != pos; m += 1) {
right.write(m);
delay(ms);
}
return;
}
else if (pos < r) {
for (m = r; m != pos; m -= 1) {
right.write(m);
delay(ms);
}
}
return;
}
// GRIP move open close in ms steps
void grippos(int pos, int ms) {
int m, r;
pos = map(pos, 0, 100, GRIPOUT, GRIPIN);
r = arm.read();
if (pos > r) {
for (m = r; m != pos; m += 1) {
grip.write(m);
delay(ms);
}
return;
}
else if (pos < r) {
for (m = r; m != pos; m -= 1) {
grip.write(m);
delay(ms);
}
}
return;
}
CODE FOR TESTING SERVOS
// move
// v0.5 20-7-17
// viewed from behind, range
// arm mid xx/98/xx
// right 80/xx/140
// left xx/xx/xx
#include "meArm.h"
void setup() {
armBegin(); // attach servos, goto start positions
delay(2000);
}
void loop() {
armpos(80, 50); // move to 80%, 50ms steps%
delay(5000);
armpos(20, 50); // move to 60% in 100 ms steps
delay(5000);
}
No comments:
Post a Comment