В одной из предыдущих статей на нашем сайте мы рассмотрели взаимодействие платы Arduino с языком программирования Python, в результате которого мы управляли свечением светодиода. Если вы начинающий радиолюбитель, то перед прочтением данной статьи вам крайне рекомендуется прочесть упомянутую статью.
После прочтения упомянутой статьи у вас может возникнуть резонный вопрос зачем нам нужно взаимодействие с языком программирования Python, если все, что мы можем сделать с ним с помощью платы Arduino, это обмениваться информацией через порт последовательной связи. На самом деле Python представляет собой мощную платформу для разработки, в которой можно реализовать множество интересных проектов, относящихся к машинному обучению, компьютерному зрению и многому другому. В этой статье мы рассмотрим как создать простой графический интерфейс используя язык программирования Python, в котором мы будем задействовать модуль под названием Vpython. Изложенные в данной статье решения применимы только для тех пользователей, которые используют операционную систему Windows, пользователям Mac и Linux необходимо использовать другой подход.
В конце данной статьи мы узнаем как создать простой GUI (графический интерфейс пользователя) используя язык программирования Python. Мы создадим некоторое подобие анимации с помощью ультразвукового датчика, подключенного к плате Arduino. Приложение будет отслеживать объект с помощью ультразвукового датчика и отображать эту информацию в графической форме на экране компьютера используя модуль VPython. Передачу данных от ультразвукового датчика языку программирования Python будет выполнять плата Arduino.
Необходимые компоненты
- Плата Arduino (любая) (купить на AliExpress).
- Ультразвуковой датчик HC-SR04 (купить на AliExpress).
- Соединительные провода.
- Компьютер с установленным Python.
- Знания из предыдущей статьи этой тематики.
Установка VPython на ваш компьютер
В предыдущей статье мы уже рассмотрели вопрос с установкой языка программирования Python на ваш компьютер. Здесь же мы установим поверх него модуль Visual Python (VPython) чтобы создавать "продвинутую" графику на основе взаимодействия Python и Arduino. Для установки VPython необходимо выполнить следующие простые шаги:
Шаг 1. Убедитесь в том, что Python уже установлен на вашем компьютере.
Шаг 2. Скачайте установочный (exe) файл VPython. Не устанавливайте его 64-битную версию даже если ваш компьютер поддерживает это.
Шаг 3. Запустите установку VPython и следуйте инструкциям во время установки. Убедитесь в том, что вы выбрали полную установку модуля (“full installation”) и не меняйте каталог установки, который установлен по умолчанию.
Шаг 4. После установки VPython его можно найти среди новых установленных программ под именем “VIDLE(VPython)” как показано на следующем рисунке.
Примечание: VIDLE for VPython отличается от IDLE for python.
Шаг 5. Запустите установленное приложение и вы увидите окно программы, показанное на следующем рисунке.
Шаг 6. Это окно, в котором вы будете писать программу для VPython. Но сначала давайте проверим корректно ли работает Vpython на тестовом примере. Для этого выберете пункт меню File->Open->Bounce.
Шаг 7. Должен открыться пример программы. Запустите его на выполнение с помощью выбора пункта меню Run -> Run Module. Если все работает как нужно вы должны получить на экране компьютера следующее изображение:
Вы должны увидеть оболочку программы (слева) и второе окно справа, в котором будет сообщение об успешной компиляции программы. А на переднем плане должно быть окно с результатами выполнения программы – подпрыгивающим мячом.
Шаг 8. Также вы можете попробовать и другие примеры программ чтобы посмотреть на возможности Vpython, например, пример программы под названием “electric-motor”, выполнение которого приведет к следующей картинке на вашем экране.
Шаг 9. Если пример программы у вас успешно запустился, то вы можете переходить к следующему разделу данной статьи.
Шаг 10. Но если у вас появились ошибки (обычно появляется сообщение о “numpy Error”) не теряйте надежду, возможно, вам их удастся исправить с помощью следующих шагов.
Шаг 11. Откройте My computer -> C drive -> Python 27 -> Scripts -> local.bat. Этот файл запустит окно с командной строкой как показано на следующем рисунке.
Шаг 12. Напечатайте в этом окне “pip install --upgrade numpy” и нажмите ввод на клавиатуре. В результате этой команды на ваш компьютер будет установлена новая версия Numpy. Возможно, вам придется подождать некоторое время если у вас медленный интернет.
Шаг 13. Теперь вам нужно вернуться к шагу 4 и попробовать запустить на выполнение указанный в шаге 6 пример программы.
Программирование VPython
Теперь мы начнем программировать в окне VPython. В этой программе мы создадим два 3D прямоугольных объекта, один из которых будет помещен в центре экрана по отношению к стационарно установленному ультразвуковому датчику, а позиция второго объекта будет меняться динамически в зависимости от расстояния между ультразвуковым датчиком и объектом (листом бумаги).
Полный код программы для Python приведен в конце статьи, здесь же мы обсудим его наиболее важные фрагменты.
Первую вещь, которую мы должны сделать в программе – это импортировать (подключить) библиотеку для работы с графическими объектами (visual Library) чтобы мы могли создавать 3D объекты. Это можно сделать с помощью следующей строки:
1 |
from visual import * |
Следующие 4 строки вам должны быть знакомы по нашему предыдущему руководству по работе с Python. Они используются для подключения библиотек для работы с последовательном портом связи и организации задержек в программе и последующего установления связи с Arduino на порту COM18 со скоростью 9600 бод/с.
1 2 3 4 5 |
import serial #подключение библиотеки для работы с портом последовательной связи import time #библиотека чтобы использовать задержки (delay) в программе ArduinoSerial = serial.Serial('com18',9600) #создаем объект последовательного порта связи с именем arduinoSerialData time.sleep(2) #ждем 2 секунды чтобы установилась последовательная связь |
Теперь пришло время создавать графические объекты. Мы создали два 3d объекта с именами obj (объект) и wallL (стена). Объект wall представляет собой стационарную стену голубого (cyan) цвета размещенную в центре экрана, а obj – это передвижной объект белого (white) цвета. Мы также разместили надпись “US sensor” рядом с объектом-стеной.
1 2 3 |
obj = box(pos=(-5,0,0), size=(0.1,4,4), color=color.white) wallL = box(pos=(-1,0,0), size=(0.2,12,12), color=color.cyan) text(text='US sensor', axis=(0,1,0) , pos=(-2,-6,0), depth=-0.3, color=color.cyan) |
Параметры в скобках команд – это трехмерные координаты (x,y,z), которые вам должны быть знакомы из курса школьной геометрии.
Теперь, когда графическая часть программы у нас готова и связь по последовательному порту связи у нас установлена, все, что нам остается делать – считывать данные, поступающие от платы Arduino и передвигать в соответствии с ними объект “obj” (белый прямоугольник) по экрану. Это можно сделать с помощью приведенных ниже строчек кода, в которых команда obj.pos.x управляет положением координаты X объекта.
1 2 3 |
t = int (ArduinoSerial.readline()) #считываем данные из последовательного порта связи и печатаем их в виде строки t= t* 0.05 obj.pos.x = t |
Подготовка платы Arduino к работе
Для подготовки платы Arduino к работе сначала мы должны подключить к ней ультразвуковой датчик в соответствии с выше приведенной принципиальной схемой. Если до этого вы никогда не работали с ультразвуковым датчиком сначала мы рекомендуем вам ознакомиться со статьей про измерение расстояний с помощью платы Arduino и ультразвукового датчика.
После этого вы должны загрузить в плату Arduino программу, приведенную в конце данной статьи. К строкам программы имеются комментарии, помогающие понять их смысл. Ультразвуковой датчик вычисляет время между передачей импульса и его возвращением обратно после отражения от объекта. Это время определяется в Arduino с помощью функции PulseIn. В дальнейшем это время преобразуется в значение расстояния с помощью следующей строчки кода:
1 |
dist = (timetaken/2) / 2.91; |
В этой формуле расстояние вычисляется в миллиметрах (мм).
Работа проекта
Запустите программу на Python и поместите объект (в нашем случае мы использовали лист бумаги) напротив ультразвукового датчика как показано на следующем рисунке.
После запуска программы на Python вы заметите как белый прямоугольник на экране движется в соответствии с расстоянием между объектом и ультразвуковым датчиком и значение этого расстояния отображается в окне программы как показано на следующем рисунке.
Так работает наша простейшая программа. Мы надеемся что вы получите удовольствие от реализации этого проекта и в дальнейшем на его основе сможете создать множество других интересных проектов, реализующих графическую мощь языка Python совместно с Arduino.
Исходный код программы
Код программы для Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
from visual import * import serial # подключение библиотеки для работы с портом последовательной связи import time # библиотека чтобы использовать задержки (delay) в программе ArduinoSerial = serial.Serial('com18',9600) # создаем объект последовательного порта связи с именем arduinoSerialData time.sleep(2) # ждем 2 секунды чтобы установилась последовательная связь obj = box(pos=(-5,0,0), size=(0.1,4,4), color=color.white) wallL = box(pos=(-1,0,0), size=(0.2,12,12), color=color.cyan) text(text='US sensor', axis=(0,1,0) , pos=(-2,-6,0), depth=-0.3, color=color.cyan) t = 0 while 1: rate(100) t = int (ArduinoSerial.readline()) # считываем данные из последовательного порта связи и печатаем их в виде строки t= t* 0.05 obj.pos.x = t print(t) |
Код программы для Arduino
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#define Trigger 2 #define Echo 3 int timetaken, dist; int sendv; void setup() { Serial.begin (9600); pinMode(Trigger, OUTPUT); pinMode(Echo, INPUT); } void loop() { timetaken=dist=0; //устанавливаем необходимые переменные в 0 перед проведением расчетов //инициируем посылку датчиком ультразвукового сигнала digitalWrite(Trigger, HIGH); digitalWrite(Trigger, LOW); timetaken = pulseIn(Echo, HIGH); //определяем время распространения импульса (до объекта и обратно) dist = (timetaken/2) / 2.91; //рассчитываем расстояние до объекта if (dist <= 200 && dist > 0) // если расстояние до объекта находится в диапазоне 0-20 см то передаем его в программу на python sendv = dist; Serial.println(sendv); delay(200); } |
Класс! Всё просто и понятно. С ардуино и датчикаии у меня опыт есть, а вот питона первый раз в руки взял ))
Спасибо что оценили мой труд