Arduino + Python: Мигание светодиодом (COM-порт)

Arduino + Python: Мигание светодиодом (COM-порт)

Нам понадобятся:

1) Arduino (UnoNano или Mega).

Для программирования:

1) Среда разработки Python (у меня PyCharm);

2) Среда разработки Arduino IDE.

Посредством программы Arduino IDE загружаем скетч в плату Arduino:

int datafromUser = 0;

void setup(){
Serial.begin(9600); //инициализируем работу порта на скорости 9600 бод
pinMode(LED_BUILTIN, OUTPUT); //pin 13 (встроенный светодиод на Ардуино) инициализируем в качестве выхода
digitalWrite (LED_BUILTIN, LOW); //убираем напряжение с 13 пина (гасим светодиод)
Serial.println("Hi! I am Arduino"); //сигнал в порт о готовности к работе
}

void loop(){
while (Serial.available() != 0){ //пока есть доступные (полученные) данные
datafromUser = Serial.read();
if (datafromUser == '1'){
digitalWrite (LED_BUILTIN, HIGH); //в случае 1 светодиод загорается
}
if (datafromUser == '0'){
digitalWrite (LED_BUILTIN, LOW); //в случае 0 светодиод гаснет
}
}
}

Программу Arduino IDE можно закрыть, она нам больше не понадобится.

 

Управление светодиодом путем отправки "0" и "1" в порт

Предварительно необходимо установить библиотеку: введите pip install pyserial в командную строку. Далее загружаем код в среду разработки Python (перед запуском необходимо выбрать порт, к которому подключен модуль, у меня СОМ3):

#для взаимодействия с портом
import serial
#для использования функций времени
import time

#выбор порта и частоты обмена данными
ArduinoSerial = serial.Serial('COM3', 9600)
#ждем 2 секунды для стабилизации
time.sleep(2)

#вывод данных из порта
print(ArduinoSerial.readline())
print("Enter 1 to turn ON LED and 0 to turn OFF LED")

while 1: #Do this forever
    #чтение введенных пользователем данных
    var = input()
    #подтверждение ввода
    print("you entered", var)
    #в случае 1 светодиод загорается
    if var == '1':
        ArduinoSerial.write(b'1')
        print ("LED turned ON")
        time.sleep(1)
    #в случае 0 светодиод гаснет
    if var == '0':
        ArduinoSerial.write(b'0')
        print ("LED turned OFF")
        time.sleep(1)

 

Управление горением светодиода с помощью конопок "Включить" и "Выключить" посредством библиотеки Tkinter

Загружаем код в среду разработки Python (перед запуском необходимо выбрать порт, к которому подключен модуль, у меня СОМ3):

from tkinter import Tk, BOTH, Frame, Button
import serial
import time

class Example(Frame):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        #создание корневого окна; виджет Frame занимает все клиентское пространство корневого окна
        self.master.title("Мигание светодиодом")
        self.pack(fill=BOTH, expand=True)
        #стиль текста font = ("DejavuSansLight", "Arial", "TimesNewRoman", "ComicSans", "FreeSerif", "LatoThin")
        #по нажатию кнопки вызов функции led_on
        onButton = Button(self, text="Включить", font="Arial", command=self.led_on)
        #содание сетки; координаты кнопки в сетке (0, 0); padx (pady) - отступы по оси х (у)
        onButton.grid(row=0, column=0, padx=5, pady=5)
        #по нажатию кнопки вызов функции led_off
        offButton = Button(self, text="Выключить", font="Arial", command=self.led_off)
        #координаты кнопки в сетке (0, 1)
        offButton.grid(row=0, column=1, padx=5, pady=5)

    def led_on(self):
        #отправление '1' в порт
        ArduinoSerial.write(b'1')
        #ждем 1 секунду для стабильности
        time.sleep(1)

    def led_off(self):
        #отправление '0' в порт
        ArduinoSerial.write(b'0')
        time.sleep(1)

def main():

    global ArduinoSerial
    ArduinoSerial = serial.Serial('COM3', 9600)
    time.sleep(2)
    print(ArduinoSerial.readline())

    root = Tk()
    root.geometry("300x200+300+300")
    app = Example()
    root.mainloop()

if __name__ == '__main__':
    main()

Для более подробного изучения кода перейдите в конец статьи.

 

Управление горением светодиода с помощью одной кнопки-переключателя

Загружаем код в среду разработки Python (перед запуском необходимо выбрать порт, к которому подключен модуль, у меня СОМ3):

from tkinter import Tk, BOTH, Frame, Button
import serial
import time

class Example(Frame):

    def __init__(self):
        super().__init__()
        #задаем переменную flash логического типа
        self.flash = False
        self.initUI()

    def initUI(self):
        self.master.title("Мигание светодиодом")
        self.pack(fill=BOTH, expand=True)
        ledButton = Button(self, text="Led", command=self.led)
        ledButton.pack(pady = 30)

    def led(self):
        if self.flash == False:
            ArduinoSerial.write(b'1')
        else:
            ArduinoSerial.write(b'0')
        self.flash = not self.flash
        time.sleep(1)

def main():

    global ArduinoSerial
    ArduinoSerial = serial.Serial('COM3', 9600)
    time.sleep(2)
    print(ArduinoSerial.readline())

    root = Tk()
    root.geometry("300x200+300+300")
    app = Example()
    root.mainloop()

if __name__ == '__main__':
    main()

 

Делаем дизайнерскую кнопку с помощью картинки png или jpg

Добавляем код в среду разработки Python.

Перед запуском необходимо:

1) выбрать порт, к которому подключен модуль (у меня СОМ3);

2) добавить картинку в папку, где хранится код и правильно ее проинициализировать. Учтите, большой размер картинки ограничит возможности размещения кнопки на экране.

from tkinter import Tk, BOTH, Frame, Button, FLAT, RAISED
from PIL import Image, ImageTk
import serial
import time

class Example(Frame):

    def __init__(self):
        super().__init__()
        self.flash = False
        self.initUI()

    def initUI(self):
        self.master.title("Мигание светодиодом")
        self.pack(fill=BOTH, expand=True)

        #создание кнопки
        toolbar = Frame(self.master, bd=1, relief=RAISED)
        self.img = Image.open("png/LED.png")
        eimg = ImageTk.PhotoImage(self.img)
        ledButton = Button(toolbar, image=eimg, relief=FLAT, command=self.led)
        ledButton.image = eimg
        ledButton.pack(padx=2, pady=2)
        toolbar.pack()

    def led(self):
        if self.flash == False:
            ArduinoSerial.write(b'1')
        else:
            ArduinoSerial.write(b'0')
        self.flash = not self.flash
        time.sleep(1)

def main():

    global ArduinoSerial
    ArduinoSerial = serial.Serial('COM3', 9600)
    time.sleep(2)
    print(ArduinoSerial.readline())

    root = Tk()
    root.geometry("300x200+300+300")
    app = Example()
    root.mainloop()

if __name__ == '__main__':
    main()

 

Немного о Tkinter

Tkinter - одна из графических библиотек в Python. Она позволяет создать простенький интерфейс, содержащий кнопочки, ползунки и другие инструменты.

Если понадобится более тчательное освоение Tkinter, рекомендую этот цикл статей.

Шаблон, которым пользовались в каждом коде:

#импортирование классов Tk и Frame
#Tk нужен для создания корневого окна
#Frame играет роль контейнера для других виджетов (Scale, Label, ...)
from tkinter import Tk, Frame

class Example(Frame):
    #self — общепринятое имя для ссылки на объект
    #__init__ — инициализатор объектов
    def __init__(self):
        super().__init__()
        #переходим к методу initUI
        self.initUI()

    def initUI(self):
        #здесь будет находиться основной код, направленный
        #на создание пользовательского интерфейса
        pass

def main():
    #создание окна и определение его геометрии
    #300х200 - габариты, следующие два числа - координаты
    root = Tk()
    root.geometry("300x200+300+300")
    #инициализируем класс приложения (app - объект класса Example)
    app = Example()
    #обработка событий
    root.mainloop()

if __name__ == '__main__':
    main()

Если есть необходимость разобраться в ООП, рекомендую этот материал.