collapse

* Links de Robótica

* Posts Recentes

Medir Agua que está no Poço por jm_araujo
[Hoje às 00:36]


URGENTE - display de 7 segmentos com backpack por helderjsd
[Ontem às 12:30]


Preços e fabricantes de pcb por Sérgio_Sena
[19 de Setembro de 2017, 10:20]


Palavras Cruzadas por Njay
[19 de Setembro de 2017, 02:24]


Isaac Asimov - I, Robot por senso
[18 de Setembro de 2017, 03:41]


Apresentação por TigPT
[17 de Setembro de 2017, 07:31]


ic SL440 da Plessey? por senso
[16 de Setembro de 2017, 13:11]


Compra Colectiva RS-Amidata por brunus
[15 de Setembro de 2017, 22:31]


Ideias para construir um quadrúpede simples por zordlyon
[15 de Setembro de 2017, 10:18]


Preparar bancada de testes por jm_araujo
[14 de Setembro de 2017, 10:24]

Autor Tópico: Servo rodar o mais lento possivel 45 graus para a direita e 45 para a esquerda  (Lida 6430 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline r16

  • Mini Robot
  • *
  • Mensagens: 337
viva...
tenho um servo da futaba, modificado para girar a 360 graus.
No entanto estou com dificuldades para o girar desde o centro 45 graus para a direita depois voltar a posicao original e rodar mais 45 para a esquerda, mas com uma velocidade muito minima.
tenho este código o que poderá estar mal? podem dar uma ajuda sff.
Obrigado

Código: [Seleccione]
// define o pino em que o servo esta conectado
 
const unsigned int pinservo = 9;
 
// definem o maximo e o minimo em Microsegundos, da largura do pulso
unsigned int maximo = 2400;
unsigned int minimo = 70;
 
//Armazena o ultimo passo enviado para o servo, evitando que ele receba um comando para permanecer onde esta, evitando assim trepidação
unsigned int ultimopasso = 0;
 
// intervalo em Milisegundos entre um pulso e outro
unsigned int interval = 15;
 
//velocidade com que o servo movimenta
unsigned int velocidade = 40;
 
void setup(){
 pinMode (pinservo, OUTPUT);
}
 
void loop(){
 
//executa diversos passos e da um delay de 1 segundo entre um e outro.
 
 
passo (45);
delay (1000);
passo (-45);
 
 
 
}
 
void passo (int _grau){
 unsigned int _passo= minimo + (maximo/180)*_grau;
 if (ultimopasso != _passo){ //impede a repetição do mesmo passo senao fosse assim causaria  trepidação
 if (ultimopasso < _passo){ //se o servo estiver antes da proxima posição ele avança
 for (int i=ultimopasso;i<_passo;i= i + velocidade){
 digitalWrite (pinservo, 1);
 delayMicroseconds(i);
 digitalWrite (pinservo, 0);
 delay(15);
 }
 }else{ //caso contrario ele recua
 for (int i=ultimopasso;i>_passo;i= i - velocidade){
 digitalWrite (pinservo, 1);
 delayMicroseconds(i);
 digitalWrite (pinservo, 0);
 delay(15);
 }
 }
 }
 
ultimopasso = _passo; //grava o ultimo passo
}

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.086
    • Tróniquices
Não vou ler o teu código porque não está indentado, mas 1º tens que encontrar o valor que mete o teu servo parado, e depois dás-lhe o passo minimo ou para cima ou para baixo, isso fá-lo rodar o mais devagar possível. Mais devagar do que isso só fazendo pausas, ou seja, pará-lo, esperar um pouco, meter a rodar o minimo, esperar um pouco, e repetir.

Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.123
  • NERD!
Identa esse código, como está é ilegível. Se não sabes como, passa o código por exemplo pelo http://universalindent.sourceforge.net

Não sei como fizeste a modificação, mas da forma habitual os servos alterados para rotação contínua não permitem controlo de posição sem adicionar alguma forma de controlo externo da mesma. Podes tentar por tempo, mas não vai ser preciso porque varia com alimentação, esforço, temperatura e provavelmente mais algumas coisas.

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.390
  • Helpdesk do sitio
gg=G  :P

Se o servo é de rotação continua o feedback não existe.
Avr fanboy

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.086
    • Tróniquices
Ui, escapou-me a parte de querer voltar à "posição original". A única forma que tou a ver é com um sensor externo que te indique que o eixo está na "posição original".

Offline r16

  • Mini Robot
  • *
  • Mensagens: 337
ok,,, consegui fazer o servo rodar como queria.
no entanto não estou a conseguir controlar a velocidade dele...ou seja queria que ele rodasse para os dois sentidos da forma mais lenta possivel.
alguma ideia no que falta no codigo?
http://pastebin.com/Nb6CZYjm


Código: [Seleccione]
#include <Servo.h>
 
Servo motor;
void setup()
{
 motor.attach(3);
}
void loop()
{
 int i;
 for(i=0;i>45;i--) {
 motor.write(i);
 delay(10);
 }
delay(1000);
 for(i=0;i<90;i++) {
        motor.write(i);
        delay(10);
 }
 delay(1000);
 for(i=0;i<135;i++) {
 motor.write(i);
 delay(10);
 }
 
 }

Offline ferb

  • Mini Robot
  • *
  • Mensagens: 8
Basta aumentares o delay nos 'for', agora tens delay de 10, se o aumentares consegues com que o servo rode mais devagar...

Espero ter ajudado!
Ferb

Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.123
  • NERD!
Se esse código funciona, o servo não está modificado para rotação contínua como disseste.

Código: [Seleccione]
for(i=0;i>45;i--) {
 motor.write(i);
 delay(10);
 }
Estás a decrementar a partir de 0, e a condição i>45 é falsa na primeira interação (i=0), pelo que esse "for" não está a fazer nada. Assumo que seja um erro.

E os dois ciclos seguintes fazem o motor rodar entre os 0 e os 90º primeiro, e depois entre os 0 e os 135º. Isso não corresponde minimamente com o que tinhas dito que pretendias, não entendo como podes dizer que está a funcionar.
O mais parecido seria, assumindo que a posição central são os 90º:
Código: [Seleccione]
void loop()
{
    int i;
    for (i=90;i>(90-45);i--) { //roda entre o centro (90º) 45º para uma direção
        motor.write(i);
         //delay(xx);
    }
    //delay(xx);
    for (i=(90-45);i<90;i++) { // e volta ao centro
         motor.write(i);
        //delay(xx);
    }
    //delay(xx);

    for (i=90;i<(90+45);i++) { //roda entre o centro (90º) 45º para a outra direção
        motor.write(i);
        //delay(xx);
    }
    //delay(xx);
    for (i=(90+45);i>90;i--) { // e volta ao centro
        motor.write(i);
        //delay(xx);
    }
    //delay(xx);
}


Mete os delays a gosto.





Offline josecarlos

  • Mini Robot
  • *
  • Mensagens: 235
 Boas :)

Penso que antes de mais é preciso saber como funciona um servo para o poder controlar.
Aqui fica alguma informação

http://www.instructables.com/id/Servos-Unscrambled/

Espero ter ajudado ;)

Offline r16

  • Mini Robot
  • *
  • Mensagens: 337
Se esse código funciona, o servo não está modificado para rotação contínua como disseste.

Código: [Seleccione]
for(i=0;i>45;i--) {
 motor.write(i);
 delay(10);
 }
Estás a decrementar a partir de 0, e a condição i>45 é falsa na primeira interação (i=0), pelo que esse "for" não está a fazer nada. Assumo que seja um erro.

E os dois ciclos seguintes fazem o motor rodar entre os 0 e os 90º primeiro, e depois entre os 0 e os 135º. Isso não corresponde minimamente com o que tinhas dito que pretendias, não entendo como podes dizer que está a funcionar.
O mais parecido seria, assumindo que a posição central são os 90º:
Código: [Seleccione]
void loop()
{
    int i;
    for (i=90;i>(90-45);i--) { //roda entre o centro (90º) 45º para uma direção
        motor.write(i);
         //delay(xx);
    }
    //delay(xx);
    for (i=(90-45);i<90;i++) { // e volta ao centro
         motor.write(i);
        //delay(xx);
    }
    //delay(xx);

    for (i=90;i<(90+45);i++) { //roda entre o centro (90º) 45º para a outra direção
        motor.write(i);
        //delay(xx);
    }
    //delay(xx);
    for (i=(90+45);i>90;i--) { // e volta ao centro
        motor.write(i);
        //delay(xx);
    }
    //delay(xx);
}


Mete os delays a gosto.


obrigado pelo teu comentário, o código que eu disse que funcionava... funciona não me perguntes como que não sei.. no entanto eu alterei novamente o servo apos o meu primeiro post, voltei a colocar um "travao".
relativamente ao teu codigo.. nao percebo em que parte do delay tenho que colocar para ele andar devagar....
é no delay a seguir ao motor.write? qual o valor minimo? 1??? e no delay seguinte 1000?

já agora queria me me dissesses se para alterar o angulo de 45 para um angulo de 20 se basta substituir o 45.
Obrigado

Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.123
  • NERD!
Re: Servo rodar o mais lento possivel 45 graus para a direita e 45 para a esquerda
« Responder #10 em: 13 de Janeiro de 2015, 23:49 »
A sério?  :o
É assim tão difícil  alterar o código a ver o que faz? A ultima vez que programei arduino levava uns segundos a compilar e enviar o código desde o PC.

Citar
funciona não me perguntes como que não sei.
Esse é o teu problema: enquanto não te esforçares para entender como as coisas funcionam, nem com a papinha toda feita te vais safar. Queres também que ta dê na boquinha?  ::) ::)

"Suja" as mãos no código e vais ver que é bem mais gratificante que levar com bocas por estar a ser preguiçoso. ;)

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.086
    • Tróniquices
Re: Servo rodar o mais lento possivel 45 graus para a direita e 45 para a esquerda
« Responder #11 em: 14 de Janeiro de 2015, 00:19 »
O código não morde e nem o arduino nem o servo dão choques r16, não tenhas medo de fazer experiências ;)

Offline r16

  • Mini Robot
  • *
  • Mensagens: 337
Re: Servo rodar o mais lento possivel 45 graus para a direita e 45 para a esquerda
« Responder #12 em: 14 de Janeiro de 2015, 08:22 »
A sério?  :o
É assim tão difícil  alterar o código a ver o que faz? A ultima vez que programei arduino levava uns segundos a compilar e enviar o código desde o PC.

Citar
funciona não me perguntes como que não sei.
Esse é o teu problema: enquanto não te esforçares para entender como as coisas funcionam, nem com a papinha toda feita te vais safar. Queres também que ta dê na boquinha?  ::) ::)

"Suja" as mãos no código e vais ver que é bem mais gratificante que levar com bocas por estar a ser preguiçoso. ;)


eu ja alterei os valores do delay tanto de 1 como de outro e a velocidade nao altera... o que altera é a rotação.
quanto ao angulo eu tambem coloquei 20...em vez de 45 e nao roda para os 20 graus.
ja tentei isso tudo antes de escrever...se soubesse nao perguntava o que acho normal...
E também não tenho conhecimentos suficientes para saber se está certo ou errado..estou a pedir essa ajuda,obviamente ninguem é obrigado a ensinar...agora eu tentei como sempre tento.
Apenas e somente isso.
obrigado



Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.086
    • Tróniquices
Re: Servo rodar o mais lento possivel 45 graus para a direita e 45 para a esquerda
« Responder #13 em: 14 de Janeiro de 2015, 11:03 »
Se dermos uma olhadela rápida pelos teus tópicos aqui no fórum vamos ver projectos com arduinos e rf, telemoveis, alarmes... fico espantado como é que até agora não aprendeste rigorosamente nada sobre programação. Tens aqui uma lista de tutoriais sobre arduino:

http://playground.arduino.cc/Main/TutorialList

Se não souberes Inglês, tá na hora de aprender. Tens aqui a grande ajuda do google:

https://translate.google.com/

Mas não traduzas a página toda que assim não aprendes rigorosamente nada. Vai traduzindo frase a frase, que assim ao fim de um par de horas já tás a perceber umas coisas de Inglês.

Citar
Dá um peixe a um homem e ele fica alimentado por um dia; ensina-o a pescar, e ele fica alimentado para o resto da vida!

Offline ferb

  • Mini Robot
  • *
  • Mensagens: 8
Re: Servo rodar o mais lento possivel 45 graus para a direita e 45 para a esquerda
« Responder #14 em: 14 de Janeiro de 2015, 12:20 »
Pegando no código do jm, e assumindo que a posição central  são os 90 graus,para teres um movimento do servo de 20 graus, o código fica algo como:

Código: [Seleccione]
void loop()
{
    int i;
    for (i=90;i>(90-20);i--) { //roda entre o centro (90º) 20º para uma direção
        motor.write(i);
         //delay(xx);
    }
    //delay(xx);
    for (i=(90-20);i<90;i++) { // e volta ao centro
         motor.write(i);
        //delay(xx);
    }
    //delay(xx);

    for (i=90;i<(90+20);i++) { //roda entre o centro (90º) 20º para a outra direção
        motor.write(i);
        //delay(xx);
    }
    //delay(xx);
    for (i=(90+20);i>90;i--) { // e volta ao centro
        motor.write(i);
        //delay(xx);
    }
    //delay(xx); //ULTIMO DELAY
}

O delay que tens que mudar é o que está dentro dos 'for'. O minimo é 1ms (sendo que com 1 ms roda rápido). Se queres uma rotação lenta, terás que aumentar esse delay para um valor mais alto.

O delay fora dos for (nomeadamente o ultimo delay) serve para fazeres uma 'pausa' até o código se repetir novamente.

Ferb