Перейти к содержимому

Начинаю изучать QT Creator по книге Макса Шлее QT 5.10 Профессиональное программирование на C++.

Появилось желание изучить кросплатформенную библиотеку Qt. Здесь буду выкладывать свои попытки разобраться с материалом. Изучение буду проводить в свободном порядке. У меня уже есть базовые знания по C++, поэтому начну сразу с интересной для меня темы "Интервью, или модель - представление".

Задача - вывести одни и те же данные в трёх различных пердставлениях(TreeView, ListView, TableVeiw).

https://www.youtube.com/watch?v=hXBmD3VHRQo

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

Изначально я планировал использовать ПИД регулятор для регулировки температуры. После многочисленных тестов я так и не смог добиться приемлемых результатов его работы для разных ситуаций. Например, когда я подбираю параметры ПИД регулятора для нагрева температуры до 150 градусов, станция уверенно выходит на заданную температуру и поддерживает её. Но как только я задаю другую температуру, например 100 градусов, регулятор уже промахивается и поднимает до 110-120 градусов. Если же подобрать параметры, которые будут более плавно выводить температуру на нужную уставку, это приведет к затягиванию процесса для более высоких температур.

Пока я решил эту проблему ограничением мощности для разных температур. Во-первых, я вычисляю разность температур (текущей и требуемой), чем больше разность, тем больше разрешенная мощность. Во вторых, ввожу дополнительный коэффициент "dop". Чем выше требуемая температура, тем больше коэффициент.

Схема соединений

Изначально я начал разрабатывать паяльную станцию на базе отладочной платы Nucleo F410RB. До данного момента она справлялась со своими задачами. Я покупал её для изучения mbed, а не под конкретный проект и не мог рассчитать примерный объем нужной мне памяти. Как следствие, я уперся в ограничение  128Кб на размер программы. Этого достаточно на текущем этапе, но нет задела для будущего. Я планирую подключать флеш карту к паяльной станции, на которой будут храниться настройки, лог - файлы, профили пайки. А это накладывает повышенные требования к памяти, так как необходимо подключить библиотеки для работы с файлами, возможно с XML файлами. Подключение библиотек для работы с файловой системой сразу же увеличило размер програмы до 130Кб. Это уж не укладывается в Nucleo F410RB. Я не стал придумывать костыли и решил использовать другую отладочную плату -Nucleo F446RE.

Посмотрим, что подключено к микроконтроллеру.

Фазовый регулятор мощности

Фазовый регулятор мощности вы могли видеть в моём видеоролике.
Там же описан принцип его работы. В предыдущей статье я описывал как им управлять в mbed. Ниже вы можете видеть к каким портам он подключен в моей паяльной станции.


Фазовый регулятор мощности

Термопары

Термопар много не бывает. На данном этапе я использую три термопары, подключенные через микросхемы max6675 (spi интерфейс). Все три модуля подключены к одному интерейсу SPI. Различаются только ножки CS(chip select). Изначально все CS порты установлены в единицу. Как только мы хотим получить данные с нужной термопары, мы устанавливаем ножку CS этой термопары в 0 и получаем данные о температуре.


Подключение термопар

Подключение флешкарты

На данном этапе флешка не задействована, но в будущем на ней будут храниться настройки и лог-файлы.


Подключение флешкарты

Связь с монитором Nextion и компьютером

Nextion - главный элемент управления станцией. Он реализует интерфейс пользователя. Подключается по uart интерфейсу. Ещё один uart интерфейс задействован по умолчанию для связи с компьютером.


Связь с монитором Nextion и ПК

Интерфейс пользователя

Интерфейс пользователя состоит из четырёх экранов.

Стартовый экран


На стартовом экране две кнопки. По нажатию на каждую из них происходит переход на соответствующую страницу интерфейса. Обработчики для нажатий на эти кнопки представлены ниже:

Нижний подогрев

Настройки

При нажатии на кнопку в uart порт передается команда "xpage=номер страницы". Номер страницы я передаю в текстовом виде. Это связано с проблемой, которую я не смог решить. Экран nextion может передавать числа в шестнадцатиричном виде по 4 байта на число. Изначально я писал:

На стороне микроконтроллера я анализировал полученные данные. Разбивал команду на то что находится до знака "=" и после. Я знал, что после знака равно идут четыре байта с числом и успешно его считывал. Но проблема в том, что дисплей отказывался передавать некоторые числа. Например 10,11,12. Вместо них не передавалось ничего. Я случайно обнаружил эту проблему, когда задавал температуру уставки 11 или 12 градусов. При этом станция начинала глючить. Хотя на всех других температурах отрабатывала нормально. Столкнувшись с этой проблемой я решил передавать все данные в текстовом виде, а уже на стороне микроконтроллера переводить нужные из них в число. Отсюда появилась строчка "covx 1,va0.txt,3,0", которая переводит цифру 1 в текстовый вид и записывает её в невидимое текстовое поле va0.txt. 

Вообще для того, чтобы быстро отличать все мои команды от другой вспомогательной информации, которая передаётся по uart порту между дисплеем и микроконтроллером, я решил, что все мои команды будут начинаться с буквы "x".

Экран задания температуры




На этом экране можно задавать требуемую температуру с помощью слайдера или наэкранной клавиатуры. Кнопки назад и вперед рассматривать не будем, они не отличаются от ранее рассмотренных. Посмотрим код кнопки "Старт".

При нажатии кнопки "Старт" по uart микроконтроллеру передается команда вида "xsd=заданная температура". h1.val - значение слайдера, page2.tempg.val - поле на следующей странице, которое показывает, какую температуру мы хотим достичь.

Экран отображения динамики нагрева

На этом экране отображаются графики изменения температуры для двух термопар. Голубой график - "термопара нижнего подогрева". Желтый - "термопара верхнего нагрева". Зеленый - температура уставки.  Таким образом видим, что задана температура 145 градусов и нижний нагреватель разогревает тестовую плату (синий график приближается к зеленому). Вторая термопара пока в процессе не учавствует, она лежит рядом с паяльной станцией. Я кратковременно прикоснулся ей к нижнему нагревателю, о чем свидетельствует всплеск на желтом графике.


Экран настроек

На этом экране пока можно включать и отключать элементы нижнего нагревателя. Приведу код кнопки для первого нагревателя. При нажатии кнопки передается команда "xtoggle=0" для первого нагревателя; "xtoggle=1" для второго и.т.д.


Функция микроконтроллера для обработки команд, принятых от экрана

Спойлер

Кратко опишу, как происходит общение между микроконтроллером и дисплеем. Общаются они по uart. Дисплей передает команду в виде "xcommand=data", где command - команда, data - данные. Все команды я начинаю с буквы x. Так легче их отделять от остального мусора. Если команда не начинается с x, значит она нам не нужна. Дальше микроконтроллер разбивает команду на command и data и выполняет необходимые действия по той или иной команде. Если же микроконтроллер хочет передать команду дисплею, то делает о это в соответствии с инструкцией.

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

Компоненты паяльной станции

3

Стоит задача - спроектировать самодельную инфракрасную паяльную станцию. Станция состоит из двух нагревателей: верхнего и нижнего. Нагреватели должны нагревать плату в соответствии с определенным профилем температуры. Температура будет определяться по показаниям термопары (одной или нескольких).

На данном этапе я приступил к реализации алгоритма поддержания заданной температуры (ПИД регулятор). Интересно? Добро пожаловать под "кат".

Регулировать температуру я решил с помощью самодельного фазового регулятора. Видео можно посмотреть ниже.

https://www.youtube.com/watch?v=jSGbDmSUytAhttps://www.youtube.com/watch?v=-QZWYIpy9j0https://www.youtube.com/watch?v=hXBmD3VHRQo

Сначала, для управления будущей паяльной станцией я решил задействовать Arduino. Предполагалось, что фазовым регулятором будет управлять одна плата Arduino nano, а остальной функционал будет обеспечиваться второй платой. В видео я как раз экспериментировал с фазовым регулятором на базе Arduino.

Позже я решил поэкспериментировать с отладочной платой Nucleo F410RB. Она уже несколько месяцев пылилась на полке моего шкафа. Мне показалось интересным попробовать mbed os с её многопоточностью для реализации алгоритма управления паяльной станцией. Забегая вперед скажу, что mbed os оставила о себе положительное впечатление.

Панель управления

Еще до начала реализации, когда паяльная станция была только в мыслях, я начал задумываться: "Каким бы мне хотелось видеть панель управления этой станцией?" Самым простым было бы налепить разных кнопочек и индикаторов, но хотелось чего - то более современного. Я начал искать подходящие сенсорные панели и наткнулся на дисплей Nextion. Это сенсорный экран, совмещенный с микроконтроллером. Управление дисплеем осуществляется по UART. Его преимуществом является графический редактор интерфейса "Nextion Editor" , в котором можно быстро сверстать все необходимое.






Интерфейс приложения делится на страницы. На каждой странице можно добавлять различные элементы (кнопки, текстбоксы, графики, лейблы и.т.д). У каждого элемента есть свои свойства и события. Например, кнопка "Старт" на фотографии выше имеет обработчик события "Touch Press Event", в котором содержится следующий код:

Первые три строчки кода выводят в UART порт строку "xsd=89 ", где 89 - температура, установленная слайдером. page2.tempg.val=h1.val задает значение элемента tempg, который находится на второй странице и отображает требуемую температуру. h1 - это слайдер. page 2 - команда перехода на вторую странцу интерфейса.

Полный набор инструкций можно посмотреть на https://www.itead.cc/wiki/Nextion_Instruction_Set

А вот небольшой пример кода, который наоборот присылает данные из nucleo в дисплей

Здесь стоит обратить внимание, что все команды, отправляемые в дисплей должны оканчиваться последовательностью FF FF FF (255 255 255).

Выбор среды разработки для mbed os

С отладочной платой и панелью управления определился, теперь нужно подумать о среде программирования.Первое моё знакомство с mbed os началось с официального сайта и официального онлайн компилятора. Он находится по адресу https://os.mbed.com/compiler/.

Онлайн компилятор предоставляет очень простой способ программирования отладочных плат nucleo. Всё, что нужно - подключить плату к компьютеру(она определится как флешка) и загрузить в нее скомпилированный файл программы. Единственное неудобство такой разработки - постоянное подключение к интернету.

Сейчас есть очень удобный offline метод. Проект называется Platformio. Я установил версию на базе VSCode. По отзывам - это наиболее удобная платформа. Она из коробки настроена для работы со многими отладочными платами. Моя -nucleo F410RB тоже есть в списке.  Для моей платы platformio сразу же предлагает mbed в качестве фреймворка.




Как уже говорил ранее, в своём проекте я планирую использовать RTOS (real time operating system). Здесь крылся один из подводных камней Platformio. Нельзя просто взять и добавить в main.cpp строчку #include "rtos.h". Сначала я так и сделал. При этом проект напрочь отказывался собираться. Поискав информацию по теме в интернете я обнаружил, что в проекте platformio есть файл platformio.ini. Поддержку rtos нужно включить еще и в нем. Файл при этом примет следующий вид:

Программная реализация

Фазовый регулятор. Немного теории.

Теперь проект компилируется и запускается. Пора приступать к написанию кода. В предыдущих видео я управлял фазовым регулятором с arduino. Теперь попробуем переписать тоже самое, только на mbed os.

Как мы помним, фазовый регулятор обрезает часть синусоиды переменного тока, что приводит к уменьшению выдаваемой мощности.


Таким образом мне нужно задавать задержку включения симистора в микросекундах относительно пересечения синусоиды с 0. Здесь есть один важный нюанс. Я знаю, что полупериод длится 10000мкс. Допустим я хочу включить нагреватель на 10% мощности. Какую задержку мне нужно задать? Если я задам задержку в 1000 мкс(10% от полупериода), то мощность не будет равна 10%, так как площадь части синусоиды вначале периода меньше, чем, допустим, в середине.

На помощь мне пришла статья на habr.com. Раздел "Управление мощностью".  Мгновенная мощность вычисляется по следующей формуле:

2018-11-03_20-01-49

Количество выделенного тепла

В общем виде получаем, что максимальное количество  тепла за период от 0 до Pi равно

2018-11-03_20-21-22

Вместо Pi запишем T*Pi, где T - коэффицент от 0 до 1 для того чтобы получить значение тепла на отрезке от 0 до T*Pi

2018-11-03_20-39-39

Получается, что при T=1 мы получем максимальное количество тепла за время от 0 до Pi

2018-11-03_20-49-08

Введем переменную Q, принимающую значения от 0 до 1. Таким образом мы получим уравнение, в которое можно вместо Q подставить нужное значение количества тепла, например, 0.1, что соответствует 10%. Решив его получим значение T, которое покажет какую часть периода нужно оставить, чтобы получить эти 10% тепла.

2018-11-03_20-53-23

Решал уравнение я по методу автора статьи с помощью консольного приложения qtcreator. В результате получил массив значений. Порядковый номер соответствует требуемой мощности от 0 до 250. Значение соответствует требуемой задержке. Например d[200]=3363 говорит, что для того чтобы получить мощность 200 необходима задержка 3363мкс.

Результат работы программы


Ради интереса построил график в excel, на котором отражена разбивка по 10% в соответствии с полученным массивом.

Фазовый регулятор. Код.

Фазовый регулятор описан классом PowerControl. Он содержит обработчик прерывания ZeroCross_ и пять таймеров. По одному для каждого нагревателя.

Класс PowerControl

Посмотрим на обработчик прерывания. Как только синусоида проходит через 0, он взводит пять таймеров, по одному на каждый нагреватель. Время для каждого берется из массива, который мы вычислили заранее.

 

А вот обработчики для первого таймера:

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

ПИД регулятор

Для установки требуемой температуры будем использовать Пропорционально-интегрально-дифференцирующий регулятор. Введем такое понятие, как "ошибка".

Ошибка - разность температур (заданной и текущей) Error = tзад -  tтек.

ПИД регулятор состоит из трех составляющих.

  1. Пропорциональная составляющая - разность температур, умноженная на пропорциональный коэффициент. Эта составляющая позволяет работать нагревателю, пока есть разность температур.(Error*Kp)
  2. Дифференцирующая составляющая - ошибка на предыдущем шаге минус текущая ошибка и всё это умноженное на дифференцирующий коэффициент. (Error(пред.) - Error)*Kd)
  3. Интегрирующая составляющая - сумма всех ошибок Error, умноженная на интегрирующий коэффициент.

Для некоторых систем достаточно только одной - пропорциональной составляющей. Например, я пока использую вместо керамического нагревателя лампочку накаливания. Она нагревает небольшой металлический предмет. В этом случае система почти не имеет инерции. И пропорциональный регулятор поддерживает заданную температуру достаточно точно.

Керамические нагреватели нагреваются дольше чем лампочка, но и остывают дольше. Таким образом появляется инерция, и пропорциональный регулятор будет перегревать систему, температура будет колебаться возле заданного значения. Здесь нам уже потребуется дифференцирующая составляющая. Она позволит предвидеть перегрев и подойти к настраиваемой температуре более плавно.

Как только мы начнем использовать пропорциональную и дифференцирующую составляющую, возникнет ситуация, когда они установят равновесие немного раньше заданного значения. В этом случае нам поможет интегрирующая составляющая. Она за несколько шагов накопит ошибку системы и добавит недостающую мощность. Температура снова установится на заданном значении.

В моей программе ПИД регулятор оформлен ввиде класса. Он содержит таймер, который через равные промежутки времени рассчитывает значения мощности и выставляет эту мощность на фазовом регуляторе.

Pid.h

Pid.cpp

На данном этапе у меня получился пропорциональный регулятор температуры. Как только в моём распоряжении появятся керамические нагреватели, буду настраивать ПИД регулятор, подбирать необходимые коэффициенты.

Дополнительные материалы

Проект в Platfomio и интерфейс для дисплея Nextion

Компоненты паяльной станции

Поделюсь своей моделью жертвенного стола для CNC 2418. Он необходим для компенсации неровностей основного стола, а так же для защиты поверхности стола от повреждения фрезой.

Модель стола я создал в ArtCam 2018. Скачать её можно по ссылке ниже.

Скачать модель столика


Создание столика разбито на три этапа. 

Этап 1: Создаем 4 крепежных отверстия с помощью которых закрепим заготовку к основному столу.

Этап 2: Создадим сквозные отверстия под болты М6

Этап 3: Выберем пазы под гайки М6

Этап 4: Выравнивание поверхности

Этап 1

Первым делом закрепим заготовку 26*20 любым возможным способом. Я крепил на канцелярские скобы. Просверлим 4 крепежных отверстия, с помощью которых уже более надежно закрепим заготовку.

  • Фреза спиральная 3мм
  • Шаг по Z: 2 мм
  • Подача 2 мм/сек
  • Обороты: 1000 (10000 об/мин)

Файл для GRBLControl (Candle)


Этап 2

Приступим к сверлению отверстий под болты М6

  • Фреза спиральная 3мм
  • Шаг по Z: 1 мм
  • Подача 1.5 мм/сек
  • Обороты: 1000 (10000 об/мин)

Файл


Этап 3

Выберем посадочные места под гайки.

  • Фреза: прямая пазовая 2мм. 
  • Шаг по Z: 3мм
  • Падача: 2мм/сек
  • Обороты: 1000(10000 об/мин)

Файл


Этап 4

Выравнивание поверхности производил концевой фрезой диаметром 2мм.

  • Глубина 0.1 мм
  • Подача 5мм/сек
  • Обороты 300(3000 об/мин)

Файл


Используемые фрезы

Спиральная фреза по дереву диаметром 3мм


AliExpress

Прямая пазовая фреза


AliExpress

По многочисленным просьбам добавил перебор цифр каждую минуту для проекта часов на ардуино.

Скетч

У многих из вас вызывает затруднение запись скетча для часов в ардуино. Чаще всего это связано с установкой библиотеки реального времени для DS3231. В этот раз я перенёс скетч в онлайн среду разработки.

 Для записи скетча в ардуино регистрируйтесь на сайте https://create.arduino.cc/editor 

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

 При выборе конечной платы выбирайте Arduino Nano ATmega328old.

Выбор конечной платы Arduino

Обсуждение проекта часов

Продолжаем изучать MBED OS. Подключим энкодер к отладочной плате Nucleo F410RB. Энкодер KY-040 часто используется в проектах на Arduino, он используется в составе многих устройств в качестве интерфейса управления. С его помощью можно регулировать какие - либо параметры поворотом ручки в ту или иную сторону. При этом энкодер не ограничен количеством оборотов ручки, она может вращаться бесконечно в ту или иную сторону. Это обеспечивает как плавную так и быструю регулировку нужного параметра. Так же в этом энкодере присутствует кнопка, которая срабатывает при нажатии на вал энкодера. 

Данный энкодер механический инкрементный. На своём борту имеет пять выводов.

  • GND
  • +
  • SW
  • DT
  • CLK

Харакеристики KY-040

  • Предельное напряжение на контактах 5В 
  • Предельный ток через контакты 10 мА 
  • Формат выходного сигнала: квадратурный код 2 бит 
  • На один оборот 24 импульса 
  • Температура 
                 эксплуатации -30…70 °C 
                 хранения -40…85 °C 
  • Ресурс оборотов не менее 30 000 
  • Ресурс нажатий кнопки не менее 20 000 

Принцип работы

Основные контакты DT и CLK. В исходном положении на обоих этих контактах положительный сигнал. При вращении энкодера контакты по очереди замыкаются на землю. По тому, какой из контактов замыкается первым, можно определить в какую сторону вращается энкодер. По количеству импульсов можно определить количество щелчков(угол поворота). Для уменьшения шумов я добавил два конденсатора по 1000пФ. Один между GND и DT, второй между GND и CLK

 

Программа

main.cpp

Encoder.h

Encoder.cpp

Ссылка на проект

2

Сегодня разберемся с подключением модуля термопары MAX6675 к отладочной плате NUCLEO F410RB. Напрямую термопару к микроконтроллеру подключить не получится, так как ЭДС термопары слишком мала, чтобы микроконтроллер адекватно реагировал на неё. Поэтому будем использовать микросхему MAX6675. Она определяет температуру с помощью термопары K-типа и передает её по SPI шине на микроконтроллер.



Купить

MAX6675 – конвертер для подключения термопары к микроконтроллеру.

Работает по шине SPI. Имеет 7 выводов:

  • GND – минус питания
  • VCC – плюс питания
  • SCK – синхросигнал
  • CS – выбор чипа (chip select). Нужен для подключения нескольких устройств на одну шину SPI
  • SO – вывод данных на микроконтроллер
  • Клеммы (+ -) – для подключения термопары

...читать далее "MBED + MAX6675"

Всем привет. Приобрел себе отладочную плату NUCLEO-F410RB.  Приобрел для приобщения к такому замечательному проекту как mbed. Для тех кто не вкурсе, mbed - это операционная система для микроконтроллеров, а так же онлайн компилятор. С помощью этой системы можно писать приложения для микроконтроллеров не сложнее, чем в Arduino IDE.

 

...читать далее "Nucleo-F410RB (serial port)"

Наверное многие, как и я, пытались перейти с arduino на что - то более мощное и современное. Причины у всех свои. Моя причина - это простой интерес к новым технологиям. Arduino я уже много раз использовал в различных проектах. Однажды даже делал "инфракрасный барьер", который и по сей день работает на предприятии в очень неблагоприятных условиях: постоянная пыль, тряска, перепады температур. Он контролирует загрузку конусной дробилки камнем.

...читать далее "Atollic TrueStrudio и STM32F103C8T6"

Всем привет, сегодня хочу поделиться с вами проектом светодиодного светильника. Идея создания такого светильника посещала меня давно, но руки дошли только сейчас. В итоге были закуплены пять десятиваттных светодиодов

После некоторых раздумий было решено делать светильник с регулировкой освещенности. Так же я решил использовать два типа светодиодов. Одни холодного белого света, другие теплого желтого, чтобы была возможность регулировки цветовой температуры.  

Таким образом получилась настольная лампа, которую можно настроить под различные ситуации. Например, в повседневной жизни она светит у меня теплым желтым светом. А когда мене нужно рабочее освещение, я переключаю ее на белый холодный свет.  ...читать далее "Самодельный светодиодный светильник"