En la parte 1 habíamos realizado la parte básica elemental para programar el Arduino, un simple led blink.
Ahora haremos un control con una interfaz pyQT, python, pyserial y arduino.
Software que necesitamos:
- QT 4 Designer
- Python y pyserial
- QT4 para phyton
- Un Arduino
- Un Led
Si usan linux debian o derivados pueden instalar el software con el siguiente comando:
sudo aptitude install qt4-dev-tools python python-qt4 qt4-designer qt4-doc python-qt4-doc python-serial
Programanado el Arduino:
Debemos programar el Arduino para que pueda recibir ordenes desde el puerto Serial.
int ledPin = 13; // Se asigna el pin13 al led int val = 0; // variable for reading the pin status char msg = ' '; // variable to hold data from serial void setup() { pinMode(ledPin, OUTPUT); // declare LED as output Serial.begin(9600); Serial.print("Program Initiated\n"); } void loop(){ // Mientras se recibe data es asignado amsg while (Serial.available()>0){ msg=Serial.read(); } // LED on/off si recibe 'Y'/'N' desde el puerto serial if (msg=='Y') { digitalWrite(ledPin, HIGH); // Enciende el Led Serial.print("LED encendido\n"); msg=' '; } else if (msg=='N') { digitalWrite(ledPin, LOW); // Apara el Led Serial.print("LED apagado\n"); msg=' '; } }
Recordemos colocar el led en el ardunino tal como se hizo en la primera parte:
Interfaz QT
Ahora debemos realizar la interfaz QT con qt-designer. La idea de la interfaz es tener un botón para encender y apagar el Led y un textBrowser para mostrar los eventos del puerto serial. Para esto hice un pequeño video:
Después que se tiene la interfaz UI la transformamos para poder utilizarla con python, esto se realiza con el siguiente comando:
pyuic4 DialogoLed.ui -o DialogoLed_Ui.py
Para probar todo ejecutamos el programa run.py
#!/usr/bin/python # -*- coding: iso-8859-3 -*- import sys, time, serial from PyQt4 import QtCore, QtGui from DialogoLed_Ui import Ui_DialogoLed # Variables Globales class DialogoLed(QtGui.QMainWindow): def __init__(self, parent=None): super(DialogoLed, self).__init__(parent) #QtGui.QWidget.__init__(self, parent) self.ui = Ui_DialogoLed() self.ui.setupUi(self) self.stadoled01 = 0 self.arduino = serial.Serial('/dev/ttyUSB0', 9600) txtArduino = self.arduino.readline() txt = "Arduino> " +txtArduino self.ui.textBrowser.append(txt) #buttons QtCore.QObject.connect(self.ui.pushButton,QtCore.SIGNAL("clicked()"), self.led01) def led01(self): if self.stadoled01==0: self.stadoled01 = 1 self.ui.pushButton.setText('Apagar Led') self.arduino.write('Y') txtArduino = self.arduino.readline() else: self.stadoled01 = 0 self.ui.pushButton.setText ('Encender Led') self.arduino.write('N') txtArduino = self.arduino.readline() txt = "Arduino> " +txtArduino self.ui.textBrowser.append(txt) def quit(self): sys.exit(app.exec_()) if __name__ == "__main__": app = QtGui.QApplication(sys.argv) myapp = DialogoLed() myapp.show() sys.exit(app.exec_())
Programa Funcionando:
Descarga los programas: Archivos utilizados en esta entrada: Arduino_pyQT_python
Hola pues mira comencé a leer tus tutoriales de python y arduino mm bueno a la hora de hacer esto:
pyuic4 DialogoLed.ui -o DialogoLed_Ui.py
me dice que no se encontró la orden me podrías ayudar?
Hola carlos…
Si usas ubuntu deberías haber instalado las librerias de pyQT:
sudo aptitude install qt4-dev-tools python python-qt4 qt4-designer qt4-doc python-qt4-doc python-serial
con esto no debeŕias tener problemas
Salud!!!
muchas gracias ayer leí un poco mas sobre mi error y vi que me hacia falta un paquete por instalar ahora creo que me equivoque en hacer la parte de la interfaz y me sale un error que dice:
Error in input file: not well-formed (invalid token): line 1, column 1
pero lo volveré a hacer a ver como me va gracias por tu atención y muy buen tutorial el que hiciste
Carlos al final del post esta el link de descarga con todos los archivos funcionales…
Buenas antes que nada felicidades por el excelente artículo, mi pregunta es la siguiente. Aqui lo que vemos es como la pc manda señales al arduino, esto los lee del puerto serial con msg=Serial.read(); pero como hacemos para que la pc lea datos desde el arduino?
Saludos Rodix….
gracias por tu comentario..
Actualmente estoy editando un post al respecto…. quizás lo libere a finales de mes…
Para resolver el problema debes hacer lo siguiente:
Espero que te sirva la explicación..
Saludos desde Mérida, Venezuela
Perfecto me sirve muchísimas gracias…
tengo hecho un pequeño programa para manejar un arduino directamente sin phyton todo hecho con qt5.1.0
aqui la drireccion de youtube
qt5.1.0 con arduino pc linux,mac,android,raspberry
Sera que puedes hacer un video especialmente desde la transformacion del GUI a python me sale diferentes cosas a las que tienes en tu blog…Gracias…
Hola buenas tardes estoy intentando hacer este proyecto, porque estoy trabajando en otro y quiero aprender un poco más sobre la programación en qt4 para controlar arduinos.
Me sale el siguiente error al ejecutar run.py:
– File «./run.py», line 8, in
from DialogoLed_Ui import Ui_DialogoLed
ImportError: cannot import name Ui_DialogoLed
Buenas noches, soy nueva en este mundo de la programacion, con mucho investigar he podido hacer un sensor se temperatura en arduino y mostrado la informacion por el puerto serial desde Python. Pero ahora quisiera saber si hay alguna forma o metodo para mostrar los datos por medio de la interfas grafica de PyQt5, he buscado mucha informacion pero es muy poco o nula. Si alguien me puede ayudar le quedare muy agradecida . adjunto el codigo. Muchas gracias.
import sys
import serial
from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox, QPushButton
from PyQt5 import uic
from PyQt5.QtGui import QFont #asignar tipo de Fuentes
from PyQt5.QtCore import Qt # Modulo para modificar el cursor.
import ctypes
#serie = serial.Serial(‘COM3’, 9600, timeout = 10)
class Ventana(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
uic.loadUi(«prueba-sensor.ui», self)
self.setWindowTitle(«Sensor de Temperatura interfas Grafica»)
def showEvent(self, event): #ojo al comentar las funciones no puede generar error de identation
#se crea la funcion showEvent y se ingresa al tabel para mostrar el texto
serie = serial.Serial(‘COM3’, 9600, timeout = 10)# solo con este codigo se muestra el puerto serie
while True:# solo con este codigo se muestra el puerto serie
print (serie.readline())# solo con este codigo se muestra el puerto serie
self.sensor.setText(«serie», serie)
app = QApplication(sys.argv)
ventana = Ventana()
ventana.show()
app.exec_()