Arduino schéma - arduino.sk

Problem s arduino kódom, "delay"

Programovanie arduina
Príspevky: 2
Registrovaný: Pon 13. Júl 2015 11:51:23

Problem s arduino kódom, "delay"

Poslaťod adho23 » Pon 13. Júl 2015 11:57:14

Nazdar, potreboval by som poradiť v kódovaní mojho projektu.
Vyrábam pingpongového robota, teda už je vyrobený a je tam zopár motorčekov, každý zvlášť napájaný. Nachádza sa tam hlavny motorček na vystrelovanie loptičiek, brushless outrunner 2700kv spolu s 30A ESC, potom tzv. feed servo, ktore tlaci lopticky do trubicky smerom hore ku hlavnemu motoru a potom je tam maly pomocny motorcek ktory napomaha feed servu. Este posledny motorcek je tam horizontalne servo, ktorý otaca hlavu robota tak aby mohli byt vystrelovane lopticky do jednej aj do druhej strany. Avsak bez toho horizontalneho serva ide vsetko ako po masle i ked s oneskorenim, ale po pridani posledneho toho horizontalneho serva tak mi blbne cely robot, potreboval by som pomoc pri prepísaní kódu pretoźe si myslim ze tam mam vela zbytocnych delayov i ked su tam velmi potrebne ale rad by som to vymenil za nieco ine. Som zaciatocnik v arduine, prosim POMOC
Vďaka
Kód: Vybrať všetko
#include <Servo.h>

Servo servo1; // feed servo
Servo motor1;  // brushless main motor
Servo otacachor; //  horizontal rotation servo
int malymot =12; //small motor,helps feed servo to feed balls
int led = 13;  //just led
int potpin1 = A0;  // potenciometer  for main brushless motor
int potpin2 = A3; // potenciometer for servomotor(servo1) (feed servo)
int potpin3= A5; //potenciometer for horizontal rotation servo
int val1 ;     // motor1
int val2;    // servomotor
int val3;   // motor for horizontal rotation
int random1; //randomizer for servo
int random2; //randomizer for horizontal motor
int toogleservo1 = 5 ; //toogle switch for activate the randomizer for feed servo
int toogleservo2= 6; //toogle switch for activate the randomizer for horizontal rotation servo
void setup()
{  pinMode(led, OUTPUT);
  pinMode(malymot, OUTPUT);
  pinMode (toogleservo1, INPUT);
pinMode (toogleservo2, INPUT);
  motor1.attach(9);  // attaches the servo on pin 9 to the servo object
  servo1.attach(3); 
  otacachor.attach(11);
}

void loop()
{
  { int toogleservo1ON = digitalRead (toogleservo1);
  val2 = analogRead(potpin2);            // reads the value of the potentiometer (value between 0 and 1023)
     val2 = map(val2, 0, 1023, 2000, 500);  //waiting between 0,5 - 2sek
  if (toogleservo1ON == HIGH){   // randomizer for horizontal servo
       random1 = random (500,2000); 
       servo1.write (172);
       delay (500);
       servo1.write (30);
       delay(random1);
       digitalWrite(malymot, HIGH);
       digitalWrite(led, LOW);}
    else if (val2 > 1900){    //val2 is for potentiometer just to stop the feed servo
         servo1.write (30);
         delay (15);
         digitalWrite(malymot, LOW);
         digitalWrite(led, HIGH);}
    else if (val1<110){    //to not feed the robot until the brushless motor doesnt work
         servo1.write (30);
         delay (15);
         digitalWrite(malymot, HIGH);
         digitalWrite(led, HIGH);}
    else {
         servo1.write (172);
     delay (500);
     servo1.write (30);
     delay(val2);
     digitalWrite(malymot, HIGH);
     digitalWrite(led, HIGH);}
     }
   
  val1 = analogRead(potpin1);            // the main brushless motor
  val1 = map(val1, 0, 1023, 60, 170);   
  motor1.write(val1);                 
  delay (15);
 
 
  int toogleservo2ON = digitalRead (toogleservo2);
  val3= analogRead(potpin3);       // horizontal rotation servo
  val3 = map(val3,0,1023,0,180);
  otacachor.write(val3);
  delay(15);
   if (toogleservo2ON == HIGH){   // randomizer for horizontal servo
       random2 = random (70,110);  //random the angle of rotation
       otacachor.write (random2);
       delay (val2);    //to delay  the time the feed servo delays
}       
}

Príspevky: 89
Registrovaný: Uto 03. Jún 2014 21:48:35
Bydlisko: Košice Slovakia

Re: Problem s arduino kódom, "delay"

Poslaťod kosice4 » Pon 13. Júl 2015 12:17:32

Delay zastaví celý procesor. Tiež som mal problémy s delay a preto sa mu vyhýbam.
Jednoducho nahradíš delay funkciou millis. https://www.arduino.cc/en/reference/millis
Ďakujem za pomoc posjirka, Diego, Xeram a barado :)

Príspevky: 2
Registrovaný: Pon 13. Júl 2015 11:51:23

Re: Problem s arduino kódom, "delay"

Poslaťod adho23 » Pon 13. Júl 2015 12:40:17

Ďakujem za odpoveď ale ja tomu millis akosi nechápem.. nevedel by si aspoň časť kódu prepísať do toho millis namiesto delay aby som pochopil prosim ťa ? Veľká vďaka

Obrázok užívateľa
Príspevky: 133
Registrovaný: Štv 06. Nov 2014 12:06:09

Re: Problem s arduino kódom, "delay"

Poslaťod budvar10 » Uto 14. Júl 2015 8:10:59

Pozor, delay nezastaví procesor. Procesor je zacyklený v slučke, kým nevprší časové oneskorenie. Prerušenia atď fungujú normálne. V novšej verzii je dokonca do delayu vnorená užívateľská funkcia, ktorú je potrebné dodefinovať pre taký slabší multitasking.

Pre funkciu s millis si pozri BlinkWithoutDelay príklad a pochopíš. Princíp je jednoduchý. Zapamätáš si čas a dokolečka testuješ, či súčasný čas prekročil uchovaný čas + požadované oneskorenie.

Príspevky: 174
Registrovaný: Ned 16. Mar 2014 23:22:00

Re: Problem s arduino kódom, "delay"

Poslaťod posjirka » Ned 19. Júl 2015 1:49:47

problem rozhodne bude ve funkci delay. nepises jake ti to dela problemy ale odhaduji ze ti serva prejizdi pres dorazy. servo musi dostat povely tusim 50x za sekundu o delce 1 az 2 ms podle.toho kam chces servo natocit. napis nam co ti to dela a neco s tim provedeme. funkce millis je jednoducha : do jedne promene si zapises aktualni hodnotu millis treba 1000 ty chces aby se po 500ms neco stali. do smycky loop si das podminku jestli je akrualni hodnota millis vetsi nez stara +500 pak neco proved a zapis si aktualni hodnotu millis. pouzivej znamenka > nebo < protoze se nikdy netrefis na milisekundu presne.

Späť na Software