Control Arduino With a Portable App
by madnerd in Circuits > Arduino
3159 Views, 31 Favorites, 0 Comments
Control Arduino With a Portable App
We are going to learn how to make an application to control arduino.
We will see how to:
- Easily make a windows application with python.
- Convert it as an executable to use it anywhere.
- Manage Serial ports (detection/reconnection) automatically with 1 line of code
We can even reuse the code to manage as many arduino as we want.
But before i tell you more about it, let's try utest first!
We will use it to control the internal led on an Arduino nano.
As always, all the documentation/code are available on github in english/french
http://github.com/pigetArduino/utest
Upload Arduino Code
Frist we need to upload the code on the arduino.
- Download the source code: http://utest.madnerd.org
- Download drivers for arduino nano : http://nano.madnerd.org
On the Arduino software ( http://arduino.madnerd.org/ )
- Copy utest folder into your sketch folder
- Upload utest.ino
(Tools: Arduino Nano / Processor : Atmega328)
You will need an Arduino nano clone (ch340g) as the application will only detected it.
You can use the serial monitor, to test your arduino:
No Line Ending / 115200
UTest : return OK ON : Turn on internal led (pin13)
OFF: Turn off internal led (pin13)
Control the Arduino With Utest
utest is a portable application, you don't need to install anything to make it works.
- Download the application : http://utestapp.madnerd.org
- Click on utest.exe
utest will automatically find the arduino
You can try to unplugged it/plug it on another usb port, and it will reconnect.
utest might not work on Windows 7 due to missing .dll
This shouldn't happen if your computer is up to date
Source: http://stackoverflow.com/questions/34218333/pyins...
Create Your Own Application
Let's see how to reuse this application, to make your own application.
First we need to install python 3 to modify it.
- Download python 3 (https://www.python.org/downloads/)
- During the installation, tick Add Python 3.5 to PATH
Then we need to install pySerial, to communicate with our arduino.
- Open a command prompt (Windows key + cmd)
- Type:
pip install serial
Finally, test the application, it is available in the source code ( http://utest.madnerd.org ) at apps/utest/
- Open a command prompt
- Go to the source code folder (apps/utest/)
- Type:
python utest.py
Create the Interface
We have everything we need to modify our application.
Check out the source code : utest.py (github)
Let's see
- how to manage our arduino
- how to build a graphical interface with tkinter
In order to manage the arduino the easiest way possible, everything is handle by the module lib/usb.py
USB
As for now, this module has only two commands
usb = USB.Device(...)
- Connect to every serial ports which as CH340 in his name
- Send UTest to the serial port
- If it received "OK", it will connected to it
from lib import USB device_name = "CH340" #Device name in Windows device_type = "UTest" #Device type (in the arduino sketch) device_return_string = "OK" #Answer when a response is correct device_baudrate = 115200 #Baudrate usb = USB.Device(device_name,device_type,device_return_string,device_baudrate,status)
Everything is inside a separate thread to avoid blocking the application.
usb.write(string)
- Send a string to the arduino
- If the serial port is not available, it will try to reconnect
GUI (TKinter)
utest use tkinter to manage the GUI (graphical interface)
You can find more information on tkinter here : http://www.tkdocs.com/tutorial/index.html
- To create a window:
from tkinter import * root = Tk()
- To create a button ON
Button(text="on",command=on).pack()
- Create an action for the button ON
def on(): print("on")
- Create a label
status = Label(text="Searching...") status.pack()
If you want to modify a widget , we need to save it into a variable, and use .pack() on a different line
We send the label to the USB Module to display the current state of the connection
usb = USB.Device(...,status)
Finally, we generate the GUI loop.
root.mainloop()
Add Commands to the Arduino
Our interface is ready,
but we need to teach our arduino to understand the commands we will send.
Check out the source code : utest.ino (Github)
Serial Functions
We use two functions to manage the serial communication.
serialManager()
Check the serial port and convert any messages to a string (inside readString)
serialCheck()
If UTest is received , answer OK
Device name
You can change the name of the usb device in the first line
const String usb_name = "UTest";
Add commands
We manage our commands inside void loop()
void loop() { serialManager(); //If string received if (readString.length() > 0) { serialCheck(); if (readString == "ON"){ digitalWrite(13,1); } if (readString == "OFF"){ digitalWrite(13,0); } } //We clean the serial buffer readString = ""; }
For each commands create a condition, for example to turn on the internal led when "ON" is sent
if (readString == "ON"){ digitalWrite(13,1); }
Convert Your App Into a Portable Executable
The arduino / Application is ready to be bundle into an .exe
- Install pyinstaller, we will use it to convert our application into an single executable file
pip install pyinstaller
- You can compile your application using the script compile.bat
pyinstaller --onefile --noconsole utest.py
- If you want to display debug messages, use this command instead:
pyinstaller --onefile utest.py
You should now have a /dist/utest.exe file
You will probably have warning about api-ms...dll file.
This shouldn't be a problem as these DLL (Universal C Runtime) are preinstalled on Windows 10 and previous windows should also have them if they are up to date.
... to Be Continued
I hope this was useful, and that will inspired you to create Arduino application !
With some modification, this application should works on MacOS / Linux.
Follow me on instructables/youtube, if you are interested by this topic.
Subscribe
Next time, we will learn how to improve our application and use it to control a led strip!