Удобная и простая утилита для управления ардуино с компа

Удобная и простая утилита для управления ардуино с компа
Приветствую местных ардуинщиков, хоть этот сайт конкретно про ардуино, речь пойдёт про python. Стоп стоп! не надо репортить или сваливать со статьи, данный проект хоть и написан совершенно на другом языке, но будет очень интересен всем, как и начинающих(особенно!) так и опытным роботоклепателям.

Я тут клепал очередной станок, и была проблема, как этой махиной управлять, кнопки геморно а с компа через терминал ide неудобно и долго. Так и родилась идея проги, способной быстро и удобно управлять любыми роботами, станками, стендами.
Так бы эта идея улетела бы в пустоту, как 1000+ идей для проектов, но тут с неба постучали, нам, дескать, проект нужен, и чтоб посложней да поинтересней, да и 500 строк кода - минимум. Я такой репу почесал, да и вспомнил про идею. Програмирование заняло больше недели, нет, АДСКОЙ НЕДЕЛИ БЕЗ СНА И ОТДЫХА, только вот школа давила на мозг и приходилась туда ходить(да, мне 16). А уже дома до поздней ночи сидеть за проектом. На домаху, я, разумеется, забил))

Ладно, кончай болтологию, давай дело. Я разработал оконное приложение, способное создавать, редактировать и сохранять интерфейс. А уже при помощи этого интерфейса управлять платой

Вот так может выглядеть ваш интерфейс:
Снимок экрана (237).png

И так, вы заинтересованны, как же при помощи этой проги можно просто, а главное удобно и без заморочек управлять вашей платой? Ща разъясню.

Элементы интерфейса(кнопки слайдеры и т. д.) я назвал нодами(знаю, неправильно, но я так привык). Все ноды можно двигать по экрану, для этого зажемаем кнопку "..." и тянем. Каждый нод имеет настройки, где можно его полностью настроить, от размера и имени, до индекса и значений команд. Что за команды? Сейчас расскажу.

Программа работает по принципу команд, команда же состоит из двух чисел, индекса, который указывает ардуине к какому конкретно исполнителю(светодиод, серва, мотор и т. д.) предназначена конкретная команда, и значения которое должно применится к данному исполнителю. Выглядят команды вот так - ${индекс} {команда};
Примеры:
$1 1; - Включить светодиод с индексом 1
$1 0; - Выключить светодиод с индексом 1
$10 90; - Повернуть сервопривод с индексом 10 в положение 90 градусов
$2 1; - Включить светодиод с индексом 2
$2 0; - Выключить светодиод с индексом 2
Привязка индекса и исполнителя происходит в коде ардуино.

Шаг 1 . Скачивание.
Переходим по ссылке на мой github https://github.com/HollowHunter/Arduino-Control-System
Читаем инструкцию(не забиваем на это!) и качаем файл ACS_1.02 (позже может выйти новая версия). Там будет ссылка на гугл диск. Получаем exe файл программы, запускаем, антивирус может начать вопить, игнорим и всё равно запускаем. Если не запустилось(Fatal error), пишем баг репорт, в котором указываем систему, версию и разрядность винды.
Всё! у вас есть прога.

Шаг 2. Разбираемся методом тыка.
Как зайдёте в прогу, увидите пустое окно с менюшкой сверху. Там будут меню "файл", "создать" и "подключение ардуино".
если с первыми двумя всё более менее понятно, то с подключение ардуины могут возникнуть вопросы.

Пункт "порт" вроде бы понятен, НО! список портов не обновляется автоматически! Прога про сканирует порты при старте, но потом сама сканить не будет!! Для обновления портов жмём "обновить порты", прога закроет и откроет окно, это нормально, это происходит при каждом добавлении чего либо, так что не паникуем!! Если порты будут найдены, они будут добавлены в список. Так же если при старте прога найдёт только один порт, то он будет выбран автоматически.
Пункт "тип сигнала" пока не работает, будет исправлено при обновлении

Если что-то не понятно, идём в файл readme на гидхабе и читаем, там на русском.

Шаг 3. Ноды.
Всего видов нод четыре, три из них на отпрвку данных, один на приём из платы.

Кнопка:
Вроде самый простой нод, но у него больше всего настроек.
Снимок экрана (239).png
Этот нод очень крут, есть 3 режима работы и возможно забиндить клавишу, правда работают только те, которыми можно печатать, то есть cntrl, shift, enter и т. д. не подойдут.
За подробностями - в документацию(файл readme)

Слайдер:
Идеален для сервоприводов, регулировке скорости моторов, rgb светодиодов и всего такого.
Снимок экрана (241).png
Возможно устанавливать минимум и максимум, размер(я обычно всегда ставлю 3 или 5), а так же есть привязка, это когда после отпускания слайдер вернётся к указанному значению, если поле пустое или некорректные данные, привязка работать не будет. Это похоже на пружинку в джойстике.

Поле для ввода:
Просто поле, куда можно руками вбить нужное число и оно полетит в плату в уже оформленное в команду. Индекс также как и везде указывается в настройках
Снимок экрана (243).png
Нод будет полезен там, где нужно ввести точные данные, например шаги для шагового двигателя.

Вход данных:
Самый интересный и сложный в реализации нод, позволяет принимать данные из ардуино. Так же использует индексы, тут они нужны, чтобы данные не смогли попасть не в то окно, которое нужно. Например данные с дальномера и потенциометра идут в разные окна.
Снимок экрана (245).png
В отличие от нодов отправки, для него не нужно обрамление в виде "$" и ";", просто сначала отправляем индекс, потом пробел, а затем само значение с датчика или чего там надо.
пример:
5 18
5 20
5 25
6 568
6 632
Пример кода в ардуине для отправки:
Serial.print("1"); // Индекс, который нужно поставить в ноде
Serial.print(" "); // Пробел для разделения
Serial.println(temperature); // Переменная, которая будет выводится в окне

Шаг 4. Скетч для ардуино.
Для реализации быстрой работы я использовал готовую функцию, разработанную нашим любимым Алексом Гайвером, вот эта функция:
Функция обработки serial:
/*
   Данный алгоритм позволяет получить через Serial пачку значений, и раскидать
   их в целочисленный массив. Использовать можно банально для управления
   ЧЕМ УГОДНО через bluetooth, так как bluetooth модули есть UART интерфейс связи.
   Либо управлять через Serial с какой-то программы с ПК
   Как использовать:
   1) В PARSE_AMOUNT указывается, какое количество значений мы хотим принять.
   От этого значения напрямую зависит размер массива принятых данных, всё просто
   2) Пакет данных на приём должен иметь вид:
   Начало - символ $
   Разделитель - пробел
   Завершающий символ - ;
   Пример пакета: $110 25 600 920;  будет раскидан в массив intData согласно порядку слева направо
   Что делает данный скетч:
   Принимает пакет данных указанного выше вида, раскидывает его в массив intData, затем выводит обратно в порт.
   Отличие от предыдущего примера: написан мной, не используя никаких хитрых функций. Предельно просто и понятно работает
*/
#define PARSE_AMOUNT 2         // число значений в массиве, который хотим получить
                                    // В данном случае нам нужно 2 элемента, индекс и значение
int intData[PARSE_AMOUNT];     // массив численных значений после парсинга
boolean recievedFlag;
boolean getStarted;
byte index;
String string_convert = "";
void parsing() {
  if (Serial.available() > 0) {
    char incomingByte = Serial.read();        // обязательно ЧИТАЕМ входящий символ
    if (getStarted) {                         // если приняли начальный символ (парсинг разрешён)
      if (incomingByte != ' ' && incomingByte != ';') {   // если это не пробел И не конец
        string_convert += incomingByte;       // складываем в строку
      } else {                                // если это пробел или ; конец пакета
        intData[index] = string_convert.toInt();  // преобразуем строку в int и кладём в массив
        string_convert = "";                  // очищаем строку
        index++;                              // переходим к парсингу следующего элемента массива
      }
    }
    if (incomingByte == '$') {                // если это $
      getStarted = true;                      // поднимаем флаг, что можно парсить
      index = 0;                              // сбрасываем индекс
      string_convert = "";                    // очищаем строку
    }
    if (incomingByte == ';') {                // если таки приняли ; - конец парсинга
      getStarted = false;                     // сброс
      recievedFlag = true;                    // флаг на принятие
    }
  }
}
void setup() {
  Serial.begin(9600);
}
void loop() {
  parsing();       // функция парсинга
  if (recievedFlag) {                           // если получены данные
    recievedFlag = false;
      switch(intData[0]){ // intData[0] - индекс intData[1] - значение
          case 1:
            // исполнитель с индексом 1
            break:
          case 2:
            // исполнитель с индексом 2
            break:
      }
    for (byte i = 0; i < PARSE_AMOUNT; i++) { // выводим элементы массива
      Serial.print(intData[i]); Serial.print(" ");
    } Serial.println();
  }
}
Взята с сайта https://alexgyver.ru/arduino-algorithms/ , Параграф "РАБОТА С SERIAL", пункт "Парсинг Serial потоковый. Вариант 2 (вручную, без задержек)"
Так же функция была незначительно отредактирована, для того что бы подходить под программу

Другие примеры есть на gitHub(ссылка выше)

Подведём небольшой итог, прога действительно получилась очень удобной, хоть это уже и законченный продукт, всегда есть куда расти, в дальнейшем буду развивать и поддерживать мою утилиту. Я приглашаю всех тоже принять в этом участие, если вы не шарите в питоне, то всё равно можете отблагодарить меня просто оставив коммент или ещё круче, сделать проект с участием этой программы и показать его всем. Гайвер, если ты увидел эту прогу, отпиши коммент со своими замечаниями и идеями для развития.

Вообще, всё кто посмотрел эту статью или скачал программу или даже её протестировал, оставляйте фид бек, этим вы мотивируете меня делать апдейты и развивать данную утилиту. Не скупитесь на критику! Но принимаю только конструктивную! Даже коммент в стиле "Вау!!" тоже будет полезен!

И да, попали на баг, пишем репорт, исправлю)

(Пс, в ближайшем апдейте будет добавлен блютус, так что ждите)
 

Комментарии

Ilia Salaur

✩✩✩✩✩✩✩
15 Окт 2020
15
6
Очень интересная штука, я недавно писал скетч который имитирует работу sim800l. Типа ардуинка под видом модуля общается с другой ардуинкой. Но не суть


Я предлагаю написать под эти дела библиотеку , чтоб не возится с парсингом и всякими делами. В принципе могу для вас ее написать)
 

HollolwHunter

✩✩✩✩✩✩✩
20 Ноя 2020
3
6
Очень интересная штука, я недавно писал скетч который имитирует работу sim800l. Типа ардуинка под видом модуля общается с другой ардуинкой. Но не суть


Я предлагаю написать под эти дела библиотеку , чтоб не возится с парсингом и всякими делами. В принципе могу для вас ее написать)
Давайте,а то я совсем не шарю в библиотеках для ардуино, буду очень благодарен. Спасибо за отзыв!
 

Wan-Derer

★★★★★✩✩
Команда форума
31 Июл 2018
1,497
321
Москва
wan-derer.ru
Вопросы:
1. Как к питоньей программе прикрутить оконный интерфейс? PyQt5 - это оно?
2. Как питонью программу скомпилировать в экзешник?
 
  • Лойс +1
Реакции: HollolwHunter

HollolwHunter

✩✩✩✩✩✩✩
20 Ноя 2020
3
6
Вопросы:
1. Как к питоньей программе прикрутить оконный интерфейс? PyQt5 - это оно?
2. Как питонью программу скомпилировать в экзешник?
Да, pyqt5 - оно самое, при помощи него и была создана эта утилита. Вещь очень удобная, но есть особенности. Python в exe переделать довольно легко, вот видос от хауди хо -
Если другие вопросы будут, пиши в лс
 

Ilia Salaur

✩✩✩✩✩✩✩
15 Окт 2020
15
6
Давайте,а то я совсем не шарю в библиотеках для ардуино, буду очень благодарен. Спасибо за отзыв!
Да не вопрос, на выходных накидаю что нибудь для теста а потом начну писать полную версию
 
  • Лойс +1
Реакции: Шал и HollolwHunter