prosim o pomoc zkusenejsi kolegy...
ucim se delat pro zabavu se servama, a narazim na neznalost absolutnich zakladu. staci me poradit kousky kodu a prakticke syntaxe.
manipulator s kodem nize funguje, ale je to extremni demo.
-jak cist aktualni polohu serva?
-proc displej skace mezi pres run/bear repo complete? (urcite nepochopeni podminkovani-pls napovedet spravnejsi reseni)
...to by me pro zacatek stacilo
dekuji.
Kód: Vybrat vše
/* selfedu ino pro robotickou ruku z wishe.
* cilem je cist nebo mit prehled o aktualni poloze kazdeho serva
* dodelat ovladani rychlosti potenciometrem/z menu (fofr)
* vyresit a naucit se podminkovani a smycky pro start
* zobrazovani stavu/poloh na displeji
* pocitat rundy (pocty presunutych medvidku)
*/
#include <Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo servo1; // servo1 nahoru/dolu 90/170
Servo servo2; // servo2 doleva/doprava 45/135
Servo servo3; // servo3 dopredu/dozadu 100/155
Servo servo4; // servo4 uchop/uvolni 140/100
int beepPin = 24; // číslo pinu pisklete
const int buttonPin = 34; // číslo pinu cudliku RUN
const int ledPin = 40; // číslo pinu ledky RUNNING
int runr = HIGH; // cudlik RUN defaultne v HIGH
int fofr = 7; //rychlost servo_x
//mechanicka maxima serv
int pos1 = 90; // 90=nahore
int pos2 = 170; // 170=dole
int pos3 = 45; // 45=vlevo
int pos4 = 135; // 134=vpravo
int pos5 = 100; // 100=dopredu
int pos6 = 155; // 155=dozadu
int pos7 = 100; // 100=kleste stisknute
int pos8 = 140; // 140=kleste uvolnene
void setup() {
lcd.begin();
lcd.backlight();
lcd.setCursor ( 0, 0);
lcd.print("BearMover v.0.1");
delay(2000);
pinMode(beepPin, OUTPUT);
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
servo1.attach(9); // nahoru/dolu osa1-pin9
servo2.attach(7); // doleva/doprava osa2-pin7
servo3.attach(11); // dopredu/dozadu osa3-pin11
servo4.attach(5); // uchop/uvolni osa4-pin5
}
void pipniBeep(){
digitalWrite(beepPin, HIGH);
delay(50);
digitalWrite(beepPin, LOW);
delay(50);
}
void nahoru() {
for (pos1 = 90; pos1 <= 170; pos1 += 1) {
servo1.write(pos1);
delay(fofr);
}
}
void dolu() {
for (pos2 = 170; pos2 >= 90; pos2 -= 1) {
servo1.write(pos2);
delay(fofr);
}
}
void doleva() {
for (pos3 = 45; pos3 <= 135; pos3 += 1) {
servo2.write(pos3);
delay(fofr);
}
}
void doprava() {
for (pos4 = 135; pos4 >= 45; pos4 -= 1) {
servo2.write(pos4);
delay(fofr);
}
}
void dopredu() {
for (pos5 = 100; pos5 <= 155; pos5 += 1) {
servo3.write(pos5);
delay(fofr);
}
}
void dozadu() {
for (pos6 = 155; pos6 >= 100; pos6 -= 1) {
servo3.write(pos6);
delay(fofr);
}
}
void uchop(){
for (pos7 = 100; pos7 <= 140; pos7 += 1){
servo4.write(pos7);
delay(fofr);
}
}
void uvolni(){
for (pos8 = 140; pos8 >= 100; pos8 -= 1) {
servo4.write(pos8);
delay(fofr);
}
}
void loop() {
// ukaz na displeji...
lcd.clear();
lcd.home();
lcd.print("press RUN...");
//cekani na stisk RUN
runr = digitalRead(buttonPin);
if (runr == LOW) {
digitalWrite(ledPin, HIGH);
delay(100);
//1x beep a repozice serv do startovaci polohy
pipniBeep();
servo1.write(90); //dole
servo2.write(135); //vlevo
servo3.write(100); //vzadu
servo4.write(100); //uvolnene
// ukaz na displeji...
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Reposition for");
lcd.setCursor(0, 1);
lcd.print("begin complete");
delay(500);
// 4x beep for Bear_reposition_RUNNIG
pipniBeep();
pipniBeep();
pipniBeep();
pipniBeep();
//cyklus MOVE_BEAR
lcd.setCursor(0, 1);
lcd.clear();
lcd.print("let's go...");
uchop();
uvolni();
nahoru();
doprava();
dolu();
dopredu();
lcd.setCursor(0, 1);
lcd.clear();
lcd.print("catch bear...");
uchop();
nahoru();
dozadu();
doleva();
dopredu();
lcd.setCursor(0, 1);
lcd.clear();
lcd.print("release bear...");
uvolni();
dozadu();
dolu();
}
//ukaz na displeji dokonceni a zhasni ledku RUNNIG
else {
//lcd.home();
//lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Bear reposition complete");
digitalWrite(ledPin, LOW);
}
}