Arduino + Python + pyQt + Android en Linux (Parte 2)

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

11 opiniones en “Arduino + Python + pyQt + Android en Linux (Parte 2)”

  1. 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?

  2. 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!!!

  3. 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

  4. 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?

  5. 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:

    • Escribir desde el programa python con sio.write(‘L’)
    • arduino debe leer comando = Serial.read(); y si es L arduino escribe Serial.write()
    • Por ultimo el programa python lee lo enviado por arduino s.read()

    Espero que te sirva la explicación..

    Saludos desde Mérida, Venezuela

  6. 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

  7. 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…

  8. 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

  9. 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_()

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *