Icono del sitio ELECTROALL

PLC con ARDUINO (ATmega 328p) V4

YouTube
YouTube
Instagram
Instagram
GitHub
GitHub

PLC con arduino (ATmega328p AU) V4, es un controlador lógico programable que fue diseñado por Electroall, cuyo circuito esta basado en el dispositivo de PLC SIEMENS S7 1200 CPU1214c con salidas de relés. Inicialmente la versión actual contará con una alimentación de 24VDC al igual que todos los dispositivos industriales. En segundo lugar en esta versión se contará con 10 entradas digitales de 12-24VDC y 2 entradas analógicas de 0 a 5V. En cuanto a las salidas se contará con 8 salidas(relé).

Para el sistema de control se hará uso del microcontrolador ATmega328P AU (SMD), ya que este µC se puede programar fácilmente en el IDE de arudino. Finalmente este dispositivo cuenta con los principios de alto aislamiento similar a la mayoría  los dispositivos industriales, tanto en la fase de las entradas como en las salidas.

ESPECIFICACIONES TÉCNICAS
  1. Tensión de alimentación……………………….…………24VDC
  2. Corriente de alimentación………………….……………100mA
  3. Entadas digitales 12-24VDC……………………….……10
  4. Entradas analógicas 0-5V……………………………………..2
  5. Programación Directa………………………………………..Ordenador – PLC V4
  6. Entorno de programación………………………..………..Arduino IDE
  7. Condiciones ambientales min……………………….….-10°
  8. Condiciones ambientales max…………………..……….55°
  9. Salidas RLY…………………………………………………………8
  10. Tensión salida AC………………………………………….……250V
  11. Corriente AC……………………………………………………….5A
  12. Tensión DC…………………………………………………………30V
  13. Corriente DC………………………………………………………5A
  14. Dimensiones………………………………………………………….100x100mm
  15.  Empotrable……………………………………………………………Sí
CAMBIOS RESPECTO A LA ANTERIOR VERSIÓN (V3)
  1. Tipos de componentes.- En la versión anterior la mayoría de los componentes eran de tipo DIP. En la versión actual todos los componentes serán SMD, este cambio se hizo con fin de reducir espacio en la PCB, ya que en esta versión se ha integrado varios componentes electrónicos, con el fin de mejorar el dispositivo PLC V4.
  2. Integración de nuevos dispositivos.- Los nuevos dispositivos son:
    • 74HC245, En la versión V3 este dispositivo ya estaba presente para el control de las entradas y, ahora para esta versión se agregará para el control de las salidas.
    • 74HC14D, Este circuito integrado nos permite eliminar ruidos producidos por  efecto de electromagnetismo. Además, este CI es indispensable ya que nuestro dispositivo PLC esta destinado para trabajar en ambientes industriales.
    • CH340C, Es un chip de conversión de bus USB, puede realizar una interfaz USB a UART, cuyo objetivo es el permitir la comunicación entre la computadora y nuestra PCB (PLC V4), de esta manera se podrá programar directamente desde un ordenador, ya no será necesario usar un tercer dispositivo para subir cualquier programa.
ESQUEMÁTICO ELECTRÓNICO

DESCARGAR EL DISEÑO EN PROTEUS 8.9 (ayúdame con una donación para comprar materiales)

DISEÑO PCB
MATERIALES
PASOS PARA SUBIR UN PROGRAMA

PASO 1 : SUBIR GESTOR DE ARRANQUE (BOOTLOADER)

Para poder usar un microcontrolador nuevo (atmega328p-U), es necesario subir un un gestor de arranque como también llamado “BOOTLOADER”, esto nos facilitará subir programas en futuras ocasiones.

finalmente para quemar el bootloader se tendrá que realizar a través de los pines ICSP, que prácticamente serían los pines [ (MOSI=11) (MISO = PIN12) (SCK=PIN13) (Slave=PIN10) ]. Para subir y quemar el gestor de arranque necesitaremos un arduino UNO ó MEGA y realizar las siguientes conexiones (ARDUINO UNO – PLC V4).

PASO 2 : SUBIR PROGRAMA; PC – PLC V4  

Después de haber subido el gestor de arranque finalmente ya podremos subir cualquier programa como normalmente lo realizamos a través del puerto serie.

CONEXIONES EXTERNAS
RELACIONES DE BORNERAS EXTERNAS Y ATMEGA328P
CÓDIGO ARDUINO

 SALIDAS

//SALIDAS DIGITALES
int Q0_0=12;
int Q0_1=13;
int Q0_2=14;
int Q0_3=15;
int Q0_4=16;
int Q0_5=17;
int Q0_6=18;
int Q0_7=19;

void setup() {

//SALIDAS DIGITALES
   pinMode (Q0_0,OUTPUT);
    pinMode (Q0_1,OUTPUT);
      pinMode (Q0_2,OUTPUT);
        pinMode (Q0_3,OUTPUT); 
          pinMode (Q0_4,OUTPUT);
            pinMode (Q0_5,OUTPUT);
              pinMode (Q0_6,OUTPUT);
                pinMode (Q0_7,OUTPUT);
}

void loop() {

  digitalWrite(Q0_0,1);
  delay(1000);
  digitalWrite(Q0_0,0);
  delay(1000);

    digitalWrite(Q0_1,1);
  delay(1000);
  digitalWrite(Q0_1,0);
  delay(1000);

    digitalWrite(Q0_2,1);
  delay(1000);
  digitalWrite(Q0_2,0);
  delay(1000);

    digitalWrite(Q0_3,1);
  delay(1000);
  digitalWrite(Q0_3,0);
  delay(1000);

    digitalWrite(Q0_4,1);
  delay(1000);
  digitalWrite(Q0_4,0);
  delay(1000);

    digitalWrite(Q0_5,1);
  delay(1000);
  digitalWrite(Q0_5,0);
  delay(1000);

    digitalWrite(Q0_6,1);
  delay(1000);
  digitalWrite(Q0_6,0);
  delay(1000);

      digitalWrite(Q0_7,1);
  delay(1000);
  digitalWrite(Q0_7,0);
  delay(1000);

}

ENTRADAS Y SALIDAS

// ENTRADAS DIGITALES
int i0_0 = 4;
int i0_1 = 5;
int i0_2 = 6;
int i0_3 = 7;
int i0_4 = 8;
int i0_5 = 9;
int i0_6 = 10;
int i0_7= 11;

int i1_0 = 2;
int i1_1 = 3;

//SALIDAS DIGITALES
int Q0_0=12;
int Q0_1=13;
int Q0_2=14;
int Q0_3=15;
int Q0_4=16;
int Q0_5=17;
int Q0_6=18;
int Q0_7=19;

void setup() {
  //ENTRADAS DIGITALES
  pinMode (i0_0,INPUT);
  pinMode (i0_1,INPUT);
  pinMode (i0_2,INPUT);
  pinMode (i0_3,INPUT);
  pinMode (i0_4,INPUT);
  pinMode (i0_5,INPUT);
  pinMode (i0_6,INPUT);
  pinMode (i0_7,INPUT);

  pinMode (i1_0,INPUT);
  pinMode (i1_1,INPUT);

  //SALIDAS DIGITALES
   pinMode (Q0_0,OUTPUT);
    pinMode (Q0_1,OUTPUT);
      pinMode (Q0_2,OUTPUT);
        pinMode (Q0_3,OUTPUT); 
          pinMode (Q0_4,OUTPUT);
            pinMode (Q0_5,OUTPUT);
              pinMode (Q0_6,OUTPUT);
                pinMode (Q0_7,OUTPUT);
}

void loop() {
   //LECTURA DE ENTRADAS DIGITALES
  int I0_0= digitalRead(i0_0);
  int I0_1= digitalRead(i0_1);
  int I0_2= digitalRead(i0_2);
  int I0_3= digitalRead(i0_3);
  int I0_4= digitalRead(i0_4);
  int I0_5= digitalRead(i0_5);
  int I0_6= digitalRead(i0_6);
  int I0_7= digitalRead(i0_7);

  int I1_0= digitalRead(i1_0);
  int I1_1= digitalRead(i1_1);

  // ENCENDIENDO LAS SALIDAS SEGÚN LAS RESPECTIVAS ENTRADAS
    if(I0_0==1)digitalWrite(Q0_0,1);
    else      digitalWrite(Q0_0,0);

    if(I0_1==1)digitalWrite(Q0_1,1);
    else      digitalWrite(Q0_1,0); 

    if(I0_2==1)digitalWrite(Q0_2,1);
    else      digitalWrite(Q0_2,0); 

    if(I0_3==1)digitalWrite(Q0_3,1);
    else      digitalWrite(Q0_3,0); 

    if(I0_4==1)digitalWrite(Q0_4,1);
    else      digitalWrite(Q0_4,0);

    if(I0_5==1)digitalWrite(Q0_5,1);
    else      digitalWrite(Q0_5,0); 

    if(I0_6==1)digitalWrite(Q0_6,1);
    else      digitalWrite(Q0_6,0);  

    if(I0_7==1)digitalWrite(Q0_7,1);
    else      digitalWrite(Q0_7,0); 

    if(I1_0==0)digitalWrite(Q0_0,1);
    else      digitalWrite (Q0_0,0); 

    if(I1_1==0)digitalWrite(Q0_1,1);
    else      digitalWrite(Q0_1,0); 

}

ENTRADAS ANALÓGICAS

//SALIDAS DIGITALES
int Q0_0=12;
int Q0_1=13;
int Q0_2=14;
int Q0_3=15;
int Q0_4=16;
int Q0_5=17;
int Q0_6=18;
int Q0_7=19;

void setup() {

   pinMode (Q0_0,OUTPUT);
    pinMode (Q0_1,OUTPUT);
      pinMode (Q0_2,OUTPUT);
        pinMode (Q0_3,OUTPUT); 
          pinMode (Q0_4,OUTPUT);
            pinMode (Q0_5,OUTPUT);
              pinMode (Q0_6,OUTPUT);
                pinMode (Q0_7,OUTPUT);

}

void loop() {

  // ENTRADA ANALÓGICA AI0

  if (analogRead(A6)>=250) digitalWrite (Q0_0,1);
  else                     digitalWrite (Q0_0,0);

  if (analogRead(A6)>=500) digitalWrite (Q0_1,1);
  else                     digitalWrite (Q0_1,0);

  if (analogRead(A6)>=750) digitalWrite (Q0_2,1);
  else                     digitalWrite (Q0_2,0);

  if (analogRead(A6)>=1000) digitalWrite (Q0_3,1);
  else                      digitalWrite (Q0_3,0);

 // ENTRADA ANALÓGICA AI0

  if (analogRead(A7)>=250) digitalWrite (Q0_4,1);
  else                     digitalWrite (Q0_4,0);

  if (analogRead(A7)>=500) digitalWrite (Q0_5,1);
  else                     digitalWrite (Q0_5,0);

  if (analogRead(A7)>=750) digitalWrite (Q0_6,1);
  else                     digitalWrite (Q0_6,0);

  if (analogRead(A7)>=1000) digitalWrite (Q0_7,1);
  else                      digitalWrite (Q0_7,0);
}

ENCENDIENDO Y APAGANDO SALIDAS DESDE MONITOR SERIE 

//SALIDAS

int Q0_0=12;
int Q0_1=13;
int Q0_2=14;
int Q0_3=15;
int Q0_4=16;
int Q0_5=17;
int Q0_6=18;
int Q0_7=19;
void setup() {
  Serial.begin(9600);
    pinMode (Q0_0,OUTPUT);
    pinMode (Q0_1,OUTPUT);
      pinMode (Q0_2,OUTPUT);
        pinMode (Q0_3,OUTPUT); 
          pinMode (Q0_4,OUTPUT);
            pinMode (Q0_5,OUTPUT);
              pinMode (Q0_6,OUTPUT);
                pinMode (Q0_7,OUTPUT); 

}

void loop() {

  // ENCENDIENDO Y APAGANDO SALIDAS DESDE MONITOR SERIE
  char data = Serial.read();

  if(data=='0'){
    digitalWrite (Q0_0,1);
    Serial.print   ("DATO = ");
    Serial.println ("Q0_0 ESTÁ ENCENDIDO");
  }
  if(data=='A'){
    digitalWrite (Q0_0,0);
    Serial.print   ("DATO = ");
    Serial.println ("Q0_0 ESTÁ APAGADO");
  }

  if(data=='1'){
    digitalWrite (Q0_1,1);
    Serial.print   ("DATO = ");
    Serial.println ("Q0_1 ESTÁ ENCENDIDO");
  }
  if(data=='B'){
    digitalWrite (Q0_1,0);
    Serial.print   ("DATO = ");
    Serial.println ("Q0_1 ESTÁ APAGADO");
  }

  if(data=='2'){
    digitalWrite (Q0_2,1);
    Serial.print   ("DATO = ");
    Serial.println ("Q0_2 ESTÁ ENCENDIDO");
  }
  if(data=='C'){
    digitalWrite (Q0_2,0);
    Serial.print   ("DATO = ");
    Serial.println ("Q0_2 ESTÁ APAGADO");
  }

  if(data=='3'){
    digitalWrite (Q0_3,1);
    Serial.print   ("DATO = ");
    Serial.println ("Q0_3 ESTÁ ENCENDIDO");
  }
  if(data=='D'){
    digitalWrite (Q0_3,0);
    Serial.print   ("DATO = ");
    Serial.println ("Q0_3 ESTÁ APAGADO");
  }

  if(data=='4'){
    digitalWrite (Q0_4,1);
    Serial.print   ("DATO = ");
    Serial.println ("Q0_4 ESTÁ ENCENDIDO");
  }
  if(data=='E'){
    digitalWrite (Q0_4,0);
    Serial.print   ("DATO = ");
    Serial.println ("Q0_4 ESTÁ APAGADO");
  }

  if(data=='5'){
    digitalWrite (Q0_5,1);
    Serial.print   ("DATO = ");
    Serial.println ("Q0_5 ESTÁ ENCENDIDO");
  }
  if(data=='F'){
    digitalWrite (Q0_5,0);
    Serial.print   ("DATO = ");
    Serial.println ("Q0_5 ESTÁ APAGADO");
  }

  if(data=='6'){
    digitalWrite (Q0_6,1);
    Serial.print   ("DATO = ");
    Serial.println ("Q0_6 ESTÁ ENCENDIDO");
  }
  if(data=='G'){
    digitalWrite (Q0_6,0);
    Serial.print   ("DATO = ");
    Serial.println ("Q0_6 ESTÁ APAGADO");
  }

  if(data=='7'){
    digitalWrite (Q0_7,1);
    Serial.print   ("DATO = ");
    Serial.println ("Q0_7 ESTÁ ENCENDIDO");
  }
  if(data=='H'){
    digitalWrite (Q0_7,0);
    Serial.print   ("DATO = ");
    Serial.println ("Q0_7 ESTÁ APAGADO");
  }

}

LECTURA ANALÓGICA EN EL MONITOR PLOTER

void setup() {
  Serial.begin(9600);

}

void loop() {
  Serial.println(analogRead(A6));
    //Serial.println(analogRead(A7));

}
VIDEO
Salir de la versión móvil