Skip to content

16. Interface and application programming

All this information is refered to Interface and application programming class.

Comunicating Python with Arduino

To learn how to comunicate Python with Arduino, for that I followed TopTechBoy_Tutorials.

The first step I did was to send a serial message from the Board to my code in python:

Arduino Code

void setup() {
Serial.begin(9600); // set the baud rate
//Serial.println("Ready"); // print "Ready" once
}
void loop() {
Serial.println(100);
delay(100); // delay for 1/10 of a second
}                

Python Code

import serial #Import Serial Library

arduinoSerialData = serial.Serial('/dev/ttyACM0',9600) #Create Serial port object called arduinoSerialData


while (1==1):
    if (arduinoSerialData.inWaiting()>0):
        myData = arduinoSerialData.readline()
        print (myData)           

The second step was to send information from python to arduino:

I runed python directly form the terminal, this is how it went: Python Code:

joseto@joseto:~$ python 3
python: can't open file '3': [Errno 2] No such file or directory
joseto@joseto:~$ Python 3

Orden «Python» no encontrada. Quizá quiso decir:

  la orden «cython» del paquete deb «cython»
  la orden «python» del paquete deb «python3»
  la orden «python» del paquete deb «python»
  la orden «python» del paquete deb «python-minimal»
  la orden «jython» del paquete deb «jython»

Pruebe con: sudo apt install <nombre del paquete deb>

joseto@joseto:~$ python
Python 2.7.16 (default, Apr  9 2019, 04:50:39) 
[GCC 8.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import serial
>>> ser = serial.Serial('/dev/ttyACM0', 9600)
>>> ser.is_open
True
>>> ser.write('S')
1
>>> ser.write('S')
1
>>> ser.write('2')
1
>>> ser.write('2')
1

Basically the code is:

import serial 
ser = serial.Serial('/dev/ttyACM0', 9600) #change for your serial port
ser.write('S')

Arduino Code:

char s;   // for incoming serial data

void setup() {
        Serial.begin(9600);     // opens serial port, sets data rate to 9600 bps
}

void loop() {

        // send data only when you receive data:
        if (Serial.available() > 0) {
                // read the incoming byte:
                s = Serial.read();

                // say what you got:
                Serial.print("I received: ");
                Serial.println(s);
        }
}

Building the GUI

To build the button GUI I started with the Hello World program:

import tkinter as tk

class Application(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.pack()
        self.create_widgets()

    def create_widgets(self):
        self.hi_there = tk.Button(self)
        self.hi_there["text"] = "Hello World\n(click me)"
        self.hi_there["command"] = self.say_hi
        self.hi_there.pack(side="top")

        self.quit = tk.Button(self, text="QUIT", fg="red",
                              command=self.master.destroy)
        self.quit.pack(side="bottom")

    def say_hi(self):
        print("hi there, everyone!")

root = tk.Tk()
app = Application(master=root)
app.mainloop()

Wich give me 2 buttons like this:

Its important to be sure you are working with Python3, and not one of the previous versions, that one didn worked for me.

The next step was to modify the Hello World to send a string to the arduino, I changed the two buttons to turn on and off an LED:

import serial
import tkinter as tk
s = serial.Serial('/dev/ttyACM0', 9600)

class Application(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.pack()
        self.create_widgets()

    def create_widgets(self):
        self.on = tk.Button(self)
        self.on["text"] = "ON"
        self.on["command"] = self.send_on
        self.on.pack(side="top")
        self.off = tk.Button(self)
        self.off["text"] = "OFF"
        self.off["command"] = self.send_off
        self.off.pack(side="bottom")

    def send_on(self):
        s.write(str.encode('O'))
    def send_off(self):
        s.write(str.encode('F'))

root = tk.Tk()
app = Application(master=root)
app.mainloop()

Here you can see how they are comunicating:

Then I modified the code of the arduino, this way the char would turn on the LED in pin 13:

char s;   // for incoming serial data

void setup() {
        Serial.begin(9600);
        pinMode(13,OUTPUT);
}

void loop() {

        // send data only when you receive data:
        if (Serial.available() > 0) {
                // read the incoming byte:
                s = Serial.read();
                Serial.println(s);
        }
        if(s=='O'){
          digitalWrite(13,HIGH);
        }
        else{
          digitalWrite(13,LOW); 
        }

}

The Result

The Board

Finally I had to design my own board to work with the GUI.

I build a simple board with Serial Comunication and a LED attached to Pin 3.

If you are looking for the files you can download them from here:

To do this, I had to change a little the code:

char s;  

#include <SoftwareSerial.h>

#define rxPin 0
#define txPin 1


SoftwareSerial mySerial( rxPin,txPin);
void setup() {   
  mySerial.begin(9600);
        pinMode(3,OUTPUT);
}

void loop() {

        // send data only when you receive data:
        if (mySerial.available() > 0) {
                // read the incoming byte:
                s = mySerial.read();

        }
        if(s=='O'){
          digitalWrite(3,HIGH);
          mySerial.println(s);
        }
        else{
          digitalWrite(3,LOW); 
        }

}

Video

José Tomás Domínguez (Joseto) on Vimeo.