domingo, 10 de julio de 2022

Arduino - Motores paso a paso Bipolares y Unipolares - DRV8825 - ULN2003

  Página principal

Arduino
Motores paso a paso Bipolares y Unipolares
DRV8825 - ULN2003

Había trabajado hace tiempo con este tipo de motores paso a paso, pero no había realizado ningún artículo.



Motores Bipolares




Control de paso a paso con DRV8825
//SETA43
//http: / / seta43.duckdns.org
//http: / / seta43.blogspot.com

#define dirPin 2
#define stepPin 3
#define enablePin 13

void setup()
{
  pinMode(enablePin, OUTPUT);
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
}

void loop()
{
  Pasos(200,1,1000);
  delay(500); 
  Pasos(200,0,1000);
  delay(500); 
}

void Pasos(int pasos,bool direccion,int timePaso)

  digitalWrite(dirPin, direccion);
  digitalWrite(enablePin, LOW);
  for(int i = 0; i < pasos; i++)
    {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(timePaso);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(timePaso);
    }
  digitalWrite(enablePin, HIGH);
}


Motores Unipolares





El modelo 28byj48 tiene engranajes para producir mas fuerza.




-Relación de reducción de engranajes
Según la hoja de datos, cuando el motor 28BYJ-48 funciona en modo de paso completo, cada paso corresponde a una rotación de 11,25°. Esto significa que hay 32 pasos por revolución (360°/11,25° = 32).

Aparte de esto, el motor tiene un juego de engranajes reductores de 1/64. (en realidad es 1/63.68395 pero para la mayoría de los propósitos 1/64 es una aproximación lo suficientemente buena)

Esto significa que en realidad hay 2038 pasos (32*63,68395 pasos por revolución = 2037,8864 aproximadamente 2038 pasos).

-El consumo de energía
El 28BYJ-48 normalmente consume alrededor de 240 mA.

Dado que el motor consume mucha energía, es mejor alimentarlo directamente desde una fuente de alimentación externa de 5 V en lugar de extraer esa energía del Arduino.
Fuente:  https://lastminuteengineers.com/28byj48-stepper-motor-arduino-tutorial/

//modificado por SETA43
//http: / / seta43.duckdns.org
//http: / / seta43.blogspot.com
//https://www.luisllamas.es/motor-paso-paso-28byj-48-arduino-driver-uln2003/


//definicion de pins
const int motorPin1 = 2;    // 28BYJ48 In1
const int motorPin2 = 3;    // 28BYJ48 In2
const int motorPin3 = 4;   // 28BYJ48 In3
const int motorPin4 = 5;   // 28BYJ48 In4
                  

int stepCounter = 0;     // contador para los pasos
int stepsPerRev = 4076;  // pasos para una vuelta completa


#define FASE3

#ifdef FASE1
//secuencia 1-fase
const int numSteps = 4;
const int stepsLookup[4] = { B1000, B0100, B0010, B0001 };
#endif

#ifdef FASE2
//secuencia 2-fases
const int numSteps = 4;
const int stepsLookup[4] = { B1100, B0110, B0011, B1001 };
#endif

#ifdef FASE3
//secuencia media fase
const int numSteps = 8;
const int stepsLookup[8] = { B1000, B1100, B0100, B0110, B0010, B0011, B0001, B1001 };
#endif

void setup()
{
  //declarar pines como salida
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
}

void loop()
{
  Pasos(1000,1,1000);
  delay(500); 
  Pasos(1000,0,1000);
  delay(500);
}



void Pasos(int pasos,bool direccion,int timePaso)
{
  for(int i = 0; i < pasos; i++)
    {
    if(direccion==1)
      {
        stepCounter++;
        if (stepCounter >= numSteps) stepCounter = 0;
        setOutput(stepCounter);
        delayMicroseconds(timePaso);
      }
      else
      {
        stepCounter--;
        if (stepCounter < 0) stepCounter = numSteps - 1;
        setOutput(stepCounter);
        delayMicroseconds(timePaso);
      }
    }
  digitalWrite(motorPin1, 0);
  digitalWrite(motorPin2, 0);
  digitalWrite(motorPin3, 0);
  digitalWrite(motorPin4, 0);
}

void setOutput(int step)
{
  digitalWrite(motorPin1, bitRead(stepsLookup[step], 0));
  digitalWrite(motorPin2, bitRead(stepsLookup[step], 1));
  digitalWrite(motorPin3, bitRead(stepsLookup[step], 2));
  digitalWrite(motorPin4, bitRead(stepsLookup[step], 3));
}

AVISO:
En muchos de los montajes que he visto, al parar el motor se sigue alimentando la bobinas.
Esto produce un alto consumo de intensidad, por lo cual se calienta tanto el driver como los motores.
Por lo cual, cuando están parados los motores, deshabilito el paso de corriente por los bobinados de los motores.
En el caso de los unipolares:

  digitalWrite(motorPin1, 0);
  digitalWrite(motorPin2, 0);
  digitalWrite(motorPin3, 0);
  digitalWrite(motorPin4, 0);
Los bipolares con:

  digitalWrite(enablePin, HIGH);


VIDEO

Saludos.
Juan Galaz



Bibliografía:

https://www.luisllamas.es/motores-paso-paso-arduino-driver-a4988-drv8825/
https://lastminuteengineers.com/28byj48-stepper-motor-arduino-tutorial/

lunes, 4 de julio de 2022

El Tiempo - Forecast - Gambas

  Página principal

El Tiempo - Forecast
Gambas

Con el lenguaje Gambas hacer programas es fácil, y como muestra es este.
Son dos programas:
-El uno toma la IP y localiza el lugar de donde se pide la información del tiempo.
-El segundo programa nos pide el lugar de donde queremos que muestre el tiempo atmosférico
Los datos se toman de la página:
        http://wttr.in/?lang=es
Es una página que muestra la información en modo texto.
Para extraer los datos que usará nuestro programa hacemos uso del comando curl , este programa normalmente se encuentra de serie instalado en Linux




He añadido también los programas compilados en Debian9 32Bits, que funcionan bien en Debian11 64Bits.
En versiones antiguas de gambas, no funcionaba bien las transparencias ni las fuentes en modo gráfico.
Los datos que proporciona wttr.in proceden de diferentes sitios, por lo que deberemos seleccionar el mejor vd que se adapte a nuestra zona.
Otra posibilidad es de colocar los códigos de los aeropuertos, en : http://www.airportsinspain.net/list-of-all-airports-in-spain se pueden encontrar.
Como ejemplo:  Barajas Airport ->MAD,  Barcelona->  BCN

VIDEO

PROGRAMAS

Saludos.
Juan Galaz