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
Tags:
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?
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por