19 dic. 2013

Arduino, Visual Basic y control de salidas. Parte 1 Software

Parte 1 de una serie de dos tutoriales ( Software y Hardware ) donde podréis ver como controlar salidas de un arduino mediante el puerto USB de un ordenador.

Programa Finalizado

Debido a ciertas circunstancias me ha surgido la necesidad de tener que controlar 2 enchufes remotamente un par de veces al día, no es un proceso que siga la misma secuencia, por lo que no podía programar un "temporizador", de modo que decidí optar debido a mi escaso tiempo por la opción que creí más fácil y didáctica, esta fue usar Visual Basic para hacer un programa, el cual conectado a un arduino, active y desactive salidas del mismo, a la vez que visualice su estado ( para tener la certeza que no se ha quedado "colgado" el programa, y que realmente esa salida ha cambiado de estado, al pulsar para activarla o desactivarla ).


Lo primero que llevé a cabo fue la parte del software, que para mi era la más difícil, ya que nunca había hecho nada en VB, aunque realmente luego descubrí que era todo muy sencillo, y que apenas había que picar código "para hacer que la aplicación funcionase", de echo la aplicación la tenía funcionando en una tarde de trabajo, y en otra tarde la aplicación del arduino, que, como entenderéis, no es demasiado tiempo.

La aplicación está pensada para que en un futuro pueda ser ampliada con más salidas, por ahora solo tiene "botones" de encendido y apagado individual, y de encendido y apagado del conjunto, aparte de el botón para conectarse al puerto serie ( que por defecto va a 9600 y se inicia en el puerto 3, aunque esto puede ser fácilmente configurable desde la propia aplicación).

El programa en el entorno de programación se ve de esta forma:



Y la configuración del "puerto serie" y del timer, es la siguiente:























Con respecto a la programación no hay más mucho que decir, dado que ya está comentada en el propio código... en cuanto acabe la parte del hardware la subiré. Os dejo un link a mega con los archivos de ambos programas

Link a Mega


Codigo Visual Basic 6.0:


Option Explicit

Dim dato As String 'Variable para guarda el dato recibido por el puerto serie
Dim datoo As String

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Const SW_NORMAL = 1
  
Private Sub Form_Load()
Puerto.Text = 3 'Esribe un 3, ya que es el puerto por defecto
End Sub
  
  
Private Sub cmdOFF1_Click()
 Serie.Output = "0"      'Mandamos un "2" para apagar el led
End Sub
  
Private Sub cmdON1_Click()
 Serie.Output = "1"      'Mandamos un "1" para encender el led
End Sub

Private Sub cmdOFF2_Click()
 Serie.Output = "2"      'Mandamos un "2" para apagar el led
End Sub
  
Private Sub cmdON2_Click()
 Serie.Output = "3"      'Mandamos un "1" para encender el led
End Sub

Private Sub OFFALL_Click()
 Serie.Output = "02"      'Mandamos un "1" para encender el led
End Sub

Private Sub ONALL_Click()
 Serie.Output = "13"      'Mandamos un "1" para encender el led
End Sub


Private Sub cmdConectar_Click()
On Error Resume Next
If (Serie.PortOpen = False) Then
Serie.CommPort = Puerto.Text
Serie.PortOpen = True   'Abrimos el puerto serie
Else
Serie.PortOpen = False  'Cerramos el puerto serie
End If
End Sub


Private Sub Puerto_Change()  'Configuración ventana que aparece si no se introduce un numero en el puerto
Dim pregunta As String
If (IsNumeric(Puerto.Text)) Then
Else
Puerto.SetFocus
pregunta = MsgBox("Se esperaba un número", vbOKOnly, "Error")
End If
End Sub

Private Sub Timer1_Timer()
pulsador.Caption = dato
pulsador2.Caption = datoo
If Serie.PortOpen = True Then
dato = Left(Serie.Input, 1)  'Cogemos el primer bit de dato serie
datoo = Left(Serie.Input, 2) 'Cogemos el segundo bit del dato serie
cmdON1.Enabled = True
cmdOFF1.Enabled = True
cmdON2.Enabled = True
cmdOFF2.Enabled = True
ONALL.Enabled = True
OFFALL.Enabled = True
Estado.Caption = "Conectado" 'Cambiamos el estado
cmdConectar.Caption = "Desconectar"
Else
Estado.Caption = "Desconectado"
cmdConectar.Caption = "Conectar"
cmdON1.Enabled = False
cmdOFF1.Enabled = False
cmdON2.Enabled = False
cmdOFF2.Enabled = False
ONALL.Enabled = False
OFFALL.Enabled = False
End If
End Sub

Private Sub Image1_Click()
Dim X
X = ShellExecute(Me.hwnd, "Open", "http://www.urpmigeek.com", &O0, &O0, SW_NORMAL)

End Sub



Codigo Arduino:


//Control de Salidas
//El proyecto se puede controlar desde la propia
//aplicación del ordenador, o mediante dos pulsadores
//conectados a las entradas 8 y 9 de arduino
//By Mister_Mst
//www.urpmigeek.com

//Asignamos variables

int boton1=9; 
int boton2=8;
int salida1=13;   
int salida2=12;
int switch1=0;
int switch2=0;
int S1=0;
int S2=0;
int dato=0;

void setup() 
{ 
Serial.begin(9600); //Configuración de puerto serie 

pinMode(boton1,INPUT); //Configuramos dichos pines como salida
pinMode(boton2,INPUT); 
} 
  
void loop() 
{ 

Serial.print(digitalRead(13)); //envia por el puerto serie el estado de las salidas
Serial.print(digitalRead(12));
delay (30); //delay, porque sinó el puerto se colapsaba

pinMode(salida1,OUTPUT);  
pinMode(salida2,OUTPUT);




// LECTURA PULSADORES Y EJECUCION
switch1 = digitalRead(boton1);
switch2 = digitalRead(boton2);
S1 = digitalRead(salida1);
S2 = digitalRead(salida2);

//Secuencia de codigo para detectar en que estado está la salida
//y cambiarla de estado al pulsar el boton1 o boton2

if (switch1==HIGH)
{
delay(150);
pinMode(salida1,INPUT);
if (S1==HIGH)
{
pinMode(salida1,OUTPUT); 
digitalWrite(salida1,LOW);
}
if (S1==LOW)
{
pinMode(salida1,OUTPUT); 
digitalWrite(salida1,HIGH);
}
}


if (switch2==HIGH)
{
delay(150);
pinMode(salida2,INPUT);
if (S2==HIGH)
{
pinMode(salida2,OUTPUT); 
digitalWrite(salida2,LOW);
}
if (S2==LOW)
{
pinMode(salida2,OUTPUT); 
digitalWrite(salida2,HIGH);
}
}


if (Serial.available())  //Comprobamos si hay datos desde VB hacia Arduino byte dato; //Variable donde guardaremos el dato recibido por puerto serie 
dato=Serial.read();  //Guardamos el dato recibido 
switch(dato) 
{ 
case '0': //Apagamos el led si recibimos '0' por puerto serie 
digitalWrite(salida1,LOW);
break; 

case '1': //Encendemos el led si recibimos '1' por puerto serie 
digitalWrite(salida1,HIGH);
break; 

case '2': //Apagamos el led si recibimos '0' por puerto serie 
digitalWrite(salida2,LOW); 
break; 

case '3': //Encendemos el led si recibimos '1' por puerto serie 
digitalWrite(salida2,HIGH); 
break; 
} 
}
}



0 comentarios:

ir arriba