Arduino + Python 3
05.01.2021(Всего голосов: 0)
Нам понадобятся:
1) Arduino (Uno, Nano или 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 можно закрыть, она нам больше не понадобится.
Загружаем код в среду разработки 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)
Загружаем код в среду разработки 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()
Добавляем код в среду разработки 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()