Opa galera, to num sufoco dus inferno.

estou construindo um braço robótico para o meu TCC de graduação.

Devido ao torque necessário estou usando motores de vidro elétrico e a ponte H IBT2.

E para o retorno de posição estou usando encoder incremental, porem este encoder nao tem a faze Z. e por isso eu coloque chaves fim de curso para sinalizar os pontos de calibração.

como esta função de calibração deverá ser executada apenas uma vez ao ligar o braço robotico, estou tendo problemas quanto a isso.

Dentro do Void setup não estou conseguindo fazer funcionar a parada do motor através da chave fim de curso.

E se eu usar o void loop tada vez ele ira executar o movimento de calibração, o que eu nao gostaria.

Mas ai vai a pergunta, é possivel usar um outro tipo de void? Tipo um void calibração () ?

Segue link do exemplo do que eu estou tentando fazer

http://pastebin.com/aqPdVwdM

Exibições: 1175

Responder esta

Respostas a este tópico

Rodrigo,

Isto resolveria?

int flag = 0;

void loop()

{

   if (flag == 0) {

      calibracao();

   }

  // resto do seu código aqui

}

void calibracao() {

    //seu código aqui

   flag = 1;

}

Acho que estou fazendo algo de errado.

a linha de programação sozinha funciona, mas quando eu insiro na linha de codigo que vc forneceu nao funcionou o codigo ficou como abaixo, estou tentando descobrir o furo mas ta complicado rsrs

int velo1 = 2;
int velo2 = 3;
int sensor1=0;
int sensor2=0;

void setup()
{
pinMode(48,INPUT_PULLUP);
pinMode(49,INPUT_PULLUP);
pinMode(velo1,OUTPUT);
pinMode(velo1,OUTPUT);

}


int flag = 0;
void loop()
{
if (flag == 0)
{
calibracao();
}
// resto do seu código aqui
}
void calibracao()
{
sensor1 = digitalRead(48);
sensor2 = digitalRead(49);

if (sensor1 == HIGH)
{
analogWrite(velo1,250);
analogWrite(velo2,0);
}
else
{
analogWrite(velo1,0);
analogWrite(velo2,0);
}


flag = 1;
}

O que não funcionou? Está executando mais do que uma vez?

Ele nao reconhece o void calibracao, vai direto para o programa. 

na bancada de teste eu coloquei um motor para rodar e quando der um pulso no fim de curso ele mudaria a sequencia para girar por 2 segundos pra um lado e depois dois segundos para o outro.

o que ocorre é que ele vai direto para a segunda parte sem executar a primeira

Envie o código completo para que facilite a análise.

Olá a todos.

Coloque essa função void calibracao() dentro de void setup() já que ela será executada apena uma vez. Caso contrario está bom.

Minha explicação para isso é que as definições das funções void setup() e void loop(), são chamadas dentro de um arquivo chamado main.cpp e dentro da função int main() (isso é padrão do c/c++), este arquivo está localizado em (caminho_da_instalação)/hardware/arduino/avr/cores/arduino.

A função void loop, como o nome sugere é um loop infinito, um for(;;) sem condição de parada.

Até mais

Oi FH,

concordo com você.

Rui

Oi RAN, bom dia, 

verifiquei o code que postou no seu ultimo comentário, e ele deveria funcionar.

A unica coisa que achei estranho é não sei se funciona, é que você 

criou a variável flag após o Setup, mas fora de uma função.

Mude ela pra a primeira parte do code, onde definiu as outras e veja se funciona.

Rui

Concordo com o RV, teoricamente não deveria influenciar, mas não custa testar.

Pessoal, desculpa a demora em dar uma resposta sobre o programa.

Consegui resolver 99% dos problemas.

Mas sabe como é parece que pra cada problema que vc soluciona aparece mais dois rsrs.

O Manipulador que desenvolvemos utiliza encoders do tipo encremental de 400ppv.

os pulsos sao convertidos para angulo na programação.

foi criado uma variável cont onde é contado os pulsos do encoder, e uma variável angulo onde é convertido o valor de pulso para angulo.

usando o monitor serial a linha de codigo so inicia a leitura caso o encoder sofra alguma movimentação, acredito que até o momento em que o encoder seja acionado o valor da variável angulo é nulo, ja que ainda não recebeu nenhum valor através da variável cont, e como o restante do código depende do valor da variável angulo  o movimento dos motores não é iniciado, se vc der um pequeno toque no encoder a programação flui normalmente.

eu acredito que se eu atribuir um valor para a variável angulo onde eu indique em que angulo o encoder está o movimento será iniciado prontamente, porem as minhas tentativas de atribuir um valor para a variavel angulo nao foram produtivas.

para atribuir um valor de angulo para a variável angulo eu utilizei os métodos abaixo todos sem sucesso.

angulo = 0;

analogWrite(angulo,0);

o codigo para a leitura do encoder é 

#define FaseA 36
#define FaseB 37


int cont=0;
float angle=0;

void setup() {

pinMode(13, OUTPUT);
pinMode(FaseA,INPUT);
pinMode(FaseB,INPUT);
pinMode(FaseA,INPUT_PULLUP);
pinMode(FaseB,INPUT_PULLUP);

}

void loop()
{

if ( digitalRead(FaseA) == LOW && digitalRead(FaseB) == HIGH ) //Testa o sentido horario
{
while(digitalRead(FaseB) && !digitalRead(FaseA));
if ( digitalRead(FaseA) == LOW && digitalRead(FaseB) == LOW )
{
while(!digitalRead(FaseB) && !digitalRead(FaseA));
if ( digitalRead(FaseA) == HIGH && digitalRead(FaseB) == LOW )
{

cont++;
angle = cont*0.9;


}
}
}

if ( digitalRead(FaseB) == LOW && digitalRead(FaseA) == HIGH ) //Testa o sentido anti-horario
{
while(digitalRead(FaseA) && !digitalRead(FaseB));
if ( digitalRead(FaseB) == LOW && digitalRead(FaseA) == LOW )
{
while(!digitalRead(FaseA) && !digitalRead(FaseB));
if ( digitalRead(FaseB) == HIGH && digitalRead(FaseA) == LOW )
{
cont--;
angle = cont * 0.9;

}
}
}
}

vocês podem me dar alguma dica para que eu possa atribuir um valor inicial de angulo 

Rodrigo,

1) A instrução analogWrite tem como sintaxe analogWrite(pino, valor). Você tem certeza que a linha analogWrite(angulo,0); está correta?   A variável não deveria ser utilizada como valor neste caso?

2) Você testa apenas se digitalRead(FaseA) == LOW && digitalRead(FaseB) == HIGH, e se for o contrário? digitalRead(FaseA) == HIGH && digitalRead(FaseB) == LOW?    Verifique se é isto mesmo.

3) Você usa while(digitalRead(FaseB) && !digitalRead(FaseA)); Ou seja, tem um ; no final da linha. Isto faz com que o while fique em loop até que a expressão lógica deixe de ser verdadeira. É isto mesmo o que você deseja?

4) Porque você tem duas variáveis para ângulo (angulo e angle)? Não seriam a mesma variável?

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço