Stap 6: Software (Arduino schets)
De code van de Arduino heeft twee functies:
- Opnemen van de analoge ingangen van de servo's potentiometers (opnameknop)
- Bedienen van de servo's met de opgenomen waarden (knop afspelen)
Notities:
- De geregistreerde waarden worden opgeslagen in het EEPROM geheugen van de Arduino - beperkt de opname (toevoeging van SD-kaart zal oplossen).
- De schets wordt gevraagd de opgenomen waarden en gespeeld, in real-time, naar de seriële MONITOR, maar dit is niet nodig voor de werking van de schets.
- Goede tutorial voor feedback van de analoge servo kan worden gevonden hier
De Arduino sketch:
Download Arduino schets
(http://www.KeerBot.com)
Voorbeeldcode voor het opnemen en afspelen van servo beweging met een analoge feedback-servo
5 Dec2013, met behulp van handmatig gehackt servo 's
#include < Servo.h >
#include < EEPROM.h >
#define CALIB_MAX 512
#define CALIB_MIN 100
#define SAMPLE_DELAY 25 / / in ms, 50 MS lijkt goed
uint8_t recordButtonPin = 12;
uint8_t playButtonPin = 7;
uint8_t één = 9, twee = 10, drie = 11;
uint8_t OneIn = A0, TwoIn = A1, ThreeIn = A2;
uint8_t ledPin = 13;
Servo myServo1, myServo2, myServo3;
VOID Setup {}
Serial.begin(9600);
pinMode (recordButtonPin, INPUT);
digitalWrite (recordButtonPin, hoge);
pinMode (playButtonPin, INPUT);
digitalWrite (playButtonPin, hoge);
pinMode (ledPin, OUTPUT);
uint16_t addr = 0;
Serial.println ("Servo RecordPlay, 3 servo's versie");
Serial.println ("door http://www.KeerBot.com");
}
void loop {}
Als (! digitalRead(recordButtonPin)) {}
delay(10);
wachten voor vrijgegeven
terwijl (! digitalRead(recordButtonPin));
vertraging(20);
OK vrijgegeven!
Serial.println("Recording");
uint16_t addr = 0;
digitalWrite (ledPin, hoge);
pinMode (OneIn, INPUT);
pinMode (TwoIn, INPUT);
pinMode (ThreeIn, INPUT);
terwijl (digitalRead(recordButtonPin)) {}
uint16_t een = analogRead(OneIn);
uint16_t b = analogRead(TwoIn);
uint16_t c = analogRead(ThreeIn);
Serial.Print ("lezen analoog:"); Serial.Print(a); Serial.Print (","); Serial.Print(b); Serial.Print (","); Serial.Print(c); Serial.Print (",");
een
Als (een < CALIB_MIN) een = CALIB_MIN;
Als (een > CALIB_MAX) een = CALIB_MAX;
een kaart = (a, CALIB_MIN, CALIB_MAX, 0, 255);
twee
Als (b < CALIB_MIN) b = CALIB_MIN;
Als (b > CALIB_MAX) b = CALIB_MAX;
b = kaart (b, CALIB_MIN, CALIB_MAX, 0, 255);
drie
Als (c < CALIB_MIN) c = CALIB_MIN;
Als (c > CALIB_MAX) c = CALIB_MAX;
c = kaart (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 ++;
Als (addr == 512) breken;
delay(SAMPLE_DELAY);
}
Als (addr! = 512) EEPROM.write (addr, 255);
digitalWrite (ledPin, laag);
Serial.println("Done");
delay(250);
}
Als (! digitalRead(playButtonPin)) {}
delay(10);
wachten voor vrijgegeven
terwijl (! digitalRead(playButtonPin));
vertraging(20);
OK vrijgegeven!
Serial.println("Playing");
uint16_t addr = 0;
myServo1.attach(one);
myServo2.attach(two);
myServo3.attach(three);
terwijl (digitalRead(playButtonPin)) {}
Een
uint8_t x = EEPROM.read(addr);
Serial.Print ("EE lezen:"); Serial.Print(x);
Als (x 255 ==) breken;
x = kaart (x, 254, 0, 0, 180);
Serial.Print (","); Serial.Print(x); Serial.Print (",");
myServo1.write(x);
addr ++;
Twee
x = EEPROM.read(addr);
Serial.Print(x); Serial.Print (",");
Als (x 255 ==) breken;
x = kaart (x, 254, 0, 0, 180);
Serial.Print ("->"); Serial.Print(x); Serial.Print (",");
myServo2.write(x);
addr ++;
Drie
x = EEPROM.read(addr);
Serial.Print(x);
Als (x 255 ==) breken;
x = kaart (x, 254, 0, 0, 180);
Serial.Print (","); Serial.Print(x); Serial.println (",");
myServo3.write(x);
delay(SAMPLE_DELAY);
addr ++;
Als (addr == 512) breken;
}
Serial.println("-");
Serial.println ("Done lezen EE");
myServo1.detach();
myServo2.detach();
myServo3.detach();
delay(250);
}
}