360° Servo IR encoder

Odpovědět
jojox
Příspěvky: 2
Registrován: 25 zář 2019, 16:38
Reputation: 0

360° Servo IR encoder

Příspěvek od jojox » 25 zář 2019, 16:47

Môj problém spočíva v počítadle. Servo sa toči do plusu aj do mínusu ale pri zmene smeru sa hodnota, napríklad : -45 zmení na hodnotu 45 a ďalej počíta ako ma. Čo mam spraviť aby počítadlo fungovalo správne?

Kód: Vybrat vše

#include <Servo.h>

Servo servo_X;

String readString;
int n;                  

int x;
int x_r;
int x_l;


#define X_counter_pin 2
bool item_detected = false;
int  X_counter = 0;

void setup()
{
  Serial.begin(9600);
  servo_X.attach(9);  
  Serial.println("Servo bereit");
  Serial.println();

  pinMode( X_counter_pin , INPUT);
 // delay(3000);
}


void loop()
//_____________Zähler_______________________________
{
  int val = digitalRead( X_counter_pin );
  if( (item_detected == false) && ( val == 0 ))
  {
        item_detected = true;
        X_counter=x ; 
        x_r++;   
        x_l--;   
        updateCounter();
  }
   
  else if( (item_detected == true) && ( val == 1 ))
  {
        item_detected = false;     
  } 

  if ( (n>53)&&(n<82) == (x=x_l) )    ;    // Links Drehen   serial write 53 schnell, 82 langsam
  if ( (n>100)&&(n<131) == (x=x_r) )  ;    // Rechts Drehen  serial write 100 schnell, 130 langsam
                                           // Stop    serial write 90 

  delay(10);

//__________________360°__Servo Steuerung___________________________________
while (Serial.available())
  {
    char c = Serial.read();                  //gets one byte from serial buffer
    readString += c;                         //makes the string readString
    delay(2);       
  }
  if (readString.length() >0)
  {
                                             // attach or detach servo if desired
    if (readString == "d")
  {
      while (digitalRead(9))                 //delay loop until pin 7 is low
  {
  }              
      servo_X.detach();                      //detach servo
      goto bailout;                          //jump over writing to servo
  }
    if (readString == "a")
  {
      servo_X.attach(9);                     //reattach servo to pin 7
       goto bailout;
  }   
    n = readString.toInt();                  //convert readString into a number
    if(n >= 500)
  {  servo_X.writeMicroseconds(n);  
  }
    else
  {
      servo_X.write(n);  
  }
bailout:                                     //reenter code loop
    Serial.println(servo_X.read());
    readString="";                           
  }
//_______________________________________________________
}

void updateCounter()
{
     Serial.print("  Steps              ");
     Serial.print(X_counter);
     Serial.println();
}

KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Re: 360° Servo IR encoder

Příspěvek od KamilV » 27 zář 2019, 19:50

Já bych si tipnul, proč je to stále bez odpovědi... Protože luštit tenhle příspěvek, to není jen tak. Tak se do toho nikomu moc nechce. Já se pokusil už 3x a stále vlastně ani nevím, co je vstup a co výstup.

Nezlob se, ale ten kód je hrozný :( Zkus ho prosím trochu učesat, ať se v tom i druzí lidé vyznají.
Kombinace EN a DE na mě působí dojmem, že jsi zkopíroval nějakou ukázku z německého kódu, takže ani Ty té ukázce sám nerozumíš a čekáš to od druhých. Druzí to ale louskají 10 min a pak to vzdají...

Velmi pomůže, když:
  • uzavřeš kód do značek pro kód (admin: upravil jsem)
  • vysvětlíš kontext tvého projektu, co je čím ovládané?
  • popíšeš trochu proměnné, co se ve které najde, protože názvy "n", "x", "x_l" jsou velmi neintuitivní
  • aktualizuješ komentáře, protože když už konečně v kódu nějaký je, tak není konzistentní s kódem, který popisuje
Pokud jsem pochopil správně, tak chceš servem otáčet na základě "příkazů" ze serial linky.
Odděl si do samostatných funkcí načtení příkazů a ovládání serva.

Pak se nám bude snáz debugovat jednotlivé části.

jojox
Příspěvky: 2
Registrován: 25 zář 2019, 16:38
Reputation: 0

Re: 360° Servo IR encoder

Příspěvek od jojox » 17 říj 2019, 17:26

Už som to spravil a aj zabudol že som sa tu vôbec zaregistroval.
Teraz mam ďalší problém, čítanie príkaznou zo sériového portu alebo SD.
V princípe prečítať jeden riadok s príkazmi a ďalší až potom keď budú predošlé príkazy hotové.
No na žiadnom fóre sa do toho nikomu nechce, len diskutujú že nechápu čo chcem.
Som na fóre https://forum.arduino.cc DE sú tam ľudia ktorý keď majú znalosti, namiesto pomoci filozofujú o veciach čo s projektom nemajú nič spoločne. Ako na Facebooku.

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: 360° Servo IR encoder

Příspěvek od gilhad » 17 říj 2019, 19:57

A v cem je problem? Ja bych to nacital do bufferu (a hlidal si preteceni) - mozna parsoval prubezne a podle toho volil dalsi cestu, nebo nacetl cely radek, pokud je to potreba - a radek konci, kdyz ti prijde znak \r nebo \n (nebo oba v libovolnem poradi). Takze je dobre preskakovat prazdne radky a jako ukonceni brat libovolny z tech znaku, a pokud znas maximalni delku prikazu, tak ten buffer udelas primerene vetsi (o mezery treba a o konec retezce urcite) a pokud ho to preleze, tak je to nejaka kravina a proste cely radek az do konce ignoruj a vypis chybu (kdyz se program na druhe strane zblazni a nebude posilat odradkovani, nebo si tam omylem copy-pastnes nejakou kravinu).

S SD je to v podstate to same, jen si musis pripadne poradit s hranicema sektoru...

KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Re: 360° Servo IR encoder

Příspěvek od KamilV » 18 říj 2019, 18:41

jojox píše:
17 říj 2019, 17:26
Teraz mam ďalší problém, čítanie príkaznou zo sériového portu alebo SD.
V princípe prečítať jeden riadok s príkazmi a ďalší až potom keď budú predošlé príkazy hotové.
No na žiadnom fóre sa do toho nikomu nechce, len diskutujú že nechápu čo chcem.
Bohužel si nemyslím, že je řešením zkoušet to na dalším a dalším fóru, ale zamyslet se, jestli se pro ty lidi, kteří by Ti jinak rádi pomohli, nejde něco udělat. Pokud opakovaně narážíš na to, že se do toho nikomu nechce, že druzí nechápou Tvé požadavky, zkus je popsat lépe.

Například teď. Víme akorát, že máš problém načítat příkazy ze serialu.
Nevíme, jaký přesně máš problém.
Nevíme, jakým kódem se o to snažíš.

Zkus napsat, jaký příkaz se snažíš po serialu poslat a jak by se měl ideálně interpretovat. Pak přidej ukázku kódu, kterou se to snažíš (třeba i mylně) realizovat. Uvidíš, že se to pak vyřeší mnohem rychleji :idea:

Odpovědět

Kdo je online

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