Boas pessoal, ando ás voltas para criar um ciclo para controlar o número de voltas de um motor de passo.

Tenho 3 botoes, um para aumentar o numero de voltas, outro para diminuir e o outro para confirmar e guardar na variável num_voltas.

Outra situação é não deixar ter numero de voltas negativos.

O código que tenho é o seguinte, mas não está a funcionar:

#include <Stepper.h>
const int stepsPerRevolution = 64;
Stepper myStepper(stepsPerRevolution, 8,9,10,11);

const int botao_mais = 2; // Pino digital 2 para o botão
const int botao_menos = 3; // Pino digital 3 para o botão
const int botao_salvar = 4; // Pino digital 4 para o botão

int numvoltas=0;
int contador_botao=0;
int estado_botao1=0;
int estado_botao2=0;
int estado_botao3=0;



void setup() {

myStepper.setSpeed(200);
Serial.begin(9600);

pinMode(botao_mais, INPUT); // Definindo o pino digital 2 como entrada
pinMode(botao_menos, INPUT); // Definindo o pino digital 2 como entrada
pinMode(botao_salvar, INPUT); // Definindo o pino digital 3 como entrada

digitalWrite(botao_mais, HIGH); // Ativa o resistor de pull-up da porta 2
digitalWrite(botao_menos, HIGH); // Ativa o resistor de pull-up da porta 2
digitalWrite(botao_salvar, HIGH); // Ativa o resistor de pull-up da porta 3

}

void loop() {

while (estado_botao3 != LOW){
   estado_botao1 = digitalRead(botao_mais); // Lê o pino 2
   estado_botao2 = digitalRead(botao_menos);
   estado_botao3 = digitalRead(botao_salvar);

if (estado_botao1 == LOW) {//Caso o botão for pressionado
   contador_botao++;
   Serial.print("Contador: ");
   Serial.println(contador_botao, DEC);
}
if (estado_botao2 == LOW) {//Caso o botão for pressionado
    contador_botao--;
    Serial.print("Contador: ");
    Serial.println(contador_botao, DEC);
}
delay(1000);

}

numvoltas = contador_botao; // Salva o valor do contador na variavel numero de voltas
Serial.print("Numero de voltas: ");
Serial.println(numvoltas, DEC);
delay(1000);


//velocidade por setSpeed()
for (int i = 0; i < 32; i++)
{
myStepper.step(64*numvoltas);

}
contador_botao = 0;

}

Exibições: 888

Responder esta

Respostas a este tópico

Não ficou claro o funcionamento dos 3 btns.

quando colocou : while (estado_botao3 != LOW){ ....

significa se ele vai continuar no laço while enquanto estado_botao3 for igual a true.

Ou seja, vai entrar se pressionar o botao 3, a questão é que dentro le os outros 2 botoes e eles so vao ser lidos se pressionar o btn 3 que disse que é salvar, é isso que queria fazer ?

Não deveria ler o tempo todo os btns + e - independente do btn salvar ?

Outra coisa que percebi foi o numero de passos do teu stepper, é so 64 passos por volta ?

Normalmente é 200.

Espero ter ajudado,

Jota

Tem razão este exemplo tem ajuda de um membro ca do lab que também não conseguiu implementar com sucesso. Consegue dar uma luz de como posso corrigir?

Quanto ao motor no datasheet dele diz que ele dá 5,625º por passo, isso multiplicado por 64x dá 360º.

Cumpts

Jota, uma dúvida sobre a expressão: while (estado_botao3 != LOW){  

visto que eu antes defini digitalWrite(botao_salvar, HIGH);

e que != significa contrario, então a expressão diz "enquanto estado do botao 3 for diferente de pressionado faz:"

Estou correto ou errado?

Amigo, esta tudo muito confuso.

Não sei se pegou isso de algum lugar, mas tem coisas que a principio não fazem muito sentido.

pinMode(botao_salvar, INPUT); // Definindo o pino digital 3 como entrada digitalWrite(botao_mais, HIGH); //
digitalWrite(botao_salvar, HIGH); // Ativa o resistor de pull-up da porta 3

Se a ideia da 1o linha é definir o pino para receber um sinal de entrada, não faz sentido depois vc querer colocar HIGH nele atraves do digitalWrite.

Tem uma referencia de como o pulldown dos pinos, mas acho que não é isso que quis fazer :

Pins Configured as INPUT_PULLUP

The Atmega chip on the Arduino has internal pull-up resistors (resistors that connect to power internally) that you can access. If you prefer to use these instead of external pull-down resistors, you can use the INPUT_PULLUP argument in pinMode(). This effectively inverts the behavior, where HIGH means the sensor is off, and LOW means the sensor is on. See the Input Pullup Serial tutorial for an example of this in use.

Tudo isso é suposição se nao olharmos exatamente o que colocou no teu circuito para ver o que fazer com o codigo para eles "casarem".

Normalmente é colocado um resistor pulldown e ao pressionar o seu btn ele joga o +5v por exemplo na entrada do arduino e vc le se esse btn foi pressionado com if (estado_botao1 == HIGH) e nao if (estado_botao1 == LOW) como colocou no codigo acima.

Claro que poder ser invertido, mas vai do que fez no teu circuito...

Na minha opiniao, tem que partir do basico.

Comece fazendo o exemplo do Arduino 2-Digital -> Button.

Ele verifica se o btn foi pressionado com : if (buttonState == HIGH) ...

Vai fazer isso para os seus 3 btn.

Nem precisa usar esse while que colocou.

Tudo dentro do loop do arduino é so colocar :

if (buttonCima == HIGH) contador_botao++;

if (buttonBaixo == HIGH) contador_botao--;

if (buttonSalvar == HIGH) { ... }

Quanto ao 64 passos por volta, sim, existem esses motores, sem problemas, a questão é que falei para verificar se realmente é seu caso, pois os mais comuns são o que dao 200 passos em fullstep.

Se isso não for critico na sua aplicacao, nao tem problema, vai ter menos resolução...

Abraços,

Jota

Eu peguei excertos de exemplos de códigos espalhados na net e fui montando á maneira que eu queria.

Nos exemplos que vi, eles activavam os PULLUP dessa forma que eu coloquei, não tinha visto essa forma que é bem mais simples.

Usar o PULLUP interno é para evitar usar um resistor externo certo?

Eu peguei o exemplo que deixou do INPUT_PULLUP e adaptei, mas mesmo assim não está a funcionar direito:


int num_voltas=0;
int contador_botao=0;



void setup() {

Serial.begin(9600);

pinMode(2, INPUT_PULLUP); // Define o pino digital 2 como entrada 
pinMode(3, INPUT_PULLUP); // e ativa o resistor interno pull-up
pinMode(4, INPUT_PULLUP); //


}

void loop() {

int botao_cima = digitalRead(2);
int botao_baixo = digitalRead(3);
int botao_ok = digitalRead(4);

Serial.print("Numero de voltas: ");
Serial.println(contador_botao, DEC);
delay(500);


// Keep in mind the pullup means the pushbutton's
// logic is inverted. It goes HIGH when it's open,
// and LOW when it's pressed. 
// Increment when button's pressed, and off when it's not:


if (botao_cima == HIGH) {
       // não faz nada 
}
else {
       contador_botao++;
}


if ((botao_baixo == HIGH) && (contador_botao <=0)) {
     // não faz nada
}
else {
       contador_botao--;
}


if (botao_ok == HIGH) {
   // não faz nada
}
else {
       num_voltas = contador_botao; // Salva o valor do contador na variavel num_voltas
}



}

Use resistores externos nos btn e veja se vai dar certo, use o exemplo que indiquei, tem que funcionar para 1 btn como no exemplo, depois vc amplia para os 3 e se quiser, adapte para o esquema que peguou usando os resistores internos.

Tem que fazer funcionar um btn simples e ir adaptando para descobrir o que pode ter dado errado e achar a solução do problema..

[]´s

Jota

Mas eu com o codigo acima consigo fazer o incrementar ++, agora quando coloco o if para o desencrementar -- é que ele começa a funcionar mal

Pode ser por isso aqui : && (contador_botao <=0))

Tire isso e diminua normalmente o valor da variavel.

Se nao quiser usar valores negativos ou abaixo de tal valor, basta usar abs(valor) ou colocar um if na linha que diminui o valor, tipo :

So vai diminuir se o valor for maior que 2

if(contador_botao>2) contador_botao--;

[]´s

Jota

Jota antes de mais obrigado pela ajuda.

Já consegui resolver o problema principal, já adiciona já retira e á passa de uma variavel para a outra.

O problema que continuo a ter e em relação ao ciclo.

Eu usando o IF se ele for falso ele avança para o proximo.

Eu queria criar ciclos que só terminem quando este cumprir todos os passos, ou seja:

1º ciclo: Adiciona, Retira a variavel contador e so quando carregar no botão salvar é que pega no valor da variavel contador e passa para variavel num_voltas, e termina o ciclo;

2º ciclo: Pega na variavel num_voltas e incrementa no código do motor para este girar e termina o ciclo; 

3º ciclo: O último ciclo é para resetar, colocar a variavel contador em 0; Termina este ciclo e volta para o primeiro;

Alguém ajuda a fazer isto?

#include <Stepper.h>

const int stepsPerRevolution = 64; //64;
Stepper myStepper(stepsPerRevolution, 8,9,10,11);

int num_voltas=0;
int contador_botao=0;


void setup() {

myStepper.setSpeed(200);
Serial.begin(9600);

pinMode(2, INPUT_PULLUP); // Define os pinos digitais 2 como entrada
pinMode(3, INPUT_PULLUP); // e ativa o resistor interno pull-up
pinMode(4, INPUT_PULLUP); //

}

void loop() {
int botao_cima = digitalRead(2);
int botao_baixo = digitalRead(3);
int botao_ok = digitalRead(4);


if (botao_cima == LOW) {
contador_botao++;
}

if (botao_baixo == LOW) {
if (contador_botao >0) {
contador_botao--;
}
}

if (botao_ok == LOW) {
num_voltas = contador_botao; // Salva o valor do contador na variavel num_voltas
Serial.println(num_voltas);
}

Serial.print("Numero de voltas: ");
Serial.println(contador_botao);
delay(500);

//velocidade por setSpeed()
for (int i = 0; i < 32; i++)//este for é porque o motor tem caixa de reducao
{
myStepper.step(64*num_voltas);
}
contador_botao = 0;

}

Obrigado Jota.

Agora preciso que no fim destes ciclos:

void loop() {
int botao_cima = digitalRead(2);
int botao_baixo = digitalRead(3);
int botao_ok = digitalRead(4);


if (botao_cima == LOW) {
contador_botao++;
}

if (botao_baixo == LOW) {
if (contador_botao >0) {
contador_botao--;
}
}

if (botao_ok == LOW) {
num_voltas = contador_botao; // Salva o valor do contador na variavel num_voltas
Serial.println(num_voltas);
}

Serial.print("Numero de voltas: ");
Serial.println(contador_botao);
delay(500);

//velocidade por setSpeed()
for (int i = 0; i < 32; i++)//este for é porque o motor tem caixa de reducao
{
myStepper.step(64*num_voltas);
}

resetem as variaveis contador_botao e num_voltas.

Alguem consegue explicar como posso fazer?

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço