Roboticka ruka

Nedaří se vám s projektem a nenašli jste vhodné místo, kde se zeptat? Napište sem.
Pravidla fóra
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
Odpovědět
radarixos
Příspěvky: 4
Registrován: 29 led 2019, 16:22
Reputation: 0

Roboticka ruka

Příspěvek od radarixos » 07 úno 2019, 22:14

ahoj vsem,
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);
    }    
}
20190207_220049.jpg
Přílohy
servo_manipulator_demo4a.ino
(3.93 KiB) Staženo 2 x
20190207_221125.jpg

radarixos
Příspěvky: 4
Registrován: 29 led 2019, 16:22
Reputation: 0

Re: Roboticka ruka

Příspěvek od radarixos » 07 úno 2019, 23:43

tak cteni serva- experiment se podaril, ale prace s prerusenim a podminky nevim jak na ne...
zobrazeni press RUN stale nekvoka... neumim odskocit, vykreslit atd...

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

//otaceni servem2 via pot+readback angel
int potpin = 0;  // analog pin A0 used to connect the potentiometer
int val;         // variable to read the value from the analog pin

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...");
    lcd.print(servo2.read());
   
//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+readback uhlu serv
uchop();
  lcd.clear();
  lcd.print(servo4.read());
uvolni();
  lcd.clear();
  lcd.print(servo4.read());
nahoru();
  lcd.clear();
  lcd.print(servo1.read());
doprava();
  lcd.clear();
  lcd.print(servo2.read());
dolu();
  lcd.clear();
  lcd.print(servo1.read());
dopredu();
  lcd.clear();
  lcd.print(servo3.read());
uchop();
  lcd.clear();
  lcd.print(servo4.read());
nahoru();
  lcd.clear();
  lcd.print(servo1.read());
dozadu();
  lcd.clear();
  lcd.print(servo3.read());
doleva();
  lcd.clear();
  lcd.print(servo2.read());
dopredu();
  lcd.clear();
  lcd.print(servo3.read());
uvolni();
  lcd.clear();
  lcd.print(servo4.read());
dozadu();
  lcd.clear();
  lcd.print(servo3.read());
dolu();
  lcd.clear();
  lcd.print(servo1.read());
}

//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);
    }   
    val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)
    val = map(val, 0, 1023, 0, 180);     // scale it to use it with the servo (value between 0 and 180)
    servo2.write(val);                   // sets the servo position according to the scaled value
}

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host