Pessoal tenho um codigo onde eu controlo o movimento de um motor de passo usando a lib AccelStepper mostro algumas informacoes no display 16x2 usando a lib LiquidCrystal_I2C.

Acontece que se eu coloca a lib do lcd o motor de passo fica extremamente lento, quase nao roda.
Basta tirar os codigos do lcd, por menor que sejam e tudo volta ao normal.

Alguem tem alguma dica sobre este problema.


Valeu

Exibições: 282

Responder esta

Respostas a este tópico

Poste o código se não fica difícil, dar dicas só com suposições!!!

Segue o codigo em questao:

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <AccelStepper.h>

AccelStepper motor(1,11,10);
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3,POSITIVE);

int led=13;             // led no pino 13
int sensorFoto=8;       // simulando o sensor - trocar
int sensorCentro=12;    // sensor do centro do carro
int btnAuto=7;          // sistema em manual ou auto
int btnCentro=4;        // botao para centralizar carro
int btnEsquerda=6;      // botao do movimento esquerdo
int btnDireita=5;       // botao do movimento direito
int liberaMotor=9;      // coloca o motor em standby
int btnInverte=3;      // botao para inverter o sentido

// variaveis do sistema do feixe
int var=0;          
int var2=0;        
int estado=0;       
int LigaMotor = 1;
int fnManual=0;

//Variaveis do Automatico
int varAuto = 0;
int varAuto2 = 0;
int estadoAuto = 0;

//Variaveis da inversao do sentido
int sentH = 0;
int sentAH = 0;
int varInv = 0;
int varInv2 = 0;
int estadoInv = 0;

void setup()
{
  lcd.begin(16,2);
  lcd.backlight();
  LigaMotor = 1;
  fnManual = 0;
  
  pinMode(led,OUTPUT);
  pinMode(sensorFoto,INPUT);
  pinMode(sensorCentro,INPUT);
  pinMode(btnCentro,INPUT);
  pinMode(btnAuto,INPUT);
  pinMode(btnEsquerda,INPUT);
  pinMode(btnDireita,INPUT);
  pinMode(btnInverte,INPUT);
  pinMode(liberaMotor,OUTPUT);
  digitalWrite(btnAuto,LOW);
   
  motor.setMaxSpeed(8000);
  motor.setSpeed(8000);
  motor.setMinPulseWidth(100);
  motor.setCurrentPosition(0);
 
 lcd.setCursor(0,0);
 lcd.print("Alinhador Eletronico");
}
void loop()
{  
  
  int varEsq = digitalRead(btnEsquerda);
  int varDir = digitalRead(btnDireita);
  
  int vStatus = SensorFeixe();
  if (LigaMotor == 1){          // coloca o motor em automatico
   if (vStatus == 1){
     
     motor.move(1000);
     motor.setSpeed(sentH);      // Velo padrao = 8000
     motor.runSpeed();           // Ver funcao InverterSentido
   
   }else if (vStatus == 0){
       
     motor.move(1000);
     motor.setSpeed(sentAH);    // Velo padrao = -8000
     motor.runSpeed();          // Ver funcao InverterSentido
   }
  }
 
 //logica para movimentar o carro esquerda e direita
 if (LigaMotor == 0){
     if (varEsq == 0){                    //botao esquerdo acionado
      fnManual = 1;
      lcd.setCursor(0,1);
      lcd.print("Mover Esquerda");
      digitalWrite(liberaMotor,LOW);
       motor.move(1000);
       motor.setSpeed(1000);
       motor.runSpeed();
      
     }
     if (varDir == 0){                    // botao direito acionado
       fnManual = 1;
       lcd.setCursor(0,1);
       lcd.print("Mover Direita");
       digitalWrite(liberaMotor,LOW);
       motor.move(1000);
       motor.setSpeed(-1000);
       motor.runSpeed();
       
     }
}
  //verifica se os botoes esquerda e direita nao estao precionados
  if ((varEsq == 0) && (varDir == 0)){
     fnManual = 0; 
  }
  
MotorManual();
InverterSentido();
}

int SensorFeixe(){
   var=digitalRead(sensorFoto);               // ler o valor enviado Sensor De Feixe
  if ((var == HIGH) && (var2 == LOW)) {
    estado = 1 - estado;
    delay(20); // de-bouncing
  }
  var2=var;
  if (estado == 1) {                    // caso esteja no material roda esquerda
    return 1;
  } else {
    return 0;                          // caso nao esteja no material roda direita
   }

 void MotorManual(){                  // funcao que coloca o motor em manual
 
   varAuto = digitalRead(btnAuto);
   if ((varAuto == HIGH) && (varAuto2 == LOW)){
     estadoAuto = 1 - estadoAuto;
     delay(20);
   }
   varAuto2 = varAuto;
   if (estadoAuto == 0){
     LigaMotor = 1;                    //sistema ligado em auto
     digitalWrite(liberaMotor,LOW);
     
   }else{
     LigaMotor = 0;                  //sistema em manual
     if (fnManual == 0){
     digitalWrite(liberaMotor,HIGH);
     
     }
   }
 }  
 void InverterSentido(){
    varInv = digitalRead(btnInverte);
    if ((varInv == HIGH) && (varInv2 == LOW)){
       estadoInv = 1 - estadoInv;
      delay(20);
    }
    varInv2 = varInv;
    if (estadoInv == 0){
     sentH = 8000;
     sentAH = -8000; 
    }else{
      sentH = -8000;
      sentAH = 8000;
    }
   }

Qual o local no código que vc coloca e tira a parte do codigo que o motor fica lento?

No codigo tem um comentario BOTAO DIREITO ACIONADO e BOTAO ESQUERDO ACIONADO. Quando eu seguro apertado estes botoes o carro alinhador vai para direita ou para esquerda. Neste ponto quando esta com o codigo do LCD o motor fica muito lento mesmo. Se eu tiro as linhas do LCD ai sim o motor roda normalmente.

Tens alguma ideia pois eu tenho um outro projeto que vou comecar a desenvolver que vai usar muito o LCD junto com o motor. Quero começca a fazer um Timelapse.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço