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: 7
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 4 x
20190207_221125.jpg

radarixos
Příspěvky: 7
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
}

posjirka
Příspěvky: 14
Registrován: 05 srp 2017, 22:12
Reputation: 0

Re: Roboticka ruka

Příspěvek od posjirka » 16 bře 2019, 21:00

koukám, že toto vlákno je trochu starší, ale jestli potřebuješ pomoct tak není problém.
je jen nutné si říct co to má dělat....

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

Re: Roboticka ruka

Příspěvek od radarixos » 17 bře 2019, 12:48

hoj, diky.
je to vlastne ten nejmene dulezity projekt co jsem kdy delal :) Je pro zabavu, ucim se na nem.
Zadani se posouva a kod doplnuji v case jak dokoncuji jednotlive funkce.

Cil je, pres klavesnici definovat track "ruky"(kazdeho serva), pripadne paralelne mu ulozit potenciometrem hodnoty, kdyz chnapne uspesne medvidka, zjisti barvu a presune ho kam ma podle podminky. Puvodne to melo jen chnapnout podle pevne cesty kostku cukru a dat ji jinam :) -coz funguje, a tak jsem si vymyslel ze to bude rozlisovat barvu objektu (pripadne si +- dohleda zajmovou barvu) a ze mu budu moct pres human interface (tft+touch/keyb) upravit podminky-track a podminky akce.

Jednotlive "podprojekty" (cteni barvy s TSC3200, ruzne displeje 3.5"/1.8"/2x16, prace s klavesnici, kalibrace poloh) postupne funguji jak chci v jinych "ulohach", ale spojovani do celku me jeste ceka.

Ted si (kdyz mam cas) lamu hlavu nad tim, jak efektivne ukladat do "registru" polohy a dal s nima pracovat(podminkovani), zobrazovat interpretaci poloh, a cist matici klavesnice/touch, a upravovat rezim chodu-programu ruky, a to cele v realnem case...ma neznalost efektivni prace s prerusenim na 2560, jak spravne skakat pro vykreslovani, cteni neceho a pritom se nekde neseknout- to je ted hlavni problem. podminky, promenne a preruseni.
Prvni -proc se me spatne vykresluje displej...

Tak, s cim jsi me ochoten prubezne pomoci :)
tnx.r.

Aktualni verze a hw cfg BearMovera v0.6
mega2560, senzor shield, 4X4 keyb,2x16 i2c disp, jeden 10k pot na A0.

Kód: Vybrat vše

/* selfedu ino pro robotickou ruku z wishe.
 *  v.0.6
 *  
 *  
 */
 
#include <Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.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

const int beepPin = 24;       // číslo pinu pisklete
byte ledPin = 40;        // číslo pinu ledky RUNNING
byte ledPin2 = 45;        // číslo pinu ledky REPOSITION TO READY
int runr = HIGH;              // cudlik RUN defaultne v HIGH
int fofr = 7;                 //rychlost servo_x
boolean blink = false;
boolean ledPin_state;

//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

// vytvoření proměnných údávajících
// počet řádků a sloupců klávesnice
const byte radky = 4;
const byte sloupce = 4;
// vytvoření pole s rozmístěním kláves
char keys[radky][sloupce] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

// nastavení čísel pinů pro spojení s klávesnicí
byte pinyRadku[radky] = {33,32,31,30};
byte pinySloupcu[sloupce] = {37,36,35,34};

// vytvoření instance klavesnice z knihovny Keypad
Keypad keypad = Keypad( makeKeymap(keys), pinyRadku, pinySloupcu, radky, sloupce);

//otaceni servem2 via pot+readback angel
int potpin2 = 0;  // analog pin A0 used to connect the potentiometer
int val2;         // variable to read the val2ue from the analog pin

void setup() {
 Serial.begin(9600);
  lcd.begin();
  lcd.noBacklight();
delay(500);
  lcd.backlight();
  lcd.setCursor ( 0, 0);
  lcd.print("BearMover v.0.6");
delay(1000);
  pinMode(beepPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(ledPin2, OUTPUT);
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 moving(){        //cyklus MOVE_BEAR+readback uhlu serv
digitalWrite(ledPin, HIGH);
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());
  digitalWrite(ledPin, LOW);
}

void dispanykey(){
// ukaz na displeji... 
   lcd.clear();
   lcd.home();
   lcd.print("press any key");
   lcd.print(servo2.read());
}
void loop() {
dispanykey();

//cekani na stisk anykey
char key = keypad.getKey();
  if (key) {
        Serial.println(key);
           
//1x beep a repozice serv do startovaci polohy  
digitalWrite(ledPin2, HIGH); 
   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");
   digitalWrite(ledPin2, LOW); //zhasnuti ledky ukonceni reposition to ready
delay(500);

// 4x beep for Bear_reposition_RUNNIG 
 pipniBeep();
  pipniBeep();
   pipniBeep();
    pipniBeep();
   
moving ();
  }
//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);
    digitalWrite(ledPin2, LOW);
    }   
    val2 = analogRead(potpin2);            // reads the val2ue of the potentiometer (val2ue between 0 and 1023)
    val2 = map(val2, 0, 1023, 0, 180);     // scale it to use it with the servo (val2ue between 0 and 180)
    
    servo2.write(val2);                   // sets the servo position according to the scaled val2ue

}
Obrázek
Přílohy
20190317_123627.jpg

posjirka
Příspěvky: 14
Registrován: 05 srp 2017, 22:12
Reputation: 0

Re: Roboticka ruka

Příspěvek od posjirka » 09 dub 2019, 21:33

sorry za zpoždění, ... musíš to trochu popsat co ti vlastně nejde. Podle kodu tipuju že se ti vykreslí zpráva na LCd a je šedivá, nebo neuplná.
Je to tím, že ev smyčce smažeš Lcd, napíšeš zpráveu a celé opakuješ bez prodlevy. tomu LCD trvá déle mazání než výpis textu takže proto to vypada tak jak to vypadá.
musíš mu udělat prodlevu aspoń 0,5s. většinou se to dělá tak,že lcd vypíšeš až když se neco změní...
příklad:
start - vypiš první text - čekej na tlačítko - smaž lcd a vypiš druhý text - ...

nebo

smyčka - něco udělej - vypiš text - čekej 1s - opakuj

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

Re: Roboticka ruka

Příspěvek od radarixos » 10 dub 2019, 20:56

no prob. diky. jdu poresit to zobrazovani.

Odpovědět

Kdo je online

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