domingo, 1 de mayo de 2016

Encender y apagar leds usando Java y Arduino por comunicación serial

Hola a todos, en este post vamos a conectar Arduino con un PC para manejar unos leds. Con las adecuadas interfaces de potencia se pueden lograr aplicaciones interesantes.

Resultado al que debemos llegar:



Programa para Arduino:

int input;
int count;
int encendido;
int apagado;
int pinArray[] = {22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37};

void setup(){
for (count=0;count<16;count++) {
  pinMode(pinArray[count], OUTPUT);  // Declaramos que utilizaremos estos pines como salidas
  }
Serial.begin(9600);
encendido=0;
apagado=0;
}

void loop(){
 
if (Serial.available()>0){

input=Serial.read();

 if (input=='1'){
  digitalWrite(pinArray[encendido], HIGH);
  encendido++;
  if (encendido==17){
  encendido=0;
  }
 }
 
if (input=='0'){  
    digitalWrite(pinArray[apagado], LOW);
    apagado++; 
    if (apagado==17){
     apagado=0;
     }
    }
  }   
}

Programa para Java:

//Clase ArduinoSwitch
package arduinoswitch;

public class ArduinoSwitch {  
    public static void main(String[] args) {
    Window Ventana = new Window();
    Ventana.setVisible(true);
    }
}

// JFrame window
 package arduinoswitch;

import com.panamahitek.PanamaHitek_Arduino;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import javax.swing.Timer;

public class Window extends javax.swing.JFrame {
 
     private int cuenta=0;
     private int apagar=0;
     private int array[];
           
    PanamaHitek_Arduino Arduino = new PanamaHitek_Arduino();

    public Window() {
        initComponents();
        setLocationRelativeTo(null);
        try {
        Arduino.ArduinoTX("COM9", 2000, 9600);
        } catch (Exception ex) {
            Logger.getLogger(Window.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
   
    private void jButtonEncenderActionPerformed(java.awt.event.ActionEvent evt) {                                              
     //   jButtonEncender.setEnabled(false);
        jButtonApagar.setEnabled(true);
        Color c;
        c = new Color(255, 204, 51);
        jButtonApagar.setBackground(c);
        c = new Color(204, 204, 204);
        jButtonEncender.setBackground(c);
     
        try {          
            Arduino.sendData("1");
        } catch (Exception ex) {
            Logger.getLogger(Window.class.getName()).log(Level.SEVERE, null, ex);
        }

       cuenta=cuenta+1; 
     
       if (cuenta>16){
           cuenta=0;
       }
     
       switch (cuenta) {      
     
        case 1:      
        uno.setBackground(Color.green);
        break;

        case 2:
        dos.setBackground(Color.green);    
        break;
      
         case 3:
        tres.setBackground(Color.green);    
        break;
      
         case 4:
        cuatro.setBackground(Color.green);    
        break;
      
         case 5:
        cinco.setBackground(Color.green);    
        break;
      
         case 6:
        seis.setBackground(Color.green);    
        break;
      
         case 7:
        siete.setBackground(Color.green);    
        break;
      
         case 8:
        ocho.setBackground(Color.green);    
        break;
      
         case 9:
        nueve.setBackground(Color.green);    
        break;
      
         case 10:
        diez.setBackground(Color.green);    
        break;
      
         case 11:
        once.setBackground(Color.green);    
        break;
      
         case 12:
        doce.setBackground(Color.green);    
        break;
      
         case 13:
        trece.setBackground(Color.green);    
        break;
      
         case 14:
        catorce.setBackground(Color.green);    
        break;
      
         case 15:
        quince.setBackground(Color.green);    
        break;
      
         case 16:
        dieciseis.setBackground(Color.green);    
        break;
        default:

        break; 
    
      }
      
    }                                             

    private void jButtonApagarActionPerformed(java.awt.event.ActionEvent evt) {                                            
      //  jButtonEncender.setEnabled(true);
     //   jButtonApagar.setEnabled(false);
        Color c;
        c = new Color(255, 204, 51);
        jButtonEncender.setBackground(c);
        c = new Color(204, 204, 204);
        jButtonApagar.setBackground(c);
     
        try {
            Arduino.sendData("0");
                     
        } catch (Exception ex) {
            Logger.getLogger(Window.class.getName()).log(Level.SEVERE, null, ex);
        }
      
        apagar=apagar+1; 
      
        if (apagar>16){
           apagar=0;
       }
        switch (apagar) {      
     
        case 1:      
        uno.setBackground(Color.white);
        break;

        case 2:
        dos.setBackground(Color.white);    
        break;
      
        case 3:
        tres.setBackground(Color.white);    
        break;
      
        case 4:
        cuatro.setBackground(Color.white);    
        break;
      
        case 5:
        cinco.setBackground(Color.white);    
        break;
      
        case 6:
        seis.setBackground(Color.white);    
        break;
      
        case 7:
        siete.setBackground(Color.white);    
        break;
      
        case 8:
        ocho.setBackground(Color.white);    
        break;
      
        case 9:
        nueve.setBackground(Color.white);    
        break;
      
        case 10:
        diez.setBackground(Color.white);    
        break;
      
        case 11:
        once.setBackground(Color.white);    
        break;
      
        case 12:
        doce.setBackground(Color.white);    
        break;
      
        case 13:
        trece.setBackground(Color.white);    
        break;
      
        case 14:
        catorce.setBackground(Color.white);    
        break;
      
        case 15:
        quince.setBackground(Color.white);    
        break;
      
        case 16:
        dieciseis.setBackground(Color.white);    
        break;
        default:

        break; 
    
      }
            
    }                                           

           /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Window().setVisible(true);
            }
        });
    }



Efecto auto fantástico con interrupción para cambio de velocidad

Buenas mis queridos lectores, para los que se inician en este apasionante mundo de Arduino vamos a documentar una serie de proyectos sencillos con la tarjeta Arduino Mega 2560.

Resultado al que debemos llegar: 




Materiales necesarios:
  • Tarjeta Arduino Mega 2560
  • 17 resistencias de 1/4  watt de 220 ohmnios
  •  1 resistencia de 1/4 watt de 10 K. omnhios
  • 1 pulsador Normalmente Abierto
  • Múltiples cables de conexión
Funcionamiento del programa:

El programa iniciará encendiendo los leds de uno en uno por cada uno de los dos grupos de 8 leds y al llegar al final se devolverá realizando el  efecto de auto fantástico. Si se presiona el pulsador la velocidad del efecto se reducirá y asi sucesivamente hasta volver al estado original, para lograr esto habrá que oprimir el pulsador unas 20 veces aproximadamente.

Conexión de la tarjeta Arduino:
  •  8 leds rojos conectados a los pines  5, 6, 7,8,9,10,11,12 
  •  8 leds verdes conectados a los pines 22,23,24,25,26,27,28,29
  •  1 pulsador conectado al pin 2
 Programa Arduino:

 /* El auto fantástico*/ 

int BotonIncremento=2;   //botón de incremento
int timeAntirebote=20;  //un valor entre 10 y 15 nos da una lectura correcta del estado del botón.
int EstadoBotonIncremento;
int EstadoBotonAnteriorIncremento;

int pinArray1[] = {5, 6, 7,8,9,10,11,12};      //primer grupo de pines
int pinArray2[] = {22,23,24,25,26,27,28,29};   //segundo grupo de pines
int count = 0;
int count2 = 0;
int timer = 5; //timer marca como queremos que vaya de rápido la ráfaga de encendido-apagado de los LEDS  
int estado = 0;

//Función Antirebote
boolean antirebote(int pin){  //esta función nos va a devolver un valor booleano.
  int contador=0;
  boolean estado; //guarda el estado del botón
  boolean estadoAnterior;//guarda el último estado del botón

 do {
   estado=digitalRead(pin);
   if (estado != estadoAnterior){
     contador=0;
     estadoAnterior = estado;
   }
  else{
    contador = contador + 1;
  }
  delay(1);
 }
 while(contador < timeAntirebote);
 return estado;
}


void setup(){
  pinMode(BotonIncremento,INPUT);   //los pines los declaramos como entradas
  Serial.begin(9600);
  attachInterrupt( 0, ServicioBoton, RISING);  //declaramos interrupción de paso bajo a paso alto
 
  for (count=0;count<8;count++) {
  pinMode(pinArray1[count], OUTPUT);
  }
 
  for (count=0;count<8;count++) {
  pinMode(pinArray2[count], OUTPUT);
  }  
  }

void loop() {  
  for (count=0;count<7;count++) {
    digitalWrite(pinArray1[count], HIGH);  
    digitalWrite(pinArray2[count], HIGH);   
    delay(timer);
    digitalWrite(pinArray1[count + 1], HIGH);
    digitalWrite(pinArray2[count + 1], HIGH);     
    delay(timer);
    digitalWrite(pinArray1[count], LOW);
    digitalWrite(pinArray2[count], LOW);
    delay(timer*2);}  
    for (count=7;count>0;count--) {
    digitalWrite(pinArray1[count], HIGH);
    digitalWrite(pinArray2[count], HIGH);
    delay(timer);
    digitalWrite(pinArray1[count - 1], HIGH);
    digitalWrite(pinArray2[count - 1], HIGH);
    delay(timer);  
    digitalWrite(pinArray1[count], LOW);
    digitalWrite(pinArray2[count], LOW);
    delay(timer*2);}   
}
   

  void ServicioBoton() {          
   EstadoBotonIncremento=digitalRead(BotonIncremento);//leemos el botón
   if((EstadoBotonIncremento !=EstadoBotonAnteriorIncremento) &&(antirebote(BotonIncremento))){   //preguntamos si hay cambio respecto al estado anterior y vemos si esta presionado
        timer=timer + 5;   //aumentamos la cuenta      
   }
   EstadoBotonAnteriorIncremento = EstadoBotonIncremento;//guardamos el estado del botón  
    if (timer >= 200) { 
    timer=5;
   }   
  }