User: alciro    User
 

microPLC para arduino

Share |
 Descargas microPLC

3. Comunicación RS-232

La placa arduino posee un adaptador de USB para realizar la programación del micro-controlador industrial AVR. Este adaptador es en realidad es un convertidor de USB a RS-232, por lo que cuando conectamos la placa al ordenador (PC) disponemos de un una UART para transferir información entre el PC y el arduino.

Comunicación RS-232 para el microPLC

El control se realiza mediante el envío de un frame formado por un comando simple de un caracter.

Frame: <Comando>
Comando:

  • <a..d>Paro del relé coreespondiente
  • <A..D> Marcha del relé coreespondiente

Ejemplo:

a -> Activar el relé K._1
A -> Parar el relé K._1

El siguiente código muestra un sencillo programa para realizar el control de los relés del microPLC a través de cualquier terminal serie.

 

/*
*  Trama 1. Control de salidas de Relé para el microPLC - arduino
*
*  Descripción: Control de los relés de salida de la placa microPLC mediante códigos enviados
*  desde el terminal serie. Mediante RS-232 con el adaptador USB del arduino.
*
*  Autor: Rafa Aranda
*  Fecha: 13-10-2014
*  Versión: 1.0
*/

// Asignación de Pins a Salidas digitales
#define Out_1 6
#define Out_2 7
#define Out_3 8
#define Out_4 9

// Pins de entrada (están ordenados de forma decreciente por necesidades del PCB)
#define In_1 5
#define In_2 4
#define In_3 3
#define In_4 2

// Librerías
#include "microPLC.h"

// Funciones prototipo
void getInputs(void);
void setOutputs(void);
void Cmd(void);

//  Variables globales

//Definición de las variables de trabajo
m4bits s;		// Entradas del MicroPLC
m4bits k;		// Salidas del MicroPLC

/*  setup
*  Tareas iniciales de preparación
*/
void setup()
{
	// Iniciar las comunicaciones en serie
	Serial.begin(9600);
	
	// Establecer los pins de salida de los relés
	pinMode(Out_1, OUTPUT);
	pinMode(Out_2, OUTPUT);
	pinMode(Out_3, OUTPUT);
	pinMode(Out_4, OUTPUT);
	
	// Establecer los pins de entradas digitales optoacopladas
	pinMode(In_1, INPUT);
	pinMode(In_2, INPUT);
	pinMode(In_3, INPUT);
	pinMode(In_4, INPUT);
	
	
}

/*  loop
*  Programa principal
*/
void loop(){
	getInputs();    // Leer las entradas digitales
	
	//-------- Trama --------
		
	// Si se ha recibido algún carácter
	if (Serial.available()) {
		// Leer los caracteres recibidos
		Cmd();
	}
	
	//------------------------
	
	setOutputs();   // Activar las salidas
	delay(1);				// CicloScan + 1ms, retardo para anti-rebotes
}

/*  Cmd
*  Analizar el comando y ejecutar la acción correspondiente
*/
void Cmd(void){
	char dat = Serial.read();	// Leer un caracter del sbuff
	Serial.write(dat);	// Hacer eco del caracter recibido
	switch(dat){
		case 'a':
			k._1=0;
			break;
		case 'b':
			k._2=0;
			break;
		case 'c':
			k._3=0;
			break;
		case 'd':
			k._4=0;
			break;			
		case 'A':
			k._1=1;
			break;
		case 'B':
			k._2=1;
			break;
		case 'C':
			k._3=1;
			break;
		case 'D':
			k._4=1;
			break;	
	}
}

/*  GetInputs
*  Lee el estado de la entrada indicada en el parámetro y lo asigna invertido a las variables de trabajo
*/
void getInputs(void){
	s._1=!digitalRead(In_1);
	s._2=!digitalRead(In_2);
	s._3=!digitalRead(In_3);
	s._4=!digitalRead(In_4);
}

/*  setOutputs
*  Asigna el estado de las variables de trabajo a las salidas digitales
*/
void setOutputs(void){
	digitalWrite(Out_1, k._1);
	digitalWrite(Out_2, k._2);
	digitalWrite(Out_3, k._3);
	digitalWrite(Out_4, k._4);
}
Loading

copyright © 2007-2024  www.alciro.org  All rights reserved.         
Share |