En la entrada de hoy vamos a realizar el control de un transportador con Arduino y Python, para ello simularemos la conexión con un PLC virtual vía modbus gracias al software Modbus Slave y usaremos el software Factory.io ya visto en nuestro blog con anterioridad para simular este proceso Industrial.
Esta entrada forma parte de una serie dedicada a la optimización de procesos industriales e industria 4.0, si quieres leer más acerca del tema te dejo este enlace directo.
Esquema Electrónico
El control de esta cinta viene dado por dos pulsadores reales que conectaremos a un Arduino programado para imprimir en el puerto serie un «1» o un «0» en función del botón que accionemos.
Por tanto la lista de los materiales será la siguiente:
- 2 resistencias de 10kΩ
- 2 condensadores de 100nF
- 2 pulsadores pushbutton
- 1 Arduino, en mi caso usaré el Arduino Uno
Con estos materiales podremos construir el siguiente esquema electrónico.
Script en C++ para el control de un transportador con Arduino y Python
Este es el código que cargaremos en nuestro microcontrolador:
/*
Control de cinta transportadora con Arduino y Python
Este código controla el estado de dos pulsadores, en caso
de que uno de los dos sea accionado se imprime a través del puerto
serie un 1 o un 0 en función del botón accionado.
Autor: Alexdevrep
Fecha: 6/9/2024
Más contenido interesante en:
-GitHub: https://www.github.com/alexdevrep
-Instagram: @alexdevrep
-Mi blog de WordPress: https://www.eltallerdealexdevrep.com/
-Youtube: @alexdevrep
*/
// Declaración de variables
const int marcha = 8;
const int paro = 9;
int estadoAnteriorMarcha = LOW;
int estadoAnteriorParo = LOW;
void setup() {
// Definimos los pines como entrada digital
pinMode(marcha, INPUT);
pinMode(paro, INPUT);
// Inicializamos la comunicación serial
Serial.begin(9600);
}
void loop() {
// Leemos los valores de ambos botones
int estadoMarcha = digitalRead(marcha);
int estadoParo = digitalRead(paro);
// Detecta cuando el botón de marcha se presiona por primera vez
if (estadoMarcha == HIGH && estadoAnteriorMarcha == LOW) {
Serial.println("1");
}
// Detecta cuando el botón de paro se presiona por primera vez
if (estadoParo == HIGH && estadoAnteriorParo == LOW) {
Serial.println("0");
}
// Actualizamos el estado anterior con el estado actual
estadoAnteriorMarcha = estadoMarcha;
estadoAnteriorParo = estadoParo;
}
Ahora si cargamos este código y abrimos nuestro puerto serie podemos comprobar como se imprime por pantalla 1 o 0 en función del pulsador accionado.
Nota: El puerto serie debe de estar cerrado para poder comunicarnos con Python.
Vídeo de funcionamiento
Script en Python del control del transportador con Arduino y Python
Por otro lado es necesario escribir el código que se recibirá los datos del puerto serie y los tratará para efectuar el control del transportador.
Este código es el siguiente:
"""
Este script en Python establece una comunicación serial con un Arduino
conectado al puerto COM5 a una velocidad de 9600 baudios. El objetivo
es recibir y mostrar en la consola los datos enviados por el Arduino
cuando se presionan dos botones físicos conectados al mismo.
El Arduino envía un valor "1" cuando se presiona el botón de "marcha"
y un valor "0" cuando se presiona el botón de "paro". Estos valores
son leídos y decodificados por este script y luego se imprimen en la
consola para su visualización.
El programa permanece en un bucle infinito leyendo los datos entrantes
hasta que se interrumpe manualmente (por ejemplo, con Ctrl+C). Cuando
se detecta una interrupción, el script cierra la conexión serial de
forma segura antes de terminar.
Autor: Alexdevrep
Fecha:04/09/2024
Más contenido interesante en :
-GitHub: https://www.github.com/alexdevrep
-Instagram: https://www.instagram.com/alexdevrep/
-Mi blog de WordPress: https://www.eltallerdealexdevrep.com/
-Youtube: https://www.youtube.com/channel/UCNlqgVY-CaQ2Lgc5xJChaKA
"""
#Importamos las librerías necesarias
import serial
import time
from pymodbus.client import ModbusTcpClient
#Inicializamos la comunicación con Arduino
arduino= serial.Serial('COM5',9600)
#Instanciamos un objeto de la clase Modbus
PLC =ModbusTcpClient("127.0.0.1")
#Nos conectamos al PLC
PLC.connect()
#Esperamos a que el Arduino se inicie
time.sleep(2)
#Definimos el código de control principal
try:
while True:
#Recibimos los datos desde la comnunicación serial
if arduino.in_waiting >0:
valor=arduino.readline().decode('utf-8').strip()
valor=int(valor)
#Controlamos el comportamiento de la cinta en función del valor recibido
if valor == 1:
registro= PLC.write_coils(0,True,1)
elif valor ==0:
registro=PLC.write_coils(0,False,1)
time.sleep(1)
#definimos como salir del bucle
except KeyboardInterrupt:
print("Conexión con Arduino finalizada")
#Cerramos la conexión con Arduino
finally:
arduino.close()
Conexión con Factory.io
Una vez hayamos cargado estos códigos, abrimos nuestro Factory.io y seleccionamos la escena «From A to B» de esta escena podemos eliminar el sensor que se encuentra al final de la cinta, acto seguido nos vamos a File ->Drivers y seleccionamos la opción del desplegable «Modbus TCP Server» esto nos desplegará un PLC virtual al que debemos de conectar Factory.io (Running) al Input 0 y Conveyor al Coil 0.
Creando la conexión Modbus
Para poder interconectar nuestro PC con el PLC virtual de Factory.io debemos simular la conexión modbus, para ello usaremos en software Modbus Slave, dentro del PLC hacemos click en «Connection»-> «Connect» y ya hemos generado la comunicación.
Control de un transportador con Arduino y Python
Ahora ya estamos listos para poder ejecutar nuestro archivo de Python (recuerda que el Arduino debe de estar conectado vía USB al PC con el que vas a ejecutar el script de Python.) Si todo ha ido bien podrás hacer algo así.
Además te dejo como escribí el script en Python desde cero en el que imprimimos los valores del puerto serie en nuestro terminal de Python.
Hasta aquí la entrada de hoy ¿Qué te ha parecido este proyectazo? Aunque Python es una mala práctica a la hora de programar PLC puede ser una gran alternativa en caso de necesitemos leer por ejemplo el valor de los sensores en tiempo real como vimos con la fotoresistencia. Si tienes alguna duda dejámela saber en los comentarios, estaré encantado de leerte :D, Además recuerda que tienes todos los archivos de descarga en mi perfil de GitHub.