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

9 Comments

  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…

Leave a Comment.