Puente H y arduino (y otras cosas)

Como parte de esta sesión, nos dedicamos a mover un motor DC con un puente H (módulo arduino), lo que nos permite controlar las velocidad y dirección del motor, perfecto para robótica y autómatas. Como demostración, vamos a controlar el motor a través de la salida B del módulo. El pin ENB se conectará con el jumper a +5V.

El ejemplo esta desarrollado con Arduino UNO.

IMAG0588.jpg

Código

El programa básicamente activa el motor en un sentido por 4 segundos, luego detiene el motor por 0.5 segundos, después activa el motor en sentido inverso por 2 segundos y por último detiene el motor por 2 segundos. Luego repite la acción indefinidamente.

 

int IN3 = 5;
int IN4 = 4;

void setup(){pinMode(IN4, OUTPUT);pinMode(IN3, OUTPUT);}

void loop()
{
//Motor gira en un sentido
digitalWrite (IN4, HIGH);
digitalWrite(IN33, LOW);
delay(2000);
//motor no gira
digitalWrite(IN4, LOW);
delay(500);
//motor gira en sentido inverso
digitalWrite(IN3, HIGH);
delay(2000);
//motor no gira
digitalWrite(IN3, LOW);
delay(5000);
}

Otros (proyectos en desarrollo): App para domótica con arduino y bluetooth. 

img_1873

Ping-ball con Arduino

img_1872

Anuncios

Motores?

En esta sesión se siguió esta guía: http://robologs.net/2014/09/16/como-construir-un-controlador-de-motores-npn/

El experimento inicial consistió en crear el controlador para encender y apagar el motor DC de forma progresiva utilizando una salida analógica, similar a los ejercicios de encendido y apagado progresivo de un LED que se desarrollaron en sesiones anteriores.

img_1794img_1798

El código utilizado es el siguiente:

int out = 9;                 
int value = 0;      //valor de la salida
int amount = 5;    //tamaño del incremento o decremento

void setup()  {
  pinMode(out, OUTPUT);
}

void loop()  {
  analogWrite(out, value);     
  value = value + amount;
  if (value == 0 || value == 255) { //detecta si se llega a uno de los limites
    amount = -amount ;              //invierte el sentido del incremento o decremento
  }    
  delay(50);
}

Luego se realizó una variación reduciendo y quitando la resistencia que se muestra en el esquemático que está en el enlace y cambiando el código para utilizar una salida digital en lugar de una salida analógica y probando a dejar el motor encendido y apagado en intervalos de 5 segundos. El código utilizado fue el siguiente:

int out = 13;                

void setup()  {
  pinMode(out, OUTPUT);
}

void loop()  {
  digitalWrite(out,HIGH);
  delay(5000);
  digitalWrite(out,LOW);
  delay(5000);
}

 

Más Arduino.

img_1701

img_1705

En esta sesión del grupo de estudio de electrónica experimentamos la integración entre circuitos analógicos creados en una placa con el procesamiento digital que permite la plataforma Arduino.

Se crearon los programas para desarrollar los siguientes ejercicios prácticos:

Control del voltaje en una salida analógica para realizar progresivamente el encendido y apagado de un LED pero utilizando sólo condicionales (if) en lugar de ciclos (for).

int pin = 11;
int v = 0; 
boolean subiendo = true; // controla si el voltaje está subiendo (true) o bajando (false)

void setup() {
  pinMode(pin, OUTPUT);
}

void loop() {
  // Cuando está subiendo
  if (subiendo==true)
  { 
    if(v >= 255)
    {
      subiendo = false;
    } 
    else 
    {
      analogWrite(pin,v);
      delay(10);
      v++;
    }
  }

  // Cuando está bajando
  if(subiendo==false)
  {
    if(v <= 0)
    {
      subiendo = true;
    } 
    else 
    {
      analogWrite(pin,v);
      delay(10);
      v--;
    }
  }
}

Uso de un potenciometro para controlar analógicamente el voltaje de salida para el encendido de un LED.

const int pinEntrada = A0;
const int pinSalida = 9;
int valorPotenciometro; //variable que almacena la lectura analógica
int posicion;           //posicion del potenciometro en porcentaje

void setup() {
  pinMode(pinSalida, OUTPUT);
}

void loop() {
  // Realizar lectura analogica de potenciometro
  valorPotenciometro = analogRead(pinEntrada);      
  // convertir a porcentaje la lectura
  posicion = map(valorPotenciometro, 0, 1023, 0, 100);
  // regla de 3 para calcular en voltaje de salida
  int voltaje = (posicion*255)/100;
  analogWrite(pinSalida, voltaje);
}

Reemplazar el potenciometro por una fotocelda para controlar analógicamente el voltaje de salida para el encendido de un LED.

const int pinEntrada = A0;
const int pinSalida = 9;
int valorFotocelda;         //variable que almacena la lectura analógica
 
void setup() {
  pinMode(pinSalida, OUTPUT);
  // Inicia la comunicción serial de Arduino con el computador a una velocidad de 9600 bits por segundo
  Serial.begin(9600);       
}

void loop() {
  // Realizar lectura analógica del potenciometro
  valorFotocelda = analogRead(pinEntrada); 
  // Imprimir en el monitor serial el valor registrado por la fotocelda
  Serial.println(valorFotocelda);
  // Restringir el valor de la fotocelda para que esté en el rango de 150 a 800
  valorFotocelda = constrain(valorFotocelda, 150, 800);
  // Mapear o convertir el valor registrado por la fotocelda a un valor entre 0 y 255;
  int voltaje = map(valorFotocelda, 150, 800, 0, 255);  
  analogWrite(pinSalida, voltaje);
}

Utilizar una fotocelda para establecer un valor de voltaje específico a partir del cual se encienden o se apagan dos LEDs de forma alternada.

const int pinEntrada = A0;
const int pinSalida1 = 12;
const int pinSalida2 = 13;
int valorFotocelda;     //variable que almacena la lectura analógica
 
void setup() {
  pinMode(pinSalida1, OUTPUT);
  pinMode(pinSalida2, OUTPUT);
  // Inicia la comunicción serial de Arduino con el computador a una velocidad de 9600 bits por segundo
  Serial.begin(9600);
}

void loop() {
  // Realizar lectura analógica del potenciometro
  valorFotocelda = analogRead(pinEntrada);
  // Imprimir en el monitor serial el valor registrado por la fotocelda
  Serial.println(valorFotocelda);
  // Comprobar las condiciones para el apagado o encendido de los LEDs
  if (valorFotocelda <= 512) {
   digitalWrite(pinSalida1, HIGH);
   digitalWrite(pinSalida2, LOW);
  } 
  else {
   digitalWrite(pinSalida1, LOW);
   digitalWrite(pinSalida2, HIGH);
  }
}

img_1708img_1709img_1711img_1713