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