Jump to content

Recommended Posts

Posted

Boas...

Escrevi um pequeno código para recriar um movimento tipo radial para usar nos conhecidos sistemas pan/tilt, que usam dois servo-motores, um para o eixo dos xx e outro para o eixo dos yy.

#include <Servo.h>

#define VSPEED 8
#define HSPEED 10
#define UP     1
#define DOWN   0

  Servo horservo;  // create servo object to control a servo
  Servo verservo;  // a maximum of eight servo objects can be created

  int verpos = 0;    // variable to store the vertical servo position
  int horpos = 0;    // variable to store the horizontal servo position
  
void setup(){
  horservo.attach(9);  // attaches the horizontal servo on pin 9 to the servo object
  verservo.attach(8);  // attaches the vertical servo on pin 9 to the servo object
  horservo.write(90);
  verservo.write(0);
  Serial.begin(9600);
}

void Print_Data(){
    Serial.print("Vert Pos: ");
    Serial.print(verpos);
    Serial.print(",");
    Serial.print("Hor Pos ");
    Serial.print(horpos);
    Serial.print('\n');  
}

void motion_1(){
  for(; horpos < 180; horpos += 2){
    horservo.write(horpos);
    if(verpos < 90){
      verservo.write(++verpos);
      delay(VSPEED);
    }
    else if (verpos > 0){
      verservo.write(--verpos);
      delay(VSPEED);
    }
    delay(HSPEED);
    Print_Data();
  }
  for(; horpos > 0; horpos -= 2){
    horservo.write(horpos);
    if(verpos < 90){
      verservo.write(--verpos);
      delay(VSPEED);
    }
    else if (verpos > 0){
      verservo.write(--verpos);
      delay(VSPEED);
    }
    delay(HSPEED);
    Print_Data();
  }
}

void motion_2(){
  for(pos = start_pos; pos != end_pos; )
  
}

void loop(){
  motion_1();
}

O código está a funcionar, não sei se está perfeito ou não, mas para já serve! No entanto, alguém com que eu estava a conversar, disse-me que o meu código podia ser simplificado e deu-me algumas pistas:

Citação

all i meant is your two loops are more or less the same thing with a parameter change.  they're both basically

for (pos = start_pos; pos != end_pos; pos += delta_to_target)  { }

where delta_to_target is +2 or -2. 

it's a pretty general observation that you probably don't need two completely separate loops. 

Estas foram as pistas! Será que me conseguem ajudar???

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Posted

presumo que estejas a falar disto : 

void motion_1() {
  for (int dir = 1; dir != -1 && horpos <= 0; horpos += 2 * dir) {
    if (horpos >= 180) {
      dir = -1;
      continue;
    }

    horservo.write(horpos);

    if (verpos < 90)
      verservo.write(verpos += 1 * dir);
    else if (verpos > 0)
      verservo.write(--verpos);

    delay(VSPEED);
    delay(HSPEED);
    Print_Data();
  }
}
IRC : sim, é algo que ainda existe >> #p@p
Posted (edited)
Citação

não sabes o valor inicial de horpos

Pois, não pensei nessa hipotese... com a alternativa que voce deu,  "&&", têm o mesmo efeito e aliás, se dir for igual a -1, não executa a segunda fase do loop. Dessa maneira, corrige-o:

dir || horpos > 0

Que é a maneira simplificada disto:

!(dir != -1 && horpos <= 0)

que foi o que voce pensou no inicio, mas na forma de excessão. De resto, acho que não há razão para o codigo não funcionar...

Edited by seuqram
Posted

Está melhor mas ainda não está correcto.

O que está a acontecer é o seguinte:

 
Citação

Vert Pos: 0,Hor Pos 90
Vert Pos: 1,Hor Pos 92
Vert Pos: 2,Hor Pos 94
Vert Pos: 3,Hor Pos 96
Vert Pos: 4,Hor Pos 98
Vert Pos: 5,Hor Pos 100
Vert Pos: 6,Hor Pos 102
Vert Pos: 7,Hor Pos 104
Vert Pos: 8,Hor Pos 106
Vert Pos: 9,Hor Pos 108
Vert Pos: 10,Hor Pos 110
Vert Pos: 11,Hor Pos 112
Vert Pos: 12,Hor Pos 114
Vert Pos: 13,Hor Pos 116
Vert Pos: 14,Hor Pos 118
Vert Pos: 15,Hor Pos 120
Vert Pos: 16,Hor Pos 122
Vert Pos: 17,Hor Pos 124
Vert Pos: 18,Hor Pos 126
Vert Pos: 19,Hor Pos 128
Vert Pos: 20,Hor Pos 130
Vert Pos: 21,Hor Pos 132
Vert Pos: 22,Hor Pos 134
Vert Pos: 23,Hor Pos 136
Vert Pos: 24,Hor Pos 138
Vert Pos: 25,Hor Pos 140
Vert Pos: 26,Hor Pos 142
Vert Pos: 27,Hor Pos 144
Vert Pos: 28,Hor Pos 146
Vert Pos: 29,Hor Pos 148
Vert Pos: 30,Hor Pos 150
Vert Pos: 31,Hor Pos 152
Vert Pos: 32,Hor Pos 154
Vert Pos: 33,Hor Pos 156
Vert Pos: 34,Hor Pos 158
Vert Pos: 35,Hor Pos 160
Vert Pos: 36,Hor Pos 162
Vert Pos: 37,Hor Pos 164
Vert Pos: 38,Hor Pos 166
Vert Pos: 39,Hor Pos 168
Vert Pos: 40,Hor Pos 170
Vert Pos: 41,Hor Pos 172
Vert Pos: 42,Hor Pos 174
Vert Pos: 43,Hor Pos 176
Vert Pos: 44,Hor Pos 178
Vert Pos: 45,Hor Pos 180
Vert Pos: 45,Hor Pos 178
Vert Pos: 46,Hor Pos 180
Vert Pos: 46,Hor Pos 178
Vert Pos: 47,Hor Pos 180
Vert Pos: 47,Hor Pos 178
Vert Pos: 48,Hor Pos 180
Vert Pos: 48,Hor Pos 178
Vert Pos: 49,Hor Pos 180
Vert Pos: 49,Hor Pos 178
Vert Pos: 50,Hor Pos 180
Vert Pos: 50,Hor Pos 178
Vert Pos: 51,Hor Pos 180
Vert Pos: 51,Hor Pos 178
Vert Pos: 52,Hor Pos 180
Vert Pos: 52,Hor Pos 178
Vert Pos: 53,Hor Pos 180
Vert Pos: 53,Hor Pos 178
Vert Pos: 54,Hor Pos 180
Vert Pos: 54,Hor Pos 178
Vert Pos: 55,Hor Pos 180
Vert Pos: 55,Hor Pos 178
Vert Pos: 56,Hor Pos 180
Vert Pos: 56,Hor Pos 178
Vert Pos: 57,Hor Pos 180
Vert Pos: 57,Hor Pos 178
Vert Pos: 58,Hor Pos 180
Vert Pos: 58,Hor Pos 178
Vert Pos: 59,Hor Pos 180
Vert Pos: 59,Hor Pos 178
Vert Pos: 60,Hor Pos 180
Vert Pos: 60,Hor Pos 178
Vert Pos: 61,Hor Pos 180
Vert Pos: 61,Hor Pos 178
Vert Pos: 62,Hor Pos 180
Vert Pos: 62,Hor Pos 178
Vert Pos: 63,Hor Pos 180
Vert Pos: 63,Hor Pos 178
Vert Pos: 64,Hor Pos 180
Vert Pos: 64,Hor Pos 178
Vert Pos: 65,Hor Pos 180
Vert Pos: 65,Hor Pos 178
Vert Pos: 66,Hor Pos 180
Vert Pos: 66,Hor Pos 178
Vert Pos: 67,Hor Pos 180
Vert Pos: 67,Hor Pos 178
Vert Pos: 68,Hor Pos 180
Vert Pos: 68,Hor Pos 178
Vert Pos: 69,Hor Pos 180
Vert Pos: 69,Hor Pos 178
Vert Pos: 70,Hor Pos 180
Vert Pos: 70,Hor Pos 178
Vert Pos: 71,Hor Pos 180
Vert Pos: 71,Hor Pos 178
Vert Pos: 72,Hor Pos 180
Vert Pos: 72,Hor Pos 178
Vert Pos: 73,Hor Pos 180
Vert Pos: 73,Hor Pos 178
Vert Pos: 74,Hor Pos 180
Vert Pos: 74,Hor Pos 178
Vert Pos: 75,Hor Pos 180
Vert Pos: 75,Hor Pos 178
Vert Pos: 76,Hor Pos 180
Vert Pos: 76,Hor Pos 178
Vert Pos: 77,Hor Pos 180
Vert Pos: 77,Hor Pos 178
Vert Pos: 78,Hor Pos 180
Vert Pos: 78,Hor Pos 178
Vert Pos: 79,Hor Pos 180
Vert Pos: 79,Hor Pos 178
Vert Pos: 80,Hor Pos 180
Vert Pos: 80,Hor Pos 178
Vert Pos: 81,Hor Pos 180
Vert Pos: 81,Hor Pos 178
Vert Pos: 82,Hor Pos 180
Vert Pos: 82,Hor Pos 178
Vert Pos: 83,Hor Pos 180
Vert Pos: 83,Hor Pos 178
Vert Pos: 84,Hor Pos 180
Vert Pos: 84,Hor Pos 178
Vert Pos: 85,Hor Pos 180
Vert Pos: 85,Hor Pos 178
Vert Pos: 86,Hor Pos 180
Vert Pos: 86,Hor Pos 178
Vert Pos: 87,Hor Pos 180
Vert Pos: 87,Hor Pos 178
Vert Pos: 88,Hor Pos 180
Vert Pos: 88,Hor Pos 178
Vert Pos: 89,Hor Pos 180
Vert Pos: 89,Hor Pos 178
Vert Pos: 90,Hor Pos 180
Vert Pos: 90,Hor Pos 178
Vert Pos: 89,Hor Pos 180
Vert Pos: 89,Hor Pos 178
Vert Pos: 90,Hor Pos 180
Vert Pos: 90,Hor Pos 178
Vert Pos: 89,Hor Pos 180
Vert Pos: 89,Hor Pos 178
Vert Pos: 90,Hor Pos 180
Vert Pos: 90,Hor Pos 178
Vert Pos: 89,Hor Pos 180
Vert Pos: 89,Hor Pos 178
Vert Pos: 90,Hor Pos 180
Vert Pos: 90,Hor Pos 178
Vert Pos: 89,Hor Pos 180
Vert Pos: 89,Hor Pos 178
Vert Pos: 90,Hor Pos 180
Vert Pos: 90,Hor Pos 178
Vert Pos: 89,Hor Pos 180
Vert Pos: 89,Hor Pos 178
Vert Pos: 90,Hor Pos 180
Vert Pos: 90,Hor Pos 178
Vert Pos: 89,Hor Pos 180
Vert Pos: 89,Hor Pos 178
Vert Pos: 90,Hor Pos 180
Vert Pos: 90,Hor Pos 178
Vert Pos: 89,Hor Pos 180
Vert Pos: 89,Hor Pos 178
Vert Pos: 90,Hor Pos 180
Vert Pos: 90,Hor Pos 178
Vert Pos: 89,Hor Pos 180
Vert Pos: 89,Hor Pos 178
Vert Pos: 90,Hor Pos 180
Vert Pos: 90,Hor Pos 178
Vert Pos: 89,Hor Pos 180
Vert Pos: 89,Hor Pos 178
Vert Pos: 90,Hor Pos 180
Vert Pos: 90,Hor Pos 178
Vert Pos: 89,Hor Pos 180
Vert Pos: 89,Hor Pos 178
Vert Pos: 90,Hor Pos 180
Vert Pos: 90,Hor Pos 178
Vert Pos: 89,Hor Pos 180
Vert Pos: 89,Hor Pos 178
Vert Pos: 90,Hor Pos 180
Vert Pos: 90,Hor Pos 178
Vert Pos: 89,Hor Pos 180
Vert Pos: 89,Hor Pos 178
Vert Pos: 90,Hor Pos 180
Vert Pos: 90,Hor Pos 178
Vert Pos: 89,Hor Pos 180
Vert Pos: 89,Hor Pos 178
Vert Pos: 90,Hor Pos 180
Vert Pos: 90,Hor Pos 178
Vert Pos: 89,Hor Pos 180
Vert Pos: 89,Hor Pos 178
Vert Pos: 90,Hor Pos 180
Vert Pos: 90,Hor Pos 178
Vert Pos: 89,Hor Pos 180
Vert Pos: 89,Hor Pos 178

Entretanto deram-me outra solução mas que tenho que a adaptar para o meu caso e como o código já é um pouco mais complexo, ainda não me debrucei sobre ele para ver se sou capaz de o adaptar!

Spoiler

#include <Servo.h>

void setup(){
    Serial.begin(9600);
}

struct vec {int x; int y;};

vec dest;
vec pos;

void printVec(Print &p, const struct vec &c) {
    p.print(c.x); 
    p.print(' '); 
    p.print(c.y);
}

void updateDestinations() {
    dest.x = Serial.parseInt();
    dest.y = Serial.parseInt();
    unsigned long start = millis();
    while (millis() - start < 100) {
        while (Serial.read() != -1)
          ;
    }
}

int int_sgn(int n){
    if (n > 0){
      return +1;
    }
    if (n < 0){
      return -1;
    }
    return 0;
}

void loop() {
    if (Serial.available()) {
        updateDestinations();
    }

    Serial.print(F( "Dest : "));
    printVec(Serial, dest);
    Serial.print(F("|Pos  : "));
    printVec(Serial, pos );

    const bool arrived = (dest.x == pos.x && dest.y == pos.y);
    
    Serial.println(arrived ? F(" [arrived]") : F(" [traveling]"));
    delay(100);

    pos.x += int_sgn(dest.x - pos.x) * 2;
    pos.y += int_sgn(dest.y - pos.y)    ;
}

 

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Posted
1 hour ago, HappyHippyHippo said:

actualiza o horpos antes da instrução continue. O problema e que ao não actualizar o horpos esta sempre a alterar o dir.

isto de responder de telemovel e complicado

void motion_2(){
  for (int dir = 1; dir != -1 && horpos > 0;) {
    horpos += 2 * dir;
    horservo.write(horpos);
    delay(HSPEED);
    if (horpos >= 180) {
      dir = -1;
      continue;
    }

    if (verpos < 90)
      verservo.write(verpos += 1 * dir);
    else if (verpos > 0)
      verservo.write(verpos += 1 * dir);
      
    delay(VSPEED);
    Print_Data();
  }  
}

Se te referias a isto, também não está a funcionar bem!

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Posted (edited)

for (int dir = 1; dir == 1 || horpos > 0; horpos += 2 * dir;) {   //não te esqueças de mudares a condição!
    horservo.write(horpos);
    delay(HSPEED);
    if (horpos >= 180) {
      dir = -1;

      horpos += 2 * dir; //o continue salta a instrução do "horpos += 2 * dir" dentro do for loop, e por isso, tens de mete-la aqui dentro da condição                                          //depois de mudares o dir para -1, senão o horpos ficaria >= 180, e esta condição estaria sempre a ser executada.
      continue;
    }

Edited by seuqram
Posted

Continua a não dar!

Está assim a função:

void motion_2(){
  for (int dir = 1; dir == 1 && horpos > 0; horpos += 2*dir) {
    horservo.write(horpos);
    delay(HSPEED);
    if (horpos >= 180) {
      dir = -1;
      horpos += 2 * dir;
      continue;
    }

    if (verpos < 90)
      verservo.write(verpos += 1 * dir);
    else if (verpos > 0)
      verservo.write(verpos += 1 * dir);
      
    delay(VSPEED);
    Print_Data();
  }  
}

 

O servo vertical está a ir para fora dos limites que deviam ser entre 0 e 90.

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Posted (edited)
else if (verpos > 0)
      verservo.write(verpos += 1 * dir);

não era soposto ser só isto:

else if (verpos > 0)
      verservo.write(--verpos);

ou simplificado (esse if é desnecessário):

else
      verservo.write(--verpos);
Edited by seuqram
Posted

Não sei porquê mas não está a dar!

O servo horizontal só anda até aos 180 e não volta para trás e o vertical só começa o movimento quando o horizontal chega aos 180. E também não volta para trás!

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Posted (edited)

horpos começa com 90, e verpos começa com 0. verpos só começa a aumentar quando chega a 90, que é quando horpos passa pelos 180 e volta aos 90. Eu não percebo muito bem o problema em termos reais, mas vejo que verpos vai ficar estacado nos 90 (no codigo inicial também era assim).

Podias eliminar o if/else dos verservo e fazer algo semelhante como o horservo:

void motion_2(){
  for (int dir = 1; dir == 1 || horpos > valor_inicial_horpos; horpos += 2*dir, verpos += dir) {
    horservo.write(horpos);
    delay(VSPEED);
    verservo.write(verpos)
    delay(HSPEED);
    if (horpos >= 180 + valor_inicial_horpos) {
      dir = -1;
      horpos -= 2;
      verpos -= 1;
      continue;
    }
    Print_Data();
  }  
}

horpos vai até 180 + init e volta ao init.

verpos vai até 90 + init e volta init.

 

No caso de 180 ser o maximo e 0 o minimo (que passas pelas funções de versvo e horservo), e o valor inicial do horpos não poder ser 0 e o do verpos menos ou igual a 90, tens de criar duas variaveis de direção, uma para o verpos e outra para o horpos. Mas parece que não é o teu problema.

Edited by seuqram
Posted (edited)

Mudei o && para || e acho que á está a funcionar!

E agora que ta ajudarem-me a adaptar o código que me sugeriram para o tentar usar?

 

Já agora, fica aqui um video dos dois servos a trabalhar:

Edited by PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Posted
void motion_2() {
  for (int dir = 1;
       dir == 1 || horpos > 0;
// esta actualização de verpos não está correcta em relação ao código inicial
       horpos += 2 * dir, verpos += dir) {
    horservo.write(horpos);
    delay(VSPEED);
    verservo.write(verpos)
    delay(HSPEED);

    if (horpos >= 180)
      dir = -1;

    Print_Data();
  }  
}

un gajo escreve um código às 6 da matina e passa um fim-de-semana a apanhar borracheiras e ficam o fórum num pantanas !!

----------

o que queres dizer com "adaptar o código" ?

IRC : sim, é algo que ainda existe >> #p@p
Posted

Não percebi o que quiseste dizer com "a actualização da variável verpos não está correcta em relação ao código inicial" porque pelo menos aparentemente, a coisa está a funcionar!

 

Em relação a adpatar o código, estava a falar no código que me foi sugerido por alguém no IRC.

Este código:

#include <Servo.h>

void setup(){
    Serial.begin(9600);
}

struct vec {int x; int y;};

vec dest;
vec pos;

void printVec(Print &p, const struct vec &c) {
    p.print(c.x); 
    p.print(' '); 
    p.print(c.y);
}

void updateDestinations() {
    dest.x = Serial.parseInt();
    dest.y = Serial.parseInt();
    unsigned long start = millis();
    while (millis() - start < 100) {
        while (Serial.read() != -1)
          ;
    }
}

int int_sgn(int n){
    if (n > 0){
      return +1;
    }
    if (n < 0){
      return -1;
    }
    return 0;
}

void loop() {
    if (Serial.available()) {
        updateDestinations();
    }

    Serial.print(F( "Dest : "));
    printVec(Serial, dest);
    Serial.print(F("|Pos  : "));
    printVec(Serial, pos );

    const bool arrived = (dest.x == pos.x && dest.y == pos.y);
    
    Serial.println(arrived ? F(" [arrived]") : F(" [traveling]"));
    delay(100);

    pos.x += int_sgn(dest.x - pos.x) * 2;
    pos.y += int_sgn(dest.y - pos.y)    ;
}

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Posted
7 minutes ago, PsySc0rpi0n said:

Não percebi o que quiseste dizer com "a actualização da variável verpos não está correcta em relação ao código inicial" porque pelo menos aparentemente, a coisa está a funcionar!

funcionar, deve funcionar, mas para condições iniciais diferentes (e escolhidas a dedo) o resultado é diferente.

ps : tenta descobrir um caso desses

 

7 minutes ago, PsySc0rpi0n said:

Em relação a adpatar o código, estava a falar no código que me foi sugerido por alguém no IRC.

Este código:


#include <Servo.h>

void setup(){
    Serial.begin(9600);
}

struct vec {int x; int y;};

vec dest;
vec pos;

void printVec(Print &p, const struct vec &c) {
    p.print(c.x); 
    p.print(' '); 
    p.print(c.y);
}

void updateDestinations() {
    dest.x = Serial.parseInt();
    dest.y = Serial.parseInt();
    unsigned long start = millis();
    while (millis() - start < 100) {
        while (Serial.read() != -1)
          ;
    }
}

int int_sgn(int n){
    if (n > 0){
      return +1;
    }
    if (n < 0){
      return -1;
    }
    return 0;
}

void loop() {
    if (Serial.available()) {
        updateDestinations();
    }

    Serial.print(F( "Dest : "));
    printVec(Serial, dest);
    Serial.print(F("|Pos  : "));
    printVec(Serial, pos );

    const bool arrived = (dest.x == pos.x && dest.y == pos.y);
    
    Serial.println(arrived ? F(" [arrived]") : F(" [traveling]"));
    delay(100);

    pos.x += int_sgn(dest.x - pos.x) * 2;
    pos.y += int_sgn(dest.y - pos.y)    ;
}

tens de ser mais específico

IRC : sim, é algo que ainda existe >> #p@p

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.