24 февраля 2022 года в 5 утра, без объявления войны, россия напала на Украину.

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

Я не умею много писать, да и без мата тут сложно что-то написать.
Поэтому выражу все мои чувства одним фото.

«Спасибо дедушка путин за счастливое детство и мое освобождение». ©

Дополню словами уважаемого человека, широко известного в узких кругах:
тут путин не виноват, не он нажал на кнопку сброса,
- виноват пилот, который нажал на кнопку сброса, мог промахнуться. виноваты жена/мать/брат/друг пилота, которые не позвонили ему, и не сказали "нет войне",
- виноват тот, кто отдал приказ, и виноваты его жена/мать/брат/друг,
- виноват тот, кто цеплял бомбу, потому что он мог её обезвредить, "ну бывает, не сработала",
- виноват кладовщик, виноват водитель, который перевозил эту бомбу. виноваты жена...и т.д., потому что не позвонили и не сказали "нет войне, не вези бомбы",
- виноваты все журналисты оркостана, потому что они врут,
- виноваты недограждане, потому что не сказали журналистам "не врите",
- виноваты все... все 160 миллионов,
- а те 2, 3, 5 тысяч, которые вышли, и которых запаковали, это даже не десятая процента, это погрешность... случайно оказавшиеся в мордоре люди. ©

PS: За несколько часов до вторжения был атакован и взломан крупный интернет хостинг в Киеве, где и размещался мой сайт. Только 16 марта отважным админам удалось частично восстановить работу хостинга. Далеко не все сайты выжили, т.к. были повреждены даже бэкапы.
Нет, нет, я не жалуюсь, нет. В цифровом мире нет ничего ценного, материального...


Due to periodic DDoS attacks, the forum may not be available.

Контроллер давления с гистерезисом (для домашнего компрессора). Arduino, homeCompressor2

Обсуждение радиолюбительских технологий. Пайка, платы, слесарка...
Post Reply
User avatar
hardlock
Администратор
Posts: 4014
Joined: 21 Jan 2009 14:48
Location: Minsk - zp.ua
Contact:

Контроллер давления с гистерезисом (для домашнего компрессора). Arduino, homeCompressor2

Post by hardlock »

Первая версия компрессора успешно поселилась в моём гараже и выручает постоянно. В отличии от обычного промышленного (гаражного) компрессора, не создаёт шума и практически незаметный в использовании. Единственный его недостаток - малая производительность (около 8-10 л/мин). Для малярных работ или работы с пневмоинструментом, наверное, не хватит.

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

Техническое задание:
0) Заводские платы (на макетке сильно долго собирать))))
1) 4 канала управления: 3 канала 220В (2 канала на компрессор + 1 канал на клапан сброса давления) + 1 канал 12 В (на 12ти вольтовый клапан)
2) Аналоговый датчик давления (0-5 Вольт), рабочее давление 0 - 16 бар.
3) Датчик температуры двигателя (DS18B20)
4) LED индикатор (3-4 символа)
5) 3 кнопки управления.
6) Совместимость с Arduino, соответственно МК ATmega8 или ATMega328
7) разъём программирования ISP или USB (если влезет)
8) Питание 12В

Выбор датчика давления.
С момента создания первого компрессора я перманентно искал недорогой, универсальный датчик на давление до 10 (16) бар... Но до сих пор ничего не нашел. Поэтому в этот раз решил вернуться к поискам датчиков от автомобилей. И поиск увенчался успехом на первой же разборке. Я купил два комплекта трубок от Hyundai Genesis и Coupe по 21р (около $8 USD на момент приобретения) с датчиками в обеих комплектах, да ещё и с разъёмами.... Вобщем, пока есть такое на разборках - не вижу смысла искать другой датчик.
motorland_01.jpg
motorland_02.jpg
trubki_01.jpg
trubki_02.jpg
Схема:
Схема во многом похожа на первую версию, но я решил не применять Arduino nano целиком, а решил контроллер разместить на основной плате. Поэтому схема стала несколько "больше".
sch_v2_14.05.2021.gif
Устройство логически разделено на две части - силовую и плату индикации.

На силовой части разместились:
1) блок питания в виде модуля (MEAN WELL MPM-20-12 или IRM-20-12 - 12V 1,8A)
2) 3 канала симисторных коммутаторов 220В
3) 1 канал 12В 0,8А для управления клапаном, который подключается вместо (или вместе) с 3м каналом 220В.

На плате индикации разместилось всё остальное))): стабилизатор 5В, ИОН 2,61В, МК, индикатор, кнопки, ISP, разъёмы подключения датчиков, 4й канал 12В 1А (независимый от первых трёх), 4 светодиода индикации состояния каждого выходного канала LED4-LED7, но они нужны скорее для отладки. В качестве контроллера можно использовать ATmega8, ATmega88, ATmega168, ATMega328. Схема не меняется - совпадение по разводке 100%. Изменения в коде программы минимальные, но они выполняются автоматически, ничего руками менять не нужно. Но об этом позже.

Немного про источник опорного напряжения 2,61В.
На датчик давления 42CP8-12 есть скромное описание с указанием формулы пересчёта давления (PSI) в напряжение.
42cp8-12.PNG
Впечатляет, правда? А если сюда добавить ещё формулу пересчёта из BAR в PSI (1 bar = psi / 0,0689475729317831), получится совсем красиво. В итоге я долго игрался с формулами и "доигрался". При опорном напряжении АЦП равном 2,61 В получается следующее:
Давление 0 bar - напряжение на входе 0,5В - значение АЦП (0): 196.
Давление 10,0 bar - напряжение на входе 1,775В - значение АЦП (10): 696.
Давление 16,0 bar - напряжение на входе 2,539В - значение АЦП (16): 995.

Т.е. с таким опорным напряжением теоретический рабочий диапазон данного контроллера с датчиком давления 42CP8-12 составляет 0-16 бар.
Если из АЦП (10) вычесть АЦП (0), то получим 500 значений на диапазон давлений от 0 до 10 бар, или цена деления 0,02 бара. Вроде ничего, и считать в программе очень легко, никаких сложных вычислений: (АЦП - 196) * 2 = значение давления, только точку осталось поставить после первой цифры слева и готово!
Если значение АЦП ниже 196 - обрыв на линии (датчик не подключен), если выше 995 - замыкание на +5В или превышение рабочего давления выше 16 бар.

Печатная плата.
Плату рисовал исходя из размера заготовки 100*100мм и особо не стеснялся с пустым местом - цена вопроса очень низкая. Поэтому получилась вот такая плата.
Screenshot_top.png
Screenshot_bottom.png
Подключение силовых входов-выходов рассчитано под разъёмы PWL/PHU с шагом 3,96мм, переходной разъём между платами CWF-5 / CHU-5 с шагом 2,5мм. Разъёмы датчиков CWF-3 / CHU-3, разъём ISP - стандартный BH-10... К сожалению, разъём microUSB и обвязка CH340 не влезла на плату (читай "лень одолела"), поэтому программировать МК придётся через ISP разъём.
Ещё про одну особенность платы силовой части забыл описать: если не используется 3й канал 220В, то его можно взять и отрезать, для уменьшения габаритных размеров платы. При этом вся остальная плата не пострадает и даже предусмотрены полноценные крепления "обрезанной" платы. А вместо отрезанного 3го канала 200В, может быть распаян 12-ти вольтовый канал. Хотя они могут работать и параллельно - кому как надо... Вобщем, такая себе унификация. Точно уже не вспомню, но вроде делал "урезанную плату" под какой-то корпус, но маркировки не помню.

В этот раз решил поэкспериментировать с цветом платы. Всегда были дороже в несколько раз, если цвет отличный от зелёного. А в этот раз все по одной цене! Получилось вот так:
IMG_20210513_113330.jpg
Собираем силовую часть (2 канала 220В + 12В на клапан), отрезав "лишний" 3й канал 220В.
IMG_20210513_113417.jpg
Ну и несколько фото собранных плат индикации в разных вариантах (ATmega8/328, индикатор 3х и 4х разрядные).
IMG_20210513_113801.jpg
IMG_20210513_113848.jpg
IMG_20210513_113901.jpg
Не обошлось и без косяков (я же не могу без них). Забыл развести резисторы подтяжки входов кнопок (R41-R43), поэтому лепил их как попало (на фото видно).
Ну и в сборе пара фото.
IMG_20210513_114021.jpg
IMG_20210513_114333.jpg
IMG_20210513_114342.jpg
IMG_20210513_114408.jpg
Скачать в формате "Sprint-Layout 6.0": pcb_compressor_v2.3_12.05.2021.rar В архиве исправленная плата.
Платы получились конечно красивые - контрастная шелкография на чёрном фоне смотрится красиво. Но вот флюс отмыть от этой матовой красоты оказалось не просто. Даже банальные отпечатки пальцев сложно стереть. На фото вся эта "красота" видна - я специально не сильно старался оттереть все следы.

Программатор.
К сожалению я поленился разводить USB-TTL преобразователь на CH340 на плате. Да и места осталось не очень много. Поэтому решил, что, при использовании чистых камней всё равно нужно будет заливать bootloader через ISP программатор... А раз есть ISP и через него залили бут, то уже и прошивку можно через него залить. Вобщем решил отказаться от USB порта. Ну а USBasp за пару долларов я думаю каждый может себе позволить. Поэтому шить будем вот таким чудом - USBasp с aliexpress.
USBasp.jpg
Выбор среды разработки.
Меня долго упрекали в том, что я использую среду разработки CodeVisionAVR. Она платная и проекты, созданные в одной версии, не всегда компилируются в другой версии. Поэтому решил попробовать сделать проект в Arduino IDE, хоть она и немного непонятна для меня. Зато бесплатная, куча библиотек, поддерживает разные программаторы, ну и т.д. Не скажу, что без труда, но я её "осилил". Для меня так и осталось диким указание выводов не в явном виде типа "PINB.2 / PORTB.5", а просто номером "13"... И из-за этого у меня часто возникала путаница. Зато выросла повторяемость устройства.

Устанавливаем и настраиваем Arduino.
1) Качаем среду разработки Arduino IDE с офсайта. Устанавливаем.
2) Устанавливаем пакет MiniCore c GitHub, выглядит это приблизительно так:
• Открыть Arduino IDE.
• Открыть Меню - Файл > Настройки.
• Скопировать следующую ссылку в поле "Дополнительные ссылки для Менеджера плат":

Code: Select all

https://mcudude.github.io/MiniCore/package_MCUdude_MiniCore_index.json
01. minicore_settings.png
• Открыть Меню - Инструменты > Плата > Менеджер плат...
• Дождаться загрузки и индексирования списка плат..
• Найти в списке (либо поиском) "MiniCore" .
• Нажать "Установка".
02. minicore_boardmanager.png
02. minicore_boardmanager.png (12.25 KiB) Viewed 1701 times
• После окончания установки закрыть Менеджер плат.
3) Устанавливаем библиотеку OneWire.
• Меню - Скетч > Подключить библиотеку > Управлять библиотеками...
• Ищем библиотеку с названием "OneWire", как показано на картинке. Другие нам не нужны.
• Нажимаем установить, после установки закрываем Менеджер библиотек.
03. onewire_lib.png
4) Открываем наш проект, выбираем плату MiniCore > ATmega328 (или ATmega8, вобщем выбираем тот процессор, который будем использовать).
04. minicore_board_choose.png
5) Делаем настройки платы, основные, которые я менял:
• Clock: "External 16 MHz"
• BOD: "BOD 4.3V"
• Bootloader: "No bootloader"
• Программатор > USBasp slow (MiniCore) - медленный режим нужен один раз для установки фьюзов, потом выбираем USBasp (MiniCore) иначе будет долго шиться.
05. minicore_board_settings.png
6) Записываем Загрузчик (на скрине выше последний пункт). Бутлоадера у нас нет, но фьюзы установятся правильные.
7) Выбираем Программатор > USBasp (MiniCore) иначе будет долго шиться.
8) Делаем настройки в программе под наше железо (индикатор, датчик температуры, и т.д.) - чуть ниже опишу что к чему.
9) Записываем Скетч (Скетч > Загрузить через программатор Ctrl+Shit+U)
06. minicore_upload.png
06. minicore_upload.png (13.55 KiB) Viewed 1701 times
Готово!

Прошивка.
Всю прошивку описывать не буду - не вижу смысла, т.к. там прокомментирована почти каждая строчка, отдельно опишу только те настройки, которые придётся менять для адаптации к конкретной сборке. Нас будут интересовать первые 30 строчек кода:

Code: Select all

/*-------------- Hardware defines ------------*/
//#define led_OA            //для индикатора с общим анодом, для ОК - закомментировать.
#define hw_4digits          //для 3х разрядного индикатора - закомментировать define

#define out_StartPin  19    //PC5 (Arduino pin 19) выход управления запусковой обмоткой  (S) CH1
#define out_WorkPin   18    //PC4 (Arduino pin 18) выход управления рабочей обмоткой     (R) CH2
#define out_ValvePin  17    //PC3 (Arduino pin 17) выход управления клапаном сброса на силовой плате    CH3
#define out_CH4        0    //PD0 (Arduino pin 0)  выход управления клапаном сброса на плате индикатора CH4
#define analogPin      7    //ADC7 вход датчика давления                      
#define hw_ds18b20    16    //PC2(Arduino pin 16)  если будет использоваться датчик температуры ds18b20
                            //если выставить в настройка температуру "0", то температура и наличие датчика игнорируется
                            //если закомментировать, то в настройках не будет отображаться настройка температуры совсем...
/*-------------- Software defines ------------*/
#define P_max       1600    //16,00 bar Максимальное значение, которое можно установить в настройках.
                            //          Рекомендую ставить максимальное рабочее давление конкретного устройства, 
                            //          чтобы пользователь не смог установить больше этого значения.
#define P_min        100    //1,00 bar  Минимальное давление, которое можно будет установить в настройках. При этом давлении компрессор будет включаться.
                            //          Для устройств, которые не могут стартовать при большом давлении и не имеют клапана сброса
#define dP            50    //0,50 bar  Минимальная разница между P_max и P_min.  
#define T_min        300    //300 = 30,0°C минимальная температура для установки защиты от перегрева. 
#define ADC_0_bar    196    //значение АЦП при давлении 0 бар, если ниже - ошибка.  !!! не трогаем, это привязано к нашим формулам.
#define ADC_16_bar  1006    //значение АЦП при давлении 16 бар, если выше - ошибка. !!! не трогаем, это привязано к нашим формулам.

#define mode_timeout_delay  5000    //задержка выхода из режима настройки параметров (ms)
#define p_min_delay         1000    //задержка старта при давлении ниже установленного (и остановки при давлении выше установленного) (для исключения "дребезга").
#define before_start_delay  1000    //время после открытия клапана и запуском компрессора (мс).
#define start_delay         1000    //время работы обмотки запуска в компрессоре (мс).
#define valve_open_delay    3000    //длительность открытия клапана продувки (мс).
#define ds_refresh_delay    1000    //задержка между опросами датчика температуры DS18B20 (мс). Меньше 750мс не ставить.
попробую описать основные .
#define led_OA - конструкция допускает использование любых семисегментных индикаторов (с общим катодом и с общим анодом). Поэтому для индикаторов с ОК строчку комментируем, для ОА оставляем раскомментированной. Больше ничего менять не нужно в программе. Единственная оговорка, с ОК я проверил, а вот ОА индикаторов у меня нет.
#define hw_4digits - при использовании 4-х разрядного индикатора. Если индикатор 3х разрядный - строчку закомментировать. И опять оговорка, мне удалось приобрести 4х разрядный индикатор только GNQ-2841AS-21. Его особенность - двоеточие посередине для отображения времени, но точка в крайнем левом разряде не используется. Подробней - смотреть даташит. Поэтому была оптимизация под такой индикатор. Если индикатор будет "обычный" (без «:» времени), то придётся немного подкорректировать код.
#define out_StartPin, #define out_WorkPin, #define out_ValvePin, #define out_CH4, #define analogPin, #define hw_ds18b20 - описание куда подключены какие выходы. Как я уже писал выше, нумерация вводит некоторое заблуждение…

Далее идут программные описания.
#define ADC_0_bar, #define ADC_16_bar - не трогаем, это привязано к нашим формулам. )))
Если возникнут непонятки - описание дополню, но вроде подробней уже некуда...

Осталась ещё одна переменная, которая может нас интересовать. Она находится в 139й строке:

Code: Select all

bool ONOFF = false;                 //переменная которая хранит разрешение работы (включено-выключено). Если TRUE, то разрешена работа компрессора.  
                                    //если тут поставить FALSE, то при включении питания компрессор не включится, а контроллер будет отображать 
                                    //текущее давление. Если поставить TRUE - сразу после включения питания запустится компрессор, если текущее давление 
                                    //ниже установленного.
Если возникнут вопросы по программе - отвечу по ходу обсуждения.

Чуть не забыл. Исходники (скетч) во вложении. Надеюсь что повторить данное устройство не составит большого труда.
Attachments
compressor_v2.3.rar
(13.3 KiB) Downloaded 133 times
pcb_compressor_v2.3_12.05.2021.rar
(49.17 KiB) Downloaded 187 times
User avatar
hardlock
Администратор
Posts: 4014
Joined: 21 Jan 2009 14:48
Location: Minsk - zp.ua
Contact:

Re: Контроллер домашнего компрессора. homeCompressor2

Post by hardlock »

Резерв1. Инструкция по эксплуатации.
User avatar
hardlock
Администратор
Posts: 4014
Joined: 21 Jan 2009 14:48
Location: Minsk - zp.ua
Contact:

Re: Контроллер домашнего компрессора. homeCompressor2

Post by hardlock »

Резерв 2. Железо и корпус.
Post Reply