Robotarm från en skrivbordslampa (IKEA Tertial hacka) (6 / 7 steg)
Steg 6: Programvara (Arduino skiss)
Arduino koden har två funktioner:
- Spela in de analoga ingångarna från servon potentiometrar (inspelningsknappen)
- Driva servon med inspelade värden (PLAY-knappen)
Anteckningar:
- De inspelade värdena lagras i EEPROM minnet av Arduino - begränsar inspelningen (lägga till SD-kort kommer att lösa det).
- Skissen uppmanas de inspelade värdena och de spelade, i realtid, till seriell bildskärmen, men detta behövs inte att arbeta för skissen.
- Bra tutorial för analoga feedback servo kan hittas här
The Arduino skiss:
Hämta Arduino skiss
(http://www.KeerBot.com)
Exempelkod för inspelning och uppspelning servo rörelse med en analog feedback servo
5 Dec2013, med hjälp av manuellt hacka servon
#include < Servo.h >
#include < EEPROM.h >
#define CALIB_MAX 512
#define CALIB_MIN 100
#define SAMPLE_DELAY 25 / / i ms, 50 ms verkar bra
uint8_t recordButtonPin = 12;
uint8_t playButtonPin = 7.
uint8_t en = 9, två = 10, tre = 11;
uint8_t OneIn = A0, TwoIn = A1, ThreeIn = A2;
uint8_t ledPin = 13.
Servo myServo1, myServo2, myServo3;
void setup() {
Serial.BEGIN(9600);
pinMode (recordButtonPin, ingång);
digitalWrite (recordButtonPin, hög);
pinMode (playButtonPin, ingång);
digitalWrite (playButtonPin, hög);
pinMode (ledPin, produktionen);
uint16_t addr = 0;
Serial.println ("Servo RecordPlay, 3 servon version");
Serial.println ("av http://www.KeerBot.com");
}
void loop() {
om (! digitalRead(recordButtonPin)) {
Delay(10);
vänta för utgiven
medan (! digitalRead(recordButtonPin));
Delay(20);
OK ut!
Serial.println("Recording");
uint16_t addr = 0;
digitalWrite (ledPin, hög);
pinMode (OneIn, indata);
pinMode (TwoIn, indata);
pinMode (ThreeIn, indata);
samtidigt (digitalRead(recordButtonPin)) {
uint16_t en = analogRead(OneIn);
uint16_t b = analogRead(TwoIn);
uint16_t c = analogRead(ThreeIn);
Serial.Print ("Läs analog:"); Serial.Print(a); Serial.Print (","); Serial.Print(b); Serial.Print (","); Serial.Print(c); Serial.Print (",");
en
om (en < CALIB_MIN) en = CALIB_MIN;
om (en > CALIB_MAX) en = CALIB_MAX;
kartan = (a, CALIB_MIN, CALIB_MAX, 0, 255);
två
om (b < CALIB_MIN) b = CALIB_MIN;
om (b > CALIB_MAX) b = CALIB_MAX;
b = karta (b, CALIB_MIN, CALIB_MAX, 0, 255);
tre
om (c < CALIB_MIN) c = CALIB_MIN;
om (c > CALIB_MAX) c = CALIB_MAX;
c = karta (c, CALIB_MIN, CALIB_MAX, 0, 255);
Serial.Print ("->"). Serial.Print(a); Serial.Print (","); Serial.Print(b); Serial.Print (","); Serial.println(c);
EEPROM.write(addr, a);
addr ++;
EEPROM.write (addr, b);
addr ++;
EEPROM.write (addr, c);
addr ++;
om (addr == 512) bryta;
Delay(SAMPLE_DELAY);
}
om (addr! = 512) EEPROM.write (addr, 255);
digitalWrite (ledPin, låg);
Serial.println("Done");
Delay(250);
}
om (! digitalRead(playButtonPin)) {
Delay(10);
vänta för utgiven
medan (! digitalRead(playButtonPin));
Delay(20);
OK ut!
Serial.println("playing");
uint16_t addr = 0;
myServo1.attach(one);
myServo2.attach(two);
myServo3.attach(three);
samtidigt (digitalRead(playButtonPin)) {
En
uint8_t x = EEPROM.read(addr);
Serial.Print ("läsa EE:"); Serial.Print(x);
om (x == 255) bryta;
x = karta (x, 0, 0, 254, 180);
Serial.Print (","); Serial.Print(x); Serial.Print (",");
myServo1.write(x);
addr ++;
Två
x = EEPROM.read(addr);
Serial.Print(x); Serial.Print (",");
om (x == 255) bryta;
x = karta (x, 0, 0, 254, 180);
Serial.Print ("->"). Serial.Print(x); Serial.Print (",");
myServo2.write(x);
addr ++;
Tre
x = EEPROM.read(addr);
Serial.Print(x);
om (x == 255) bryta;
x = karta (x, 0, 0, 254, 180);
Serial.Print (","); Serial.Print(x); Serial.println (",");
myServo3.write(x);
Delay(SAMPLE_DELAY);
addr ++;
om (addr == 512) bryta;
}
Serial.println("-");
Serial.println ("gjort läsa EE");
myServo1.detach();
myServo2.detach();
myServo3.detach();
Delay(250);
}
}