Nema17 + Controlador A4988 + RFID RC522 + Arduino Nano

Hola amigos, en este nuevo tutorial queremos compartir con ustedes nuestro ejemplo de como poner en funcionamiento un motor paso a paso bipolar de referencia Nema 17 conectado a un cotrolador A4988 mediante un lector RFID RC522 tan solo con una tarjeta BIP o cualquier tarjeta bancaria u otra tarjeta o llavero que emita una frecuencia de 13.56 Mhz; todo esto dirigido por un Arduino Nano.

El RC522 está diseñado para escribir o leer datos de aplicaciones de bajoc consumo de energia y todo esto a un bajo costo, ideal para dispositivos portatiles y tiene por caracteristicas lo siguiente:

  1. Corriente de operación: 13-26mA a 3.3V
  2. Corriente de standby: 10-13mA a 3.3V
  3. Corriente de sleep-mode: <80µA
  4. Corriente máxima: 30mA
  5. Frecuencia de operación: 13.56Mhz
  6. Distancia de lectura: 0 a 60mm
  7. Protocolo de comunicación: SPI
  8. Velocidad de datos máxima: 10Mbit/s

 

 

En el Diagrama podemos ver como conectamos el controlador A4988 al arduino
Detalle del controlador A4988 y sus conexiones.

pololuA4988

 

Este codigo basicamente trata de que al acercar la tarjeta BIP o la que estemos usando al RC522 un Led se encenderá haciendo girar el motor Nema 17 y no se apagará hasta que el motor regrese a su estado inicial manteniendo un completo descanso, lo cual le otorga un buen cuidado al motor y a su vez al controlador, la idea surge empezando por acercar la tarjeta al RC522, posteriormente encendiendo un Led y por ultimo el presente codigo´, esperamos sea de mucha utilidad.

Librerias:

SPI-master

rfid-master

Codigo:

#include <SPI.h>
#include <MFRC522.h>
int steps = 8;
int direccion = 7;
int reset = 5;
int pasos = 4000;

#define VELOCIDAD 1700

#define RST_PIN 9 // Configurable, see typical pin layout above
#define SS_PIN 10 // Configurable, see typical pin layout above

MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance

void setup() {
Serial.begin(9600); // Initialize serial communications with the PC
SPI.begin(); // Init SPI bus
mfrc522.PCD_Init(); // Init MFRC522 card
Serial.println(F(“Ingrese Tarjeta para Escribir Dato Personal”));
pinMode(4, OUTPUT);
pinMode(steps, OUTPUT);
pinMode(direccion, OUTPUT);
pinMode(reset, OUTPUT);
}

void loop() {
//Activar una direccion y fijar la velocidad con stepDelay

// Giramos 200 pulsos para hacer una vuelta completa
digitalWrite(4, LOW);
// Prepare key – all keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
MFRC522::MIFARE_Key key;

for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;

if (  mfrc522.PICC_IsNewCardPresent()) {

digitalWrite(4, HIGH);
Serial.println(F(“Lectura Confirmada”));

digitalWrite(reset, LOW); //Mientras reset este en LOW el motor permanecerá apagado y no sufrirá. El chip apagará todos los puertos y no leerá comandos.
delay(100);
digitalWrite(reset, HIGH); //Cuando reset se encuentre en HIGH el motor arrancará y leerá los comandos enviados.
digitalWrite(direccion, HIGH);

for (int i = 0; i<pasos; i++) //Equivale al numero de vueltas (200 es 360º grados) o micropasos
{
digitalWrite(steps, HIGH); // This LOW to HIGH change is what creates the
digitalWrite(steps, LOW); // al A4988 de avanzar una vez por cada pulso de energia.
delayMicroseconds(VELOCIDAD); // Regula la velocidad, cuanto mas bajo mas velocidad.

}

digitalWrite(reset, LOW); //Mientras reset este en LOW el motor permanecerá apagado y no sufrirá. El chip apagará todos los puertos y no leerá comandos.
delay(500);
digitalWrite(reset, HIGH); //Cuando reset se encuentre en HIGH el motor arrancará y leerá los comandos enviados.
digitalWrite(direccion, LOW);

for (int i = 0; i<pasos; i++) //Equivale al numero de vueltas (200 es 360º grados) o micropasos
{

digitalWrite(steps, LOW); // LOW to HIGH hace que el motor avance ya que da la orden
digitalWrite(steps, HIGH); // al A4988 de avanzar una vez por cada pulso de energia.
delayMicroseconds(VELOCIDAD); // Regula la velocidad, cuanto mas bajo mas velocidad.
}

digitalWrite(reset, LOW);

//delay(500);

return;
}
// Look for new cards

digitalWrite(4, LOW);
}

Arduino y CD74HC4067 prendiendo Led

Uno de los módulos creo que mas útiles que tenemos disponibles son los multiplexores (CD74HC4067), una descripción muy light de este dispositivo seria como una zapatilla de pines… Para que se entienda de forma mas fácil es un dispositivo donde usando 5 pines del Arduino podemos manejar 16 señales o sensores.. si 16, y esto se agradece en el minuto que queremos tener acceso a muchos datos o armar un robot o manejar muchas luces y todo lo que se nos pudiera ocurrir, lo mejor es capaz de leer señales digitales o analógicas… Super!!!

Por el minuto nos limitaremos a prender 16 led, luego trataremos de manejar varios sensores, incluso hacer uso de varios multiplexores a la vez.

Aquí el diagrama:

multiplexor_arduino_led

 

Para simplificar la vida usaremos una libreria Mux.h la podemos descargar del siguiente link :

https://github.com/mikedotalmond/Arduino-Mux-CD74HC4067

Arduino-Mux-CD74HC4067-master (Aquí también por si desaparece)

Aquí el Modulo en nuestra Tienda

Aquí el código :

#include <Mux.h>

Mux mux(2,3,4,5,4); // initialise on construct...
int counter=0;

void setup(){
Serial.begin(9600);
mux.setup(8,9,10,11,4); // initialise Mux
}

void loop(){
mux.write(counter, HIGH); //Turn ON the selected LED
delay(500);
mux.write(counter, LOW); //Turn OFF the selected LED

if(counter==15){
Serial.println(counter); //Print results
}
else{
Serial.print(counter);
Serial.print(", ");
}

counter = ++counter & 15; //Add +1 to counter until 15
}

 

 

Nota: Para el circuito del video no use resistencias, en favor del tiempo.

 

Como usar el sensor Photoresistor con arduino

Codigo

int lightPin = 0;  //Definimos el pin para el ldr
int ledPin=11;     //Definimos pin para el Led

void setup()
{
    Serial.begin(9600);  //Comenzamos la comunicación serial
    pinMode( ledPin, OUTPUT );
}

void loop()
{
    Serial.println(analogRead(lightPin)); //Escribimos el valor del LDR en la pantalla  Serial de Arduino
    analogWrite(ledPin, analogRead(lightPin)/4);  //Mandamos el valor al pin del led. Dependiendo del valor del resistor 
                                                //se debe dividir el valor. por ejemplo, 
                                                //con una resistencia de 10k dividimos el valor por 2, para una de 100k dividimos por 4.
   delay(10); //prendemos el led con un corto tiempo.
}