Me ajude por favor. Como escrever o número de passos de um motor com um teclado?

Tenho um projeto para faculdade,Meu projeto e basicamente será escrever uma distancia em milímetros no teclado e o motor de passo movimentar uma trilha com essa precisão milimétrica, fiz um código que leva um teclado 4x4, um lcd, e um motor de passo, porem para todos os valores que escrevo no meu teclado o motor executa o mesmo numero de passos.

#include <Keypad.h>
#include <LiquidCrystal.h>
#include <Wire.h>
#include <Stepper.h>

Stepper myStepper(300, 13, 10, 9, 6);
const byte Coluna = 3;
const byte Linha = 4;

int i = 0;

char Teclas[Linha][Coluna] = {
{‘1’,‘2’,‘3’},
{‘4’,‘5’,‘6’},
{‘7’,‘8’,‘9’},
{’*’,‘0’,’#’}};

byte Pino_linha[Linha] = {A0, A1, A2, A3};
byte Pino_coluna[Coluna] = {A4, A5, 8};

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
Keypad keypad = Keypad(makeKeymap(Teclas), Pino_linha, Pino_coluna, Linha, Coluna );

void setup()
{
Serial.begin(9600);
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print(“CNC CONTROLE”);
delay(2000);
lcd.clear();

}

void loop(){

lcd.setCursor(0,0);
lcd.print(“DIGITE O TAMANHO”);
int entrada = 0;

while (i < 3 ){
char teclaPressionada = keypad.getKey();
if (teclaPressionada != NO_KEY)
{
lcd.setCursor(i, 1);
lcd.print(teclaPressionada);
i++;

entrada += 1;

if (entrada == 3){
delay(500);
lcd.clear();
delay(500);
lcd.setCursor(0,0);
lcd.print(“DIGITE O TAMANHO”);
i++;
i = 0;
entrada = 0;
delay(300);

int passo=teclaPressionada*50;

// Ajusta a velocidade, este valor pode ser mudado
myStepper.setSpeed(100);
// Numero de passos, sentido horário
myStepper.step(passo);
delay(500); // Delay de 0,5seg antes do próximo
// Ajusta a velocidade, este valor pode ser mudado
myStepper.setSpeed(100);
// Numero de passos, sentido horário
myStepper.step(-passo);
delay(500); // Delay de 0,5seg antes do próximo

}

}

}

}

Algures tens de definir uma taxa de conversao... um passo do motor = x milimetros.

Depois divides o numero que colocas no LCD por essa taxa e ficas com o numero de passos que o motor tem de dar.

O que deviam fazer estas linhas?

      i++;
       
      entrada += 1;

      if (entrada == 3){
      (...)

1) int passo=teclaPressionada*50; está errado, a variável passo deve ser global crie também int incremento = 50;

2) faça passo = 0; fora do while faça passo = passo*10 + teclaPressionada fora de if (entrada == 3) mas dentro do while.

3) no lugar de int passo=teclaPressionada*50; faça passo = passo*incremento;

4) me pague uma cerveja :)

Bubulindo: e verdade, mas eu ainda não consegui fazer com que ao digitar por exemplo 001 no teclado faça com que o motor movimente apenas um passo. Para depois verificar quantos passos fara com que o motor movimente uma trilha 1 mm.

Luisilva: copiei esse código, ele basicamente limita o numero de dígitos no lcd para 3, que seria o limite de 999 mm quase 1 metro de trilha a ser movimentada pelo motor.

Osias neto: copie seu código acho que melhorou, mas coloquei, incremento = 1 para ver ser ao digitar no teclado 001 o motor movimenta-se apenas 1 passo, Mas não consegui o motor da varias voltas, tentei tambem trocando o codigo (passo = passo10 + teclaPressionada;), por (passo = passo + teclaPressionada;), mas não deu certo. Da uma olhada no código ve se ta certo. Há não entendi essa parte (passo = passo10 + teclaPressionada ) , a multiplicação do passo por 10?

Me ajuda o modificar o código para que ao digitar 001 no teclado o motor movimentar 1 passo. Depois que eu verificar quantos passos equivalem a 1 mm, colocar no incremento multiplicando. E se pudesse me ajudar com um código para que o motor voltasse para posição inicial depois de pressionado uma tecla como # agradeço.

Postei um vídeo de como ficou depois do código da uma olhada.

Há e a cerveja, pode deixar e por minha conta , obrigado por me ajudarem. rsrsrs

#include <Keypad.h>
#include <LiquidCrystal.h>
#include <Wire.h>
#include <Stepper.h>

Stepper myStepper(300, 13, 10, 9, 6);
const byte Coluna = 3;
const byte Linha = 4;

int i = 0;
int incremento = 1;
int passo;

char Teclas[Linha][Coluna] = {
{‘1’,‘2’,‘3’},
{‘4’,‘5’,‘6’},
{‘7’,‘8’,‘9’},
{’*’,‘0’,’#’}};

byte Pino_linha[Linha] = {A0, A1, A2, A3};
byte Pino_coluna[Coluna] = {A4, A5, 8};

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
Keypad keypad = Keypad(makeKeymap(Teclas), Pino_linha, Pino_coluna, Linha, Coluna );

void setup()
{
Serial.begin(9600);
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print(“CNC CONTROLE”);
delay(2000);
lcd.clear();

}

void loop(){

lcd.setCursor(0,0);
lcd.print(“DIGITE O TAMANHO”);
int entrada = 0;

passo=0;

while (i < 3 ){
char teclaPressionada = keypad.getKey();
if (teclaPressionada != NO_KEY)
{
lcd.setCursor(i, 1);
lcd.print(teclaPressionada);
i++;

entrada += 1;
passo = passo*10+teclaPressionada;

if (entrada == 3){
delay(500);
lcd.clear();
delay(500);
lcd.setCursor(0,0);
lcd.print(“DIGITE O TAMANHO”);
i++;
i = 0;
entrada = 0;
delay(300);

passo=passo*incremento;

// Ajusta a velocidade, este valor pode ser mudado
myStepper.setSpeed(100);
// Numero de passos, sentido horário
myStepper.step(passo);
delay(500); // Delay de 0,5seg antes do próximo
// Ajusta a velocidade, este valor pode ser mudado
myStepper.setSpeed(100);
// Numero de passos, sentido horário
myStepper.step(-passo);
delay(500); // Delay de 0,5seg antes do próximo
}

}

}

}

thiagofernandes, a minha pergunta era uma pergunta que pretendia apontar na direcção do erro!
Porque a alteração do posicionamento só é realizada quando entrada=3 que é o que a linha “if (entrada == 3){” faz.
Também esta linha while (i < 3 ) não faz nada. A única coisa que faz é repetir 3 vezes o código:

      lcd.setCursor(i, 1);
      lcd.print(teclaPressionada);
      i++;
       
      entrada += 1;
      passo = passo*10+teclaPressionada;

que apenas mostra no ecrã 3 vezes qual foi a tecla pressionada.

A linha passo = passo*10+teclaPressionada; também não faz absolutamente nada, uma vez que antes dela ser executada passo=0;, sendo assim 0*10=0 e 0+tecla=tecla, por isso podia bem ser passo=tecla.

Estas linhas também não fazem nada:

      i++;
      i = 0;

Quando se faz passo=passo*incremento; na realidade o que se está a fazer é que passo=tecla*1;, isto é, passo=tecla;.

Também não compreendo porque é que se move o motor numa direcção e depois se volta à posição inicial:

  myStepper.step(passo);    // roda "teclaPressionada" passos para um lado
  myStepper.step(-passo);  // roda "teclaPressionada" passos para o outro lado

Espero que isto ajude.

luisilva, obrigado por ajudar, mas fiz as modificações que explanou, porem ainda não consegui. quem puder ajudar agradeço. =( =(

Qual é o código actual? (utilize a tag "code" da barra de ferramentas)

#include <Keypad.h>
#include <LiquidCrystal.h>
#include <Wire.h>
#include <Stepper.h>

Stepper myStepper(300, 13, 10, 9, 6);
const byte Coluna = 3;
const byte Linha = 4;

int i = 0;
int passo; 


char Teclas[Linha][Coluna] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}};

byte Pino_linha[Linha] = {A0, A1, A2, A3};
byte Pino_coluna[Coluna] = {A4, A5, 8};
 
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
Keypad keypad = Keypad(makeKeymap(Teclas), Pino_linha, Pino_coluna, Linha, Coluna );


void setup()
{
  Serial.begin(9600);
  lcd.begin(16, 2);
  lcd.setCursor(0,0);
  lcd.print("CNC CONTROLE");
  delay(2000);
  lcd.clear();
    
}



void loop(){
 
  lcd.setCursor(0,0);
  lcd.print("DIGITE O TAMANHO");
  int entrada = 0;
  
  passo=0;

  
  while (i < 3 ){ 
  char teclaPressionada = keypad.getKey();
  if (teclaPressionada != NO_KEY)
  {
      lcd.setCursor(i, 1);
      lcd.print(teclaPressionada);
      i++;
        
      entrada += 1;
      passo = teclaPressionada;

      if (entrada == 3){
      delay(500);
      lcd.clear();       
      delay(500);
      lcd.setCursor(0,0);
      lcd.print("DIGITE O TAMANHO");  
      i++;
      i=0;      
      entrada = 0;           
      delay(300);
  
     
  
  // Ajusta a velocidade, este valor pode ser mudado
  myStepper.setSpeed(100); 
  // Numero de passos, sentido horário
  myStepper.step(passo); 
  delay(500); // Delay de 0,5seg antes do próximo
  // Ajusta a velocidade, este valor pode ser mudado
 
       }    
           
           
    }
 

  }
  
  
}

Video:

Se eu tirar a linha:

i++;
i=0;
Quando o limpa o lcd ( lcd.clear ) não aparece mais os dígitos quando pressionados no teclado.

Primeiro vou criticar e depois vou tentar perceber e sugerir alguma solução.

As variáveis int entrada = 0; e int i = 0; são exactamente a mesma coisa! São incrementadas na mesma altura e “zeradas” também na mesma altura, por isso não há necessidade de ter as duas.

Depois de ver o vídeo penso que para mim ficou mais claro qual é a ideia. A minha sugestão é a seguinte:

  while (entrada < 3 ){ 
  char teclaPressionada = keypad.getKey();
  if (teclaPressionada != NO_KEY)
  {
      lcd.setCursor(0, 1);
      lcd.print(teclaPressionada);
      lcd.print(" ");
      entrada ++;
      passo = passo*10+teclaPressionada;

      if (entrada == 3){
         delay(500);
         lcd.clear();       
         delay(500);
         lcd.setCursor(0,0);
         lcd.print("DIGITE O TAMANHO");     
         delay(300);
         // Ajusta a velocidade, este valor pode ser mudado
         myStepper.setSpeed(100); 
         // Numero de passos, sentido horário
         myStepper.step(passo); 
         delay(500); // Delay de 0,5seg antes do próximo
         // Ajusta a velocidade, este valor pode ser mudado
       }      
    }
  }

Espero que funcione.

Obrigado Luisilva pela critica, pois e assim que estou aprendendo com você. Alterei o código como sugeriu ficando assim:

#include <Keypad.h>
#include <LiquidCrystal.h>
#include <Wire.h>
#include <Stepper.h>

Stepper myStepper(300, 13, 10, 9, 6);
const byte Coluna = 3;
const byte Linha = 4;

int i = 0;
int passo; 


char Teclas[Linha][Coluna] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}};

byte Pino_linha[Linha] = {A0, A1, A2, A3};
byte Pino_coluna[Coluna] = {A4, A5, 8};
 
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
Keypad keypad = Keypad(makeKeymap(Teclas), Pino_linha, Pino_coluna, Linha, Coluna );


void setup()
{
  Serial.begin(9600);
  lcd.begin(16, 2);
  lcd.setCursor(0,0);
  lcd.print("CNC CONTROLE");
  delay(2000);
  lcd.clear();
    
}



void loop(){
 
  lcd.setCursor(0,0);
  lcd.print("DIGITE O TAMANHO");
  int entrada = 0;
  
  while (entrada < 3 ){ 
  char teclaPressionada = keypad.getKey();
  if (teclaPressionada != NO_KEY)
  {
      lcd.setCursor(0, 1);
      lcd.print(teclaPressionada);
      lcd.print(" ");
      entrada ++;
      passo = passo*10+teclaPressionada;

      if (entrada == 3){
         delay(500);
         lcd.clear();       
         delay(500);
         lcd.setCursor(0,0);
         lcd.print("DIGITE O TAMANHO");     
         delay(300);
         // Ajusta a velocidade, este valor pode ser mudado
         myStepper.setSpeed(100); 
         // Numero de passos, sentido horário
         myStepper.step(passo); 
         delay(500); // Delay de 0,5seg antes do próximo
         
       }      

    }

  }
}

O resultado foi esse:

gostaria de conseguir fazer que o motor movimenta-se um passo ao digitar no teclado 001 para que assim depois eu pudesse adicionar um incremento quando eu calcular quantos passos o motor movimentaria um milimetro em uma trilha. percebe-se que ao digitar o lcd não escreve os três dígitos um do lado do outro, mas um em cima do outro. E no segundo comando o motor mudou o sentido.

agradeço novamente pelo apoio, e espero que consiga me ajudar . obrigado

O erro foi meu! Peço desculpa. Penso que o que está a acontecer é que a variável passo não é “zerada” antes de se proceder novamente à introdução de um novo valor de deslocamento. Isto é, é necessário fazer passo=0; antes do ciclo while(entrada<3). O problema do valor (ou das teclas) ser escrito um em cima dos outros, também foi problema meu. Para resolver isto, é necessário substituir:

      lcd.setCursor(0, 1);
      lcd.print(teclaPressionada);
      lcd.print(" ");
      entrada ++;
      passo = passo*10+teclaPressionada;

por:

      lcd.setCursor(0, 1);
      entrada ++;
      passo = passo*10+teclaPressionada;
      lcd.print(passo);
      lcd.print(" ");

Era isto que eu tinha pensado, não sei porquê, não o deixei assim.

Consegue compreender o que implica a alteração?

Não consegui acompanhar a evolução do seu problema aqui, depois eu leio com mais calma... mas quanto ao passo = passo*10+teclaPressionada; É só uma maneira de digitar o valor que você quer com mais de um digito, ex.: Se você quer entrar o valor 210 apertando '2' '1' e '0' e depois 'enter' ficaria:

//(passo inicialmente é 0. Apertou 2) passo = 0*10 + 2 ;// passo igual será 2

// (apertou 0) passo = 2*10 + 1; // passo será 21

// (apertou 0 novamente) passo = 21*10 + 0; // passo será 210 como desejado :)

Depois é só confirmar da maneira que achar melhor, no seu caso você definiu 3 casas decimais sempre, mas poderia ter uma tecla enter, ou um timer para confirmar o valor.

ps.: o que você quer fazer é algo parecido com isto > https://www.youtube.com/watch?v=cKmPvY475Uc? Fiz este projeto em 2009, No video não aparece mas tinha um LCD e um teclado como o seu onde selecionava-se modo de operação (automático ou manual). Infelizmente não tenho mais o código, talvez esteja em meus backups

Osias, foi exactamente isso que o thiagofernandes fez. Ele tinha outros problemas com o controlo dos ciclos e isso também não estava a ajudar. Já há mais de 1 semana que ele não diz nada, por isso, penso que o problema deve ter ficado resolvido.